第5章 FPGA條件語句、循環(huán)語句、塊語句與生成語句_第1頁
第5章 FPGA條件語句、循環(huán)語句、塊語句與生成語句_第2頁
第5章 FPGA條件語句、循環(huán)語句、塊語句與生成語句_第3頁
第5章 FPGA條件語句、循環(huán)語句、塊語句與生成語句_第4頁
第5章 FPGA條件語句、循環(huán)語句、塊語句與生成語句_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 5.1 賦值語句和塊語句賦值語句和塊語句 1 1、過程賦值語句、過程賦值語句 過程賦值語句可以給寄存器、整數(shù)、時(shí)間變 量賦值。連續(xù)賦值語句總是處于活動(dòng)狀態(tài),而過 程賦值語句只有在執(zhí)行到的時(shí)候才會(huì)起作用。 在Verilog 語言中,信號(hào)有兩種賦值方式: (1).非阻塞(Non_Blocking)賦值方式 ( 如 b = a; ) 1它不會(huì)阻塞位于同一個(gè)順序塊中其后語句的執(zhí) 行。同一順序塊中的語句并發(fā)執(zhí)行。 2b b的值并不是立刻就改變的,的值并不是立刻就改變的,塊結(jié)束后才完成 賦值操作。 (2). 阻塞(Blocking)賦值方式 ( 如 b = a; ) 1) 順序塊中的阻塞賦值語句按順序執(zhí)

2、行, 它不會(huì)阻塞其后并行塊中語句的執(zhí)行。語句 執(zhí)行完后,塊才結(jié)束。 2) b2) b的值在賦值語句執(zhí)行完后立刻就改變。的值在賦值語句執(zhí)行完后立刻就改變。 非阻塞賦值方式和阻塞賦值方式的區(qū)別 常給設(shè)計(jì)人員帶來問題。問題主要是給 “always”塊內(nèi)的reg型信號(hào)的賦值方式不易把 握。一般情況下,如果用一個(gè)always塊來描 述時(shí)序電路,這個(gè)的“always”模塊內(nèi)的reg型 信號(hào)都是采用下面的非阻塞賦值方式: b = a; 例1: always ( posedge clk ) begin b=a; c b ) out1 b) out1=int1; else out1b) out1=int1; e

3、lse if(a=b) out1=int2; else out1b) out1=int1; else out1b) begin out1=int1; out2=int2; end else begin out1=int2; out20) for(scani=0;scani0) begin memoryscani=0; end else/*WRONG*/ $display(error-indexiszero); 盡管程序設(shè)計(jì)者把else寫在與第一個(gè)if(外層if)同 一列上,希望與第一個(gè)if對應(yīng),但實(shí)際上else是與 第二個(gè)if對應(yīng),因?yàn)樗鼈兿嗑嘧罱?正確的寫法應(yīng)當(dāng)是這樣的 if(index0

4、) begin for(scani=0;scani0) begin memoryscani=0; end end else /*WRONG*/ $display(error-indexiszero); 2. 2. casecase語句語句 case語句是種多分支選擇語句,if語句只有兩個(gè)分支 可供選擇,Verilog語言提供的case語句直接處理多分 支選擇。case語句通常用于微處理器的指令譯碼,它的 一般形式如下: c a s e ( 表 達(dá) 式 ) endcase c a s e z ( 表 達(dá) 式 ) endcase c a s e x ( 表 達(dá) 式 ) endcase case分支

5、項(xiàng)的一般格式如下: 分支表達(dá)式: 語句 缺省項(xiàng)(default項(xiàng)): 語句 reg 15:0 rega; reg 9:0 result; case(rega) 16 d0: result = 10 b0111111111; 16 d1: result = 10 b1011111111; 16 d2: result = 10 b1101111111; 16 d3: result = 10 b1110111111; 16 d4: result = 10 b1111011111; 16 d5: result = 10 b1111101111; 16 d6: result = 10 b11111101

6、11; 16 d7: result = 10 b1111111011; 16 d8: result = 10 b1111111101; 16 d9: result = 10 b1111111110; default: result = bx; endcase 每個(gè)case分項(xiàng)的分支表達(dá)式的值必須互不相同, 否則就會(huì)出現(xiàn)矛盾現(xiàn)象(對表達(dá)式的同一個(gè)值,有多 種執(zhí)行方案)。 執(zhí)行完case分項(xiàng)后的語句,則跳出該case語句結(jié)構(gòu), 終止case語句的執(zhí)行。 在用case語句表達(dá)式進(jìn)行比較的過程中,只有當(dāng)信號(hào)的 對應(yīng)位的值能明確進(jìn)行比較時(shí),比較才能成功。因此要 注意詳細(xì)說明case分項(xiàng)的分支表達(dá)式的值。

7、 case語句的所有表達(dá)式的值的位寬必須相等,只有這樣 控制表達(dá)式和分支表達(dá)式才能進(jìn)行對應(yīng)位的比較。一個(gè) 經(jīng)常犯的錯(cuò)誤是用bx, bz 來替代 nbx, nbz,這樣 寫是不對的,因?yàn)樾盘?hào)x, z的缺省寬度是機(jī)器的字節(jié)寬 度,通常是32位(此處 n 是case控制表達(dá)式的位寬)。 case語句與if_else_if語句的區(qū)別主要有兩點(diǎn): 與case語句中的控制表達(dá)式和多分支表達(dá)式 這種比較結(jié)構(gòu)相比,if_else_if結(jié)構(gòu)中的條 件表達(dá)式更為直觀一些。 1. 對于那些分支表達(dá)式中存在不定值x和高阻值 z位時(shí),case語句提供了處理這種情況的手段。 下面的兩個(gè)例子介紹了處理x,z值位的case語

8、 句。 例1: case ( select1:2 ) 2 b00: result = 0; 2 b01: result = flaga; 2 b0 x, 2 b0z: result = flaga? bx : 0; 2 b10: result = flagb; 2 bx0, 2 bz0: result = flagb? bx : 0; default: result = bx; endcase 例2: case(sig) 1 bz: $display(signal is floating); 1 bx: $display(signal is unknown); default: $displa

9、y(signal is %b, sig); endcase Verilog 針對電路的特性提供了case語句的其它 兩種形式用來處理case語句比較過程中的不必考 慮的情況( dont care condition )。其中casez 語句用來處理不考慮高阻值z的比較過程,casex 語句則將高阻值z和不定值都視為不必關(guān)心的情 況。所謂不必關(guān)心的情況,即在表達(dá)式進(jìn)行比較 時(shí),不將條件表達(dá)式或分支表達(dá)式中的該位的狀 態(tài)考慮在內(nèi)。這樣在case語句表達(dá)式進(jìn)行比較時(shí), 就可以靈活地設(shè)置以對信號(hào)的某些位進(jìn)行比較。 例3 reg7:0 ir; casez(ir) 8 b1?: instruction1(

10、ir); 8 b01?: instruction2(ir); 8 b00010?: instruction3(ir); 8 b000001?: instruction4(ir); endcase 例4 reg7:0 r, mask; mask = 8bx0 x0 x0 x0; casex(rmask) 8 b001100 xx: stat1; 8 b1100 xx00: stat2; 8 b00 xx0011: stat3; 8 bxx001100: stat4; endcase 3.3.由于使用條件語句不當(dāng)在設(shè)計(jì)中生成了原本沒由于使用條件語句不當(dāng)在設(shè)計(jì)中生成了原本沒 想到有的鎖存器想到有的鎖

11、存器 Verilog HDL設(shè)計(jì)中容易犯的一個(gè)通病是由于不正確使用語 言,生成了并不想要的鎖存器。下面我們給出了一個(gè)在 “always塊中不正確使用if語句,造成這種錯(cuò)誤的例子。 always (al or d) begin if(al)q=d; end 有鎖存器 always (al or d) begin if(al) q=d; else q=0 end 無鎖存器 檢查一下左邊的always塊,if語句保證了只 有當(dāng)al=1時(shí),q才取d的值。這段程序沒有寫出 al = 0 時(shí)的結(jié)果, 那么當(dāng)al=0時(shí)會(huì)怎么樣呢? 在always塊內(nèi),如果在給定的條件下變量沒 有賦值,這個(gè)變量將保持原值,也

12、就是說會(huì)生成 一個(gè)鎖存器! 如果設(shè)計(jì)人員希望當(dāng) al = 0 時(shí)q的值為0, else項(xiàng)就必不可少了,請注意看右邊的always 塊,整個(gè)Verilog程序模塊綜合出來后, always塊對應(yīng)的部分不會(huì)生成鎖存器。 Verilog 程序另一種偶然生成鎖存器是 在使用case語句時(shí)缺少default項(xiàng)的情況下 發(fā)生的。 case語句的功能是:在某個(gè)信號(hào)(本例中的 sel)取不同的值時(shí),給另一個(gè)信號(hào)(本例中的q) 賦不同的值。注意看下圖左邊的例子,如果 sel=0,q取a值,而sel=11,q取b的值。這個(gè)例子 中不清楚的是:如果sel取00和11以外的值時(shí)q將 被賦予什么值?在下面左邊的這個(gè)例子

13、中,程序 是用Verilog HDL寫的,即默認(rèn)為q保持原值,這 就會(huì)自動(dòng)生成鎖存器。 右邊的例子很明確,程序中的case語句有default項(xiàng),指 明了如果sel不取00或11時(shí),編譯器或仿真器應(yīng)賦給q的 值。程序所示情況下,q賦為0,因此不需要鎖存器。 always (sel1:0 or a or b) case(sel1:0) 2b00: q=a; 2b11: q=b; endcase 有鎖存器 always (sel1:0 or a or b) case(sel1:0) 2b00: q=a; 2b11: q=b; default: q=b0; endcase 無鎖存器 以上就是怎樣來避

14、免偶然生成鎖存器的錯(cuò)誤偶然生成鎖存器的錯(cuò)誤。如。如 果用到果用到ifif語句,最好寫上語句,最好寫上elseelse項(xiàng)。如果用項(xiàng)。如果用casecase 語句,最好寫上語句,最好寫上defaultdefault項(xiàng)。項(xiàng)。遵循上面兩條原則,遵循上面兩條原則, 就可以避免發(fā)生這種錯(cuò)誤,使設(shè)計(jì)者更加明確設(shè)就可以避免發(fā)生這種錯(cuò)誤,使設(shè)計(jì)者更加明確設(shè) 計(jì)目標(biāo),同時(shí)也增強(qiáng)了計(jì)目標(biāo),同時(shí)也增強(qiáng)了VerilogVerilog程序的可讀性。程序的可讀性。 5.35.3 循環(huán)語句循環(huán)語句 在Verilog中存在著四種類型的循環(huán)語句,用來控 制執(zhí)行語句的執(zhí)行次數(shù)。 1) forever連續(xù)的執(zhí)行語句。 2) repe

15、at連續(xù)執(zhí)行一條語句n次。 3) while 執(zhí)行一條語句直到某個(gè)條件不滿足。 如果一開始條件即不滿足(為假),則語句一次也 不能被執(zhí)行。 4) for通過三個(gè)步驟來決定語句的循環(huán)執(zhí)行。 注意:循環(huán)語句只能在always或initial塊中使用。 1. forever語句語句 forever語句的格式如下: forever語句; 或 foreverbegin多條語句 end forever循環(huán)語句不包含任何條件表達(dá)式,只執(zhí) 行無限循環(huán),直到遇到系統(tǒng)任務(wù)$finish為止。 常用于產(chǎn)生周期性的波形,用來作為仿真測試信 號(hào)。它與always語句不同處在于不能獨(dú)立寫在程 序中,而必須寫在initia

16、l塊中。 例: reg clock; initial begin clock=1b0; forever #10 clock = clock; end 2. repeat語句語句 repeat語句的格式如下: repeat(表達(dá)式) 語句; 或 repeat(表達(dá)式) begin 多條語句 end 在repeat語句中,其表達(dá)式通常為常量表 達(dá)式。 例 integer count; initial begin count=0; repeat(128) begin $display(“count=%d”,count); count =count + 1; end end 3. while語句語句

17、while語句的格式如下: while(表達(dá)式) 語句 或用如下格式: while(表達(dá)式) begin 多條語句end 例1: integer count; initial begin count=0; while (count1; end end 4. for語句語句 for語句的一般形式為: for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 語句 通過以下三個(gè)步驟來決定語句的循環(huán)執(zhí)行。通過以下三個(gè)步驟來決定語句的循環(huán)執(zhí)行。 a)先給確定循環(huán)次數(shù)的變量賦初值。 b) 判定控制循環(huán)的表達(dá)式的值,如為假則跳出循環(huán) 語句,如為真則執(zhí)行指定的語句后,轉(zhuǎn)到第三步。 c) 執(zhí)行一條賦值語句來修正控制循環(huán)變量次數(shù)

18、的變 量的值,然后返回第二步。 它的執(zhí)行過程如下: 1) 先求解表達(dá)式1; 2) 求解表達(dá)式2,若其值為真(非0),則 執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行 下面的第3步。若為假(0),則結(jié)束循環(huán), 轉(zhuǎn)到第5步。 3) 若表達(dá)式為真,在執(zhí)行指定的語句后, 求解表達(dá)式3。 4) 轉(zhuǎn)回上面的第2步驟繼續(xù)執(zhí)行。 5)執(zhí)行for語句下面的語句。 for循環(huán)語句實(shí)際上相當(dāng)于采用while循環(huán)語 句建立以下的循環(huán)結(jié)構(gòu): begin 循環(huán)變量賦初值; while(循環(huán)結(jié)束條件) begin 執(zhí)行語句 循環(huán)變量增值; end end 這樣對于需要8條語句才能完成的一個(gè)循環(huán)控制, for循環(huán)語句只需兩條即可。 例1:用for語句來初始化memory reg7:0 tempi; initial begin for(tempi=0;tempimemsize;tempi=tempi+1) m

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論