版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第四講 行為描述高級語句, 過程語句(initial、always) 塊語句(begin-end、fork-join) 賦值語句(assign、=、=) 條件語句(if-else、case、casez、casex) 循環(huán)語句(for、forever、repeat、while) 編譯指示語句(define、include、ifdef、else、endif) 任務(task)與 函數(function) 順序執(zhí)行與并發(fā)執(zhí)行,Verilog HDL行為語句,4.1 過程語句,initial always 在一個模塊(module)中,使用initial和always語句的次數是不受限制的。initi
2、al語句常用于仿真中的初始化,initial過程塊中的語句僅執(zhí)行一次; always塊內的語句則是不斷重復執(zhí)行的,always結構在仿真過程中是時刻活動的 。,always過程語句使用模板,always () begin /過程賦值 /if-else,case,casex,casez選擇語句 /while,repeat,for循環(huán) /task,function調用 end “always”過程語句通常是帶有觸發(fā)條件的,觸發(fā)條件寫在敏感信號表達式中,只有當觸發(fā)條件滿足時,其后的“begin-end”塊語句才能被執(zhí)行。,敏感信號表達式,敏感信號表達式又稱事件表達式或敏感信號列表,即當該表達式中變量
3、的值改變時,就會引發(fā)塊內語句的執(zhí)行。因此敏感信號表達式中應列出影響塊內取值的所有信號。若有兩個或兩個以上信號時,它們之間用“or”連接。 always (a) /當信號a的值發(fā)生改變 always (a or b) /當信號a或信號b的值發(fā)生改變 always (posedge clock) /當clock 的上升沿到來時 always (negedge clock) /當clock 的下降沿到來時 always (posedge clk or negedge reset) /當clk的上升沿到來或reset信號的下降沿到來 電平敏感,組合邏輯電路采用 邊沿敏感,時序邏輯用。不要混用,敏感信號
4、列表舉例,module mux4_1(out,in0,in1,in2,in3,sel); output out; input in0,in1,in2,in3; input1:0 sel; reg out; always (in0,in1,in2 ,in3 ,sel) /敏感信號列表 case(sel) 2b00: out=in0; 2b01: out=in1; 2b10: out=in2; 2b11: out=in3; default: out=2bx; endcase endmodule,4選1數據選擇器,posedge和negedge關鍵字,對于時序電路,事件通常是由時鐘邊沿觸發(fā)的,為表達
5、邊沿這個概念,Verilog提供了posedge和negedge關鍵字來描述。比如: 【例】同步置數、同步清零的計數器 module count(out,data,load,reset,clk); output7:0 out; input7:0 data; input load,clk,reset; reg7:0 out; always (posedge clk) /clk上升沿觸發(fā) begin if(!reset) out=8h00; /同步清0,低電平有效 else if(load) out=data; /同步預置 else out=out+1; /計數 end endmodule,4.2
6、 塊語句,塊語句是由塊標志符begin-end或fork-join界定的一組語句,當塊語句只包含一條語句時,塊標志符可以缺省。 順序塊,以關鍵字beginend將多條語句封裝成塊。 按順序執(zhí)行 。 begin regb=rega; regc=regb; end 由于begin-end塊內的語句順序執(zhí)行,在最后,將regb、regc 的值都更新為rega的值,該begin-end塊執(zhí)行完后,regb、regc 的值是相同的。,并行塊 (了解即可),以關鍵字fork join將多條語句封裝成塊 所有語句并行執(zhí)行,initial fork a=0; #5 b=1; #10 c=a,b; #15 d=
7、b,a; join,并行塊容易引起競爭 適用于絕對時間的控制 實際建模時,并行塊不可綜合。用于仿真。 僅用順序塊即可,4.3 過程賦值語句,行為級的賦值語句 必須出現在initial和always結構中 過程賦值語句的左端都必須是reg類型 分為阻塞性賦值和非阻塞性賦值,非阻塞(non_blocking)賦值方式 賦值符號為“=”, 如:b= a; 非阻塞賦值在整個過程塊結束時才完成賦值操作,即b的值并不是立刻就改變的。實際并行。 阻塞(blocking)賦值方式 賦值符號為“=”, 如:b= a; 阻塞賦值在該語句結束時就立即完成賦值操作,即b的值在該條語句結束后立刻改變。如果在一個塊語句中
8、,有多條阻塞賦值語句,那么在前面的賦值語句沒有完成之前,后面的語句就不能被執(zhí)行,仿佛被阻塞了(blocking)一樣,因此稱為阻塞賦值方式。實際順序執(zhí)行。,阻塞賦值與非阻塞賦值,非阻塞賦值 module non_block(c,b,a,clk); output c,b; input clk,a; reg c,b; always (posedge clk) begin b=a; c=b; end endmodule,阻塞賦值 module block(c,b,a,clk); output c,b; input clk,a; reg c,b; always (posedge clk) begin
9、b=a; c=b; end endmodule,阻塞賦值與非阻塞賦值,非阻塞賦值綜合結果:,阻塞賦值綜合結果,阻塞賦值與非阻塞賦值,非阻塞賦值仿真波形圖,阻塞賦值仿真波形圖,4.4 條件語句,( if-else語句) if-else語句使用方法有以下3種: (1)if(表達式) 語句1;else ; /建議添加一個空else語句防止出現鎖存器 (2)if(表達式) 語句1; else 語句2; (3)if(表達式1) 語句1; else if(表達式2) 語句2; else if(表達式3) 語句3; else if(表達式n) 語句n; else 語句n+1;,關鍵字為case、defaul
10、t、endcase case語句的結構如下。 case (敏感表達式) 值1: 語句1;/case分支項 值2: 語句2; 值n: 語句n; default:語句n+1; endcase,case語句,注意事項,case語句中的每個分支條件必須不同,變量的位寬要嚴格相等,還要使用明確指定寬度的方式,避免使用“d”等不指明寬度的分支條件。 case語句中的每個分支可以接多條待執(zhí)行語句,只需要使用beginend即可 case語句中只能有一個default語句,而且建議使用default,也是為了得到最后綜合的電路不會生成鎖存器。,如 2b01:begin out=a-b; sum=a+b; en
11、d ,BCD碼七段數碼管顯示譯碼器,module decode4_7(decodeout,indec); output6:0 decodeout; input3:0 indec; reg6:0 decodeout; always (indec) begin case(indec) /用case語句進行譯碼 4d0:decodeout=7b1111110; 4d1:decodeout=7b0110000; 4d2:decodeout=7b1101101; 4d3:decodeout=7b1111001; 4d4:decodeout=7b0110011; 4d5:decodeout=7b10110
12、11; 4d6:decodeout=7b1011111; 4d7:decodeout=7b1110000; 4d8:decodeout=7b1111111; 4d9:decodeout=7b1111011; default: decodeout=7bx; endcase end endmodule,簡易ALU電路的行為級建模,module my_ALU(out,a,b,select); output 4:0 out; input 3:0 a,b; input 2:0 select; reg 4:0 out; always (*) case(select) 3b000: out=a; 3b001
13、: out=a+b; 3b010: out=a-b; 3b011: out=a/b; 3b100: out=a%b; 3b101: out=a1; 3b111: out=ab; default: out=5b00000; endcase endmodule,4.5 循環(huán)語句,repeat,initial begin for(i=0;i4;i=i+1) out = out +1; end,initial begin repeat(5) out = out +1; end,initial begin i=0; while(i0) i=i+1; end,for,while,在Verilog中存在四種
14、類型的循環(huán)語句,用來控制語句的執(zhí)行次數。這四種語句分別為: (1)forever:連續(xù)地執(zhí)行語句;多用在“initial”塊中,以生成時鐘等周期性波形。 (2)repeat:連續(xù)執(zhí)行一條語句n次。 (3)while:執(zhí)行一條語句直到某個條件不滿足。 (4)for:有條件的循環(huán)語句。,forever循環(huán),沒有條件,永遠循環(huán) 類似always,但使用在initial里 比較如下兩例,Initial begin clock=0; forever #10 clock=clock; end,initial clock=0; always #10 clock=clock;,用for語句描述七人投票表決器,
15、module voter7(pass,vote); output pass; input6:0 vote; reg2:0 sum; integer i; reg pass; always (vote) begin sum=0; for(i=0;i=6;i=i+1) if(votei) sum=sum+1; if(sum2) pass=1; /超過4人贊成,則通過 else pass=0; end endmodule,用repeat實現8位二進制數乘法,module mult_repeat(outcome, a, b);/無符號數串行乘法 parameter size=8; inputsize:
16、1 a,b; output2*size:1 outcome; reg2*size:1 temp_a, outcome; regsize:1 temp_b; always (a or b) begin outcome=0; temp_a=a; temp_b=b; repeat(size) /repeat語句,size為循環(huán)次數 begin if(temp_b1) /如果temp_b的最低位為1,就執(zhí)行下面的加法 outcome=outcome +temp_a; temp_a=temp_a1; /操作數b右移一位 end end endmodule,4.6 編譯指示語句,Verilog允許在程序中
17、使用特殊的編譯向導(Compiler Directives)語句,在編譯時,通常先對這些向導語句進行“預處理”,然后再將預處理的結果和源程序一起進行編譯。 向導語句以符號“”開頭,以區(qū)別于其它語句。Verilog提供了十幾條編譯向導語句,如:define、ifdef、else、endif、restall等。比較常用的有define,include和ifdef、else、endif等。,宏替換define,define語句用于將一個簡單的名字或標志符(或稱為宏名)來代替一個復雜的名字或字符串,其使用格式為: define 宏名(標志符) 字符串 如:define sum ina+inb+inc+
18、ind 在上面的語句中,用簡單的宏名sum來代替了一個復雜的表達式ina+inb+inc+ind,采用了這樣的定義形式后,在后面的程序中,就可以直接用sum來代表表達式ina+inb+inc+ind了。,文件包含include,include是文件包含語句,它可將一個文件全部包含到另一個文件中。其格式為: include “文件名” 使用include語句時應注意以下幾點: 一個include語句只能指定一個被包含的文件。 include語句可以出現在源程序的任何地方。被包含的文件若與包含文件不在同一個子目錄下,必須指明其路徑名。 文件包含允許多重包含,比如文件1包含文件2,文件2又包含文件3
19、等。,4.7 任務與函數,任務(task) 任務定義格式: task ; /注意無端口列表 端口及數據類型聲明語句; 其它語句; endtask 任務調用的格式為: (端口1,端口2,); 需要注意的是:任務調用時和定義時的端口變量應是一一對應的。,使用任務時,需注意,任務的定義與調用須在一個module模塊內。 定義任務時,沒有端口名列表,但需要緊接著進行輸入輸出端口和數據類型的說明。 當任務被調用時,任務被激活。任務的調用與模塊調用一樣通過任務名調用實現,調用時,需列出端口名列表,端口名的排序和類型必須與任務定義中的相一致。 一個任務可以調用別的任務和函數,可以調用的任務和函數個數不限。,
20、函數的目的是返回一個值,以用于表達式計算 函數的定義格式: function 函數名; 端口聲明; 局部變量定義; 其它語句; endfunction 是一個可選項,如果缺省,則返回值為1位寄存器類型的數據。,函數(function),函數舉例,function 7:0 get0; input7:0 x; reg7:0 count; integer i; begin count=0; for (i=0;i=7;i=i+1) if(xi=1b0) count=count+1; get0=count; end endfunction 上面的get0函數循環(huán)核對輸入數據x的每一位,計算出x中0的個數
21、,并返回一個適當的值。,在使用函數時,需注意,函數的定義與調用須在一個module模塊內。 函數只允許有輸入變量且必須至少有一個輸入變量,輸出變量由函數名本身擔任,在定義函數時,需對函數名說明其類型和位寬。 定義函數時,沒有端口名列表,但調用函數時,需列出端口名列表,端口名的排序和類型必須與定義時的相一致。這一點與任務相同 函數可以出現在持續(xù)賦值assign的右端表達式中。 函數不能調用任務,而任務可以調用別的任務和函數,且調用任務和函數個數不受限制。,任務與函數的比較,4.8 順序執(zhí)行與并發(fā)執(zhí)行,兩個或更多個“always”過程塊、“assign”持續(xù)賦值語句、實例元件調用等操作都是同時執(zhí)行
22、的。 在“always”模塊內部,其語句如果是非阻塞賦值,也是并發(fā)執(zhí)行的;而如果是阻塞賦值,則語句是按照指定的順序執(zhí)行的,語句的書寫順序對程序的執(zhí)行結果有著直接的影響。,順序執(zhí)行的例子,順序執(zhí)行模塊1 module serial1(q,a,clk); output q,a; input clk; reg q,a; always (posedge clk) begin q=q; a=q; end endmodule,順序執(zhí)行模塊2 module serial2(q,a,clk); output q,a; input clk; reg q,a; always(posedge clk) begin a=q;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年管理會計師專業(yè)能力認證考試試題附答案
- 迪士尼員工安全培訓卡課件
- 云南國防工業(yè)職業(yè)技術學院《室內設計(軍工場館)》2024-2025 學年第一學期期末試卷(藝術專業(yè))
- 邊坡支護安全教育培訓課件
- 內科主治醫(yī)師考試基礎知識練習試題及答案
- 2026年書記員測試題及答案
- 中小學德育活動策劃與學生品格塑造專項工作總結(2篇)
- 2025年企業(yè)審計年終工作總結(3篇)
- 銀行內部控制規(guī)范制度
- 2026年工作室成員個人工作總結(2篇)
- 醫(yī)院申請醫(yī)養(yǎng)結合申請書
- 2024-2025學年山東省濱州市北鎮(zhèn)中學鴻蒙班九年級下學寒假開學考試數學試題
- 園林綠化服務方案(3篇)
- 2025年流產家屬簽字協(xié)議書
- 2025年《中醫(yī)護理適宜技術臨床應用指南》
- 下頜阻生齒拔除病例匯報
- 生物樣本資源庫建設計劃及管理工作方案
- DBJ04-T 491-2025 建設工程消防設計審查驗收文件歸檔標準
- DB45∕T 2419-2021 鉆孔管波探測技術規(guī)程
- 2025年學校食堂從業(yè)人員食品安全知識培訓考試試題(附答案)
- GB/T 45752-2025礦用車載滅火系統(tǒng)安全技術要求
評論
0/150
提交評論