關於背景知識,可以先看 https://www.cnblogs.com/xingce/p/16386108.html
參照一段官方的說明,AXI MCDMA存在的主要目的是為了節約資源,我們想要使用這個模組的主要目的也是為了降低資源消耗,從而可以將系統部署在更小面積的FPGA晶片上,當然,具體的效果還需要進一步的測試,先對該IP做一些模擬和線上測試吧。
FPGAs have been providing DMA engines in the Programmable Logic for many years. To add to the existing DMA offering, Xilinx added a Multichannel DMA IP into the Xilinx IP Catalog to provide additional channels. Additional DMA channels provide a hardware segregation of data that ultimately provides more efficient management of data streams. This leads to an overall savings of Programmable Logic, while maintaining data movement throughput.
下圖是IP的介面和設定介面,更詳細的描述請移步官方手冊 https://docs.xilinx.com/v/u/en-US/pg288-axi-mcdma
在開始之前,先確定一個目標,我們希望通過該模擬的學習,搞清楚IP的基本設定、工作流程,然後去建立自己的模擬工程
選擇開啟IP的example design,檢視其模擬工程
先來看看頂層的*tb.v 模擬檔案,裡面生成了1個200M的基準時鐘,然後傳送了start開始訊號,並檢測結束done訊號與status訊號,根據status的狀態輸出測試結論,核心的測試程式碼不在這個檔案裡面
再來直接看DUT的頂層檔案,先搞清楚對應的額層級關係
下圖表明axi_traffic_gen_0 用作mcdma的axi lite master模組,完成對mcdma 暫存器的設定
AXI MCDMA會讀出BRAM_CTL_0 中的資料,那麼BRAM 0中的資料怎麼才知道是不是對的,又需要一個模組寫入測試資料,這個測試資料由axi4_write_master.vhd模組完成,在系統復位解除後,就開始寫入測試資料
與讀出通道對應,AXI MCDMA會向BRAM_CTL_1寫入測試資料,檢查資料正確性的時候,測試邏輯是直接檢查的寫入訊號,並不是將BRAM 1中寫入的資料讀出做校驗,這一點需要檢視模擬波形,有可能設計人員偷懶,所以這樣寫的
descriptor資訊預先儲存在BRAM_CTL_3中,由AXI MCDMA的AXI SG介面將對應的資訊讀出,對應的descripto資訊儲存在"sg_mem.mem" 檔案中
從以上資訊基本可以看清整個模擬邏輯了,接下來再結合模擬訊號看看真實的工作流程。
首先,根據IP手冊,AXI MCDMA開始工作之前,需要設定對應暫存器
先看S2MM 寫操作對應的流程,MM2S也是對應的流程,這裡不介紹了,可以看模擬的時序和IP手冊的說明
這是IP手冊建議的流程
向0x500 暫存器寫入控制資料
對應模擬時序圖如下,其中基地址為0x500 ,寫入資料為0x000202f1
向0x508暫存器寫入對應引數,當disable的時候,並非真的stop了,而是當descriptor 連結串列對應也執行到含EOF標誌的連結串列時才真正停止。
(這裡有個問題就需要注意,如果是讀出操作,我們丟棄不需要的資料,如果是寫入操作,如何結束呢?)
應該向0x008寫入0x1 使能MM2S的channel 0,模擬實際寫入的是0x3,這個是由於模擬程式碼是設定的2個通道,2個通道是合理的,因為只有這樣才能體現出Multichannel DMA的意義
IP根據設定的descriptor地址去memory中fetch對應的descriptor連結串列,然後執行對應的axi讀寫操作
下面描述了對應channel 0 1的descriptor地址,由於我們是32bit 地址區間,所以只需要對應設定LSB 32bit地址即可,MSB 是在超過32bit地址空間的空間才有效
每個通道都有自己的設定暫存器,這些暫存器第0個bit是開啟descriptor的featch,其它bit基本都是和中斷的產生相關的,模擬範例對S2MM和MM2S 通道進行了不同的設定,這個可以從模擬波形觀察得到
通過觀察暫存器寫入的值,可以看出S2MM 的channel 0 對應寫入的current BD 地址為0x100 , nexr BD 地址為0x140
下圖是對應的時序,圖中不能看出具體的地址,如果想看的話可以自己模擬,然後放大觀察
BD descriptor 描述,下圖描述了MM2S對應的descriptor描述,S2MM也是類似的內容,AXI MCDMA對應的通道會根據這個descriptor完成對應的dma操作
在這個模擬範例中,我們看一下
SG從0x100地址讀指定 8*32bit的descriptor資料,然後根據descriptor去讀取資料
整體看下來,這個模擬demo是非常簡易的,不能覆蓋真實的工況,下一步需要上機測試才能更好的模擬真實工作場景