毋高峰
(焦作師范高等專科學校,河南 焦作 454000)
PCI Express 總線(以下簡稱“PCIe”)總線采用點對點串行連接方式,使用高速差分信號線傳輸數據,提高了抗干擾能力,保障了數據傳輸的完整性和可靠性,同時也可以根據設計性能需求,將一個PCIe 物理鏈接靈活地配置成x1、x2、x4、x8、x16 及x32 多種鏈路模式,以及PCIe 1.0、PCIe 2.0、PCIe 3.0、PCIe 4.0和PCIe 5.0 不同的比特率[1]。其層次結構分明,從上到下分為事務傳輸層(Transaction Layer)、數據鏈路層(Data Link Layer)和物理層(Physical Layer),PCIe層次結構如圖1 所示。事務傳輸層將設備核心層的數據和請求封裝成TLP(Transaction Layer packet)數據包發送給數據鏈路層,并解析出來自數據鏈路層的TLP 數據包上報給設備核心層;數據鏈路層通過發送和接收DLLP(Data Link Layer packet)實現Ack/Nak應答處理機制,實現數據包的鏈路層校驗和流控管理,同時將來自事務傳輸層的TLP 添加前綴和后綴發送到物理層,將來自物理層的數據包刪除前綴和后綴上報給事務傳輸層;物理層完成數據流的加解擾、編解碼和串并轉換,實現將數據鏈路層的數據包以比特流的形式通過物理鏈路發送到對端物理層,并將來自對端物理層的比特流轉換成數據包上報給數據鏈路層,同時物理層還要負責鏈路的協商。

圖1 PCIe 層次結構圖
PCIe 總線是基于請求和響應的通信機制,設備A要訪問設備B 的內存,則設備A 要向設備B 發送一個請求,而設備B 需要一個完成向設備A 反饋請求結果。作為PCIe總線結構最高層的事務傳輸層則是負責請求和響應TLP 的生成,一個完整的TLP 由1 個或者多個TLP Prefix、TLP 頭(Header)、1 個可選數據負載(Payload)以及1 個可選的端到端CRC(ECRC)組成[2]。Header 指定事務類型、優先級、路由信息及其它數據包特征,TLP Header 如圖2 所示,數據負載是TLP 要傳輸的數據,長度最小為0,最大為1 024 DW,而ECRC 是對TLP 傳輸正確性的校驗。

圖2 TLP Header 數據格式
為了充分利用PC 內存,減少數據傳輸延時,PC軟件程序采用循環隊列緩存DMA 讀寫的關鍵信息,DMA 控制器讀取循環隊列,開啟DMA 的讀寫操作,進行數據傳輸。循環隊列是由多個元素組成的一個首尾相連圓環,如圖3 所示,在循環隊列結構中,當隊列的最后一個存儲單元已被使用,想要再插入新的元素時,只有當隊列的第一個存儲單元空閑時,才可將新元素插入到第一個存儲單元,即將隊列的第一個存儲作為隊尾。循環隊列是通過2 個指針front 和rear 判斷隊列的空滿防止隊列溢出的。

圖3 循環隊列示意圖
DAM 控制器是基于PCIe IP 硬核,添加對事物傳輸層數據包TLP 的收發控制,來實現FPGA 和PC 之間的數據高速傳輸。本設計是由PC 申請2 個獨立的內存空間,搭建出DMA 的讀寫循環隊列,循環隊列的front 和rear 指針分別由FPGA 和PC 控制。在進行數據傳輸時,PC 在循環隊列中插入DMA 讀寫的描述符,并更新循環隊列指針,FPGA 通過存儲器讀TLP 獲取描述符,發起DMA 讀寫操作實現數據從PC 到FPGA之間的數據傳輸,數據傳輸完成后,FPGA 更新循環隊列指針,結束此次DMA 讀寫操作。
PC 申請一段物理地址連續的內存空間[3],填充需要發送的數據,將數據長度和內存地址封裝成DMA讀描述符插入到DMA 讀隊列中,DMA 讀描述符如圖4 所示[4],更新DMA 讀隊列front 指針,并發送存儲器寫請求TLP 將front 指針發送給FPGA;FPGA 接收到DMA 讀隊列的front 指針,封裝存儲器讀請求TLP,將DMA 讀描述符從PC 中讀出,然后解析出DMA 讀描述符中的內存地址和數據長度,按照PCIe 總線協商的最大讀取長度,向PCIe 總線發起一個或多個存儲器讀請求TLP,接收讀完成TLP 將數據從內存中搬移到FPGA;數據搬移完成后,FPGA 更新DMA 讀隊列rear指針,發起DMA 寫請求,TLP 將rear 指針發送給PC,完成了一次PC 到FPGA 的數據傳輸。

圖4 DMA 讀描述符數據格式
PC 申請一段物理地址連續的內存空間,將內存地址封裝成DMA 寫描述符插入到DMA 寫隊列中,DMA寫描述符如圖5 所示,更新DMA 寫隊列front 指針,并發送存儲器寫請求TLP 將front 指針發送給FPGA;FPGA 接收到DMA 寫隊列的front 指針,封裝存儲器讀請求TLP,將DMA 寫描述符從PC 中讀出,緩存到FIFO 中;FPGA 需要發送數據時,將DMA 寫描述符從FIFO 中讀出并解析,按照PCIe 總線協商的最大負載能力,向PCIe 總線發起一個或多個存儲器寫請求TLP,將數據寫入到PC 申請好的內存中;在數據包完全發送后,FPGA 更新DMA 寫隊列rear 指針,并發起DMA 寫請求TLP 將rear 指針發送給PC,通知PC 數據傳輸完,完成了一次FPGA 到PC 的數據傳輸。

圖5 DMA 寫描述符數據格式
根據上述的DMA 控制器的設計方案,硬件設計采用DMA 讀操作和DMA 寫操作2 個單獨的通道,如圖6 所示,來實現DMA 控制器,共分為TLP 接收模塊、TLP 發送模塊、存儲器讀控制模塊、存儲器寫控制模塊、DMA 讀隊列讀取模塊、DMA 讀數據模塊,DMA 寫隊列讀取模塊和DMA 寫數據模塊[5]。

圖6 DMA 控制器硬件實現框圖
TLP 接收模塊實現對來自PCIe IP 硬核事務傳輸層接口TLP 的接收控制,并對TLP 數據包進行解析。該模塊有2 個單獨的控制通道CQ 接口和RC 接口[6],CQ 接口通道接收PC 到FPGA 的存儲器寫TLP,實現對FPGA 內部的寄存器的配置;RC 接口通道接收PC到FPGA 的讀完成包TLP,并根據TLP 攜帶的tag 號,將讀完成包的數據發送給存儲器讀的請求者,實現將數據從內存到FPGA 的搬移。
TLP 發送模塊實現向PCIe IP 硬核事務傳輸層接口的TLP 發送控制。該模塊分別從存儲器讀控制模塊和存儲器寫控制模塊獲取已封裝完成的TLP 數據包,向PCIe 總線發送存儲器讀寫請求。
存儲器讀控制模塊實現存儲器讀請求TLP 的封裝和發送控制,該模塊輪詢讀取DMA 讀隊列模塊、DMA讀數據模塊和DMA 寫隊列模塊FIFO 中的數據,解析出存儲器讀請求TLP 所需的內存地址和數據長度,添加tag 號,封裝成存儲器讀請求TLP,傳輸給TLP 發送模塊,并將存儲器讀的請求者和對應的tag 號記錄下來,發送給TLP 接收模塊。
存儲器寫控制模塊實現存儲器寫請求TLP 的封裝和發送控制,該模塊獲取DMA 寫數據模塊FIFO 中的數據,獲取存儲器寫請求TLP 的內存地址和數據長度以及要發送的數據,封裝成存儲器寫請求TLP,發送給TLP 發送模塊。
DMA 讀隊列讀取模塊實現讀取DMA 讀隊列的信息生成,該模塊查詢DMA 讀隊列的空滿狀態,判斷是否需要發起DMA 讀操作,當DMA 讀隊列不空時,則可以生成存儲器讀信息,發起存儲器讀請求,獲取讀描述符,將描述符緩存到FIFO 中。
DMA 讀數據模塊實現DMA 讀數據信息的生成和DMA 讀隊列rear 指針的控制,該模塊讀取DMA 讀隊列讀取模塊中的描述符緩存FIFO,解析出描述符中的數據地址和長度,并對數據長度進行最大為512 字節分片處理,然后依次將數據地址和長度封裝成DMA讀的信息寫入FIFO 中,發送給存儲器讀控制模塊,其中每寫入一個DMA 讀信息,地址要遞增512,數據長度遞減512;當讀取的數據依次從TLP 接收模塊接收完成后,則將DMA 讀隊列rear 指針遞增1,并主動發起一次存儲器寫TLP 將rear 指針發送給PC。
DMA 寫隊列讀取模塊實現讀取DMA 寫隊列的信息生成,該模塊查詢DMA 寫隊列的空滿狀態,判斷是否需要發起DMA 寫操作,當DMA 寫隊列不空時,則可以生成存儲器讀信息,發起存儲器讀請求,獲取寫描述符,將描述符緩存到FIFO 中。
DMA 寫數據模塊實現DMA 寫數據信息的生成和DMA 寫隊列rear 指針的控制,該模塊讀取DMA 寫隊列讀取模塊中的描述符緩存FIFO,解析出描述符中的數據地址,并對要發送的數據長度進行最大為256 字節分片處理,然后依次將數據地址、長度和數據封裝成DMA 寫的信息寫入FIFO 中,發送給存儲器寫控制模塊,其中每寫入一個DMA 寫信息,地址要遞增256,數據長度遞減256;當待發送數據完整發送后,DMA寫隊列rear 指針遞增1,并主動發起一次存儲器寫TLP將rear 指針發送給PC。
控制器的驗證采用的是Xilinx XCKU040 FPGA,PC 采用DELL 7050 臺式主機,其中FPGA 開發環境為Vivado 2018.3,本設計采用PCIe 3.0x4 IP 硬核,用戶時鐘為250 MHz,用戶數據位寬為128 bit,理論上最大速率為32 Gbps。本設計采用LINUX 系統,搭建PCIe 測試的上位機程序,經大量的測試表明,DMA控制器的穩定性得以驗證;性能測試采用的是2 KB 大小的隨機數據,通過計算固定時間內傳輸的數據包個數計算出該控制器的DMA 讀操作帶寬為23.8 Gbps,DMA 寫操作帶寬為25.2 Gbps。
本文闡述了DMA 控制器的設計和實現方法,提出了一種基于PCIe 3.0 IP 硬核的DMA 高速傳輸方案,通過對DMA 讀寫操作的控制的實現,完成了FPGA和PC 之間數據的高速傳輸,本設計可為數據存儲、高清視頻傳輸和信息安全等采用CPU+FPGA 架構方案的產品提供良好的參考。