關於Xilinx PCIE DMA的問答
很久沒上部落格園了,但由於之前在部落格園寫了幾篇關於PCIE DMA的文章,很多同學給我發訊息詢問相關知識點,之前有空的時候都是語音一小時跟人細講,最近由於工作繁忙,有回覆不周的,敬請諒解。綜合大家提出的問題,對其中幾個有代表性的問題,在這裡做一下統一回復。
問:PCIE DMA主要用來做什麼?
答:PCIE DMA主要用來解決資料在FPGA和PC之間高速通訊的問題
問:學習PCIe,應該從什麼地方起步?
答:分研究型和應用型,研究型從XAPP1052起步,應用型從XDMA起步
問:XILINX提供了三種PCIE IP核,各有什麼區別?
答:第一種 7 Series Integrated Block for PCI Express,這個是最基礎的PCIE硬核,實現的是PCIE的物理層、鏈路層和事務層,提供給使用者的是以AXIS介面定義的TLP包。使用者如果要往PC發資料,就要在邏輯端組好MEM_WR事務包送到AXIS介面上,同樣要從PC獲取資料,就要傳送MEM_RD事務包,然後獲取到COMPLETE事務包,再從COMPLETE事務包中提取出資料。要用這個IP核,需要對PCIE協議有清楚的理解,如果你只是想用PCIE傳輸資料,又不想去深究協議,那麼建議您使用其餘兩個IP核。第二種 AXI Memory Mapped To PCI Express,這個是本人最喜歡用的PCIE IP核,它的作用就是一座橋,一座FPGA端直通上位機記憶體的橋,使用者如需讀寫上位機記憶體空間,只需要操作這個IP核的S_AXI介面,就可以像讀寫普通AXI介面的BRAM/DDR一樣讀寫上位機記憶體,對於採集卡而言,FPGA收到AD資料後,只需要根據上位機配下來的寫記憶體地址暫存器,就可以將資料以 AXI Memory介面標準發往上位機,然後產生中斷讓CPU從相應記憶體地址去取資料就好了,這種IP就省卻了組事務層包的煩惱,你只要把資料發上去就好了,組包的事IP會解決。第三種 DMA/Bridge Subsystem for PCI Express (PCIe),俗稱XDMA,這個IP核更狠,不但把事務層的組包解包做了,還把DMA的事也一塊兒做了,俗稱傻瓜式PCIe傳輸,為了徹底解放邏輯工程師,它甚至把PC端的驅動都幫你寫好了,一經推出就是受到了廣大FPGA工程師的歡迎。
問:XDMA那麼好用,它有什麼侷限嗎?
答:XDMA是好用,但卻是把雙刃劍,使用過的工程師會發現這個XDMA只有M_AXI介面,沒有像上述第二個PCIE IP一樣的S_AXI介面,這說明什麼問題?說明所有的PCIE讀寫請求只能由上位機發起!FPGA端無法主動發起讀寫請求。有人問為啥要做成這樣,我認為可能是為了系統穩定,控制權必須牢牢掌握在官方驅動手裡。要是任由FPGA主動訪問記憶體,分分鐘就當機了。又有同學問,為啥AXI Memory Mapped To PCI Express這個IP核可以由FPGA主動發起讀寫請求,那是因為用這個IP的人都是自己寫驅動的,這些高階玩家不會傻到把不能訪問的地址空間分配給FPGA。
問:XDMA的效率怎麼樣?
答:XDMA效率其實還可以,實測傳輸頻寬大約在滿頻寬的70%-80%左右。
問:XDMA官方驅動好用嗎?
答:BUG有一些,但基本可用。本人試用過16 17 18三個版本的驅動,目前相對穩定的是18版本。Linux驅動主要問題在中斷處理上,硬體觸發了中斷,驅動也進了中斷服務程式,但進去後卻找不到對應的使用者中斷,所以需要在硬體端增加中斷持續時間,本人給出的建議是一直拉著中斷直到上位機識別到使用者中斷後,通過寫暫存器來清中斷。還有不要聽信使用者手冊上的建議,用AXI_LITE介面來配置使用者側的暫存器,因為驅動上這個介面讀寫延遲非常不穩定,親測從幾微秒到幾毫秒都有!建議使用BYPASS介面來配置暫存器。WIN驅動上bug就更多了,網上隨便一搜就能搜到。本人稍微改動了一些程式碼,目前在MM模式下讀寫效率還是可以的,也在70%-80%。
問:XDMA可以用來做高速資料採集卡嗎?
答:可以,但有較多限制。首先需要有高速的板載DDR,最好上DDR4,因為資料需要先進到板載DDR做快取,然後觸發中斷,讓CPU發起DMA讀請求,把資料從板載DDR讀到上位機記憶體。如果是連續資料採集,意味著FPGA要不間斷得寫DDR,同時PC也在不間斷得讀DDR,試想250M時鐘128位寬的取樣資料,進DDR的速率是4GB/s,出DDR的速率是4GB/s,同時讀寫也就是要達到8GB/s的吞吐率,請問你的板載DDR準備好了嗎?其次CPU不能太爛,因為是高速採集卡,資料不間斷採集的時候中斷是很頻繁的,CPU要是中斷處理不過來會很麻煩,而且CPU要是不行,後端資料來不及處理,那麼在FPGA板載DDR的地方就會出現進資料快,出資料慢的問題,丟資料就在所難免。最後FPGA器件等級也很重要,器件等級越高,XDMA支援的PCIe傳輸頻寬就越大,目前最高16x gen3,傳輸頻寬越大,CPU就能更快得把資料從板載DDR中取走,避免資料覆蓋。目前本人在KC705開發板上可以做到2.5GB/s連續採集,基本可以滿足大部分高速採集卡傳輸需求。