關於FPGA設計中實現訊號延時的資源消耗

2021-09-18 07:10:57 字數 1684 閱讀 6667

在fpga設計中我們經常會遇到對乙個訊號進行延時的情況,一般只延時乙個或幾個clk時,通常是直接打拍,如果要延時的clk較多時,我們會選擇移位暫存器ip核,而有時為了方便,我們常常會使用下面的方式

always @ (posedge clk) begin

if (rst) a <= 0;

else a <= ;

end

前段時間我臨時對乙個脈衝訊號延時8192個clk就使用了這種寫法,當時有意識到可能會消耗較多的資源,但沒想到會這麼多。

還是對乙個脈衝訊號延時8192個clk,為了對比不同方式的資源消耗,我新建了乙個工程

對比了三種實現方式

資源消耗情況如下圖所示。

可以看到計數器消耗的資源是最少的,因為它相當於只儲存乙個bit的資訊,不像其他兩種方式把8192個時鐘的資訊都儲存了,這算是一種取巧的方式,能應用的場合比較少。

打8192拍的方式使用資源最多,用了2032個alm,alm是altera器件的最小邏輯單元,乙個alm包含4個暫存器。因為要打8192拍,所以可以看到這裡消耗了8192個暫存器。實際上打拍並沒有用到任何的組合邏輯(lut),但是因為暫存器和lut是繫結到alm中的,所以一旦暫存器被消耗,同時lut也很難應用到其他邏輯中。像這裡,8192個暫存器需要2048個alm(圖中是2032),這2048個alm中的lut就被浪費掉了(我不是很確定,需要進一步研究,但是從資源消耗的情況來看,應當是這樣的)。所以這種方式是最不經濟的,除非要延時的時鐘很少或者是除錯**,否則不建議總是採用這種方式。

移位暫存器ip消耗的資源相對比較適中,只使用了262個alm,相當於是把alm配置成了memory,像是xilinx器件中的srl。實現時資源設定的是auto,如果設定為m10k的話,是下面這樣的。可以看到使用乙個m10ks的block memory,而alm就只消耗了14個。實際設計時可根據晶元哪種資源餘量更**擇哪種。

更多關於alm的資訊可以這篇博文:cyclone v lab &alm結構

從上面的實驗可以看到,直接打拍的方式是非常浪費資源的,所以如果要延時的clk較多,建議採用ip核的方式,在使用ip核方式時根據剩餘資源選擇合適的資源來實現。而在某些特殊情況,可以考慮採用計數器的方式來實現,這種方式消耗的資源最少,但是如果不是要延時特別多的clk,則不建議,因為這種方式在時序變化時難以維護。

20190705 更新

打拍延時是可以的,但是不要復位,像下面這樣寫,綜合工具可以推斷使用memory來實現。經測試,這種寫法與ip核的資源消耗是差不多的(還是會比ip多一點點),這樣就可以很方便的實現訊號delay了。xilinx的器件也是一樣,不要復位。

always @ (posedge clk) begin

a <= ;

end

這裡綜合後顯示的是使用了乙個m10k。還可以加上綜合屬性,強制使用mlab實現。

如果乙個系統裡有很多這樣沒有復位的memory的話,在復位系統時,需要將復位訊號拉的長一點,保證復位過後的訊號沖掉memory中的殘留資料,否則系統會有出錯的風險。..

....

..

FPGA 時鐘訊號幾種設計方法

最近找工作,課題組報告一堆事搞得不可開交,今天就再更一下時鐘訊號的幾種設計方法吧,哇好氣,今天發現這個破編輯器好煩,都快寫完了,都有給我搞丟了,還得重新寫!吐槽一下csdn的部落格編輯,希望不要再出現這種情況了!時鐘訊號是fpga時序邏輯設計中必不可少的條件,一般情況下在fpga始終資源充裕的情況下...

關於linux中的延時函式

應用程式 include usleep n n微秒 sleep n n毫秒 sleep n n秒 驅動程式 include mdelay n milliseconds 其實現 ifdef notdef define mdelay n else define mdelay n builtin cons...

關於linux中的延時函式

應用程式 include sleep n n秒 驅動程式 include mdelay n milliseconds 其實現 ifdef notdef define mdelay n else define mdelay n builtin constant p n n max udelay ms ...