在Xilinx Kintex-7系列FPGA上實現PCIe(Peripheral Component Interconnect Express)接口,通常使用Xilinx提供的7 Series Integrated Block for PCIe IP核,結合Vivado設計流程。以下是實現PCIe接口的詳細步驟和關鍵點,適用于Kintex-7 FPGA(如XC7K325T)。
1. 準備工作
- 硬件需求:
- Kintex-7 FPGA,支持PCIe Gen1(2.5 GT/s)或Gen2(5.0 GT/s),具體取決于型號和速率要求。
- 開發板(如KC705,支持PCIe x8 Gen2)或自定義PCB,確保PCIe差分信號(TX/RX)布線滿足信號完整性要求(差分阻抗100Ω、長度匹配等)。
- PCIe參考時鐘(通常100 MHz差分時鐘,HCSL標準)。
- 工具需求:
- Vivado Design Suite(建議2020.2或更新版本)。
- 開發板的支持包(如KC705的XDC文件)。
- 參考文檔:
- Xilinx PG054(7 Series FPGAs Integrated Block for PCI Express用戶指南)。
- Kintex-7數據手冊(DS182)。
- PCIe Base Specification(3.0或更早版本,視Gen1/Gen2需求)。
- Xilinx XAPP1052(PCIe參考設計)。
2. 配置PCIe IP核
Xilinx 7 Series FPGA集成了硬核PCIe模塊,Vivado的IP核可簡化配置。
步驟:
-
創建Vivado項目:
- 打開Vivado,創建新項目,選擇目標Kintex-7 FPGA型號。
- 導入開發板的引腳約束文件(XDC)。
-
添加PCIe IP核:
- 在Vivado IP Catalog中搜索“7 Series Integrated Block for PCI Express”,雙擊添加。
- 在IP配置界面:
- 基本設置:
- 選擇PCIe版本(Gen1或Gen2,Kintex-7不支持Gen3)。
- 配置Lane寬度(如x1、x4、x8,取決于硬件支持和帶寬需求)。
- 設置最大速率(Gen1=2.5 GT/s,Gen2=5.0 GT/s)。
- 設備角色:
- 選擇Root Port(主機)或Endpoint(設備),通常為Endpoint。
- BAR配置:
- 配置Base Address Registers(BAR),定義內存或IO空間大小(如64 KB內存BAR)。
- 啟用32位或64位尋址,視應用需求。
- 參考時鐘:
- 配置100 MHz PCIe參考時鐘(
sys_clk
),通常由外部提供。
- 配置100 MHz PCIe參考時鐘(
- 用戶接口:
- 選擇AXI-Stream接口(推薦,簡化數據傳輸)。
- 設置AXI數據寬度(如64位或128位,匹配Lane寬度和性能需求)。
- ID設置:
- 配置Vendor ID、Device ID、Class Code等,符合PCIe規范。
- 其他選項:
- 啟用MSI(Message Signaled Interrupts)或Legacy中斷,視驅動需求。
- 基本設置:
-
引腳分配:
- 配置PCIe差分信號(
pcie_7x_mgt_rxn/p
、pcie_7x_mgt_txn/p
)到FPGA的GTX收發器引腳。 - 分配參考時鐘引腳(
sys_clk_p/n
)和復位信號(sys_rst_n
)。 - 確保引腳分配與開發板或PCB一致,參考XDC文件。
- 配置PCIe差分信號(
-
生成IP核:
- 完成配置后,點擊“Generate”生成PCIe IP核。
- 輸出包括:
- PCIe硬核控制器:處理PCIe協議和物理層。
- AXI-Stream接口:用于用戶邏輯與PCIe核心交互。
- 例化模板:Verilog/VHDL代碼,指導用戶邏輯集成。
3. 用戶邏輯設計
PCIe IP核通過AXI-Stream接口與用戶邏輯交互,傳輸數據包(TLP,Transaction Layer Packet)。
關鍵接口信號:
- AXI-Stream接收(RX):
m_axis_rx_tdata
:接收數據。m_axis_rx_tvalid
:數據有效。m_axis_rx_tready
:用戶邏輯準備好接收。m_axis_rx_tuser
:附加控制信息(如SOP、EOP)。
- AXI-Stream發送(TX):
s_axis_tx_tdata
:發送數據。s_axis_tx_tvalid
:數據有效。s_axis_tx_tready
:PCIe核心準備好接收。s_axis_tx_tuser
:控制信息。
- 配置接口:
cfg_mgmt_*
:訪問配置空間(如BAR、ID)。cfg_interrupt_*
:中斷控制(如MSI)。
- 狀態信號:
user_link_up
:PCIe鏈路建立指示。user_rst
:用戶邏輯復位。
設計步驟:
- 初始化等待:
- 監測
user_link_up
,確保PCIe鏈路正常建立。
- 監測
- 數據接收:
- 檢測
m_axis_rx_tvalid
,讀取m_axis_rx_tdata
。 - 解析TLP包,提取請求類型(如Memory Read/Write、Completion)。
- 使用狀態機處理不同TLP(如響應讀請求、處理寫數據)。
- 檢測
- 數據發送:
- 構造TLP包(如Completion或Memory Write)。
- 將數據寫入
s_axis_tx_tdata
,置位s_axis_tx_tvalid
。 - 等待
s_axis_tx_tready
確認傳輸。
- 中斷處理:
- 若使用MSI,配置
cfg_interrupt_msi_*
信號發送中斷。 - 若使用Legacy中斷,配置
cfg_interrupt_*
。
- 若使用MSI,配置
- 配置空間:
- 通過
cfg_mgmt_*
接口讀取/設置PCIe配置寄存器(如BAR、Device ID)。
- 通過
典型應用:
- DMA引擎:實現高效數據搬運,結合AXI DMA IP核。
- 內存映射:將FPGA內部BRAM或DDR3映射到PCIe BAR空間。
- 控制接口:通過PCIe傳輸控制命令和狀態。
4. 時鐘和時序約束
- 時鐘配置:
- PCIe參考時鐘(100 MHz)輸入到GTX收發器。
- PCIe IP核生成用戶時鐘(
user_clk
,典型為62.5 MHz、125 MHz或250 MHz,取決于Lane寬度和Gen版本)。 - 使用MMCM/PLL管理其他時鐘域(如DDR3接口)。
- 時序約束:
- PCIe IP核的XDC文件包含GTX和參考時鐘約束。
- 確保用戶邏輯與
user_clk
同步,必要時使用FIFO處理跨時鐘域。 - 運行Vivado Timing Analysis,檢查Setup/Hold違例。
5. 仿真驗證
- 生成仿真模型:
- PCIe IP核提供內置仿真支持,生成PCIe BFM(Bus Functional Model)。
- 在IP配置中啟用仿真選項,生成測試平臺。
- 編寫Testbench:
- 模擬Root Complex行為,發送TLP(如Memory Read/Write)。
- 驗證鏈路建立、數據傳輸、TLP解析和中斷。
- 使用仿真工具:
- 使用Vivado Simulator或第三方工具(如ModelSim)。
- 檢查
user_link_up
、TLP數據完整性等。
6. 硬件調試
- 綜合與實現:
- 綜合、實現設計,生成比特流。
- 確保GTX引腳和參考時鐘分配正確。
- 上板測試:
- 下載比特流到Kintex-7 FPGA。
- 將開發板插入PCIe插槽,啟動主機。
- 使用Vivado Logic Analyzer監測
user_link_up
、m_axis_rx_tdata
等信號。
- 主機端驗證:
- 在主機端加載PCIe驅動(如Linux下使用
lspci
檢查設備)。 - 使用工具(如
memtool
或自定義驅動)測試數據讀寫。
- 在主機端加載PCIe驅動(如Linux下使用
- 錯誤排查:
- 若鏈路未建立,檢查參考時鐘、復位信號、GTX布線。
- 若數據錯誤,驗證TLP格式、BAR配置、時序約束。
7. 性能優化
- Lane寬度和速率:選擇x8 Gen2以最大化帶寬(理論最大4 GB/s)。
- TLP優化:增大TLP payload(受Max Payload Size限制,典型128-256字節)。
- DMA設計:使用Xilinx AXI DMA IP核實現高效批量傳輸。
- 中斷效率:優先使用MSI,減少中斷延遲。
- 流水線處理:優化用戶邏輯,減少AXI-Stream接口的stall。
8. 參考示例
- Xilinx XAPP1052:提供PCIe參考設計,包含DMA和BRAM映射示例。
- KC705參考設計:Xilinx官網提供KC705的PCIe例程,包含Vivado工程和驅動。
- Vivado例程:Vivado安裝目錄(
vivado/data/ip/xilinx/pcie_7x
)包含Verilog/VHDL示例。
注意事項
- 信號完整性:PCIe差分信號為高速信號,PCB布線需滿足長度匹配和阻抗控制。
- 功耗:GTX收發器和PCIe核心功耗較高,確保FPGA電源設計充足。
- 驅動開發:主機端需開發PCIe驅動(如Linux內核模塊),匹配FPGA的BAR和中斷配置。
- 版本兼容性:不同Vivado版本的PCIe IP配置可能有差異,參考PG054。
總結
在Kintex-7 FPGA上實現PCIe接口,核心是使用Xilinx 7 Series PCIe IP核,配置GTX收發器和AXI-Stream接口,結合用戶邏輯實現數據傳輸。流程包括IP配置、邏輯設計、仿真驗證和硬件調試。參考Xilinx文檔和示例工程,可快速搭建PCIe通信系統。