FPGA設(shè)計(jì)實(shí)用分享02之XILINX的可參數(shù)化FIFO
一、背景
FIFO是FPGA項(xiàng)目中使用最多的IP核,一個(gè)項(xiàng)目使用幾個(gè),甚至是幾十個(gè)FIFO都是很正常的。通常情況下,每個(gè)FIFO的參數(shù),特別是位寬和深度,是不同的。
明德?lián)P(MDY)在2021年承擔(dān)了多個(gè)基于XILINX芯片的研發(fā)項(xiàng)目,包括VPX網(wǎng)絡(luò)透明傳輸項(xiàng)目(芯片為XC7K325T-2FBG900)、某高端測(cè)試儀項(xiàng)目(芯片為XCKU060-FFVA1156)、某網(wǎng)閘設(shè)備項(xiàng)目(芯片為XC7Z030-FBG676)等,另外,明德?lián)P自研了基于XC7K325T-2FBG900和基于XC7K410T-2FBG900芯片的核心板,在XILINX研發(fā)領(lǐng)域擁有豐富的經(jīng)驗(yàn)。
這些項(xiàng)目都必須用到FIFO。如果按照通常做法,每種位寬和深度的IP,都要打開(kāi)FIFO IP核界面、命名(命名不好不好分辨需要的FIFO)、設(shè)置參數(shù)、生成并編譯IP核,工作量可以想象出來(lái)是非常多的。更重要的是隨之而來(lái)的管理問(wèn)題,如何管理這幾十個(gè)不同F(xiàn)IFO,如何檢查FIFO的設(shè)置是否正確,都是一個(gè)不小的挑戰(zhàn)。
對(duì)于我們專門(mén)承接項(xiàng)目的團(tuán)隊(duì),絕不可忍受如此重復(fù)、枯燥、容易出錯(cuò)的工作。經(jīng)過(guò)精心研究,終于找到了一條實(shí)用的方法:使用XILINX的原語(yǔ)--xpm_fifo_async和xpm_fifo_sync。
XILINX原語(yǔ)xpm_fifo_async和xpm_fifo_sync在FPGA中,可以直接例化使用,并且可以參數(shù)化FIFO的位寬和深度的。即在設(shè)計(jì)時(shí),不用生成FIFO IP,直接例化就可以使用了。
二、獲得參考代碼
打開(kāi)VIVADO軟件,點(diǎn)擊上圖中的Language Templates,將會(huì)彈出Language Templates窗口,如下圖。
在Language Templates窗口中,依次點(diǎn)擊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窗口,將出現(xiàn)xpm_fifo_async的注釋以及參考代碼。將此部分代碼拷出來(lái),并將注釋刪除,剩下的是xpm_fifo_async的例化參考。
上圖是對(duì)xpm_fifo_async的參數(shù)例化部分。下面是需要重點(diǎn)關(guān)注并經(jīng)常使用的參數(shù)。
FIFO_WRITE_DEPTH:FIFO的寫(xiě)深度,其實(shí)就是在這里設(shè)置FIFO的深度,注意該值通常是2的N次方,如8、16、32、64等數(shù)。
PROG_EMPTY_THRESH:FIFO的快空的水線。當(dāng)FIFO存儲(chǔ)的數(shù)據(jù)量小于該水線時(shí),F(xiàn)IFO的快空信號(hào)將會(huì)變高。
PROG_FULL_THRESH:FIFO的快滿的水線。當(dāng)FIFO存儲(chǔ)的數(shù)據(jù)量大于該水線時(shí),F(xiàn)IFO的快滿信號(hào)將會(huì)變高,表示有效。
READ_DATA_WIDTH:讀數(shù)據(jù)的位寬。
WRITE_DATA_WIDTH:將數(shù)據(jù)的位寬。
RD_DATA_COUNT_WIDHT:讀側(cè)數(shù)據(jù)統(tǒng)計(jì)值的位寬。
WR_DATA_COUNT_WIDTH:寫(xiě)側(cè)數(shù)據(jù)統(tǒng)計(jì)值的位寬。
上圖是對(duì)xpm_fifo_async的接口信號(hào)部分。下面是需要重點(diǎn)關(guān)注并經(jīng)常使用的信號(hào)。
wr_clk:FIFO的寫(xiě)時(shí)鐘
rst:FIFO的復(fù)位信號(hào),高電平有效。要注意的是,該信號(hào)是屬于寫(xiě)時(shí)鐘域的。
wr_en:FIFO的寫(xiě)使能信號(hào)。
din:FIFO的寫(xiě)數(shù)據(jù)
full:寫(xiě)滿指示信號(hào),當(dāng)FIFO寫(xiě)滿時(shí),該信號(hào)變高。
wr_data_count:FIFO存儲(chǔ)數(shù)據(jù)量指示信號(hào),用來(lái)指示當(dāng)前FIFO已經(jīng)寫(xiě)入但未讀出的數(shù)據(jù)個(gè)數(shù)。
rd_clk:FIFO的讀時(shí)鐘。
rd_en:FIFO的讀使能。
dout:FIFO讀出的數(shù)據(jù)。
empty:FIFO的空指示信號(hào)。當(dāng)其為1表示FIFO處于空狀態(tài),當(dāng)其為0,表示FIFO內(nèi)有數(shù)據(jù)。
三、定義自用的FIFO模塊
從第二步可以看出,xpm_fifo_async是可以參數(shù)化深度和位寬的。但xpm_fifo_async有很多參數(shù)和信號(hào),并且其中有部分是不使用的。為了使用上的方便,可以自定義自用的FIFO模塊。
例如,明德?lián)P就定義了一個(gè)模塊mdyFifoAsy,該信號(hào)的接口信號(hào)如下圖。可以看出,名稱更加規(guī)范,并且定義常用的信號(hào),如讀時(shí)鐘rd_clk,寫(xiě)時(shí)鐘wrclk、寫(xiě)使能wrreq等信號(hào)。
明德?lián)P還在模塊mdyFifoAsy定義了一些常用的參數(shù),分別是FIFO深度參數(shù):DEPT_W;FIFO位寬的參數(shù):DATA_W,還有FIFO快滿參數(shù)AL_FUL和快空參數(shù)AL_EMP,如下圖。
接下來(lái),就是在mdyFifoAsy中例化并使用xpm_fifo_async了。如下圖,就是對(duì)xpm_fifo_async的參數(shù)例化。將DEPT_W傳給FIFO_WRITE_DEPTH,DATA_W傳給READ_DATA_WIDTH等。
下圖是對(duì)xpm_fifo_async的信號(hào)例化。將不用的信號(hào)留空,將dout連到q,din連到data,wr_en連到wrreq等。您可以根據(jù)自己情況來(lái)定制FIFO。
四、應(yīng)用
定制完自己的FIFO后,就可以直接例化使用了。
上圖就是使用了一個(gè)位寬為8,深度為256的FIFO。
上圖就是使用了一個(gè)位寬為18,深度為1024的FIFO。
FIFO是FPGA、芯片設(shè)計(jì)中,最常用的IP核,在存儲(chǔ)控制、算法實(shí)現(xiàn)、接口設(shè)計(jì)中,都少不了FIFO,因此合理并正確使用FIFO的技術(shù)就非常有必要了,明德?lián)P錄制了FIFO的訓(xùn)練視頻,掌握后技術(shù)能力將有大提升。
通過(guò)上面介紹可知,通過(guò)此種方式,再也不用生成FIFO IP核啦,整個(gè)工程大小基本上可以減少一大半。
上面舉的例子是xpm_fifo_async,同步FIFO:xpm_fifo_sync的使用方法是類(lèi)似的。
明德?lián)P(MDY)除了承接項(xiàng)目外,還可為客戶提供FPGA芯片、電源芯片、AD芯片等元器件,可找我們了解。
審核編輯:湯梓紅
評(píng)論