本文演示借用网上Crazybingo的案例uart_fifo_design(下载地址 https://www.eeworm.com/dl/849005.html)
在这基础上进行了局部修改(将Altera fifo IP 替换成手写同步fifo 模块sync_fifo.v,修改工程FPGA器件为DE10-Standard对应器件5CSXFC6D6F31C6)得到uart_sync_fifo_design(下载地址:https://pan.baidu.com/s/1UjXFZRedF22G9wEQKXvoiA 提取码: tera),下面讲解案例结构以及下板演示。
uart_sync_fifo_design工程是一个基于FPGA的UART FIFO通信系统,功能是:接收PC端从串口来的数据,并存入FIFO,然后通过按键触发从FIFO读出数据并通过UART发送出去。

工程一共有7个模块:uart_sync_fifo_design.v、system_ctrl.v、key_scan.v、clk_generator.v、uart_receiver.v、uart_transfer.v、fifo_read_write.v,下面对每个模块功能进行简单介绍。

uart_sync_fifo_design.v(顶层模块)
该模块是整个项目的顶层,负责例化并连接所有子模块。它将系统时钟、外部复位、按键输入、UART接收引脚(fpga_rxd)作为输入,输出UART发送引脚(fpga_txd)。内部通过 system_ctrl.v产生延迟复位信号,clk_generator.v 提供波特率时钟和采样时钟,uart_receiver.v 接收数据并存入FIFO,key_scan.v 检测按键事件,fifo_read_write.v 根据按键从FIFO读出数据并通过 uart_transfer.v 发送出去,实现接收存储—按键触发—回传的完整链路。
system_ctrl.v(上电延迟复位模块)
该模块产生一个延迟约100ms后释放的同步复位信号 sys_rst_n。它通过计数器对50MHz时钟计数5,000,000个周期,在计数完成前保持复位有效,完成后释放复位,同时使用两级寄存器将复位释放与时钟同步,确保系统在电源和时钟稳定后再开始工作,避免上电初期的不稳定状态影响逻辑。
key_scan.v(按键消抖与事件检测模块)
该模块对两位按键输入 key_data(低电平有效)进行消抖处理。当检测到按键状态稳定且非空闲(不等于2'b11)时,启动20ms计时;计时满后产生一个单周期脉冲 key_flag,并锁存当前的按键组合值 key_value。输出脉冲经过边沿检测后提供给上层,作为触发FIFO读操作的事件信号,确保每次按键只触发一次有效动作。
clk_generator.v(波特率时钟发生器)
该模块采用DDS(直接数字频率合成)原理,基于50MHz系统时钟生成两个脉冲时钟:clk_bps(波特率时钟,115200Hz)和 clk_smp(16倍采样时钟,1.8432MHz)。通过两个32位累加器分别累加频率控制字,取累加器最高位产生方波,再经边沿检测转换为单周期脉冲,为UART发送和接收提供精确的位定时与过采样使能信号。
uart_receiver.v(UART接收模块)
该模块以 clk_smp 作为采样使能,对串行输入 rxd 进行16倍过采样。检测到起始位后,在每位的中点(第8个采样点)采样8位数据,并在接收完停止位后产生 rxd_flag 脉冲,同时输出接收到的字节 rxd_data。该脉冲用于通知上层模块将数据写入FIFO,实现串行数据的并行化接收。
uart_transfer.v(UART发送模块)
该模块在 txd_en 信号有效时启动发送,以 clk_bps 作为位时钟使能,按UART协议逐位发送起始位(0)、8位数据(LSB first)和停止位(1)。发送完成后产生 txd_flag 脉冲,通知上层模块当前帧已发送完毕。输出 txd 为串行数据线,直接连接到FPGA的UART发送引脚。
fifo_read_write.v(FIFO读写控制模块)
该模块例化了一个同步FIFO(sync_fifo.v,本实验里面已经将之前的深度参数从8改到256了),并实现了一个状态机来管理数据的写入和读出。写入侧:当 rxd_flag 有效且FIFO未满时,将接收数据写入FIFO。读出侧:当检测到按键触发(key_flag=1 且 key_value=2'b01)且FIFO非空时,状态机依次进入使能、读取、等待发送完成、判断是否继续读取的循环,将FIFO中的数据逐一读出并通过 txd_en 和 txd_data 交给发送模块,实现“按键触发—逐字节发送—直到FIFO空”的自动回传功能。
引脚分配:

连接开发板(具体的硬件连接可参考https://mp.weixin.qq.com/s/_OfobIYCPNhmmRdOXqFdfw ):

下板验证:
打开串口助手,设置波特率115200、数据位8、停止位1、无校验。在串口助手中发送任意字节或字符串,然后按下DE10-Standard的KEY2按键,,观察串口助手是否收到相同的数据回显。

浙公网安备 33010602011771号