- 前言
之前主要都在做FPGA算法層面的東西,最近覺得對於接口方面的知識比較欠缺,打算以PCI-E為例來系統的學習一下接口方面的知識。
- PCI-E全稱PCI Express,是一種高速總線技術。各種PCI-E設備通過PCI-E協議互相連接,形成PCI-E系統,其拓撲結構如下所示:

其中,根聯合體是連接CPU,主儲存器到PCI-E總線結構的設備,相當於PCI系統中的北橋。FSB為Front Side Bus,是連接CPU與北橋的總線。可以根聯合體上延伸出多個PCI-E接口。交換開關也可以引出多個PCI-E端口,從而連接更多的PCI-E端點設備。這里的端點設備也類似於顯卡等PCI-E設備,可以是網卡,藍牙設備,硬盤等。PCI-E-PCI橋保證了PCI設備也能接入PCI-E系統,增加了兼容性。
- 下面分析PCI-E的傳輸協議
PCI-E協議規定采用三層分層協議來實現數據的傳輸,類似於網絡通信中的TCP/IP通信協議,如下圖所示:

上圖展示了PCI-E設備A喝PCI-E設備B的通信協議,其中設備核和設備核接口可以簡單的理解為應用層和應用層的接口,我們主要關心的是下面的三層,即事務層(TL層),數據鏈路層(DL層)和物理層(PL層)。
PCI_E設備之間通過數據包的形式進行傳輸,因此可以將三層的數據包分別表示為TLP(Transcation Layer package),DLLP和PLP。PCI-E設備發送端首先通過應用層和應用層接口傳輸TLP對應協議的數據格式給TL層,隨后DL層對TLP進行二次打包形成DLLP在傳輸到PL層,PL層對數據DLLP進行編碼后通過模擬信號來進行傳輸,接收端進行逆向操作得到最后的TLP,並最終解碼成應用層需要的數據。
- TL層為數據添加包頭(Header)和ECRC,這里的ECRC表示(End to end CRC),表示事務層的校驗CRC編碼。一個TLP如圖所示:

Header是TLP的核心部分,其大小主要在3DW或4DW(12字節或16字節,96bit or 128bit),以4DW(128bit為例),其DW0~DW3的結構如圖所示:

以DW0為例,DW0[9:0]表示數據長度(length),其最大值為1DW*2^10 = 4KB;DW0[13:12]表示數據包的屬性,DW0[13] == 1表示使能PCI-X式的寬松排序,DW0[12] == 1表示不要求系統硬件去監控Cache;DW0[22:20]可以設置TC0~TC7四種不同的狀態,默認TC0,用於流量控制;DW0[16] TD==1表示TLP包含ECRC;至於DW0[30:29]的Fmt和DW0[28:24]的Type,主要負責配置寄存器的一些讀寫請求和配置,如下表所示:

除此之外還有很多字段是根據不同的TLP類型而變化的,具體的可以配置TLP可以查詢:PCI_Express_Specification這本PDF第二章。
- DL層介於TL層和PL層,在發送端對TLP進行打包后發送到PL層,接收端則對PL層接包在傳輸到TL層,一個DL層傳輸的Package如下圖所示:

DL層主要實現了三個功能:數據交換;錯誤檢測/重試;初始化以及電源管理。
在錯誤檢測/重試功能的實現中,DL層通過為TLP添加了Sequence Number和LCRC來實現。需要注意的是,PCI-E 設備B的DL層在接收到對應的Package時需要,返回一個應答包來確認或否定確認,即Ack/Nak DLLP,如下所示:

除此之外,根據不同的用途,DLLP可以分為很多種,大致可以分為四種常用類型,即對TLP的應答包—Ack/Nak DLLP,電源管理DLLP,流控制DLLP以及廠商自定義DLLP,分別如下所示:




其中,Ack/Nak DLLP中的Ack和Nak分別表示確認Sequcence Number——成功收到一定數量的TLP和否定確認Sequcence Number——來啟動重試功能;fig3-6中的FC1表示流控制(Flow Control);fig 3-9中的PM表示Power Management。關於Byte 0[31:24]表示DLLP Type字段,其各個字段的編碼以及對應功能如下標所示:

除了上述功能,DL層還提供了數據完整性檢查和CRC校驗等功能,具體可以參考 PCI_Express_Specification第三章。
- 發送端PL層將DL層過來的package進行編碼並發送,其中涉及邏輯子模塊和電氣子模塊。邏輯子模塊將上層的數據處理后送入電氣層,在邏輯層對上層傳輸過來的Package進行的操作主要是添加一個幀頭和幀尾:

一個完成的PCI-E發送-接收模型如下圖所示:

PCI_E協議的總體介紹到這里就告一段落了,如果以上協議的邏輯部分通過FPGA去純擼代碼實現感覺還是比較困難的,后面有空再去研究一下xilinx 的IP實現。