2015-02-11 56 views
0

是否有可能通過altera在Qsys(quartus 14.0)中提供的IP核«Cyclone V Avalon-MM for PCIe»進行DMA轉移?使用帶Cyclone V Avalon-MM的dma transfert用於PCIe

Altera提供了一個名爲«Cyclone V Avalon-MM DMA for PCIe»的ip內核來執行dma transfert。但是這個ip-core不支持1x通道的PCIe Gen1。

「Cyclone V Avalon-MM for PCIe」的演示(ep_g1x1)設計包括一個連接在PCIe ip-core的Avalon-mm TX總線上的DMA模塊。

然後我想知道是否有可能將數據從此DMA塊寫入根聯合體(主機)?因爲我找不到如何做到這一點。

回答

0

我終於設法通過「用於PCIe的Cyclone V Avalon-MM」altera core-ip發出DMA請求。那麼是的,這是可能的。

在我的Linux系統上,rootcomplex(RC)包含在帶Linux操作系統的i.MX6下。其實大部分技巧都在Linux方面。

在Linux驅動程序下,必須通過調用dma_alloc_coherent()來請求PAGE,並且必須將此頁面的地址寫入名爲ADDR_MAP_LO0和ADDR_MAP_HI0的CRA寄存器中。

在我的系統中,內存頁面大小爲4k,然後我必須配置4k頁面的PCIe硬IP的「地址轉換設置」。

一旦完成,我只需將Qsys提供的DMA控制器連接到PCIe IP的TX avalon-MM從端口上。 告訴DMA在此端口上寫入數據將自動從FPGA生成TLP以寫入i.MX6 RAM。

+0

我也在開發適用於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

+0

@RiteshPrajapati:沒有計算,只需在CRA寄存器中寫入dma_handle指針值: iowrite32(dma_handle,&bar0 [ADDR_MAP_LO]); – FabienM 2015-09-14 07:36:36

1

從我的材料的簡短脫脂,應該可以發出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>_oRXMBurstCount_<n>_o傳遞給一些膠合邏輯,以便從FPGA內存中獲取所請求的數據。一旦準備好發回數據,爲發送的每個有效單詞聲明RXMReadDataValid_<n>_i

我猜你引用的«Cyclone V Avalon-MM DMA for PCIe»核心是爲我提及的'glue'邏輯處理的,並且允許你直接連接到Qsys上的SDRAM控制器總線。 Altera通常不會加密他們的擴展代碼,所以如果你的系統verilog很強大,可能需要仔細研究他們生成的文件,並且看看你是否可以以某種方式重用那一點代碼。

至於核心設置,我看到,你需要看出來的是確保在單DW完成者設置的唯一的事關OFF。否則核心會中止接收到的長度大於1 DWORD的請求。

希望有所幫助。