PCIE XDMA 開發環境搭建以及環路測試

kunkliu發表於2020-09-26

軟體版本:VIVADO2017.4

作業系統:Ubuntu16.4 64bit

硬體平臺:適用米聯客 ZYNQ系列開發板

米聯客(MSXBO)論壇:www.osrc.cn答疑解惑專欄開通,歡迎大家給我提問!!

1.1 課程介紹

 

      這一章開始主要介紹 XILINX FPGA PICE IP XDMA IP的使用。XDMA IP使用部分教程分LINUX 篇和WINDOWS篇兩個部分。通過實戰,面向應用,提供給大家 XILINX FPGA PCIE 應用解決方案。

     本教程以MZ7035FA作為樣機測試。在正式開始教程內容前,有必要把MZ7035FA開發板的特點說明下。這是一款高價效比的FPGA開發板。帶PCIE介面,SFP光通訊介面,3路千兆乙太網口,2路SATA介面,1路HDMI輸出,1路串列埠,1路TF卡介面。支援MSXBO(米聯客)FEP標準擴充套件介面。採用的CPU型號為XC7Z035-FFG676。PL端搭載32bit 1024MB DDR3記憶體,PS端搭載32bit 1024MB DDR3記憶體,FPGA讀寫DDR支援的最大資料時鐘為1600M,可以進行很多複雜的開發任務。

      教程的內容完全適合其他開發板。如果讀者使用過程中遇到問題,可以在我們討論課程網頁留言(米聯客(MSXBO)論壇www.osrc.cn答疑解惑專欄開通,歡迎大家給我提問)。我們會在論壇上公佈相關課程內容和原始碼。

1.2 XDMA 概述

 

     Xilinx 提供的DMASubsystem for PCIExpressIP是一個高效能,可配置的適用於PCIE2.0,PCIE3.0 的SG 模式 DMA,提供使用者可選擇的 AXI4 介面或者 AXI4-Stream介面。一般情況下配置成 AXI4 介面可以加入到系統匯流排互聯,適用於大資料量非同步傳輸,通常情況都會使用到 DDR,AXI4-Stream 介面適用於低延遲資料流傳輸。

      XDMA 是SGDMA,並非Block DMA,SG 模式下,主機會把要傳輸的資料組成連結串列的形式,然後將連結串列首地址通過BAR 傳送給XDMA,XDMA 會根據連結串列結構首地址依次完成連結串列所指定的傳輸任務。

1.3 XDMA 提供如下介面:

 

  • AXI4、AXI4-Stream,必須選擇其中一個,用來資料傳輸
  • AXI4-Lite Master,可選,用來實現PCIE BAR 地址到 AXI4-Lite 暫存器地址的對映,可用來讀寫使用者邏輯寄

存器

  • AXI4-Lite Slave,可選,用來將XDMA 內部暫存器開放給使用者邏輯,使用者邏輯可以通過此介面訪問 XDMA

內部暫存器,不會對映到BAR

  • AXI4 Bypass 介面,可選,用來實現PCIE 直通使用者邏輯訪問,可用於低延遲資料傳輸

1.4 XDMA IP 配置

 

Mode:配置模式,選擇 Advanced 高階配置

Lane Width:MZ7035 支援X4

Max Link Speed:選擇5.0GT/s 即PCIE2.0

Reference Clock :100MHZ,參考時鐘 100M

DMA Interface Option:介面選擇 AXI4 介面

AXI Data Width:128bit,即 AXI4 資料匯流排寬度為128bit

AXI Clock :125M,即AXI4 介面時鐘為 125MHZ

PCIE ID 配置

我們配置成 Memory controller 讓 IP 自動選擇VID 等

PCIE BAR 配置,這裡面的配置比較重要

首先使能 PCIE to AXI Lite Master Interface ,這樣可以在主機一側通過PCIE 來訪問使用者邏輯側暫存器或者其他 AXI4-Lite 匯流排裝置

對映空間選擇 1M,當然使用者也可以根據實際需要來自定義大小。

PCIE to AXI Translation:這個設定比較重要,通常情況下,主機側PCIE BAR 地址與使用者邏輯側地址是不一樣的, 這個設定就是進行BAR 地址到AXI 地址的轉換,比如主機一側 BAR 地址為0,IP 裡面轉換設定為 0x80000000, 則主機訪問 BAR 地址 0 轉換到AXI LIte 匯流排地址就是0x80000000

PCIE to DMA Interface :選擇64bit 使能

DMA Bypass 暫時不用

PCIE 中斷設定

User Interrupts:使用者中斷,XDMA 提供16 條中斷線給使用者邏輯,這裡面可以配置使用幾條中斷線。

Legacy Interrupt:XDMA 支援 Legacy 中斷

選擇 MSI 中斷

注意:MSI 中斷和 MSI-X 中斷只能選擇一個,否則會報錯,如果選擇了 MSI 中斷,則可以選擇 Legacy 中斷, 如果選擇了 MSI-X 中斷,那麼 MSI 必須取消選擇,同時Legacy 也必須選擇None。此 IP 對於7 系列設定有這麼 個問題,如果使用Ultrascale 系列,則可以全部選擇

配置DMA 相關內容

Number of DMA Read Channel(H2C)和Number of DMA Write Channel(C2H)通道數,對於PCIE2.0 來說最大 只能選擇 2,也就是 XDMA 可以提供最多兩個獨立的寫通道和兩個獨立的讀通道,獨立的通道對於實際應用中 有很大的作用,在頻寬允許的前提前,一個PCIE 可以實現多種不同的傳輸功能,並且互不影響。這裡我們選擇1

Number of Request IDs for Read (Write)channel :這個是每個通道設定允許最大的 outstanding 數量,按照默 認即可

配置完成以後,點選 Run Block Auto,可以看到之前的配置資訊,如果有發現和目標配置不一樣的,需要手動 修改,點選 OK,完成配置

配置完成以後,VIVADO 會自動進行必要的連線

到此為止,XDMA IP 配置就完成了只要再進行時鐘和 GTP 約束即可。 

1.5 MIG 7 SERIES 的配置

 

Step1:任單擊 IP Catalog,選取 Memory Interface Generator(MIG 7 series)IP 新增到 Block design。雙擊 MIG 7 SERIES ,對這個 IP 進行配置。

雙擊生成的IP核

單擊NEXT

繼續單擊NEXT

選擇DDR3 單擊NEXT

設定MIG 核心時脈頻率為、記憶體型號、記憶體的資料位寬

設定MIG AXI4 最大支援的位寬,對於2片DDR 最大位寬為256bit

設定輸入頻率

 

系統和參考時鐘時鐘選擇no buffer,MIG低電平復位

Step9:終端阻抗選擇50hms,設定DCI

選擇Fixed Pin Out

根據原理圖手動填寫PIN 腳定義,或者選擇Read XDC/UCF直接讀入pin腳定義,本課程下提供了MZ7035.ucf 的DDR 配置檔案,直接讀入既可。

填寫完成後,先單擊Validate再單擊NEXT

繼續單擊NEXT

繼續單擊NEXT

繼續單擊NEXT

繼續單擊NEXT

最後單擊Generate,至此MIG的配置完成

1.6 基礎測試系統搭建

 

      我們的測試目標是進行PCIE AXI4匯流排與外設進行讀寫操作,PCIE AXI4-Lite 匯流排進行使用者邏輯暫存器或者其他 AXI4-Lite 匯流排裝置訪問操作。AXI4匯流排上掛載到MIG控制器DDR上去,實現對DDR的讀寫控制。

      為此搭建系統為下圖所示:

進行地址分配:

      這裡我們把掛在M_AXI上的DDR地址分配從0開始(對於widnows系統必須為0), M_AXI是需要進行DMA操作的。而M_AXI_LITE掛載的BRAM是需要進行BAR空間操作,所以地址設定為0x80000000和XMDA IP裡面設定的地址對應。

 

1.7 LINUX下驅動程式編譯\安裝\測試 

1.7.1 驅動編譯和安裝(下必須重新編譯)

 

官方驅動包選擇 2017 版本以後的,注意 2016 版本的有 BUG!!!

在終端進入到 xdma 目錄,輸入 make ,進行驅動編譯

執行以下指令:

- Change directory to the driver directory.

        cd driver

  - Compile the kernel module driver.

        make

  - Change directory to the tests directory.

        cd tests

  - Compile the provided example software.

        make

  - Copy the provided driver rules from the etc directory to the

    /etc/ directory on your system.

        cp ../etc/udev/rules.d/* /etc/udev/rules.d/

      關於驅動載入,這裡有兩點要說明一下,首先是在驅動載入之前,如果檢測到系統中已經載入過驅動,那麼它會將已經載入的驅動解除安裝,然後再載入。然後就是PCIe DMA的工作方式可以通過載入驅動傳輸引數進行修改。預設情況下DMA工作在中斷模式,可以通過修改load_driver.sh指令碼改為輪循模式如下圖所示,但是可能驅動有問題,實際測試輪詢模式有些程式無法正常執行,所以建議大家不要使用輪詢模式。

      在準備載入驅動前,確保你的開發板已經下載PCIE工程的bit檔案,而且已經重啟過電腦。好了,現在載入驅動。 

./load_driver.sh 

如下顯示驅動安裝成功

在終端執行命令:

./dma_from_device -d /dev/xdma0_c2h_0 -f  ./test.bin -s 4096 -a 0 -c 1

./dma_to_device -d /dev/xdma0_h2c_0 -f  ./test.bin -s 4096 -a 0 -c 1

-d:device 裝置.

-f:file 檔案

-s:size 大小

-a:addr 起始地址

-c:count

      這兩個操作分別是從板卡讀 4096 Bytes 資料到檔案 test.bin 以及從 test.bin 讀出4096 Bytes 資料傳送給板卡。

相關文章