結(jié)構(gòu)語句系統(tǒng)任務函數(shù)語句和顯示系統(tǒng)任務課件_第1頁
結(jié)構(gòu)語句系統(tǒng)任務函數(shù)語句和顯示系統(tǒng)任務課件_第2頁
結(jié)構(gòu)語句系統(tǒng)任務函數(shù)語句和顯示系統(tǒng)任務課件_第3頁
結(jié)構(gòu)語句系統(tǒng)任務函數(shù)語句和顯示系統(tǒng)任務課件_第4頁
結(jié)構(gòu)語句系統(tǒng)任務函數(shù)語句和顯示系統(tǒng)任務課件_第5頁
已閱讀5頁,還剩41頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

16.1結(jié)構(gòu)說明語句Verilog語言中的任何過程模塊都從屬于以下四種結(jié)構(gòu)的說明語句。initial說明語句(2)always說明語句(3)task說明語句(4)function說明語句2initial和always說明語句在仿真的一開始即開始執(zhí)行。initial語句只執(zhí)行一次。相反,always語句則是不斷地重復執(zhí)行,直到仿真過程結(jié)束。always語句后面跟著的過程塊是否運行,則要看它的觸發(fā)條件是否滿足,如滿足則運行過程塊一次,再次滿足再運行一次,直至仿真過程結(jié)束。在一個模塊中,使用initial和always語句的次數(shù)是不受限制的。task和function語句可以在程序模塊中的一處或多處調(diào)用。36.1.1initial語句initial語句的格式如下:initialbegin

語句1;

語句2;......

語句n;end4例6.1用initial塊對存儲器變量賦初始值initialbeginareg=0; //初始化寄存器aregfor(index=0;index<size;index=index+1)memory[index]=0; //初始化一個memoryend5例6.2用initial語句來生成激勵波形initialbegininputs='b000000; //初始時刻為0#10inputs='b011001; #10inputs='b011011; #10inputs='b011000; #10inputs='b001000; end6always語句由于其不斷活動的特性,只有和一定的時序控制結(jié)合在一起才有用。如果一個always語句沒有時序控制,則這個always語句將會使仿真器產(chǎn)生死鎖。alwaysareg=~areg;但如果加上時序控制,則這個always語句將變?yōu)橐粭l非常有用的描述語句。

always#half_periodareg=~areg;7例6.5reg[7:0]counter;regtick;always@(posedgeareg)begintick=~tick;counter=counter+1;end8always的時間控制可以是沿觸發(fā)也可以是電平觸發(fā)的,可以單個信號也可以多個信號,中間需要用關(guān)鍵字or連接。always@(posedgeclockorposedgereset)begin…endalways@(aorborc)begin…end9邊沿觸發(fā)的always塊常常描述時序行為,如有限狀態(tài)機。如果符合可綜合風格要求,則可通過綜合工具自動地將其轉(zhuǎn)換為表示寄存器組和門級組合邏輯的結(jié)構(gòu),而該結(jié)構(gòu)應具有時序所要求的行為電平觸發(fā)的always塊常常用來描述組合邏輯的行為。如果符合可綜合風格要求,可通過綜合工具自動將其轉(zhuǎn)換為表示組合邏輯的門級邏輯結(jié)構(gòu)或帶鎖存器的組合邏輯結(jié)構(gòu),而該結(jié)構(gòu)應具有所要求的行為。一個模塊中可以有多個always塊,它們都是并行運行的。10always塊的or事件控制有時,多個信號或者事件中任意一個發(fā)生的變化都能觸發(fā)語句或語句塊的執(zhí)行。在Verilog語言中,可以使用“或”表達式來表示這種情況。由關(guān)鍵詞“or”連接的多個事件名或信號名組成的列表稱為敏感列表。關(guān)鍵詞“or”被用來表示這種關(guān)系。Verilog1364-2001版本的語法中,對于原來的規(guī)定作了補充:關(guān)鍵詞"or"也可以使用","來代替。使用","來代替關(guān)鍵詞"or"也適用于跳變沿敏感的觸發(fā)器。11//有異步復位的電平敏感鎖存器always@(resetorclockord)//等待復位信號reset或時鐘信號clock或輸入信號d的改變beginif(reset)//若reset信號為高,把q置零

q=1'b0;elseif(clock)//若clock信號為高,鎖存輸入信號dq=d;end12//有異步復位的電平敏感鎖存器always@(reset,clock,d)//等待復位信號reset或時鐘信號clock或輸入信號d的改變beginif(reset)//若reset信號為高,把q置零

q=1'b0;elseif(clock)//若clock信號為高,鎖存輸入信號dq=d;end13//用reset異步下降沿復位,clk正跳變沿觸發(fā)的D寄存器always@(posedgeclk,negedgereset)//注意:使用逗號來代替關(guān)鍵字orif(!reset)q<=0;elseq<=d;14如果組合邏輯塊語句的輸入變量很多,那么編寫敏感列表會很繁瑣并且容易出錯。針對這種情況,Verilog提供另外兩個特殊的符號:@*和@(*),它們都表示對其后面語句塊中所有輸入變量的變化時敏感的。/用or操作符的組合邏輯塊//編寫敏感列表很繁瑣并且容易漏掉一個輸入always@(aorborcordoreorforgorhorporm)beginout1=a?b+c:d+e;out2=f?g+h:p+m;end15//不用上述方法,用符號@(*)來代替,//可以把所有輸入變量都自動包括進敏感列表。always@(*)beginout1=a?b+c:d+e;out2=f?g+h:p+m;end16電平敏感時序控制waitalwayswait(count_enable)#20count=count+1;仿真器連續(xù)監(jiān)視count_enable的值,若其值為0,則不執(zhí)行后面的語句,仿真會停頓下來;如果其值為1,則在20個時間單位之后執(zhí)行這條語句。如果count_enable始終為1,那么count將每過20個時間單位加1。176.2task和function說明語句在設(shè)計中,設(shè)計者經(jīng)常需要在程序的多個不同地方實現(xiàn)同樣的功能。這表明有必要把這些公共的代碼提取出來,將其組成子程序,然后在需要的地方調(diào)用這些子程序,以避免重復編碼。Verilog語言提供的任務和函數(shù)可以將較大的設(shè)計劃分為較小的代碼段,允許設(shè)計者將在多個地方使用的相同代碼提取出來,編寫成任務和函數(shù),以使代碼簡潔、易懂。18task和function說明語句的不同點(1)函數(shù)只能與主模塊共用同一個仿真時間單位,而任務可以定義自己的仿真時間單位。(2)函數(shù)不能啟動任務,而任務能啟動其它任務和函數(shù)。(3)函數(shù)至少要有一個輸入變量,而任務可以沒有或有多個任何類型的變量。(4)函數(shù)返回一個值,而任務則不返回值。19task說明語句如果傳給任務的變量值和任務完成后接收結(jié)果的變量已定義,就可以用一條語句啟動任務。任務完成以后控制就傳回啟動過程。如任務內(nèi)部有定時控制,則啟動的時間可以與控制返回的時間不同。任務可以啟動其它的任務,其它任務又可以啟動別的任務,可以啟動的任務數(shù)是沒有限制的。不管有多少任務啟動,只有當所有的啟動任務完成以后,控制才能返回。20任務的定義定義任務的語法如下:task<任務名>;<端口及數(shù)據(jù)類型聲明語句>begin<語句1><語句2>.....<語句n>endendtask21任務的調(diào)用及變量的傳遞啟動任務并傳遞輸入輸出變量的聲明語句的語法如下:

<任務名>(端口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)一個電路,該電路有2組輸入端口a和b,1組輸出端口c,位寬均為4,c輸出a和b中較大的數(shù)。要求“對兩數(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說明語句函數(shù)的目的是返回一個用于表達式的值。定義函數(shù)的語法:function<返回值的類型或范圍>(函數(shù)名);<端口說明語句><變量類型說明語句>begin<語句>........endendfunction27從函數(shù)返回的值函數(shù)的定義蘊含聲明了與函數(shù)同名的、函數(shù)內(nèi)部的寄存器。如在函數(shù)的聲明語句中<返回值的類型或范圍>為缺省,則這個寄存器是一位的,否則是與函數(shù)定義中<返回值的類型或范圍>一致的寄存器。函數(shù)的定義把函數(shù)返回值所賦值寄存器的名稱初始化為與函數(shù)同名的內(nèi)部變量。函數(shù)的調(diào)用函數(shù)的調(diào)用是通過將函數(shù)作為表達式中的操作數(shù)來實現(xiàn)的。<函數(shù)名>(<表達式>,…,<表達式>)28函數(shù)的使用規(guī)則與任務相比較函數(shù)的使用有較多的約束,下面給出的是函數(shù)的使用規(guī)則:函數(shù)的定義不能包含有任何的時間控制語句,即任何用#、@、或wait來標識的語句。函數(shù)不能啟動任務。定義函數(shù)時至少要有一個輸入?yún)⒘俊T诤瘮?shù)的定義中必須有一條賦值語句給函數(shù)中的一個內(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ù)使用舉例奇偶校驗位的計算//定義一個模塊,其中包含能計算偶校驗位的函數(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//每當?shù)刂分蛋l(fā)生變化,計算新的偶校驗位always@(addr)beginparity=calc_parity(addr);//第一次啟動校驗位計算函數(shù)calc_parity$display("Paritycalculated=%b",calc_parity(addr));//第二次啟動校驗位計算函數(shù)calc_parityend//定義偶校驗計算函數(shù)functioncalc_parity;input[31:0]address;begin//適當?shù)卦O(shè)置輸出值,使用隱含的內(nèi)部寄存器calc_parity

calc_parity=^address;//返回所有地址位的異或值endendfunctionendmodule33//定義偶校驗位計算函數(shù),該函數(shù)采用ANSIC風格的變量聲明functioncalc_parity

(input[31:0]address);begin//適當?shù)卦O(shè)置輸出值,使用隱含的內(nèi)部寄存器calc_parity

calc_parity=^address;//返回所有地址位的異或值endendfunction使用C風格進行變量聲明的函數(shù)定義34//定義一個包含移位函數(shù)的模塊moduleshifter;//左/右移位寄存器`defineLEFT_SHIFT1'b0`defineRIGHT_SHIFT1'b1reg[31:0]addr,left_addr,right_addr;//regcontrol;

//每當新地址出現(xiàn)時就計算右移位和左移位的值always@(addr)begin//調(diào)用下面定義的具有左右移位功能的函數(shù)

left_addr=shift(addr,`LEFT_SHIFT);right_addr=shift(addr,`RIGHT_SHIFT);end35//定義移位函數(shù),其輸出是一個32位的值function[31:0]shift;input[31:0]address;inputcontrol;begin//根據(jù)控制信號適當?shù)卦O(shè)置輸出值

shift=(control==`LEFT_SHIFT)?(address<<1):(address>>1);endendfunctioninitialbeginaddr=32'h0001_0000;#100;addr=32'h0200_0000;endendmodule366.4常用的系統(tǒng)任務6.4.1$display和$write任務格式$display(p1,p2,…,pn);$write(p1,p2,…,pn);這兩個函數(shù)和系統(tǒng)任務的作用是用來輸出信息,即將參數(shù)p2到pn按參數(shù)p1給定的格式輸出。參數(shù)p1通常稱為“格式控制”,參數(shù)p2至pn通常稱為“輸出表列”。這兩個任務的作用基本相同。$display自動地在輸出后進行換行,$write則不是這樣。如果想在一行里輸出多個信息,可以使用$write。因為$write在輸出時不換行,要注意它的使用。可以在$write中加入換行符\n,以確保明確的輸出顯示格式。376.4.2文件輸出打開文件使用系統(tǒng)任務$fopen用法:$fopen(“<文件名>”);用法:<文件句柄>=$fopen(“<文件名>”);

任務$fopen返回一個被稱為多通道描述符的32位值。多通道描述符中只有一位被設(shè)置成1.標準輸出有一個多通道描述符,其最低位(第0位)被設(shè)置成1.標準的輸出也稱通道為0。標準輸出一直是開放的。以后對$fopen的每一次調(diào)用打開一個新通道,并且返回一個設(shè)置第1位、第2位等,直到32位描述的第30位。第31位是保留位。通道號與多通道描述符中被設(shè)置成1的位相對應。多通道的優(yōu)點在于可以有選擇的同時寫多個文件。38寫文件$fdisplay$fmonitor$fwrite$fstrobe都用于寫文件這些任務在語法上與常規(guī)系統(tǒng)任務$display、$monitor等類似關(guān)閉文件使用系統(tǒng)任務$fclose$fclose(<文件描述符>);39moduleex6_20;//多通道描述符integerhandle1,handle2,handle3;//整型數(shù)為32位//標準輸出是打開的;descriptor=32'h0000_0001(第0位置1)integerdesc1,desc2,desc3;//三個文件的描述符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和標準輸出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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論