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):
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燒寫
- 下載器無限擴展
- 配備專屬程序固化軟件,一鍵燒寫,能大大減小程序固化時間!