UART 到 AXI4-Stream 桥接设计实现与验证指南

FPGA小白
文章2026-07-16
28 0 0 0

Quick Start

  1. 下载并安装 Vivado 2024.2(或更高版本),确保包含 Xilinx 7 Series / UltraScale+ 器件库。
  2. 创建新工程,选择目标器件(例如 xc7a35tcsg324-1,Artix-7 35T)。
  3. 在工程中添加本项目提供的 RTL 源文件:uart_rx.v、uart_tx.v、uart2axis_bridge.v、axis_fifo.v(可选)。
  4. 添加约束文件(.xdc),指定 UART 引脚(RX、TX)、系统时钟(100 MHz)和复位(低有效)。
  5. 运行综合(Synthesis),检查无严重警告或错误。
  6. 运行实现(Implementation),确保时序收敛(建立时间无违例)。
  7. 生成比特流并下载到开发板。
  8. 使用串口调试工具(如 Putty、Tera Term)发送字节(例如 0x55),观察 AXI4-Stream 输出端 tdata 和 tvalid 是否同步变化。
  9. 若板上无 AXI 分析仪,可用 ILA(Integrated Logic Analyzer)核捕获 tdata、tvalid、tready 等信号,验证桥接逻辑。
  10. 预期结果:每发送一个 UART 字节(8-N-1,波特率 115200),AXI4-Stream 输出一个 8-bit 数据包,tvalid 高有效一个时钟周期,tready 为高时握手成功。

前置条件与环境

项目推荐值说明/替代方案
器件/板卡Xilinx Artix-7 35T (xc7a35tcsg324-1)其他 7 Series / UltraScale+ 器件,需调整约束
EDA 版本Vivado 2024.2Vivado 2023.x 或更高(需支持 AXI4-Stream IP)
仿真器Vivado Simulator 或 ModelSim/QuestaVerilator(仅仿真,不支持 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 代码

由于篇幅限制,此处仅展示核心代码片段。完整代码请从项目仓库获取。

分类
技术分享
标签
AXI4-StreamUART桥接
浏览 28收藏 0赞 0评论 0
分享:

相关推荐

同频道 · 相近分类

暂无相关推荐

作者

FPGA小白查看主页

同分类阅读

文章

延伸阅读与实操

  • 文章 + 课程联动深度文章常对应体系课章节,可一键选课。
  • 学习产出可参考笔记与作业案例在学习产出广场持续更新。

探索全站