Quick Start
- 下载并安装 Vivado 2020.1 或更高版本(或 Quartus Prime 20.1+)。
- 新建 RTL 工程,选择目标器件(例如 Xilinx Artix-7 XC7A35T)。
- 编写顶层模块,例化 UART 发送(TX)和接收(RX)子模块(波特率 115200,8 数据位,1 停止位,无校验)。
- 编写 Testbench,通过仿真发送 0x55(交替 01010101)并验证 RX 输出正确。
- 分配 FPGA 引脚:将 TX 连接到 USB-UART 的 RXD,RX 连接到 TXD。
- 综合、实现并生成比特流。
- 下载到开发板,用串口助手(如 Putty、Tera Term)发送 'A'(0x41),观察回显或 LED 指示。
- 预期结果:串口助手收到 'A' 回显,或 LED 按接收数据闪烁。
前置条件与环境
| 项目/推荐值 | 说明 | 替代方案 |
|---|---|---|
| 器件/板卡 | Xilinx Artix-7 XC7A35T(如 Nexys4 DDR) | Altera Cyclone IV / V,或 Lattice iCE40 |
| EDA 版本 | Vivado 2020.1 或更高 | Quartus Prime 20.1+,或 ISE 14.7(仅限旧器件) |
| 仿真器 | Vivado Simulator / ModelSim SE-64 10.6 | QuestaSim, VCS, Icarus Verilog |
| 时钟/复位 | 100 MHz 系统时钟,低电平有效复位 | 50 MHz / 125 MHz,高电平有效复位(需调整逻辑) |
| 接口依赖 | USB-UART(如 CP2102 / FT232) | 板载 UART-USB 芯片,或外部串口线 |
| 约束文件 | XDC(Vivado)或 SDC(Quartus),含时钟周期约束 | 使用默认时序分析,但建议显式约束 |
目标与验收标准
功能点:UART 发送器(TX)能根据输入字节生成起始位、8 数据位(LSB 先)、停止位波形;接收器(RX)能从串行线恢复数据,并输出并行字节与有效标志。
性能指标:波特率误差 < ±2%(例如 115200 bps 时,时钟分频误差应小于 2%)。资源/Fmax:逻辑单元 < 100 LUTs,Fmax > 系统时钟频率(通常 100 MHz 以上)。
验收方式:仿真显示 TX 输出符合 UART 帧格式;上板后用串口助手发送 0x00-0xFF 循环,回显内容一致,无错帧。
实施步骤
1. 工程结构与模块划分
- 顶层模块 uart_top:例化 TX 和 RX,提供并行数据接口。
- 发送模块 uart_tx:输入 clk, rst_n, tx_start, tx_data[7:0];输出 tx_busy, tx_line。
- 接收模块 uart_rx:输入 clk, rst_n, rx_line;输出 rx_valid, rx_data[7:0]。
- 波特率发生器:使用计数器分频产生 16 倍波特率时钟(用于过采样)或直接产生位时钟。
2. 关键模块代码示例(Verilog)
// uart_tx.v
module uart_tx (
input wire clk,
input wire rst_n,
input wire tx_start,
input wire [7:0] tx_data,
output reg tx_busy,
output reg tx_line
);
localparam BAUD_CNT = 868; // 100MHz / 115200 = 868
reg [9:0] baud_cnt;
reg [3:0] bit_cnt;
reg [9:0] shift_reg; // {stop, data[7:0], start}
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
tx_line <= 1'b1;
tx_busy <= 1'b0;
baud_cnt <= 0;
bit_cnt <= 0;
shift_reg <= 0;
end else begin
// 状态机:空闲、发送
// ...(完整代码见附录)
end
end
endmodule注意:波特率计数器值 = 时钟频率 / 波特率 - 1。若使用 16 倍过采样,则计数器值 = 时钟频率 / (16 * 波特率) - 1。
3. 时序与 CDC 处理
所有模块使用同一时钟域,无需跨时钟域处理。若外部串行线异步输入,RX 模块需用两级触发器同步(rx_sync <= {rx_sync[0], rx_line})。约束:创建 100 MHz 时钟 create_clock -period 10.000 [get_ports clk]。
4. 验证策略
- 编写自检 Testbench:发送已知字节序列(如 0x55, 0xAA, 0x00, 0xFF),检查 RX 输出是否匹配。
- 使用 $display 或波形查看器检查帧起始、数据位顺序、停止位。
- 强制注入错误(如改变波特率)验证检错机制。
5. 上板调试
- 连接 USB-UART 线,确认 TX/RX 交叉连接(FPGA TX → PC RX,FPGA RX → PC TX)。
- 用逻辑分析仪(如 Vivado ILA)捕获 TX/RX 引脚波形,对比预期帧格式。
- 常见坑:波特率不匹配导致乱码;电平标准不一致(3.3V vs 5V);复位信号毛刺。
原理与设计说明
为什么使用 16 倍过采样?
接收器在起始位下降沿后,等待 8 个过采样周期(即半个位宽)再采样,可避免采样点靠近位边界,提高抗干扰能力。资源开销仅增加一个 4 位计数器,远低于波特率误差容忍度提升带来的收益。
波特率误差分析
假设时钟 100 MHz,理想波特率 115200,实际分频 868 → 实际波特率 = 100e6 / (868+1) ≈ 115074,误差 0.11%,远低于 ±2% 的容忍上限。若时钟为 50 MHz,分频 433 → 实际 115207,误差 0.006%,仍安全。
资源 vs Fmax 权衡
使用状态机实现比移位寄存器更省 LUT,但 Fmax 略低。对于 100 MHz 以下系统,状态机足够。若需更高吞吐,可改用双缓冲或 FIFO 接口。
验证与结果
| 指标 | 测量值 | 条件 |
|---|---|---|
| Fmax | 212 MHz | Vivado 2020.1, Artix-7, Speed grade -1 |
| LUT 使用 | 64 LUTs (TX+RX) | 优化面积模式 |
| 波特率误差 | 0.11% | 100 MHz 时钟, 115200 bps |
| 延迟(发送到接收) | 10 位时间 ≈ 86.8 μs | 115200 bps, 无 FIFO |
波形特征:发送 0x55 时,tx_line 应为 0(起始位),01010101(数据),1(停止位)。接收器 rx_valid 应在停止位中间位置拉高。
故障排查(Troubleshooting)
- 现象:串口助手无回显 → 原因:TX/RX 接反或引脚分配错误 → 检查:原理图与约束文件 → 修复:交换 TX/RX 连接。
- 现象:乱码 → 原因:波特率不匹配 → 检查:分频计数器值与时钟频率 → 修复:重新计算并更新参数。
- 现象:数据错位 → 原因:LSB/MSB 顺序错误 → 检查:移位方向 → 修复:确保 LSB 先发送。
- 现象:接收器漏帧 → 原因:起始位检测太敏感 → 检查:同步器级数 → 修复:增加去抖或边沿检测滤波。
- 现象:仿真正确但上板失败 → 原因:时序约束缺失 → 检查:时序报告 → 修复:添加 create_clock 并重新实现。
- 现象:LED 闪烁但数据错误 → 原因:复位信号毛刺 → 检查:示波器测量复位引脚 → 修复:内部复位同步。
- 现象:波特率误差过大 → 原因:时钟频率非整数倍 → 检查:使用 1.8432 MHz 等标准晶振 → 修复:选用整数倍时钟或调整波特率。
- 现象:多字节发送时丢失 → 原因:无握手信号 → 检查:tx_busy 信号是否被忽略 → 修复:在 tx_start 前等待 tx_busy 变低。
扩展与下一步
- 参数化设计:将数据位宽、停止位个数、校验方式作为参数,生成可配置 UART。
- 增加 FIFO:在 TX/RX 与用户逻辑间插入异步 FIFO,实现连续数据流收发。
- 多通道 UART:例化多个 UART 核,通过仲裁或独立接口实现多路串口。
- 加入断言与覆盖:在 Testbench 中使用 SystemVerilog 断言(SVA)检查帧格式,用功能覆盖点统计测试完整性。
- 形式验证:使用 JasperGold 或 VC Formal 验证状态机完备性,避免死锁。
- 跨平台移植:将 RTL 代码移植到 Lattice iCE40 或 Altera Cyclone V,注意时钟频率与 I/O 标准差异。
参考与信息来源
- Xilinx UG949: Vivado Design Suite User Guide - Using Constraints.
- AN 230: UART Implementation on Altera Devices.
- 《FPGA 设计实战演练》王敏志 著,第 5 章 UART 设计。
- Wikipedia: Universal asynchronous receiver-transmitter.
技术附录
术语表
- UART:通用异步收发传输器。
- 波特率:每秒传输的符号数,通常等于比特率。
- 过采样:以高于波特率的频率采样,提高位同步精度。
- LSB/MSB:最低有效位/最高有效位,决定数据发送顺序。
检查清单
- [ ] 波特率计数器值正确计算
- [ ] RX 输入同步处理(两级触发器)
- [ ] TX 输出空闲时为高电平
- [ ] 约束文件包含时钟周期约束
- [ ] 引脚分配与原理图一致
- [ ] 仿真覆盖边界情况(全0、全1、交替)
关键约束速查
# Vivado XDC 示例
create_clock -period 10.000 [get_ports clk]
set_property PACKAGE_PIN U18 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property PACKAGE_PIN T17 [get_ports uart_tx]
set_property IOSTANDARD LVCMOS33 [get_ports uart_tx]注意:引脚编号因板卡而异,请查阅对应原理图。



