




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
16.1結(jié)構(gòu)說明語(yǔ)句Verilog語(yǔ)言中的任何過程模塊都從屬于以下四種結(jié)構(gòu)的說明語(yǔ)句。initial說明語(yǔ)句(2)always說明語(yǔ)句(3)task說明語(yǔ)句(4)function說明語(yǔ)句2initial和always說明語(yǔ)句在仿真的一開始即開始執(zhí)行。initial語(yǔ)句只執(zhí)行一次。相反,always語(yǔ)句則是不斷地重復(fù)執(zhí)行,直到仿真過程結(jié)束。always語(yǔ)句后面跟著的過程塊是否運(yùn)行,則要看它的觸發(fā)條件是否滿足,如滿足則運(yùn)行過程塊一次,再次滿足再運(yùn)行一次,直至仿真過程結(jié)束。在一個(gè)模塊中,使用initial和always語(yǔ)句的次數(shù)是不受限制的。task和function語(yǔ)句可以在程序模塊中的一處或多處調(diào)用。36.1.1initial語(yǔ)句initial語(yǔ)句的格式如下:initialbegin
語(yǔ)句1;
語(yǔ)句2;......
語(yǔ)句n;end4例6.1用initial塊對(duì)存儲(chǔ)器變量賦初始值initialbeginareg=0; //初始化寄存器aregfor(index=0;index<size;index=index+1)memory[index]=0; //初始化一個(gè)memoryend5例6.2用initial語(yǔ)句來(lái)生成激勵(lì)波形initialbegininputs='b000000; //初始時(shí)刻為0#10inputs='b011001; #10inputs='b011011; #10inputs='b011000; #10inputs='b001000; end6always語(yǔ)句由于其不斷活動(dòng)的特性,只有和一定的時(shí)序控制結(jié)合在一起才有用。如果一個(gè)always語(yǔ)句沒有時(shí)序控制,則這個(gè)always語(yǔ)句將會(huì)使仿真器產(chǎn)生死鎖。alwaysareg=~areg;但如果加上時(shí)序控制,則這個(gè)always語(yǔ)句將變?yōu)橐粭l非常有用的描述語(yǔ)句。
always#half_periodareg=~areg;7例6.5reg[7:0]counter;regtick;always@(posedgeareg)begintick=~tick;counter=counter+1;end8always的時(shí)間控制可以是沿觸發(fā)也可以是電平觸發(fā)的,可以單個(gè)信號(hào)也可以多個(gè)信號(hào),中間需要用關(guān)鍵字or連接。always@(posedgeclockorposedgereset)begin…endalways@(aorborc)begin…end9邊沿觸發(fā)的always塊常常描述時(shí)序行為,如有限狀態(tài)機(jī)。如果符合可綜合風(fēng)格要求,則可通過綜合工具自動(dòng)地將其轉(zhuǎn)換為表示寄存器組和門級(jí)組合邏輯的結(jié)構(gòu),而該結(jié)構(gòu)應(yīng)具有時(shí)序所要求的行為電平觸發(fā)的always塊常常用來(lái)描述組合邏輯的行為。如果符合可綜合風(fēng)格要求,可通過綜合工具自動(dòng)將其轉(zhuǎn)換為表示組合邏輯的門級(jí)邏輯結(jié)構(gòu)或帶鎖存器的組合邏輯結(jié)構(gòu),而該結(jié)構(gòu)應(yīng)具有所要求的行為。一個(gè)模塊中可以有多個(gè)always塊,它們都是并行運(yùn)行的。10always塊的or事件控制有時(shí),多個(gè)信號(hào)或者事件中任意一個(gè)發(fā)生的變化都能觸發(fā)語(yǔ)句或語(yǔ)句塊的執(zhí)行。在Verilog語(yǔ)言中,可以使用“或”表達(dá)式來(lái)表示這種情況。由關(guān)鍵詞“or”連接的多個(gè)事件名或信號(hào)名組成的列表稱為敏感列表。關(guān)鍵詞“or”被用來(lái)表示這種關(guān)系。Verilog1364-2001版本的語(yǔ)法中,對(duì)于原來(lái)的規(guī)定作了補(bǔ)充:關(guān)鍵詞"or"也可以使用","來(lái)代替。使用","來(lái)代替關(guān)鍵詞"or"也適用于跳變沿敏感的觸發(fā)器。11//有異步復(fù)位的電平敏感鎖存器always@(resetorclockord)//等待復(fù)位信號(hào)reset或時(shí)鐘信號(hào)clock或輸入信號(hào)d的改變beginif(reset)//若reset信號(hào)為高,把q置零
q=1'b0;elseif(clock)//若clock信號(hào)為高,鎖存輸入信號(hào)dq=d;end12//有異步復(fù)位的電平敏感鎖存器always@(reset,clock,d)//等待復(fù)位信號(hào)reset或時(shí)鐘信號(hào)clock或輸入信號(hào)d的改變beginif(reset)//若reset信號(hào)為高,把q置零
q=1'b0;elseif(clock)//若clock信號(hào)為高,鎖存輸入信號(hào)dq=d;end13//用reset異步下降沿復(fù)位,clk正跳變沿觸發(fā)的D寄存器always@(posedgeclk,negedgereset)//注意:使用逗號(hào)來(lái)代替關(guān)鍵字orif(!reset)q<=0;elseq<=d;14如果組合邏輯塊語(yǔ)句的輸入變量很多,那么編寫敏感列表會(huì)很繁瑣并且容易出錯(cuò)。針對(duì)這種情況,Verilog提供另外兩個(gè)特殊的符號(hào):@*和@(*),它們都表示對(duì)其后面語(yǔ)句塊中所有輸入變量的變化時(shí)敏感的。/用or操作符的組合邏輯塊//編寫敏感列表很繁瑣并且容易漏掉一個(gè)輸入always@(aorborcordoreorforgorhorporm)beginout1=a?b+c:d+e;out2=f?g+h:p+m;end15//不用上述方法,用符號(hào)@(*)來(lái)代替,//可以把所有輸入變量都自動(dòng)包括進(jìn)敏感列表。always@(*)beginout1=a?b+c:d+e;out2=f?g+h:p+m;end16電平敏感時(shí)序控制waitalwayswait(count_enable)#20count=count+1;仿真器連續(xù)監(jiān)視count_enable的值,若其值為0,則不執(zhí)行后面的語(yǔ)句,仿真會(huì)停頓下來(lái);如果其值為1,則在20個(gè)時(shí)間單位之后執(zhí)行這條語(yǔ)句。如果count_enable始終為1,那么count將每過20個(gè)時(shí)間單位加1。176.2task和function說明語(yǔ)句在設(shè)計(jì)中,設(shè)計(jì)者經(jīng)常需要在程序的多個(gè)不同地方實(shí)現(xiàn)同樣的功能。這表明有必要把這些公共的代碼提取出來(lái),將其組成子程序,然后在需要的地方調(diào)用這些子程序,以避免重復(fù)編碼。Verilog語(yǔ)言提供的任務(wù)和函數(shù)可以將較大的設(shè)計(jì)劃分為較小的代碼段,允許設(shè)計(jì)者將在多個(gè)地方使用的相同代碼提取出來(lái),編寫成任務(wù)和函數(shù),以使代碼簡(jiǎn)潔、易懂。18task和function說明語(yǔ)句的不同點(diǎn)(1)函數(shù)只能與主模塊共用同一個(gè)仿真時(shí)間單位,而任務(wù)可以定義自己的仿真時(shí)間單位。(2)函數(shù)不能啟動(dòng)任務(wù),而任務(wù)能啟動(dòng)其它任務(wù)和函數(shù)。(3)函數(shù)至少要有一個(gè)輸入變量,而任務(wù)可以沒有或有多個(gè)任何類型的變量。(4)函數(shù)返回一個(gè)值,而任務(wù)則不返回值。19task說明語(yǔ)句如果傳給任務(wù)的變量值和任務(wù)完成后接收結(jié)果的變量已定義,就可以用一條語(yǔ)句啟動(dòng)任務(wù)。任務(wù)完成以后控制就傳回啟動(dòng)過程。如任務(wù)內(nèi)部有定時(shí)控制,則啟動(dòng)的時(shí)間可以與控制返回的時(shí)間不同。任務(wù)可以啟動(dòng)其它的任務(wù),其它任務(wù)又可以啟動(dòng)別的任務(wù),可以啟動(dòng)的任務(wù)數(shù)是沒有限制的。不管有多少任務(wù)啟動(dòng),只有當(dāng)所有的啟動(dòng)任務(wù)完成以后,控制才能返回。20任務(wù)的定義定義任務(wù)的語(yǔ)法如下:task<任務(wù)名>;<端口及數(shù)據(jù)類型聲明語(yǔ)句>begin<語(yǔ)句1><語(yǔ)句2>.....<語(yǔ)句n>endendtask21任務(wù)的調(diào)用及變量的傳遞啟動(dòng)任務(wù)并傳遞輸入輸出變量的聲明語(yǔ)句的語(yǔ)法如下:
<任務(wù)名>(端口1,端口2,...,端口n);22modulecall_task;reg[15:0]old_word;reg[15:0]new_word;
taskswitch_bytes;input[15:0]old_w;output[15:0]new_w;reg[15:0]temp;//此變量可以不要,此處是為了說明task內(nèi)變量的定義
begintemp=old_w;new_w[15:8]=temp[7:0];new_w[7:0]=temp[15:8];endendtask23
initialbeginold_word=16'h3fa2;switch_bytes(old_word,new_word);#100;old_word=16'habcd;switch_bytes(old_word,new_word);endendmodule
24編寫Verilog程序?qū)崿F(xiàn)一個(gè)電路,該電路有2組輸入端口a和b,1組輸出端口c,位寬均為4,c輸出a和b中較大的數(shù)。要求“對(duì)兩數(shù)進(jìn)行比較找出最大值”這一功能用任務(wù)來(lái)實(shí)現(xiàn)。25moduletask_max(a,b,c);input[3:0]a,b;output[3:0]c;tasknew_max;input[3:0]a,b;output[3:0]c;
beginif(a>b)c=a;elsec=b;endendtaskalways@(a,b)new_max(a,b,c);endmodule26function說明語(yǔ)句函數(shù)的目的是返回一個(gè)用于表達(dá)式的值。定義函數(shù)的語(yǔ)法:function<返回值的類型或范圍>(函數(shù)名);<端口說明語(yǔ)句><變量類型說明語(yǔ)句>begin<語(yǔ)句>........endendfunction27從函數(shù)返回的值函數(shù)的定義蘊(yùn)含聲明了與函數(shù)同名的、函數(shù)內(nèi)部的寄存器。如在函數(shù)的聲明語(yǔ)句中<返回值的類型或范圍>為缺省,則這個(gè)寄存器是一位的,否則是與函數(shù)定義中<返回值的類型或范圍>一致的寄存器。函數(shù)的定義把函數(shù)返回值所賦值寄存器的名稱初始化為與函數(shù)同名的內(nèi)部變量。函數(shù)的調(diào)用函數(shù)的調(diào)用是通過將函數(shù)作為表達(dá)式中的操作數(shù)來(lái)實(shí)現(xiàn)的。<函數(shù)名>(<表達(dá)式>,…,<表達(dá)式>)28函數(shù)的使用規(guī)則與任務(wù)相比較函數(shù)的使用有較多的約束,下面給出的是函數(shù)的使用規(guī)則:函數(shù)的定義不能包含有任何的時(shí)間控制語(yǔ)句,即任何用#、@、或wait來(lái)標(biāo)識(shí)的語(yǔ)句。函數(shù)不能啟動(dòng)任務(wù)。定義函數(shù)時(shí)至少要有一個(gè)輸入?yún)⒘?。在函?shù)的定義中必須有一條賦值語(yǔ)句給函數(shù)中的一個(gè)內(nèi)部變量賦以函數(shù)的結(jié)果值,該內(nèi)部變量具有和函數(shù)名相同的名字。29modulecall_function;reg[15:0]old_word;reg[15:0]new_word;
function[15:0]switch_bytes;input[15:0]old_w;reg[15:0]temp;//此變量可以不要,此處是為了說明function內(nèi)變量的定義
begintemp=old_w;switch_bytes[15:8]=temp[7:0];switch_bytes[7:0]=temp[15:8];endendfunction
30
initialbeginold_word=16'h3fa2;new_word=switch_bytes(old_word);#100;old_word=16'habcd;new_word=switch_bytes(old_word);endendmodule
316.2.4函數(shù)使用舉例奇偶校驗(yàn)位的計(jì)算//定義一個(gè)模塊,其中包含能計(jì)算偶校驗(yàn)位的函數(shù)(calc_parity)moduleparity;reg[31:0]addr;regparity;initialbegin addr=32'h3456_789a; #10addr=32'hc4c6_78ff; #10addr=32'hff56_ff9a; #10addr=32'h3faa_aaaa;end32//每當(dāng)?shù)刂分蛋l(fā)生變化,計(jì)算新的偶校驗(yàn)位always@(addr)beginparity=calc_parity(addr);//第一次啟動(dòng)校驗(yàn)位計(jì)算函數(shù)calc_parity$display("Paritycalculated=%b",calc_parity(addr));//第二次啟動(dòng)校驗(yàn)位計(jì)算函數(shù)calc_parityend//定義偶校驗(yàn)計(jì)算函數(shù)functioncalc_parity;input[31:0]address;begin//適當(dāng)?shù)卦O(shè)置輸出值,使用隱含的內(nèi)部寄存器calc_parity
calc_parity=^address;//返回所有地址位的異或值endendfunctionendmodule33//定義偶校驗(yàn)位計(jì)算函數(shù),該函數(shù)采用ANSIC風(fēng)格的變量聲明functioncalc_parity
(input[31:0]address);begin//適當(dāng)?shù)卦O(shè)置輸出值,使用隱含的內(nèi)部寄存器calc_parity
calc_parity=^address;//返回所有地址位的異或值endendfunction使用C風(fēng)格進(jìn)行變量聲明的函數(shù)定義34//定義一個(gè)包含移位函數(shù)的模塊moduleshifter;//左/右移位寄存器`defineLEFT_SHIFT1'b0`defineRIGHT_SHIFT1'b1reg[31:0]addr,left_addr,right_addr;//regcontrol;
//每當(dāng)新地址出現(xiàn)時(shí)就計(jì)算右移位和左移位的值always@(addr)begin//調(diào)用下面定義的具有左右移位功能的函數(shù)
left_addr=shift(addr,`LEFT_SHIFT);right_addr=shift(addr,`RIGHT_SHIFT);end35//定義移位函數(shù),其輸出是一個(gè)32位的值function[31:0]shift;input[31:0]address;inputcontrol;begin//根據(jù)控制信號(hào)適當(dāng)?shù)卦O(shè)置輸出值
shift=(control==`LEFT_SHIFT)?(address<<1):(address>>1);endendfunctioninitialbeginaddr=32'h0001_0000;#100;addr=32'h0200_0000;endendmodule366.4常用的系統(tǒng)任務(wù)6.4.1$display和$write任務(wù)格式$display(p1,p2,…,pn);$write(p1,p2,…,pn);這兩個(gè)函數(shù)和系統(tǒng)任務(wù)的作用是用來(lái)輸出信息,即將參數(shù)p2到pn按參數(shù)p1給定的格式輸出。參數(shù)p1通常稱為“格式控制”,參數(shù)p2至pn通常稱為“輸出表列”。這兩個(gè)任務(wù)的作用基本相同。$display自動(dòng)地在輸出后進(jìn)行換行,$write則不是這樣。如果想在一行里輸出多個(gè)信息,可以使用$write。因?yàn)?write在輸出時(shí)不換行,要注意它的使用。可以在$write中加入換行符\n,以確保明確的輸出顯示格式。376.4.2文件輸出打開文件使用系統(tǒng)任務(wù)$fopen用法:$fopen(“<文件名>”);用法:<文件句柄>=$fopen(“<文件名>”);
任務(wù)$fopen返回一個(gè)被稱為多通道描述符的32位值。多通道描述符中只有一位被設(shè)置成1.標(biāo)準(zhǔn)輸出有一個(gè)多通道描述符,其最低位(第0位)被設(shè)置成1.標(biāo)準(zhǔn)的輸出也稱通道為0。標(biāo)準(zhǔn)輸出一直是開放的。以后對(duì)$fopen的每一次調(diào)用打開一個(gè)新通道,并且返回一個(gè)設(shè)置第1位、第2位等,直到32位描述的第30位。第31位是保留位。通道號(hào)與多通道描述符中被設(shè)置成1的位相對(duì)應(yīng)。多通道的優(yōu)點(diǎn)在于可以有選擇的同時(shí)寫多個(gè)文件。38寫文件$fdisplay$fmonitor$fwrite$fstrobe都用于寫文件這些任務(wù)在語(yǔ)法上與常規(guī)系統(tǒng)任務(wù)$display、$monitor等類似關(guān)閉文件使用系統(tǒng)任務(wù)$fclose$fclose(<文件描述符>);39moduleex6_20;//多通道描述符integerhandle1,handle2,handle3;//整型數(shù)為32位//標(biāo)準(zhǔn)輸出是打開的;descriptor=32'h0000_0001(第0位置1)integerdesc1,desc2,desc3;//三個(gè)文件的描述符initialbeginhandle1=$fopen("file1.out");//handle1=32'h0000_0002(bit1set1)handle2=$fopen("file2.out");//handle2=32'h0000_0004(bit2set1)handle3=$fopen("file3.out");//handle3=32'h0000_0008(bit3set1)40desc1=handle1|1;//按位或;desc1=32'h0000_0003$fdisplay(desc1,"Display1");//寫到文件file1.out和標(biāo)準(zhǔn)輸出stdoutdesc2=handle2|handle1;//desc2=32'h0000_0006$fdisplay(desc2,"Display2");//寫到文件file1.out和file2.outdesc3=handle3;//desc3=32'h0000_0008$fdisplay(desc3,"Display3desc1=%ddesc2=%ddesc3=%d",desc1,desc2,desc3);//只寫到文件file3.out$fclose(handle1|handle2|handle3);//本句不寫也可以enden
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 設(shè)備驗(yàn)收復(fù)習(xí)試題(一)
- 《俄國(guó)十月革命》蘇聯(lián)社會(huì)主義道路的探索課件-
- 安裝燈具的合同范本
- 2025企業(yè)投資居間合同范本
- 課堂上的感恩課件
- 酒店行業(yè)銷售部月度匯報(bào)
- 2025年臨時(shí)工勞動(dòng)合同標(biāo)準(zhǔn)范本
- 課題競(jìng)標(biāo)管理辦法解讀
- 汽車行業(yè)外部環(huán)境分析
- 員工培訓(xùn)重要性
- 2018年四川省高考數(shù)學(xué)試卷(文科)(全國(guó)新課標(biāo)Ⅲ)
- 前列腺增生患者的護(hù)理查房課件
- 2023年四川農(nóng)信(農(nóng)商行)招聘筆試真題
- 呼蘭河傳(2022年黑龍江牡丹江中考語(yǔ)文試卷記敘文閱讀題及答案)
- 小學(xué)英語(yǔ)“教學(xué)評(píng)一體化”實(shí)施
- 危險(xiǎn)化學(xué)品出入庫(kù)管理制度
- 醫(yī)學(xué)課件新生兒黃疸5
- 2024年中考英語(yǔ)作文熱點(diǎn)主題:人工智能滿分范文10篇精彩表達(dá)25句
- 2025年呼和浩特市重點(diǎn)中學(xué)中考領(lǐng)航2020大二輪復(fù)習(xí)數(shù)學(xué)試題模擬含解析
- 水泥攪拌樁施工記錄-自動(dòng)計(jì)算
- 全國(guó)大學(xué)生網(wǎng)絡(luò)安全知識(shí)競(jìng)賽題庫(kù)及答案
評(píng)論
0/150
提交評(píng)論