PCI Express(PCIe)是一種高性能互連協議,可應用于網絡適配、圖形加速、服務器、大數據傳輸、嵌入式系統等領域。PCIe協議在軟件層上可兼容于PCI和PCI—X,但同時也有明顯的不同。在兩個設備間,其是一種基于數據包、串行、點對點的互連,因此所連接設備獨享通道帶寬。根據使用的版本號和通道數,其性能具有可擴展性。對于PCIe 2.0,每條通道在每個方向上的數據傳輸速率是5.0 Gbit·s-1。從PCIe×1~PCIe×16,能滿足一定時間內出現的低速設備和高速設備的需求。
Altera提供了兼容于PCIe 1.0和PCIe 2.0的解決方案,無論是作為根節點還是端點,都可以通過嵌入在FPGA內部的可配置硬核IP模塊實現,而不占用可編程資源,這既節省了資源也提高了應用的可靠性。Altera的IP編譯器可以提供×1,×2,×4,×8的通道接口。本文主要介紹采用Cyclone IV GX系列的FPGA來實現×4的PCIe接口所涉及的硬件電氣規范、協議規范等。
1 PCIe總線體系和Cyclone IV GX
1.1 PCIe總線體系概述
PCI Express是一種基于數據包、串行、點到點的高性能互連總線協議。其定義了一種分層的體系結構,包括軟件層、處理層、數據鏈路層和物理層。其中軟件層是保持與PCI總線兼容的關鍵,PCIe采用與PCI和PCI—X相同的使用模型和讀寫通信模型。支持各種常見事物,如存儲器讀寫事物,IO讀寫事物和配置讀寫事物。而且由于地址空間模型沒有變化,所以現有的操作系統和驅動軟件無需進行修改即可在PCIe系統上運行。此外PCIe還支持一種稱為消息事物的新事物類型。這是由于PCIe協議在取消了許多邊帶信號的情況下,需要有替代的方法來通知主機系統對設備中斷,電源管理,熱插拔支持等進行服務。
1.2 Altera Cyclone IV GX系列FPGA
Cyclone IV GX FPGA采用Altera成熟的GX收發器技術,具有出眾的抖動性能和優異的信號完整性。利用靈活的收發器時鐘體系結構,可充分利用收發器所有可用資源,實現多種協議。Cyclone IV GX FPGA為根端口和端點配置的PCI Express×1、×2和×4提供唯一的硬核知識產權(IP)模塊。因此不用再接入其他專用的PCIe協議芯片,即可實現端到端的高速數據傳輸。
Cyclone IV系列的FPGA還支持一系列外部存儲器,包括DDR2 SDRAM,DDR SDRAM,QDR SDRAM。Altera可提供速度最快、效率最高、最低延遲的存儲器控制器,使得FPGA可以接入現有的更高速的存儲器件。專用的DQS和DQ引腳在芯片級的布線上進行優化以減少抖動和增大余量上,且固定在芯片四周的特定位置。高速外部存儲器在眾多應用中是重要的系統組成部分,如視頻圖像處理,數據通信與存儲,以及DMA等。
2 板級系統和部分走線阻抗
2.1 板級系統
充分利用FPGA左右兩側的存儲器接口,分別掛兩片Micron的DDR2 SDRAM顆粒,作為DMA緩存。FPGA的下側是高速收發器接口,共有4組GXB[3:0],分別經差分鏈路接入PCIe ×4金手指。其中GXB[3:2]是復用接口,通過改變T節點的耦合電容,可接入兩路高速ADC。FPGA上側接口包括USB PHY、千兆以太網PHY、串口、SD卡以及VGA接口等。FPGA有3個時鐘輸入,分別是:(1)來自PCIe接口的參考時鐘PCIE_REFCLK。(2)來自專用時鐘模塊的GXB_REFCLK。(3)來自25 MHz有源晶振的SYM_CLK。
2.2 關鍵走線的阻抗控制
圖2是PCB疊層結構示意圖,其中L1,L3,L6,L8是信號層;L2,L7是地層;L4,L5是電層。信號層分別參考臨近的地層或電源層。其中PCIe鏈路僅在L1和L8布線,基于以上疊層結構,確定PCIe接口的100 Ω差分阻抗走線的線寬和線間距分別為4 mil(1mil=0.0254 mm)和8.1 mil,差分線長容差在5 mil之內。
DDR2 SDRAM的布線按照SSTL_18標準,DQ/DQS信號在L3和L6層,確定50 Ω單端走線線寬5.3 mil,等長控制在10 mil之內。時鐘走線是100 Ω差分阻抗,布線時放在頂層和L6層。在時鐘走線過孔附近打上接地過孔,作為信號回流路徑,以盡量減少阻抗不連續對信號完整性造成的影響。
3 PCIe應用層設計方案及仿真
3.1 PCIe IP核結構
Altera的PCIe硬核IP包含處理層,鏈路層和物理層所要求的全部功能,以及大多數的可選功能。只需在IPCompiler中經過簡單的參數設置即可生成全功能的IP模塊,如果是作為端點設備,可以使用Avalon-ST接口或Avalon—MM接口適配器,將應用層映射為處理層的TLP。Avalon—ST適配層將應用層的Avalon—ST接口映射到PCIe處理層的TLPs。
3.2 應用層設計
圖4左側是應用層的方案圖,主要包含配置模塊、硬核IP模塊、時鐘管理模塊、DMA讀寫控制與仲裁模塊、任務驅動模塊等5部分。
設計采用64位Agalon—ST接口,這樣供應用的層使用的時鐘pld_clk與內核時鐘同頻。TLPs分為Header、PayLoad和ECRC 3部分。其中TLP的數據包頭指出了數據包的類型,路由方式,有效載荷長度,目標地址,設備ID,功能ID,總線ID等內容,而數據包后還可生成與校驗有關的ECRC信息,這些特征均有助于增強傳輸過程中數據的完整性與可靠性。圖5是一個以4雙字長度為例的數據接收的時序圖,其中rx_st_data和tx_st_data表示64位寬度的讀寫數據端口,rx_st_sop和tx_st_sop表示數據包起始標志,rx_st_eop和tx_st_eop表示數據包結束標志。應用層可根據這些數據和標志位實現TLP接收與發送同步。
設計中還包括鏈式DMA,用于FPGA外部存儲與系統存儲器的數據傳輸。通過DMA訪問外部存儲器的最大優勢在于,CPU配置完DMA狀態機后可繼續執行其他指令操作,然后DMA狀態機會通過請求PCIe總線中斷的方式來完成數據傳輸。在用DMA時需要設置兩個基址BAR2和BAR3最小為256 Byte。DMA主要分為讀操作、寫操作以及仲裁3部分。初始條件下,DMA處于復位狀態,通過讀取DMA信息標示符來判斷當前是否處于空閑狀態,并從FPGA內部讀取DMA控制信息,并相應的進入讀操作或寫操作。以CPU寫FPGA外部存儲器為例,CPU通過PCIe總線寫BAR0地址數據來配置并開啟DMA Engine。FPGA將發出對CPU的DMA讀請求,然后等待CPU發送DMA數據。此時DMA Engine處于WAIT_FOR_DATA狀態,等待來自PCIe接口的DMA數據包。同樣,CPU讀FPGA外部存儲器時,FPGA將發出對CPU的DMA寫請求,并當DMA完成讀操作后,等待PCIe接口發送DMA數據包,并由中斷標志位判斷是否開啟PCIe中斷。狀態轉移如圖6所示。
在端點存儲器方面,2片16位的DDR2 SDRAM并接構成一個32位的FPGA片外存儲器,并根據DDR2SDRAM芯片手冊在Altmemphy向導中配置好相關時序與延遲參數,即可生成DDR2 SDRAM控制器。在做電路圖設計時,由于引腳驅動能力的問題,關鍵是FPGA對DDR2 SDRAM的引腳在連續的區域內不能超過一定數量,最好能約束引腳區域,全編譯一遍后由軟件自由分配,再由人工作適當調整,直到沒有嚴重警告。
3.3 數據收發仿真測試
當用PCIe IP Compiler創建一個PCIe的硬核IP時,會生成一個用戶可修改的測試文件頂層以及根聯合體模型。這樣就對測試應用層接口功能提供了一個簡單的途徑,只需在測試文件中做一個模塊例化,即可構建一個簡單的PCIe系統測試平臺。
如上共15個寄存器,其中tl_cfg_add和tl_cfg_ctl分別表示要更新的寄存器地址和對應的寄存器數據,tl_cfg_sts是配置的狀態。利用tl_cfg_ctl_wr和tl_cfg_sts_wr的跳變邊沿,由此可知對應寄存器的內容已發生更新,以此來確定數據的安全采樣時機。
如上信號tx_st_sop0的跳變啟動了一個TLP數據包的開始。應用層參考tx_stream_read0信號開始往數據端口寫入數據,其中前兩個數據是TLP的包頭。分解成雙字格式為:0x40000020,0x010800ff,0x000001880和0x00000000。即這是一個32位地址的寫存儲器TLP,數據長度為32雙字。當tx_stream_read0變為低電平2個周期后應停止寫入數據,直到tx_stream_read0再次變為高電平2個周期后可繼續寫入數據。
如上信號rx_st_sop0出現高電平表明一個TLP數據包的開始。rx_st_data0的前兩個數據是TLP的數據包頭,分解為雙字后是:0x4a000020,0x00000080,0x01080270和0x000 00000。由這些包頭信息可知這是—個帶數據的完成TLP,完成者ID是0x0000,請求者ID是0x0108。且其后含有32個雙字的數據,第一個雙字是0xaaa00001,第二個雙字是0xaaa 0002,直到0xaaa0020。rx_st_eop0在最后一個數據0xaaa0020aaa001f出現時發生跳變,表明TLP數據包結束。
4 結束語
仿真結果表明,使用Altera Cyclone IV GX系列FPGA搭建的PCIe接口能夠方便地實現高速數據傳輸應用。隨著器件的發展和IP核的開發,多通道的PCIe總線技術將會迅速發展,并對大數據、高速數據提供安全可靠的傳輸管道。
評論