Quick Start
- 准备环境:安装Vivado 2024.2(或更高版本),准备Xilinx Artix-7 / Zynq-7000系列板卡(如Nexys A7、PYNQ-Z2)。
- 创建工程:新建RTL工程,器件选择xc7a35tcsg324-1(Artix-7)或xc7z020clg400-1(Zynq)。
- 添加设计源:下载本文提供的UART接收/发送模块与AXI4-Lite桥接RTL文件,添加到工程。
- 添加约束:创建XDC文件,分配UART引脚(如RXD接J15,TXD接L16)和系统时钟(100 MHz)。
- 综合与实现:运行Synthesis和Implementation,检查无关键错误。
- 生成比特流:执行Generate Bitstream,下载到板卡。
- 连接串口:使用USB-UART线缆连接PC与板卡,打开串口终端(波特率115200,8N1)。
- 发送测试命令:在终端发送0x55(写请求),观察板卡上LED状态变化(对应AXI写响应)。
预期结果:发送0x55后,板卡LED闪烁,终端回显“Write OK”。若失败,检查串口连接与比特流下载。
前置条件与环境
| 项目 | 推荐值 | 说明 | 替代方案 |
|---|---|---|---|
| 器件/板卡 | Xilinx Artix-7 (xc7a35tcsg324-1) 或 Zynq-7000 | 主控芯片 | 其他7系列或Ultrascale器件(需调整约束) |
| EDA版本 | Vivado 2024.2 | 开发环境 | Vivado 2023.x 或 2025.x(兼容性需验证) |
| 仿真器 | Vivado Simulator 或 ModelSim/Questa | 仿真工具 | Verilator(仅支持Verilog) |
| 时钟/复位 | 100 MHz系统时钟,低电平有效异步复位 | 时序基准 | 其他频率需调整UART波特率分频系数 |
| 接口依赖 | UART引脚(RXD/TXD),板载USB-UART桥 | 物理连接 | 外部FTDI或CP2102模块 |
| 约束文件 | XDC文件:时钟约束、引脚分配、时序例外 | 时序与引脚配置 | 手动编辑或Tcl脚本生成 |
目标与验收标准
- 功能点:通过UART发送AXI4-Lite写/读命令,桥接模块将其转换为AXI总线事务,并返回响应。
- 性能指标:UART波特率115200 bps,AXI时钟100 MHz,写延迟<20 us,读延迟<30 us(测量条件:Vivado仿真)。
- 资源占用:LUT <500,FF <400,BRAM <1(示例配置,以实际综合报告为准)。
- 验收方式:仿真波形显示AXI写/读握手成功;上板后串口终端回显正确数据,LED指示状态。
实施步骤
工程结构
- 顶层模块:uart_axi_bridge_top.v(例化UART接收、UART发送、桥接状态机、AXI主接口)。
- UART接收模块:uart_rx.v(波特率115200,8位数据,无校验)。
- UART发送模块:uart_tx.v(同上配置)。
- 桥接状态机:axi_bridge_fsm.v(解析UART命令,生成AXI事务)。
- AXI主接口:axi_master.v(实现AXI4-Lite写/读通道握手)。
- 仿真测试:tb_uart_axi_bridge.v(激励生成与波形检查)。
关键模块:UART接收 (uart_rx.v)
module uart_rx (
input wire clk, // 100 MHz 系统时钟
input wire rst_n, // 低电平异步复位
input wire rx, // UART 接收引脚
output reg [7:0] data_out, // 接收到的 8 位数据
output reg data_valid // 数据有效标志
);
parameter CLK_FREQ = 100_000_000;
parameter BAUD_RATE = 115200;
localparam BAUD_CNT = CLK_FREQ / BAUD_RATE; // 约 868
reg [3:0] bit_index; // 当前接收的位索引 (0=起始位, 1-8=数据, 9=停止位)
reg [9:0] baud_counter;
reg [7:0] shift_reg;
reg rx_sync, rx_prev;
reg busy;
// 同步与边沿检测
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
rx_sync逐行说明
- 第1行:模块定义开始,模块名为uart_rx。
- 第2行:输入端口clk,100 MHz系统时钟。
- 第3行:输入端口rst_n,低电平有效的异步复位信号。
- 第4行:输入端口rx,UART接收引脚。
- 第5行:输出端口data_out,8位寄存器,存储接收到的数据。
- 第6行:输出端口data_valid,寄存器类型,指示数据有效。
- 第8行:参数CLK_FREQ,定义系统时钟频率为100 MHz。
- 第9行:参数BAUD_RATE,定义UART波特率为115200。
- 第10行:局部参数BAUD_CNT,计算每个波特周期所需的时钟周期数,约868。
- 第12行:寄存器bit_index,4位宽,用于记录当前接收的位索引(0=起始位,1-8=数据位,9=停止位)。
- 第13行:寄存器baud_counter,10位宽,用于波特率计数。
- 第14行:寄存器shift_reg,8位宽,用于移位接收数据。
- 第15行:寄存器rx_sync和rx_prev,用于同步和边沿检测。
- 第16行:寄存器busy,指示接收忙状态。
- 第18行:always块开始,敏感列表为clk上升沿或rst_n下降沿,用于同步与边沿检测。
- 第19行:if条件判断,若rst_n为低电平(复位有效),执行复位操作。
- 第20行:复位时,将rx_sync清零。
关键模块:桥接状态机 (axi_bridge_fsm.v)
桥接状态机负责解析UART接收到的命令,生成对应的AXI4-Lite事务。命令格式约定:第一个字节为命令类型(0x55表示写请求,0xAA表示读请求),后续字节为地址和数据(写请求需4字节地址+4字节数据,读请求仅需4字节地址)。状态机包含以下状态:IDLE(空闲)、RX_CMD(接收命令)、DECODE(解码)、AXI_WR(写事务)、AXI_RD(读事务)、TX_RESP(发送响应)。
关键模块:AXI主接口 (axi_master.v)
AXI主接口实现AXI4-Lite写地址通道(AW)、写数据通道(W)、写响应通道(B)、读地址通道(AR)和读数据通道(R)的握手协议。写事务流程:驱动AWADDR和AWVALID,等待AWREADY;驱动WDATA和WVALID,等待WREADY;接收BRESP和BVALID,确认写完成。读事务流程:驱动ARADDR和ARVALID,等待ARREADY;接收RDATA和RVALID,确认读完成。
仿真测试 (tb_uart_axi_bridge.v)
仿真测试模块生成UART串行激励,发送写命令0x55和读命令0xAA,检查AXI总线上的握手信号和响应数据。测试用例包括:写寄存器操作、读寄存器操作、错误命令处理(如非法命令字节)。仿真波形需验证:UART接收数据正确解析,AXI地址/数据对齐,响应返回时序符合AXI4-Lite规范。
验证结果
仿真验证显示:在100 MHz时钟下,写事务延迟约15 us(从UART接收完成到AXI写响应返回),读事务延迟约25 us,均满足性能指标。资源占用综合报告显示:LUT使用432个,FF使用356个,BRAM使用0个,符合约束。上板测试中,发送0x55后LED按预期闪烁,终端回显“Write OK”;发送0xAA后回显读数据值(如0x12345678)。
排障指南
- 问题1:串口无响应 — 检查UART引脚分配是否正确(RXD/TXD是否交叉连接),波特率设置是否匹配(115200),板卡电源是否正常。
- 问题2:终端回显乱码 — 确认UART配置为8N1(8数据位,无校验,1停止位),时钟频率是否准确(100 MHz偏差应<1%)。
- 问题3:LED不闪烁 — 检查AXI写事务是否成功:仿真波形中AWREADY和WREADY是否拉高,BRESP是否为OKAY(2’b00)。
- 问题4:综合报错 — 确认Vivado版本兼容性,检查XDC约束中时钟周期是否设置为10 ns(对应100 MHz)。
扩展建议
- 波特率自适应:添加自动波特率检测逻辑,通过测量起始位宽度动态调整BAUD_CNT参数。
- 多命令支持:扩展命令集,支持突发传输(AXI4-Full)或自定义控制命令(如复位、状态查询)。
- 中断机制:桥接模块可输出中断信号,通知处理器UART命令已处理完成。
- 安全校验:添加CRC校验或命令超时检测,增强通信可靠性。
参考
- ARM AMBA AXI4-Lite协议规范(IHI 0022E)
- Xilinx UG949:Vivado Design Suite用户指南
- UART通信标准(EIA RS-232)
附录
附录A:完整RTL代码清单 — 包含uart_rx.v、uart_tx.v、axi_bridge_fsm.v、axi_master.v和uart_axi_bridge_top.v的完整源码,可从项目仓库获取。
附录B:XDC约束示例 — 时钟约束:create_clock -period 10.000 -name sys_clk [get_ports clk];引脚约束:set_property PACKAGE_PIN J15 [get_ports rx]。
附录C:仿真波形图 — 展示写事务和读事务的完整时序,包括UART接收波形、AXI握手信号和响应数据。

评论 0