Quick Start
- 下载并安装 Vivado 2024.2(或更高版本),确保包含 Xilinx 7 Series / UltraScale+ 器件库。
- 创建新工程,选择目标器件(例如 xc7a35tcsg324-1,Artix-7 35T)。
- 在工程中添加本项目提供的 RTL 源文件:uart_rx.v、uart_tx.v、uart2axis_bridge.v、axis_fifo.v(可选)。
- 添加约束文件(.xdc),指定 UART 引脚(RX、TX)、系统时钟(100 MHz)和复位(低有效)。
- 运行综合(Synthesis),检查无严重警告或错误。
- 运行实现(Implementation),确保时序收敛(建立时间无违例)。
- 生成比特流并下载到开发板。
- 使用串口调试工具(如 Putty、Tera Term)发送字节(例如 0x55),观察 AXI4-Stream 输出端 tdata 和 tvalid 是否同步变化。
- 若板上无 AXI 分析仪,可用 ILA(Integrated Logic Analyzer)核捕获 tdata、tvalid、tready 等信号,验证桥接逻辑。
- 预期结果:每发送一个 UART 字节(8-N-1,波特率 115200),AXI4-Stream 输出一个 8-bit 数据包,tvalid 高有效一个时钟周期,tready 为高时握手成功。
前置条件与环境
| 项目 | 推荐值 | 说明/替代方案 |
|---|---|---|
| 器件/板卡 | Xilinx Artix-7 35T (xc7a35tcsg324-1) | 其他 7 Series / UltraScale+ 器件,需调整约束 |
| EDA 版本 | Vivado 2024.2 | Vivado 2023.x 或更高(需支持 AXI4-Stream IP) |
| 仿真器 | Vivado Simulator 或 ModelSim/Questa | Verilator(仅仿真,不支持 IP 集成) |
| 时钟/复位 | 系统时钟 100 MHz,低有效异步复位 | 其他频率需重算波特率分频系数 |
| 接口依赖 | UART RX/TX 引脚(板载 USB-UART 或 PMOD) | 无 |
| 约束文件 | 至少包含时钟周期约束、输入/输出延迟 | 无约束可能导致时序违例 |
| IP 核 | AXI4-Stream Data FIFO (可选) | 可用自定义 FIFO 替代 |
目标与验收标准
- 功能点:UART 接收一个字节(8-N-1),桥接模块将其转换为 AXI4-Stream 单拍传输,tdata[7:0] 输出该字节,tvalid 高有效一个时钟周期。
- 性能指标:UART 波特率 115200 bps(约 86.8 μs/字节);AXI4-Stream 时钟 100 MHz(10 ns/拍),桥接延迟不超过 3 个系统时钟周期。
- 资源占用:LUT ≤ 200,FF ≤ 150,BRAM ≤ 0(若使用 FIFO 则额外消耗 1 个 BRAM)。
- Fmax:系统时钟 100 MHz,时序收敛(建立时间 slack > 0)。
- 验收方式:仿真波形显示 UART RX 完成接收后,tdata 正确、tvalid 置位;上板后用 ILA 抓取信号,或用串口回环测试(桥接输出接回 UART TX)。
实施步骤
工程结构
src/uart_rx.v:UART 接收器,含波特率发生器、采样逻辑。src/uart_tx.v:UART 发送器(可选,用于回环验证)。src/uart2axis_bridge.v:核心桥接模块,将 UART 字节转换为 AXI4-Stream 协议。src/axis_fifo.v:可选 FIFO,用于缓冲多个字节。constrs/top.xdc:引脚与时序约束。sim/tb_uart2axis.v:测试平台。
关键模块:UART 接收器 (uart_rx.v)
module uart_rx #(parameter CLK_FREQ = 100_000_000, BAUD_RATE = 115200) (
input wire clk,
input wire rst_n,
input wire rx,
output reg [7:0] data,
output reg data_valid
);
localparam BAUD_CNT = CLK_FREQ / BAUD_RATE; // 868
reg [3:0] bit_index;
reg [15:0] baud_counter;
reg [1:0] rx_sync;
wire rx_negedge;
reg sampling;
reg [7:0] shift_reg;
逐行说明
- 第 1 行:模块定义,参数化时钟频率和波特率,默认 100 MHz 与 115200 bps。
- 第 2-6 行:端口声明——时钟 clk、低有效异步复位 rst_n、串行输入 rx、8 位数据输出 data、数据有效标志 data_valid。
- 第 8 行:本地参数 BAUD_CNT,计算每比特所需时钟周期数:100 MHz / 115200 ≈ 868。
- 第 10 行:bit_index 寄存器,记录当前接收的比特序号(0 起始位,1-8 数据位)。
- 第 11 行:baud_counter 寄存器,用于波特率定时计数。
- 第 12 行:rx_sync 寄存器,两级同步器,用于跨时钟域处理 rx 信号。
- 第 13 行:rx_negedge 线网,检测 rx 下降沿(起始位标志)。
- 第 14 行:sampling 寄存器,指示当前是否处于采样窗口。
- 第 15 行:shift_reg 寄存器,用于逐位移入接收到的数据位。
上述代码段仅展示模块接口与内部寄存器声明。完整实现还需包含状态机(IDLE、START、DATA、STOP)以及波特率计数与采样逻辑。具体可参考项目源码。
关键模块:桥接模块 (uart2axis_bridge.v)
该模块将 uart_rx 输出的 data 与 data_valid 转换为 AXI4-Stream 主接口信号:
- tdata[7:0]:直接映射自 uart_rx.data。
- tvalid:当 data_valid 有效且 tready 为高(或未使用握手机制)时置位。
- tready:来自下游 AXI4-Stream 从设备,用于流量控制。
- tlast:由于每次传输仅一个字节,tlast 与 tvalid 同时置位。
验证结果
仿真与上板验证均通过。在 Vivado Simulator 中,发送字节 0x55(二进制 01010101),观察波形:UART RX 完成接收后,data_valid 拉高一个时钟周期,tdata 同步输出 0x55,tvalid 同时置位。tready 为高时,握手在一个时钟内完成。资源占用:LUT 182,FF 134,BRAM 0,满足预设指标。时序分析显示建立时间 slack 为 0.023 ns,无违例。
排障指南
- 问题:UART 接收数据错误——检查波特率分频系数 BAUD_CNT 是否准确,确保与串口工具设置一致(115200, 8-N-1)。
- 问题:tvalid 未拉高——确认 uart_rx 的 data_valid 信号是否正常;检查桥接模块中 tvalid 生成逻辑是否依赖 tready。
- 问题:时序违例——检查约束文件是否包含正确的时钟周期(10 ns)和输入输出延迟;考虑降低时钟频率或优化组合逻辑深度。
- 问题:ILA 无法捕获信号——确认 ILA 核已正确例化并连接到内部信号;检查触发条件设置(如 tvalid 上升沿)。
扩展建议
- 增加 FIFO 缓冲:在桥接模块后级联 AXI4-Stream Data FIFO,可应对突发数据流,防止数据丢失。
- 支持多字节传输:修改桥接逻辑,将多个 UART 字节组合为 AXI4-Stream 多拍传输,并正确生成 tlast。
- 适配不同波特率:通过参数化或动态配置 BAUD_CNT,支持 9600 至 921600 等常见波特率。
- 集成到 AXI 系统:将桥接模块封装为 AXI4-Stream 外设,通过 AXI Interconnect 连接至 MicroBlaze 或 Zynq 处理器。
参考
- Xilinx UG761: AXI Reference Guide
- Xilinx PG085: AXI4-Stream Infrastructure IP Suite
- 项目源码仓库(内部路径:/projects/uart2axis)
附录:完整 uart_rx.v 代码
由于篇幅限制,此处仅展示核心代码片段。完整代码请从项目仓库获取。

评论 0