· 程序執(zhí)行順序 ·
和C/C++一類編程語言不同,HDL用于電路描述,代表著門電路和觸發(fā)器的組合。任何時(shí)刻,只要上電后,FPGA就等價(jià)于一堆數(shù)字電路,每個(gè)電路按照自己的條件執(zhí)行,不會(huì)因?yàn)槟硞€(gè)模塊放在代碼前面,就會(huì)先工作。這就需要設(shè)計(jì)人員,按照每個(gè)模塊并行工作的思路來調(diào)整設(shè)計(jì)。這給軟件開發(fā)人員入門帶來了難度,但是同時(shí)也是FPGA的價(jià)值所在,正因?yàn)镕PGA能夠并行執(zhí)行,所以很多算法和設(shè)計(jì)可以在低頻時(shí)鐘下高實(shí)時(shí)性,快速出結(jié)果。這是FPGA的優(yōu)勢,也是火起來的一個(gè)重要原因,所以希望大家好好去理解。
同時(shí)大家要明白verilog不是不能實(shí)現(xiàn)順序執(zhí)行,而是實(shí)現(xiàn)順序執(zhí)行并不像語法那么直觀,最簡單的順序執(zhí)行方法就是用狀態(tài)機(jī)去控制每一個(gè)寄存器的跳變,C/C++編程也可以認(rèn)為本質(zhì)上就是大型的一個(gè)狀態(tài)機(jī),verilog要做到那樣也只是做成狀態(tài)機(jī)去模擬他的工作。只要是數(shù)字電路能夠?qū)崿F(xiàn)的,F(xiàn)PGA都可以做到。
模塊內(nèi)部的執(zhí)行順序比較復(fù)雜,優(yōu)秀的設(shè)計(jì)中,模塊內(nèi)部是并行工作的,即使是begin end語句內(nèi)部,這里很多讀者會(huì)問,begin end不是串行語句塊嗎?下面詳細(xì)解釋這個(gè)問題。
begin end之間存在阻塞賦值和非阻塞賦值2種賦值方法,如果使用不當(dāng)不僅僅會(huì)出現(xiàn)競爭冒險(xiǎn),還會(huì)導(dǎo)致你的理解和編譯器理解不一樣,最終生成的電路和自己想的天差地別,導(dǎo)致一些難修正的錯(cuò)誤。所以必須按照以下兩條執(zhí)行準(zhǔn)則使用賦值語句:
描述組合邏輯的always塊里面用阻塞式賦值
描述時(shí)序邏輯的always塊里面用非阻塞賦值
在組合邏輯中,阻塞賦值只和電平有關(guān),往往和觸發(fā)邊沿沒有關(guān)系,可以看成是并行運(yùn)行的組合邏輯電路。而時(shí)序邏輯中,非阻塞賦值是本身就是并行執(zhí)行的。因此,優(yōu)秀的設(shè)計(jì),其begin end內(nèi)部也是并行執(zhí)行的。大家為了加深理解,可以去看看實(shí)例說明里面的例子。
· 實(shí)例說明 ·
modulepara_demo(clk,reset,a,b);
inputclk;
inputreset;
input[3:0]a;
output[3:0]b;
reg[3:0]tempa1,tempa2,b;
always@(posedgeclk)
begin
if(!reset)begin
tempa1<=?0;??
tempa2<=?0;??
b<=?0;??
end
elsebegin
tempa1<=?a?+?1;??
tempa2<=?tempa1?+?1;??
b<=?tempa2?+?1;??????
end
end
endmodule
上述代碼的RTL級(jí)圖如下,可以看出代碼最終實(shí)現(xiàn)是一個(gè)3級(jí)累加結(jié)構(gòu),每級(jí)累加結(jié)構(gòu)中間有一個(gè)觸發(fā)器打拍。也就是說這是典型的流水線結(jié)構(gòu)。每一級(jí)都在一直工作,運(yùn)行順序沒有先后,但是數(shù)據(jù)到達(dá)時(shí)間有先后,處理順序有先后。
大家再看仿真圖,tempa2 并不是等到a+1的結(jié)果給到tempa1后才執(zhí)行的tempa1+1,而是執(zhí)行a+1的同時(shí)也在執(zhí)行tempa1+1。三句累加都是同時(shí)進(jìn)行,看下圖就知道都是對(duì)前一個(gè)數(shù)值基礎(chǔ)上加1。所以tempa1和tempa2相等,而不是相差1。
看此文之前請(qǐng)千萬很熟悉verilog語法,能區(qū)分可綜合,不可綜合語句。
-
寄存器
+關(guān)注
關(guān)注
31文章
5271瀏覽量
119650 -
Verilog
+關(guān)注
關(guān)注
28文章
1335瀏覽量
109857 -
編譯器
+關(guān)注
關(guān)注
1文章
1608瀏覽量
48978
原文標(biāo)題:面向硬件的設(shè)計(jì)思維——程序執(zhí)行順序
文章出處:【微信號(hào):HaveFunFPGA,微信公眾號(hào):玩兒轉(zhuǎn)FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論