關於Xilinx PCIE DMA的問答

關於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連續採集,基本可以滿足大部分高速採集卡傳輸需求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章