從我的材料的簡短脫脂,應該可以發出DMA讀取或從RC寫入你的旋風v如果使用IP核您感興趣(EP)。
我已經做了DMA在Stratix V上讀取和寫入數據,然而它只是使用PCIe核心HIP模塊(自定義TLP編碼和解碼邏輯)進行非Qsys設計。這個模塊似乎是他們的PCIe HIP模塊的封裝,它也爲您處理事務層。
第一步將讓您的RC發出PCIe DMA讀取或寫入請求。在讀取請求的情況下,您需要發送一個長度大於1 DWORD的數據(CplD)請求的完整內存讀取。我建議您專門用一個完整的BAR來映射您希望在FPGA上的DMA存儲空間,以保持您的地址目標的簡單。在FPGA方面,我建議使用Signal Tap並在內核上探測接口信號。通過這種方式,您可以看到來自內核的DMA讀取請求的確切時間。我的猜測是RXMRead_<n>_o
信號會變高,表示請求開始。在這一點上,您必須解碼並將RxmAddress_<n>_o
和RXMBurstCount_<n>_o
傳遞給一些膠合邏輯,以便從FPGA內存中獲取所請求的數據。一旦準備好發回數據,爲發送的每個有效單詞聲明RXMReadDataValid_<n>_i
。
我猜你引用的«Cyclone V Avalon-MM DMA for PCIe»核心是爲我提及的'glue'邏輯處理的,並且允許你直接連接到Qsys上的SDRAM控制器總線。 Altera通常不會加密他們的擴展代碼,所以如果你的系統verilog很強大,可能需要仔細研究他們生成的文件,並且看看你是否可以以某種方式重用那一點代碼。
至於核心設置,我看到,你需要看出來的是確保在單DW完成者設置的唯一的事關OFF。否則核心會中止接收到的長度大於1 DWORD的請求。
希望有所幫助。
我也在開發適用於Linux X86系統的PCIe接口的Cycleon V Avalon-MM。我得到一個虛擬地址作爲dma_alloc_coherent()api的返回值,並且還得到了一個dma_handle,它是DMA的物理地址。您能否給我提供計算來配置名爲ADDR_MAP_LO0和ADDR_MAP_HI0的CRA寄存器?我的頁面大小爲4K,並使用32位Linux操作系統。 – 2015-08-17 11:27:49
@RiteshPrajapati:沒有計算,只需在CRA寄存器中寫入dma_handle指針值: iowrite32(dma_handle,&bar0 [ADDR_MAP_LO]); – FabienM 2015-09-14 07:36:36