米聯客的FDMA資料緩存方案釋出也有五六年了,但真正能熟練使用的兄弟卻很少,其實還是沒有好的例程作為參考和同熟易懂的講解,這裡我做如下解析:
FDMA部分:這部分是米聯客封裝了使用者接口的AXI4-FULL協定代碼,我之前寫過一篇文章,逐行講解這個子產品,感興趣的兄弟可以去參考FDMA代碼逐行講解
米聯客官方的FDMA3.1封裝的IP做得不咋地,我這裡對IP做了重新封裝,如下:
這裡的AXI資料位寬并不是任意設定的,比如設定為110,這是非法的,米聯客原來的IP并沒有意識到這一點,也沒有提示使用者,是以我修改為可選項如下:
根據AXI4協定,AXI4資料位寬必須與記憶體相映射,說人話就是必須是8的倍數;且最大隻能是256;
AXI最大突發是長度:同理,AXI突發是長度也不是任意值,可選的隻有1,2,4,8,32,64,128,256,米聯客原來的IP并沒有意識到這一點,也沒有提示使用者,是以我修改為可選項如下:
這裡是指最大值,是以直接選256;
另外:重點:拿出小本本:
AXI資料位寬與AXI突發長度必須遵循如下公式:
AXI資料位寬/8*AXI突發長度<=4096;即4k邊界,當然,這裡米聯客依然沒說;
AXI ID以及ID位寬:如果需要調用多個FDMA IP,就要用到這裡,我的修改如下:
最大ID位寬給到了4,即最多可同時調用16個IP,一般用不到這麼多,是以這裡選1;
下面看更重要的FDMA控制器:
關于FDMA控制器我之前寫過文章,感興趣的可以參考FDMA控制器
當然,同樣的道理,米聯客原來的IP也沒有給出更細的東西,這裡我來說說:
先看FDMA控制器IP:
IP配置頁面如下:
下面的講解全是幹貨,注意聽!!!!!
SDK讀使能:
一般用不到,他的作用是在SDK裡讀目前幀的序号等,具體取看代碼吧,不懂的也可以問我;
圖像場同步檢測使能:
作用是檢測輸入視訊場同步的上升沿,以觸發FDMA傳輸,如果緩存視訊肯定要使能,如果緩存其他類型資料看情況,比如後面的緩存音頻的工程就沒有使能該信号;
AXI讀寫資料使能:
即讀和寫可選擇,這裡應該表揚米聯客,如果你的工程不需要用到讀,那你就隻使能寫,這樣可以節約fpga資源;
AXI資料位寬:
必須與FDMA的配置保持一緻;這裡我将IP做了修改,該參數修改為可選項有限,如下:
讀寫FIFO緩存深度:
IP内部有用到FIFO,這裡就是FIFO的資料深度設定,具體為什麼要用FIFO以及用FIFO的作用請看我之前的文章FDMA控制器這裡我将IP做了修改,該參數修改為可選項有限,如下:
如果資料量小的話可以選1024,資料量大的話可以選4096,具體情況具體選擇吧,不懂的也可以聯系問我;
讀寫資料的起始位址:
這裡指的是資料緩存的首位址,IP内部根據一幀資料的完成對起始位址進行了累加,具體看代碼吧,也可以參考我之前的文章FDMA控制器
讀寫資料“偏移”位址:
這裡的偏移打了引号,因為他不是正真的偏移,IP内部代碼關于讀寫位址部分如下:
其中fdma_wbufn就是根據一幀資料的完成對起始位址進行了累加,W_addr就是根據突發資料進行的所謂偏移位址的增加,可能講不清楚,具體可以聯系問我吧;
讀寫緩存幀數:
這裡很好了解,就是存幾幀,這裡我将IP做了修改,該參數修改為可選項有限,如下:
輸入和輸出資料位寬:
這裡選32是為了和FIFO深度和AXI資料位寬進行适配;
FDMA單次突發的分傳次數:
這裡是為了解決4K邊界的問題,具體參考我之前的文章FDMA控制器這裡我将IP做了修改,該參數修改為可選項有限,如下:
讀寫單次突發的長度和次數:
因為DFMA控制器直接略過了AXI突發長度的問題,用FDMA單次突發的分傳次數完美取代了,是以讀寫單次突發的長度可以由使用者自定義,無需再考慮4K對齊,以1080P視訊為例,完全可以設定單次直接突發為一行資料,即1920,突發次數為1080行,一次類推;
單次突發跨度:
比如我想寫如720p視訊,卻以1080P視訊時序讀出來,這裡就有用了,跨度直接設定為1280,後面的工程由講解;
米聯客還配套給出了一個位址切換的IP,如下:
這個ip米聯客幹脆就沒有介紹,可能覺得太簡單了,我這裡解析如下:
可以看到,這個IP其實還是有點繞的,使用方法官方也沒有說,這裡我給的注釋應該能看得懂吧,這裡我将IP做了修改,該參數修改為可選項有限,如下:
工程講解:
工程1:
開發闆:Kintex7開發闆;
開發環境:vivado2019.1;
輸入:HDMI視訊1080P,IT6802解碼;
輸出:HDMI視訊1080P;
BD工程:
IP配置:
代碼架構:
工程2:
開發闆:Kintex7開發闆;
開發環境:vivado2019.1;
輸入:OV5640攝像頭720P;
輸出:HDMI視訊1080P;
BD工程:
同工程1;
IP配置:
這裡是720P輸入1080P輸出,是以跨度這裡的設定不一樣,要好好了解,不懂得聯系問我吧;
代碼架構:
工程3:
開發闆:Kintex7開發闆;
開發環境:vivado2019.1;
輸入:音頻資料,WM8731解碼;
輸出:音頻資料,WM8731編碼;
BD工程:
IP配置:
這裡說明一下:
音頻串并轉換後一個音頻點是32為資料,采樣率48K,雙通道,是以每秒的資料量就是:
48000*2=96000;
IP裡的單次突發讀寫長度設定為960,實際就是單次讀寫10ms的音頻;
IP裡的突發讀寫次數設定為1000,實際就是一共讀寫10s的音頻;
具體可參考我之前寫得文章音頻緩存
代碼架構:
輸出結果:工程1如下:
工程1輸出效果
工程2如下:
工程2輸出效果
福利:送以上3套工程及其源碼,聯系我吧兄弟!!!!!!