一、背景
FIFO是FPGA項目中使用最多的IP核,一個項目使用幾個,甚至是幾十個FIFO都是很正常的。通常情況下,每個FIFO的參數,特別是位寬和深度,是不同的。
明德揚(MDY)在2021年承擔了多個基于XILINX芯片的研發項目,包括VPX網絡透明傳輸項目(芯片為XC7K325T-2FBG900)、某高端測試儀項目(芯片為XCKU060-FFVA1156)、某網閘設備項目(芯片為XC7Z030-FBG676)等,另外,明德揚自研了基于XC7K325T-2FBG900和基于XC7K410T-2FBG900芯片的核心板,在XILINX研發領域擁有豐富的經驗。
這些項目都必須用到FIFO。如果按照通常做法,每種位寬和深度的IP,都要打開FIFO IP核界面、命名(命名不好不好分辨需要的FIFO)、設置參數、生成并編譯IP核,工作量可以想象出來是非常多的。更重要的是隨之而來的管理問題,如何管理這幾十個不同FIFO,如何檢查FIFO的設置是否正確,都是一個不小的挑戰。
對于我們專門承接項目的團隊,絕不可忍受如此重復、枯燥、容易出錯的工作。經過精心研究,終于找到了一條實用的方法:使用XILINX的原語--xpm_fifo_async和xpm_fifo_sync。
XILINX原語xpm_fifo_async和xpm_fifo_sync在FPGA中,可以直接例化使用,并且可以參數化FIFO的位寬和深度的。即在設計時,不用生成FIFO IP,直接例化就可以使用了。
二、獲得參考代碼
打開VIVADO軟件,點擊上圖中的Language Templates,將會彈出Language Templates窗口,如下圖。
在Language Templates窗口中,依次點擊verilog、Xilinx Parameterized Macros(XPM)、XPM、XPM_FIFO,如上圖。可以看到有三種FIFO,分別是異步的XPM FIFO:xpm_fifo_async、AXI總線的FIFO:xpm_fifo_axis和同步的XMP FIFO:xpm_fifo_sync。
選擇xpm_fifo_async,右邊的Preview窗口,將出現xpm_fifo_async的注釋以及參考代碼。將此部分代碼拷出來,并將注釋刪除,剩下的是xpm_fifo_async的例化參考。
上圖是對xpm_fifo_async的參數例化部分。下面是需要重點關注并經常使用的參數。
? FIFO_WRITE_DEPTH:FIFO的寫深度,其實就是在這里設置FIFO的深度,注意該值通常是2的N次方,如8、16、32、64等數。
? PROG_EMPTY_THRESH:FIFO的快空的水線。當FIFO存儲的數據量小于該水線時,FIFO的快空信號將會變高。
? PROG_FULL_THRESH:FIFO的快滿的水線。當FIFO存儲的數據量大于該水線時,FIFO的快滿信號將會變高,表示有效。
? READ_DATA_WIDTH:讀數據的位寬。
? WRITE_DATA_WIDTH:將數據的位寬。
? RD_DATA_COUNT_WIDHT:讀側數據統計值的位寬。
? WR_DATA_COUNT_WIDTH:寫側數據統計值的位寬。
上圖是對xpm_fifo_async的接口信號部分。下面是需要重點關注并經常使用的信號。
? wr_clk:FIFO的寫時鐘
? rst:FIFO的復位信號,高電平有效。要注意的是,該信號是屬于寫時鐘域的。
? wr_en:FIFO的寫使能信號。
? din:FIFO的寫數據
? full:寫滿指示信號,當FIFO寫滿時,該信號變高。
? wr_data_count:FIFO存儲數據量指示信號,用來指示當前FIFO已經寫入但未讀出的數據個數。
? rd_clk:FIFO的讀時鐘。
? rd_en:FIFO的讀使能。
? dout:FIFO讀出的數據。
? empty:FIFO的空指示信號。當其為1表示FIFO處于空狀態,當其為0,表示FIFO內有數據。
三、定義自用的FIFO模塊
從第二步可以看出,xpm_fifo_async是可以參數化深度和位寬的。但xpm_fifo_async有很多參數和信號,并且其中有部分是不使用的。為了使用上的方便,可以自定義自用的FIFO模塊。
例如,明德揚就定義了一個模塊mdyFifoAsy,該信號的接口信號如下圖。可以看出,名稱更加規范,并且定義常用的信號,如讀時鐘rd_clk,寫時鐘wrclk、寫使能wrreq等信號。
明德揚還在模塊mdyFifoAsy定義了一些常用的參數,分別是FIFO深度參數:DEPT_W;FIFO位寬的參數:DATA_W,還有FIFO快滿參數AL_FUL和快空參數AL_EMP,如下圖。
接下來,就是在mdyFifoAsy中例化并使用xpm_fifo_async了。如下圖,就是對xpm_fifo_async的參數例化。將DEPT_W傳給FIFO_WRITE_DEPTH,DATA_W傳給READ_DATA_WIDTH等。
下圖是對xpm_fifo_async的信號例化。將不用的信號留空,將dout連到q,din連到data,wr_en連到wrreq等。您可以根據自己情況來定制FIFO。
四、應用
定制完自己的FIFO后,就可以直接例化使用了。
上圖就是使用了一個位寬為8,深度為256的FIFO。
上圖就是使用了一個位寬為18,深度為1024的FIFO。
FIFO是FPGA、芯片設計中,最常用的IP核,在存儲控制、算法實現、接口設計中,都少不了FIFO,因此合理并正確使用FIFO的技術就非常有必要了,明德揚錄制了FIFO的訓練視頻,掌握后技術能力將有大提升。
通過上面介紹可知,通過此種方式,再也不用生成FIFO IP核啦,整個工程大小基本上可以減少一大半。
上面舉的例子是xpm_fifo_async,同步FIFO:xpm_fifo_sync的使用方法是類似的。
溫馨提示:明德揚2023推出了全新課程——邏輯設計基本功修煉課,降低學習FPGA門檻的同時,增加了學習的趣味性,并組織了考試贏積分活動
http://www.cqqtmy.cn/ffkc/415.html
(點擊→了解課程詳情?)感興趣請聯系易老師:13112063618(微信同步)
明德揚除了培訓學習還有項目承接業務,擅長的項目主要包括的方向有以下幾個方面:
1. MIPI視頻拼接
2. SLVS-EC轉MIPI接口(IMX472 IMX492)
3. PCIE采集系統
4. 圖像項目
5. 高速多通道ADDA系統
6. 基于FPGA板卡研發
7. 多通道高靈敏電荷放大器
8. 射頻前端
需要了解相關信息可以聯系:易老師13112063618(微信同號)