Verilog行為描述高級(jí)語(yǔ)句_第1頁(yè)
Verilog行為描述高級(jí)語(yǔ)句_第2頁(yè)
Verilog行為描述高級(jí)語(yǔ)句_第3頁(yè)
Verilog行為描述高級(jí)語(yǔ)句_第4頁(yè)
Verilog行為描述高級(jí)語(yǔ)句_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

講行為描述語(yǔ)句◆過(guò)程語(yǔ)句(initial、always)◆塊語(yǔ)句(begin-end、fork-join)◆賦值語(yǔ)句(assign、=、<=)◆條件語(yǔ)句(if-else、case、casez、casex)◆循環(huán)語(yǔ)句(for、forever、repeat、while)◆編譯指示語(yǔ)句(`define、`include、`ifdef、`else、`endif)◆任務(wù)(task)與函數(shù)(function)◆順序執(zhí)行與并發(fā)執(zhí)行2021/5/91VerilogHDL行為語(yǔ)句類別語(yǔ)句可綜合性過(guò)程語(yǔ)句initial

always√塊語(yǔ)句串行塊begin-end√并行塊fork-join

賦值語(yǔ)句持續(xù)賦值assign√過(guò)程賦值=、<=√條件語(yǔ)句if-else√case√

循環(huán)語(yǔ)句for√repeat

while

forever

編譯向?qū)дZ(yǔ)句`define√`include`ifdef,`else,`endif√2021/5/924.1

過(guò)程語(yǔ)句

initialalways在一個(gè)模塊(module)中,使用initial和always語(yǔ)句的次數(shù)是不受限制的。initial語(yǔ)句常用于仿真中的初始化,initial過(guò)程塊中的語(yǔ)句僅執(zhí)行一次;always塊內(nèi)的語(yǔ)句則是不斷重復(fù)執(zhí)行的,always結(jié)構(gòu)在仿真過(guò)程中是時(shí)刻活動(dòng)的。2021/5/93always過(guò)程語(yǔ)句使用模板always@(<敏感信號(hào)表達(dá)式event-expression>)begin //過(guò)程賦值 //if-else,case,casex,casez選擇語(yǔ)句 //while,repeat,for循環(huán) //task,function調(diào)用end“always”過(guò)程語(yǔ)句通常是帶有觸發(fā)條件的,觸發(fā)條件寫(xiě)在敏感信號(hào)表達(dá)式中,只有當(dāng)觸發(fā)條件滿足時(shí),其后的“begin-end”塊語(yǔ)句才能被執(zhí)行。2021/5/94敏感信號(hào)表達(dá)式敏感信號(hào)表達(dá)式又稱事件表達(dá)式或敏感信號(hào)列表,即當(dāng)該表達(dá)式中變量的值改變時(shí),就會(huì)引發(fā)塊內(nèi)語(yǔ)句的執(zhí)行。因此敏感信號(hào)表達(dá)式中應(yīng)列出影響塊內(nèi)取值的所有信號(hào)。若有兩個(gè)或兩個(gè)以上信號(hào)時(shí),它們之間用“or”連接。always@(a) //當(dāng)信號(hào)a的值發(fā)生改變

always@(aorb) //當(dāng)信號(hào)a或信號(hào)b的值發(fā)生改變

always@(posedgeclock)//當(dāng)clock的上升沿到來(lái)時(shí)

always@(negedgeclock)//當(dāng)clock的下降沿到來(lái)時(shí)

always@(posedgeclkornegedgereset) //當(dāng)clk的上升沿到來(lái)或reset信號(hào)的下降沿到來(lái)電平敏感,組合邏輯電路采用邊沿敏感,時(shí)序邏輯用。不要混用2021/5/95敏感信號(hào)列表舉例modulemux4_1(out,in0,in1,in2,in3,sel);outputout;inputin0,in1,in2,in3;input[1:0]sel;regout;always@(in0,in1,in2,in3,sel)//敏感信號(hào)列表case(sel)2'b00: out=in0;2'b01: out=in1;2'b10: out=in2;2'b11: out=in3;default:out=2'bx;endcaseendmodule4選1數(shù)據(jù)選擇器2021/5/96posedge和negedge關(guān)鍵字對(duì)于時(shí)序電路,事件通常是由時(shí)鐘邊沿觸發(fā)的,為表達(dá)邊沿這個(gè)概念,Verilog提供了posedge和negedge關(guān)鍵字來(lái)描述。比如:【例】同步置數(shù)、同步清零的計(jì)數(shù)器modulecount(out,data,load,reset,clk);output[7:0]out;input[7:0]data;inputload,clk,reset;reg[7:0]out;always@(posedgeclk)//clk上升沿觸發(fā)beginif(!reset)out=8'h00;//同步清0,低電平有效elseif(load)out=data;//同步預(yù)置else out=out+1; //計(jì)數(shù)endendmodule2021/5/974.2

塊語(yǔ)句塊語(yǔ)句是由塊標(biāo)志符begin-end或fork-join界定的一組語(yǔ)句,當(dāng)塊語(yǔ)句只包含一條語(yǔ)句時(shí),塊標(biāo)志符可以缺省。順序塊,以關(guān)鍵字begin…end將多條語(yǔ)句封裝成塊。按順序執(zhí)行。

begin

regb=rega;

regc=regb; end由于begin-end塊內(nèi)的語(yǔ)句順序執(zhí)行,在最后,將regb、regc的值都更新為rega的值,該begin-end塊執(zhí)行完后,regb、regc的值是相同的。2021/5/98并行塊(了解即可)以關(guān)鍵字fork…join將多條語(yǔ)句封裝成塊所有語(yǔ)句并行執(zhí)行initialforka=0;#5b=1;#10c={a,b};#15d={b,a};join并行塊容易引起競(jìng)爭(zhēng)適用于絕對(duì)時(shí)間的控制實(shí)際建模時(shí),并行塊不可綜合。用于仿真。僅用順序塊即可2021/5/994.3過(guò)程賦值語(yǔ)句

行為級(jí)的賦值語(yǔ)句必須出現(xiàn)在initial和always結(jié)構(gòu)中過(guò)程賦值語(yǔ)句的左端都必須是reg類型分為阻塞性賦值和非阻塞性賦值2021/5/910非阻塞(non_blocking)賦值方式賦值符號(hào)為“<=”,如:b<=a;

非阻塞賦值在整個(gè)過(guò)程塊結(jié)束時(shí)才完成賦值操作,即b的值并不是立刻就改變的。實(shí)際并行。

阻塞(blocking)賦值方式賦值符號(hào)為“=”,如:b=a;

阻塞賦值在該語(yǔ)句結(jié)束時(shí)就立即完成賦值操作,即b的值在該條語(yǔ)句結(jié)束后立刻改變。如果在一個(gè)塊語(yǔ)句中,有多條阻塞賦值語(yǔ)句,那么在前面的賦值語(yǔ)句沒(méi)有完成之前,后面的語(yǔ)句就不能被執(zhí)行,仿佛被阻塞了(blocking)一樣,因此稱為阻塞賦值方式。實(shí)際順序執(zhí)行。2021/5/911阻塞賦值與非阻塞賦值

非阻塞賦值modulenon_block(c,b,a,clk);outputc,b;inputclk,a;regc,b;always@(posedgeclk) begin

b<=a; c<=b; endendmodule阻塞賦值moduleblock(c,b,a,clk);outputc,b;inputclk,a;regc,b;always@(posedgeclk) begin

b=a; c=b; endendmodule2021/5/912阻塞賦值與非阻塞賦值非阻塞賦值綜合結(jié)果:阻塞賦值綜合結(jié)果2021/5/913阻塞賦值與非阻塞賦值非阻塞賦值仿真波形圖

阻塞賦值仿真波形圖2021/5/9144.4

條件語(yǔ)句(if-else語(yǔ)句)if-else語(yǔ)句使用方法有以下3種:(1)if(表達(dá)式)語(yǔ)句1;[else;] //建議添加一個(gè)空else語(yǔ)句防止出現(xiàn)鎖存器(2)if(表達(dá)式)語(yǔ)句1;

else語(yǔ)句2;(3)if(表達(dá)式1)語(yǔ)句1;

elseif(表達(dá)式2)語(yǔ)句2;

elseif(表達(dá)式3)語(yǔ)句3; ……

elseif(表達(dá)式n)語(yǔ)句n;

else語(yǔ)句n+1;2021/5/915關(guān)鍵字為case、default、endcasecase語(yǔ)句的結(jié)構(gòu)如下。case(敏感表達(dá)式)值1:語(yǔ)句1; //case分支項(xiàng)值2:語(yǔ)句2;……值n:語(yǔ)句n;

default:語(yǔ)句n+1;endcasecase語(yǔ)句2021/5/916注意事項(xiàng)case語(yǔ)句中的每個(gè)分支條件必須不同,變量的位寬要嚴(yán)格相等,還要使用明確指定寬度的方式,避免使用“'d”等不指明寬度的分支條件。case語(yǔ)句中的每個(gè)分支可以接多條待執(zhí)行語(yǔ)句,只需要使用begin…end即可case語(yǔ)句中只能有一個(gè)default語(yǔ)句,而且建議使用default,也是為了得到最后綜合的電路不會(huì)生成鎖存器。如……2'b01:beginout=a-b;sum=a+b;

end……2021/5/917BCD碼—七段數(shù)碼管顯示譯碼器moduledecode4_7(decodeout,indec);output[6:0]decodeout;input[3:0]indec;reg[6:0]decodeout;always@(indec)begincase(indec)//用case語(yǔ)句進(jìn)行譯碼4'd0:decodeout=7'b1111110;4'd1:decodeout=7'b0110000;4'd2:decodeout=7'b1101101;4'd3:decodeout=7'b1111001;4'd4:decodeout=7'b0110011;4'd5:decodeout=7'b1011011;4'd6:decodeout=7'b1011111;4'd7:decodeout=7'b1110000;4'd8:decodeout=7'b1111111;4'd9:decodeout=7'b1111011;

default:decodeout=7'bx;endcaseendendmodule2021/5/918簡(jiǎn)易ALU電路的行為級(jí)建模modulemy_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)3'b000:out=a;3'b001:out=a+b;3'b010:out=a-b;3'b011:out=a/b;3'b100:out=a%b;3'b101:out=a<<1;3'b110:out=a>>1;3'b111:out=a>b;default:out=5'b00000;endcaseendmodule2021/5/9194.5循環(huán)語(yǔ)句repeatinitialbegin

for(i=0;i<4;i=i+1)

out=out+1;endinitialbegin

repeat(5)out=out+1;endinitialbegini=0;

while(i<0)i=i+1;endforwhile在Verilog中存在四種類型的循環(huán)語(yǔ)句,用來(lái)控制語(yǔ)句的執(zhí)行次數(shù)。這四種語(yǔ)句分別為:(1)forever:連續(xù)地執(zhí)行語(yǔ)句;多用在“initial”塊中,以生成時(shí)鐘等周期性波形。(2)repeat:連續(xù)執(zhí)行一條語(yǔ)句n次。(3)while:執(zhí)行一條語(yǔ)句直到某個(gè)條件不滿足。(4)for:有條件的循環(huán)語(yǔ)句。2021/5/920forever循環(huán)

沒(méi)有條件,永遠(yuǎn)循環(huán)類似always,但使用在initial里比較如下兩例Initialbeginclock=0;

forever#10clock=~clock;endinitialclock=0;always#10clock=~clock;2021/5/921用for語(yǔ)句描述七人投票表決器modulevoter7(pass,vote);outputpass;input[6:0]vote;reg[2:0]sum;integeri;regpass;always@(vote)beginsum=0; for(i=0;i<=6;i=i+1) if(vote[i])sum=sum+1; if(sum[2])pass=1;//超過(guò)4人贊成,則通過(guò) else pass=0;endendmodule2021/5/922用repeat實(shí)現(xiàn)8位二進(jìn)制數(shù)乘法

modulemult_repeat(outcome,a,b);//無(wú)符號(hào)數(shù)串行乘法parametersize=8;input[size:1]a,b;output[2*size:1]outcome;reg[2*size:1]temp_a,outcome;reg[size:1]temp_b;always@(aorb)beginoutcome=0;temp_a=a;temp_b=b;repeat(size) //repeat語(yǔ)句,size為循環(huán)次數(shù)begin if(temp_b[1])//如果temp_b的最低位為1,就執(zhí)行下面的加法 outcome=outcome+temp_a; temp_a=temp_a<<1;//操作數(shù)a左移一位 temp_b=temp_b>>1;//操作數(shù)b右移一位endendendmodule2021/5/9234.6

編譯指示語(yǔ)句Verilog允許在程序中使用特殊的編譯向?qū)В–ompilerDirectives)語(yǔ)句,在編譯時(shí),通常先對(duì)這些向?qū)дZ(yǔ)句進(jìn)行“預(yù)處理”,然后再將預(yù)處理的結(jié)果和源程序一起進(jìn)行編譯。向?qū)дZ(yǔ)句以符號(hào)“`”開(kāi)頭,以區(qū)別于其它語(yǔ)句。Verilog提供了十幾條編譯向?qū)дZ(yǔ)句,如:`define、`ifdef、`else、`endif、`restall等。比較常用的有`define,`include和`ifdef、`else、`endif等。

2021/5/924宏替換`define

`define語(yǔ)句用于將一個(gè)簡(jiǎn)單的名字或標(biāo)志符(或稱為宏名)來(lái)代替一個(gè)復(fù)雜的名字或字符串,其使用格式為:`define宏名(標(biāo)志符)

字符串如:`definesumina+inb+inc+ind在上面的語(yǔ)句中,用簡(jiǎn)單的宏名sum來(lái)代替了一個(gè)復(fù)雜的表達(dá)式ina+inb+inc+ind,采用了這樣的定義形式后,在后面的程序中,就可以直接用sum來(lái)代表表達(dá)式ina+inb+inc+ind了。2021/5/925文件包含`include

`include是文件包含語(yǔ)句,它可將一個(gè)文件全部包含到另一個(gè)文件中。其格式為:

`include“文件名”使用`include語(yǔ)句時(shí)應(yīng)注意以下幾點(diǎn):一個(gè)`include語(yǔ)句只能指定一個(gè)被包含的文件。`include語(yǔ)句可以出現(xiàn)在源程序的任何地方。被包含的文件若與包含文件不在同一個(gè)子目錄下,必須指明其路徑名。文件包含允許多重包含,比如文件1包含文件2,文件2又包含文件3等。

2021/5/9264.7

任務(wù)與函數(shù)

任務(wù)(task)任務(wù)定義格式:task<任務(wù)名>; //注意無(wú)端口列表端口及數(shù)據(jù)類型聲明語(yǔ)句;其它語(yǔ)句;

endtask任務(wù)調(diào)用的格式為:

<任務(wù)名>(端口1,端口2,……);需要注意的是:任務(wù)調(diào)用時(shí)和定義時(shí)的端口變量應(yīng)是一一對(duì)應(yīng)的。2021/5/927使用任務(wù)時(shí),需注意任務(wù)的定義與調(diào)用須在一個(gè)module模塊內(nèi)。定義任務(wù)時(shí),沒(méi)有端口名列表,但需要緊接著進(jìn)行輸入輸出端口和數(shù)據(jù)類型的說(shuō)明。

當(dāng)任務(wù)被調(diào)用時(shí),任務(wù)被激活。任務(wù)的調(diào)用與模塊調(diào)用一樣通過(guò)任務(wù)名調(diào)用實(shí)現(xiàn),調(diào)用時(shí),需列出端口名列表,端口名的排序和類型必須與任務(wù)定義中的相一致。

一個(gè)任務(wù)可以調(diào)用別的任務(wù)和函數(shù),可以調(diào)用的任務(wù)和函數(shù)個(gè)數(shù)不限。

2021/5/928函數(shù)的目的是返回一個(gè)值,以用于表達(dá)式計(jì)算函數(shù)的定義格式: function<返回值位寬或類型說(shuō)明>函數(shù)名; 端口聲明; 局部變量定義; 其它語(yǔ)句; endfunction<返回值位寬或類型說(shuō)明>是一個(gè)可選項(xiàng),如果缺省,則返回值為1位寄存器類型的數(shù)據(jù)。函數(shù)(function)2021/5/929函數(shù)舉例function[7:0]get0;input[7:0]x;reg[7:0]count;integeri;begin count=0;for(i=0;i<=7;i=i+1) if(x[i]=1'b0)count=count+1;

get0=count;endendfunction上面的get0函數(shù)循環(huán)核對(duì)輸入數(shù)據(jù)x的每一位,計(jì)算出x中0的個(gè)數(shù),并返回一個(gè)適當(dāng)?shù)闹怠?021/5/930在使用函數(shù)時(shí),需注意

函數(shù)的定義與調(diào)用須在一個(gè)module模塊內(nèi)。函數(shù)只允許有輸入變量且必須至少有一個(gè)輸入變量,輸出變量由函數(shù)名本身?yè)?dān)任,在定義函數(shù)時(shí),需對(duì)函數(shù)名說(shuō)明其類型和位寬。定義函數(shù)時(shí),沒(méi)有端口名列表,但調(diào)用函數(shù)時(shí),需列出端口名列表,端口名的排序和類型必須與定義時(shí)的相一致。這一點(diǎn)與任務(wù)相同

函數(shù)可以出現(xiàn)在持續(xù)賦值assign的右端表達(dá)式中。

函數(shù)不能調(diào)用任務(wù),而任務(wù)可以調(diào)用別的任務(wù)和函數(shù),且調(diào)用任務(wù)和函數(shù)個(gè)數(shù)不受限制。2021/5/931任務(wù)與函數(shù)的比較

2021/5/9324.8

順序執(zhí)行與并發(fā)執(zhí)行兩個(gè)或更多個(gè)“always”過(guò)程塊、“assign”持續(xù)賦值語(yǔ)句、實(shí)例元件調(diào)用等操作都是同時(shí)執(zhí)行的。在“always”模塊內(nèi)部,其語(yǔ)句如果是非阻塞賦值,也是并發(fā)執(zhí)行的;而如果是阻塞賦值,則語(yǔ)句是按照指定的順序執(zhí)行的,語(yǔ)句的書(shū)寫(xiě)順序?qū)Τ绦虻膱?zhí)行結(jié)果有著直接的影響。2021/5/933順序執(zhí)行的例子順序執(zhí)行模塊1moduleserial1(q,a,clk);outputq,a;inputclk;regq,a;always@(posedgeclk) begin

q=~q; a=~q; endendmodule順序執(zhí)行模塊2moduleserial2(q,a,clk);outputq,a;inputclk;regq,a;always@(

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論