Xilinx FPGA UART 硬件接口使用指南
1. 引言
UART (通用异步收发器) 是一种广泛使用的串行通信接口,因其简单、可靠和易于实现而成为 Xilinx FPGA 设计中的常见硬件接口。UART 用于在 FPGA 与外部设备(如 PC、微控制器、传感器等)之间进行数据通信。本文档基于 Xilinx Vivado 工具,详细介绍在 Xilinx FPGA 中实现和使用 UART 接口的方法,重点介绍相关 IP 核的配置与使用,涵盖 Spartan、Artix、Kintex、Virtex 等系列。
2. UART 基础
2.1 定义
UART 是一种异步串行通信协议,通过发送和接收数据帧实现双向通信。数据帧通常包括起始位、数据位、奇偶校验位(可选)和停止位。
2.2 主要特性
- 波特率:数据传输速率,常见值包括 9600、115200、921600 bps。
- 数据帧格式 :
- 起始位:1 位,标记数据帧开始(低电平)。
- 数据位:5 到 8 位,常用 8 位。
- 奇偶校验位:可选,用于错误检测(奇校验、偶校验或无)。
- 停止位:1 或 2 位,标记数据帧结束(高电平)。
- 异步通信:无共享时钟,接收端根据波特率同步。
- 双向通信:TX(发送)和 RX(接收)独立操作。
- 电平标准:FPGA 通常使用 3.3V/1.8V 逻辑电平,外部设备可能需要电平转换(如 RS-232)。
2.3 应用场景
- FPGA 与 PC 之间的调试和数据传输。
- 与微控制器、传感器或其他外设的通信。
- 低速、简单的数据交换(如控制命令或状态信息)。
- 嵌入式系统中终端接口(如串口终端)。
3. Xilinx FPGA 中的 UART 实现
Xilinx FPGA 支持通过以下方式实现 UART:
- 使用 Vivado IP 核:通过 AXI UART Lite 或 AXI UART 16550 IP 快速实现。
- 自定义 HDL 设计:用 Verilog/VHDL 编写 UART 模块,适合特定需求。
- MicroBlaze/Zynq 软核/硬核:结合处理器系统使用 UART。
本节重点介绍使用 Vivado IP 核实现 UART 的方法。
3.1 相关 IP 核
Xilinx Vivado 提供以下 UART 相关 IP 核:
- AXI UART Lite :
- 轻量级 UART IP,适合简单应用。
- 支持 AXI4-Lite 接口,易于与 MicroBlaze 或自定义逻辑集成。
- 固定 8 位数据、无奇偶校验、1 位停止位。
- 资源占用低,适合小型 FPGA。
- AXI UART 16550 :
- 功能更丰富的 UART IP,兼容 16550 标准。
- 支持 AXI4-Lite 接口,可配置数据位、奇偶校验、停止位。
- 包含 FIFO 缓冲区,适合高吞吐量应用。
- 资源占用较高,适合复杂系统。
- Zynq PS UART (仅限 Zynq 系列):
- Zynq 芯片的处理系统 (PS) 提供内置 UART 控制器。
- 通过 PS 配置,无需额外 IP,适合 Zynq 设计。
3.2 AXI UART Lite 配置步骤
以下以 AXI UART Lite 为例,介绍 IP 配置和使用流程。
3.2.1 配置 IP
- 打开 Vivado,进入 IP Catalog。
- 搜索并选择 AXI UART Lite。
- 配置参数:
- 波特率 :选择标准波特率(如 115200 bps)或自定义值。
- 实际波特率由输入时钟频率和分频比决定,公式为:
\\text{波特率} = \\frac{\\text{时钟频率}}{\\text{分频比} \\times 16}
- 实际波特率由输入时钟频率和分频比决定,公式为:
- 接口:AXI4-Lite(默认)。
- FIFO 大小:通常为 16 字节(固定)。
- 中断:可选,启用后可通过中断处理数据收发。
- 波特率 :选择标准波特率(如 115200 bps)或自定义值。
- 生成 IP 核,获取 Verilog/VHDL 文件。
- 将 IP 添加到设计中,通常与 AXI 互连模块和处理器(如 MicroBlaze)连接。
3.2.2 端口说明
以下是 AXI UART Lite 的主要外部端口:
端口名 | 方向 | 描述 |
---|---|---|
s_axi_aclk |
输入 | AXI 时钟 |
s_axi_aresetn |
输入 | AXI 复位(低有效) |
tx |
输出 | UART 发送数据(TX) |
rx |
输入 | UART 接收数据(RX) |
interrupt |
输出 | 中断信号(可选) |
AXI 接口:通过 AXI4-Lite 总线与处理器或控制逻辑通信,包含地址、数据和控制信号。
3.2.3 例化示例
以下是一个简单的 AXI UART Lite 例化(Verilog):
verilog
module uart_example (
input wire clk,
input wire resetn,
input wire rx,
output wire tx,
output wire interrupt
);
axi_uartlite_0 u_uart (
.s_axi_aclk(clk), // AXI 时钟
.s_axi_aresetn(resetn), // AXI 复位
.rx(rx), // UART RX
.tx(tx), // UART TX
.interrupt(interrupt) // 中断
);
endmodule
说明 :axi_uartlite_0
为 Vivado 生成的 IP 模块名,需根据实际配置调整。
3.3 AXI UART 16550 配置
AXI UART 16550 的配置类似 AXI UART Lite,但支持更多选项:
- 数据位:5 到 8 位。
- 奇偶校验:无、奇、偶、强制 0/1。
- 停止位:1 或 2 位。
- FIFO 大小:可配置为 16、64 或更大。
- 波特率:支持更高波特率,需确保时钟频率足够。
配置步骤与 AXI UART Lite 类似,生成后可通过 AXI4-Lite 接口控制。
3.4 Zynq PS UART 配置
对于 Zynq 系列,UART 可通过处理系统 (PS) 配置:
- 打开 Vivado 的 Block Design。
- 添加 Zynq Processing System IP。
- 双击 Zynq IP,进入配置界面。
- 在 MIO Configuration 中启用 UART0 或 UART1。
- 配置波特率、数据格式等参数。
- 将 UART 引脚分配到 MIO 引脚(无需 PL 逻辑)。
- 生成位流并导出到 SDK/Vitis 进行软件开发。
4. 设计注意事项
4.1 波特率匹配
- 确保 FPGA 和外部设备的波特率一致,避免数据错误。
- 检查输入时钟频率,确保分频比支持目标波特率。例如,50 MHz 时钟支持 115200 bps 的分频比约为 27。
4.2 电平转换
- FPGA 的 UART 引脚通常为 3.3V 或 1.8V 逻辑电平。
- 若连接 RS-232 设备(±12V),需使用电平转换芯片(如 MAX3232)。
- 确保外部设备与 FPGA 的电平兼容。
4.3 时钟域管理
- AXI UART Lite/16550 使用 AXI 时钟,确保与系统时钟同步。
- 若 UART 数据进入其他时钟域,需使用异步 FIFO 或同步器处理跨时钟域问题。
4.4 中断与轮询
- 中断模式:适合高吞吐量应用,减少 CPU 轮询开销。
- 轮询模式:适合简单设计,查询状态寄存器以检查数据是否准备好。
- 配置中断时,确保中断控制器(如 AXI Interrupt Controller)正确连接。
4.5 仿真与验证
- 使用 Vivado 仿真器测试 UART IP。
- 测试场景:
- 发送和接收连续数据。
- 不同波特率下的通信。
- 错误帧(如奇偶校验错误)。
- 中断触发行为。
- 使用逻辑分析仪或串口调试工具(如 PuTTY、Tera Term)验证硬件行为。
5. 常见问题与解决
问题 | 可能原因 | 解决方法 |
---|---|---|
数据乱码 | 波特率不匹配 | 确保 FPGA 和外部设备波特率一致 |
无法接收数据 | RX 引脚未正确连接或电平不匹配 | 检查引脚分配和电平转换电路 |
发送数据丢失 | FIFO 溢出或 AXI 总线时序错误 | 检查 AXI 时钟和 FIFO 状态 |
中断未触发 | 中断未启用或中断控制器配置错误 | 检查 IP 配置和中断连接 |
时序违例 | 时钟频率过高或未优化约束 | 添加时序约束,降低时钟频率 |
6. 设计工具推荐
- SZ901 :
SZ901 是一款基于XVC协议的FPGA网络下载器。- 最高支持53M
- 支持4路JTAG独立使用
- 支持端口合并
- 支持国产FLASH烧写
- 下载器无限扩展
- 配备专属程序固化软件,一键烧写,能大大减小程序固化时间!