verilog-hdl教程-硬件描述語言-課件-PPT_第1頁
verilog-hdl教程-硬件描述語言-課件-PPT_第2頁
verilog-hdl教程-硬件描述語言-課件-PPT_第3頁
verilog-hdl教程-硬件描述語言-課件-PPT_第4頁
verilog-hdl教程-硬件描述語言-課件-PPT_第5頁
已閱讀5頁,還剩174頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

期中檢測說明11月28號期中檢測按小組抽簽決定(cpld和單片機(jī)前四個(gè)實(shí)驗(yàn)為基礎(chǔ),適當(dāng)變化)123.8循環(huán)語句3.9結(jié)構(gòu)說明語句3.10編譯預(yù)處理語句3.11語句的順序執(zhí)行與并行執(zhí)行3.12不同抽象級別的VerilogHDL模型3.13設(shè)計(jì)技巧3.1引言3.2VerilogHDL基本結(jié)構(gòu)3.3數(shù)據(jù)類型及常量、變量3.4運(yùn)算符及表達(dá)式3.5語句3.6賦值語句和塊語句3.7條件語句第3章硬件描述語言VerilogHDL33.1引言一、什么是VerilogHDL二、VerilogHDL的發(fā)展歷史三、不同層次的VerilogHDL抽象四、VerilogHDL的特點(diǎn)內(nèi)容概要43.1引言一、什么是VerilogHDLVerilogHDL是一種用于數(shù)字邏輯電路設(shè)計(jì)的硬件描述語言(HradwareDescriptionLanguage),可以用來進(jìn)行數(shù)字電路的仿真驗(yàn)證、時(shí)序分析、邏輯綜合。用VerilogHDL描述的電路設(shè)計(jì)就是該電路的VerilogHDL模型。VerilogHDL既是一種行為描述語言也是一種結(jié)構(gòu)描述語言。既可以用電路的功能描述,也可以用元器件及其之間的連接來建立VerilogHDL模型。53.1引言二、VerilogHDL的發(fā)展歷史1983年,由GDA(GateWayDesignAutomation)公司的PhilMoorby首創(chuàng);1989年,Cadence公司收購了GDA公司;1990年,Cadence公司公開發(fā)表VerilogHDL;1995年,IEEE制定并公開發(fā)表VerilogHDL1364-1995標(biāo)準(zhǔn);1999年,模擬和數(shù)字電路都適用的Verilog標(biāo)準(zhǔn)公開發(fā)表63.1引言三、不同層次的VerilogHDL抽象VerilogHDL模型可以是實(shí)際電路的不同級別的抽象。抽象級別可分為五級:系統(tǒng)級(systemlevel):用高級語言結(jié)構(gòu)(如case語句)實(shí)現(xiàn)的設(shè)計(jì)模塊外部性能的模型;算法級(algorithmiclevel):用高級語言結(jié)構(gòu)實(shí)現(xiàn)的設(shè)計(jì)算法模型(寫出邏輯表達(dá)式);RTL級(registertransferlevel):描述數(shù)據(jù)在寄存器之間流動(dòng)和如何處理這些數(shù)據(jù)的模型;門級(gatelevel):描述邏輯門(如與門、非門、或門、與非門、三態(tài)門等)以及邏輯門之間連接的模型;開關(guān)級(switchlevel):描述器件中三極管和儲(chǔ)存節(jié)點(diǎn)及其之間連接的模型。返回3.1273.1引言四、VerilogHDL的特點(diǎn)語法結(jié)構(gòu)上的主要特點(diǎn):形式化地表示電路的行為和結(jié)構(gòu);借用C語言的結(jié)構(gòu)和語句;可在多個(gè)層次上對所設(shè)計(jì)的系統(tǒng)加以描述,語言對設(shè)計(jì)規(guī)模不加任何限制;具有混合建模能力:一個(gè)設(shè)計(jì)中的各子模塊可用不同級別的抽象模型來描述;基本邏輯門、開關(guān)級結(jié)構(gòu)模型均內(nèi)置于語言中,可直接調(diào)用;易創(chuàng)建用戶定義原語(UDP,UserDesignedPrimitive)。易學(xué)易用,功能強(qiáng)與C語言非常相似!83.2VerilogHDL基本結(jié)構(gòu)一、簡單的VerilogHDL例子二、VerilogHDL模塊的結(jié)構(gòu)三、邏輯功能定義四、關(guān)鍵字五、標(biāo)識符六、編寫VerilogHDL源代碼的標(biāo)準(zhǔn)內(nèi)容概要93.2VerilogHDL基本結(jié)構(gòu)一、簡單的VerilogHDL例子[例3.2.1]8位全加器

moduleadder8(cout,sum,a,b,cin); outputcout; //輸出端口聲明

output[7:0]sum; input[7:0]a,b; //輸入端口聲明

inputcin; assign{cout,sum}=a+b+cin;

endmodule

assign語句:無論右邊表達(dá)式操作數(shù)何時(shí)發(fā)生變化,右邊表達(dá)式都會(huì)重新計(jì)算,并且在指定的延遲后給左邊表達(dá)式賦值。I/O說明端口定義功能描述模塊名(文件名)整個(gè)VerilogHDL程序嵌套在module和endmodule聲明語句中。每條語句相對module和endmodule最好縮進(jìn)2格或4格!//

……

表示注釋部分,一般只占據(jù)一行。對編譯不起作用!單行注釋符103.2VerilogHDL基本結(jié)構(gòu)[例3.2.2]8位計(jì)數(shù)器

modulecounter8(out,cout,data,load,cin,clk); output[7:0]out; outputcout; input[7:0]data; inputload,cin,clk; reg[7:0]out; always@(posedge

clk) begin

if(load) out<=data;//同步預(yù)置數(shù)據(jù)

else out<=out+1+cin;//加1計(jì)數(shù)

endassigncout=&out&

cin;//若out為8‘hFF,cin為1,則cout為1

endmoduleI/O說明端口定義功能描述信號類型聲明縮減運(yùn)算符位運(yùn)算符113.2VerilogHDL基本結(jié)構(gòu)[例3.2.3]2位比較器

modulecompare2(equal,a,b); outputequal; input[1:0]a,b; assignequal=(a==b)?1:0;/*如果a等于b,則equal為1,否則為0*/

endmodule“<=”非阻塞過程性賦值:將想要賦給左式的值安排在未來時(shí)刻。不等上一個(gè)賦值完成執(zhí)行下個(gè)賦值語句?!?”阻塞過程性賦值:按照順序執(zhí)行,前一個(gè)賦值結(jié)束才執(zhí)行下邊的賦值語句。連續(xù)賦值語句條件運(yùn)算符/*……*/內(nèi)表示注釋部分,一般可占據(jù)多行。對編譯不起作用!多行注釋符123.2VerilogHDL基本結(jié)構(gòu)[例3.2.4]三態(tài)驅(qū)動(dòng)器

moduletrist2(out,in,enable); outputout; inputin,enable;

bufif1

mybuf(out,in,enable);

endmodule例化元件名門元件關(guān)鍵字門元件例化——程序通過調(diào)用一個(gè)在Verilog語言庫中現(xiàn)存的實(shí)例門元件來實(shí)現(xiàn)某邏輯門功能。

Inputs|OutputINENABLE |OUTX 0 |Z1 1 |10 1 |0bufif1的真值表門元件例化13moduletrist1(out,in,enable);outputout;inputin,enable;

mytri

tri_inst(out,in,enable);endmodulemodulemytri(out,in,enable);outputout;inputin,enable;assignout=enable?

in:’bz;/*如果enable為1,則out=in,否則為高阻態(tài)*/endmodule3.2VerilogHDL基本結(jié)構(gòu)[例3.2.5]

三態(tài)驅(qū)動(dòng)器例化元件名子模塊名頂層模塊子模塊模塊元件例化模塊元件例化——頂層模塊(trist1)調(diào)用由某子模塊(mytri)定義的實(shí)例元件(tri_inst)來實(shí)現(xiàn)某功能。返回邏輯功能定義143.2VerilogHDL基本結(jié)構(gòu)VerilogHDL程序是由模塊構(gòu)成的。每個(gè)模塊嵌套在module和endmodule聲明語句中。模塊是可以進(jìn)行層次嵌套的。每個(gè)VerilogHDL源文件中只準(zhǔn)有一個(gè)頂層模塊,其他為子模塊。每個(gè)模塊要進(jìn)行端口定義,并說明輸入輸出端口,然后對模塊的功能進(jìn)行行為邏輯描述。程序書寫格式自由,一行可以寫幾個(gè)語句,一個(gè)語句也可以分多行寫。除了endmodule語句、begin_end語句和fork_join語句外,每個(gè)語句和數(shù)據(jù)定義的最后必須有分號??捎?*.....*/和//...對程序的任何部分作注釋。加上必要的注釋,以增強(qiáng)程序的可讀性和可維護(hù)性??偨Y(jié)153.2VerilogHDL基本結(jié)構(gòu)二、VerilogHDL模塊的結(jié)構(gòu)Verilog的基本設(shè)計(jì)單元是“模塊

(block)”

。Verilog模塊的結(jié)構(gòu)由在module和endmodule關(guān)鍵詞之間的4個(gè)主要部分組成:moduleblock1(a,b,c,d);

inputa,b,c;

outputd;

wirex;

assignd=a|x;assignx=(b&~c);endmoduleI/O說明端口定義功能描述信號類型聲明1234163.2VerilogHDL基本結(jié)構(gòu)三、邏輯功能定義在Verilog模塊中有3種方法可以描述電路的邏輯功能:(1)用assign語句

assignx=(b&~c);連續(xù)賦值語句常用于描述組合邏輯門元件例化模塊元件例化例化元件名門元件關(guān)鍵字(2)用元件例化(instantiate)

and

myand3(f,a,b,c);注1:元件例化即是調(diào)用VerilogHDL提供的元件;注2:元件例化包括門元件例化和模塊元件例化;注3:每個(gè)實(shí)例元件的名字必須唯一!以避免與其它調(diào)用元件的實(shí)例相混淆。注4:例化元件名也可以省略!173.2VerilogHDL基本結(jié)構(gòu)(3)用“always”塊語句

always@(posedge

clk)//每當(dāng)時(shí)鐘上升沿到來時(shí)執(zhí)行一遍塊內(nèi)語句

begin

if(load) out=data;//同步預(yù)置數(shù)據(jù)

else out=data+1+cin;//加1計(jì)數(shù)

end結(jié)構(gòu)說明語句注1:“always”塊語句常用于描述時(shí)序邏輯,也可描述組合邏輯。注2:“always”塊可用多種手段來表達(dá)邏輯關(guān)系,如用if-else語句或case語句。注3:“always”塊語句與assign語句是并發(fā)執(zhí)行的,assign語句一定要放在“always”塊語句之外!183.2VerilogHDL基本結(jié)構(gòu)VerilogHDL模塊的模板(僅考慮用于邏輯綜合的部分)module<頂層模塊名>(<輸入輸出端口列表>);

output

輸出端口列表;

input

輸入端口列表;

//(1)使用assign語句定義邏輯功能

wire結(jié)果信號名;

assign<結(jié)果信號名>=表達(dá)式;

//(2)使用always塊定義邏輯功能

always@(<敏感信號表達(dá)式>)begin //過程賦值語句

//if語句

//case語句

//while,repeat,for循環(huán)語句

//task,function調(diào)用

end193.2VerilogHDL基本結(jié)構(gòu)//(3)元件例化

<module_name

><instance_name

>(<port_list>);//模塊元件例化

<gate_type_keyword><instance_name

>(<port_list>);//門元件例化endmodule例化元件名也可以省略!203.2VerilogHDL基本結(jié)構(gòu)四、關(guān)鍵字關(guān)鍵字——事先定義好的確認(rèn)符,用來組織語言結(jié)構(gòu);或者用于定義VerilogHDL提供的門元件(如and,not,or,buf)。用小寫字母定義!

——如always,assign,begin,case,casex,else,end,for,function,if,input,output,repeat,table,time,while,wire見《數(shù)字系統(tǒng)設(shè)計(jì)與VerilogHDL》P285附錄A。用戶程序中的變量、節(jié)點(diǎn)等名稱不能與關(guān)鍵字同名!213.2VerilogHDL基本結(jié)構(gòu)VerilogHDL關(guān)鍵字edgeelseendendcaseendfunctionendprimitiveendmoduleendspecifyendtableendtaskeventforforceforeverforkfunctionhighz0highz1ififnoneinitialinoutinputintegerjoinlargemacromodulemediummodulenandnegedgenornotnotif0notif1nmosoroutputparameterpmosposedgeprimitivepulldownpulluppull0pull1andalwaysassignbeginbufbufif0bufif1casecasexcasezcmosdeassigndefaultdefparamdisable223.2VerilogHDL基本結(jié)構(gòu)VerilogHDL關(guān)鍵字(續(xù))tri0tri1vectoredwaitwandweak0weak1whilewireworxnorxorrcmosrealrealtimeregreleaserepeatrnmosrpmosrtranrtranif0rtranif1scalaredsmallspecifyspecparamstrengthstrong0strong1supply0supply1tabletasktrantranif0tranif1timetritriandtriortrireg233.2VerilogHDL基本結(jié)構(gòu)五、標(biāo)識符

任何用VerilogHDL語言描述的“東西”都通過其名字來識別,這個(gè)名字被稱為標(biāo)識符。如源文件名、模塊名、端口名、變量名、常量名、實(shí)例名等。標(biāo)識符可由字母、數(shù)字、下劃線和$符號構(gòu)成;但第一個(gè)字符必須是字母或下劃線,不能是數(shù)字或$符號!在VerilogHDL中變量名是區(qū)分大小寫的!合法的名字:A_99_ZReset_54MHz_Clock$Module

不合法的名字:123a$datamodule7seg.v標(biāo)識符不能與關(guān)鍵字同名!243.2VerilogHDL基本結(jié)構(gòu)六、編寫VerilogHDL源代碼的標(biāo)準(zhǔn)編寫VerilogHDL源代碼的標(biāo)準(zhǔn)分為兩類:(1)語匯代碼的編寫標(biāo)準(zhǔn)

規(guī)定了文本布局、命名和注釋的約定,以提高源代碼的可讀性和可維護(hù)性。(2)綜合代碼的編寫標(biāo)準(zhǔn)

規(guī)定了Verilog風(fēng)格,盡量保證能夠綜合,以避免常見的不能綜合及綜合結(jié)果存在缺陷的問題,并在設(shè)計(jì)流程中及時(shí)發(fā)現(xiàn)綜合中存在的錯(cuò)誤。綜合:將用HDL語言或圖形方式描述的電路設(shè)計(jì)轉(zhuǎn)換為實(shí)際門級電路(如觸發(fā)器、邏輯門等),得到一個(gè)網(wǎng)表文件,用于進(jìn)行適配(在實(shí)際器件中進(jìn)行布局和布線)。253.2VerilogHDL基本結(jié)構(gòu)(1)每個(gè)VerilogHDL源文件中只準(zhǔn)編寫一個(gè)頂層模塊,也不能把一個(gè)頂層模塊分成幾部分寫在幾個(gè)源文件中。(2)源文件名字應(yīng)與文件內(nèi)容有關(guān),最好與頂層模塊同名!源文件名字的第一個(gè)字符必須是字母或下劃線,不能是數(shù)字或$符號?。?)每行只寫一個(gè)聲明語句或說明。(4)源代碼用層層縮進(jìn)的格式來寫。1

語匯代碼的編寫標(biāo)準(zhǔn)263.2VerilogHDL基本結(jié)構(gòu)(5)定義變量名的大小寫應(yīng)自始至終保持一致(如變量名第一個(gè)字母均大寫)。(6)變量名應(yīng)該有意義,而且含有一定的有關(guān)信息。局部變量名(如循環(huán)變量)應(yīng)簡單扼要。(7)通過注釋對源代碼做必要的說明,尤其對接口(如模塊參數(shù)、端口、任務(wù)、函數(shù)變量)做必要的注釋很重要。(8)常量盡可能多地使用參數(shù)定義和宏定義,而不要在語句中直接使用字母、數(shù)字和字符串。參數(shù)定義(用一個(gè)標(biāo)識符來代表一個(gè)常量)的格式:

parameter

參數(shù)名1=表達(dá)式,參數(shù)名2=表達(dá)式,……;宏定義(用一個(gè)簡單的宏名來代替一個(gè)復(fù)雜的表達(dá)式)的格式:

’define

標(biāo)志符(即宏名)字符串(即宏內(nèi)容)1

語匯代碼的編寫標(biāo)準(zhǔn)(續(xù))273.2VerilogHDL基本結(jié)構(gòu)(1)把設(shè)計(jì)分割成較小的功能塊,每塊用行為風(fēng)格設(shè)計(jì)。除設(shè)計(jì)中對速度響應(yīng)要求比較臨界的部分外,都應(yīng)避免門級描述。(2)建立一個(gè)好的時(shí)鐘策略(如單時(shí)鐘、多相位時(shí)鐘,經(jīng)過門產(chǎn)生的時(shí)鐘、多時(shí)鐘域等)。保證源代碼中時(shí)鐘和復(fù)位信號是干凈的(即不是由組合邏輯或沒有考慮到的門產(chǎn)生的)。(3)建立一個(gè)好的測試策略,使所有觸發(fā)器都是可復(fù)位的,使測試能通過外部管腳進(jìn)行,又沒有冗余的功能。(4)所有源代碼都必須遵守并符合在always塊語句的4種可綜合標(biāo)準(zhǔn)模板之一。(5)描述組合和鎖存邏輯的always塊,必須在always塊開頭的控制事件列表中列出所有的輸入信號。2

綜合代碼的編寫標(biāo)準(zhǔn)always塊語句模板283.2VerilogHDL基本結(jié)構(gòu)(6)描述組合邏輯的always塊,一定不能有不完全賦值,即所有輸出變量必須被各輸入值的組合值賦值,不能有例外。(7)描述組合和鎖存邏輯的always塊一定不能包含反饋,即在always塊中已被定義為輸出的寄存器變量絕對不能再在該always塊中讀進(jìn)來作為輸入信號。(8)時(shí)鐘沿觸發(fā)的always塊必須是單時(shí)鐘的,且任何異步控制輸入(通常是復(fù)位或置位信號)必須在控制事件列表中列出。例:always@(posedge

clkornegedgesetornegedgereset)(9)避免生成不想要的鎖存器。在無時(shí)鐘的always塊中,若有的輸出變量被賦了某個(gè)信號變量值,而該信號變量并未在該always塊的電平敏感控制事件中列出,則會(huì)在綜合中生成不想要的鎖存器。2

綜合代碼的編寫標(biāo)準(zhǔn)(續(xù)1)293.2VerilogHDL基本結(jié)構(gòu)(10)避免生成不想要的觸發(fā)器。在時(shí)鐘沿觸發(fā)的always塊中,如果用非阻塞賦值語句對reg型變量賦值;或者當(dāng)reg型變量經(jīng)過多次循環(huán)其值仍保持不變,則會(huì)在綜合中生成觸發(fā)器。用reg型變量生成觸發(fā)器舉例:

modulerw2(clk,d,out1);

inputclk,d;

outputout1;

regout1;

always@(posedgeclk)//沿觸發(fā)

out1<=d;

endmodule

2

綜合代碼的編寫標(biāo)準(zhǔn)(續(xù)2)非阻塞賦值語句dclkout1DQDFF303.2VerilogHDL基本結(jié)構(gòu)若不想生成觸發(fā)器,而是希望用reg型變量生成組合邏輯,則應(yīng)使用電平觸發(fā):

modulerw2(clk,d,out1);

inputclk,d;

outputout1;

regout1;

always@(d)//電平觸發(fā)

out1<=d;

endmodule

2

綜合代碼的編寫標(biāo)準(zhǔn)(續(xù)3)dout1BUFF313.2VerilogHDL基本結(jié)構(gòu)(11)所有內(nèi)部狀態(tài)寄存器必須是可復(fù)位的,這是為了使RTL級和門級描述能夠被復(fù)位成同一個(gè)已知的狀態(tài),以便進(jìn)行門級邏輯驗(yàn)證。(12)對存在無效狀態(tài)的有限狀態(tài)機(jī)和其他時(shí)序電路(如4位十進(jìn)制計(jì)數(shù)器有6個(gè)無效狀態(tài)),必須明確描述所有的2的N次冪種狀態(tài)下的行為(包括無效狀態(tài)),才能綜合出安全可靠的狀態(tài)機(jī)。(13)一般地,在賦值語句中不能使用延遲,否則是不可綜合的。(14)不要使用integer型和time型寄存器,否則將分別綜合成32位和64位的總線。(15)仔細(xì)檢查代碼中使用動(dòng)態(tài)指針(如用指針或地址變量檢索的位選擇或存儲(chǔ)單元)、循環(huán)聲明或算術(shù)運(yùn)算部分,因?yàn)檫@類代碼在綜合后會(huì)生成大量的門,且難以優(yōu)化。2

綜合代碼的編寫標(biāo)準(zhǔn)(續(xù)4)323.3數(shù)據(jù)類型及常量、變量一、數(shù)據(jù)類型二、常量三、變量內(nèi)容概要333.3數(shù)據(jù)類型及常量、變量一、數(shù)據(jù)類型數(shù)據(jù)類型是用來表示數(shù)字電路中的數(shù)據(jù)存儲(chǔ)和傳送單元。VerilogHDL中共有19種數(shù)據(jù)類型;其中4個(gè)最基本的數(shù)據(jù)類型為:integer型parameter型reg型wire型

其它數(shù)據(jù)類型:large型、medium型、scalared型、small型、time型、tri型、tri0型、tri1型、triand型、trior型、trireg型、vectored型、wand型、wor型等二、常量在程序運(yùn)行過程中,其值不能被改變的量,稱為常量。數(shù)字(包括整數(shù),x和z值,負(fù)數(shù))parameter常量(或稱符號常量)343.3數(shù)據(jù)類型及常量、變量整常數(shù)的3種表達(dá)方式:表達(dá)方式說明舉例<位寬>’<進(jìn)制><數(shù)字>完整的表達(dá)方式8’b11000101或8’hc5<進(jìn)制><數(shù)字>缺省位寬,則位寬由機(jī)器系統(tǒng)決定,至少32位hc5<數(shù)字>缺省進(jìn)制為十進(jìn)制,位寬默認(rèn)為32位197(1)整數(shù)型常量(即整常數(shù))的4種進(jìn)制表示形式:二進(jìn)制整數(shù)(b或B);十進(jìn)制整數(shù)(d或D);十六進(jìn)制整數(shù)(h或H);八進(jìn)制整數(shù)(o或O)。注:這里位寬指對應(yīng)二進(jìn)制數(shù)的寬度。353.3數(shù)據(jù)類型及常量、變量(2)x和z值x表示不定值,z表示高阻值;8’b1001xxxx或8’h9x8’b1010zzzz或8’haz每個(gè)字符代表的二進(jìn)制數(shù)的寬度取決于所用的進(jìn)制;當(dāng)用二進(jìn)制表示時(shí),已標(biāo)明位寬的數(shù)若用x或z表示某些位,則只有在最左邊的x或z具有擴(kuò)展性!為清晰可見,最好直接寫出每一位的值![例]8’bzx=8’bzzzz_zzzx[例]8’b1x=8’b0000_001x“?”是z的另一種表示符號,建議在case語句中使用?表示高阻態(tài)z[例]casez(select)4’b???1:out=a;4’b??1?:out=b;4’b?1??:out=c;4’b1???:out=d;endcase363.3數(shù)據(jù)類型及常量、變量(3)負(fù)數(shù)在位寬前加一個(gè)減號,即表示負(fù)數(shù)如:-8’d5//5的補(bǔ)數(shù),=8‘b11111011減號不能放在位寬與進(jìn)制之間,也不能放在進(jìn)制與數(shù)字之間!8’d-5//非法格式為提高可讀性,在較長的數(shù)字之間可用下劃線_隔開!但不可以用在<進(jìn)制>和<數(shù)字>之間。如:16‘b1010_1011_1100_1111//合法

8‘b_0011_1010//非法當(dāng)常量未指明位寬時(shí),默認(rèn)為32位。10=32‘d10=32’b1010-1=-32’d1=32’b1111……1111=32’hFFFFFFFF373.3數(shù)據(jù)類型及常量、變量(4)parameter常量(符號常量)用parameter來定義一個(gè)標(biāo)識符,代表一個(gè)常量——稱為符號常量。參數(shù)型數(shù)據(jù)的確認(rèn)符parameter

參數(shù)名1=表達(dá)式,參數(shù)名2=表達(dá)式,……;每個(gè)賦值語句的右邊必須為常數(shù)表達(dá)式,即只能包含數(shù)字或先前定義過的符號常量!

parameteraddrwidth=16;//合法格式

parameteraddrwidth=datawidth*2;//非法格式常用參數(shù)來定義延遲時(shí)間和變量寬度??捎米址硎镜娜魏蔚胤?都可以用定義的參數(shù)來代替。參數(shù)是本地的,其定義只在本模塊內(nèi)有效。在模塊或?qū)嵗脮r(shí),可通過參數(shù)傳遞改變在被引用模塊或?qū)嵗幸讯x的參數(shù)!賦值語句表格式383.3數(shù)據(jù)類型及常量、變量模塊實(shí)例引用時(shí)參數(shù)的傳遞——方法之一:利用defparam定義參數(shù)聲明語句!defparam例化模塊名.參數(shù)名1=常數(shù)表達(dá)式,

例化模塊名.參數(shù)名2=常數(shù)表達(dá)式,……;格式defparam語句在編譯時(shí)可重新定義參數(shù)值??删C合性問題:一般情況下是不可綜合的。提示:不要使用defparam語句!在模塊的實(shí)例引用時(shí)可用“#”號后跟參數(shù)的語法來重新定義參數(shù)。39[例]modulemod(out,ina,inb);…parametercycle=8,real_constant=2.039,file=“/user1/jmdong/design/mem_file.dat”;…endmodulemoduletest;…modmk(out,ina,inb);//對模塊mod的實(shí)例引用

defparammk.cycle=6,mk.file=“../my_mem.dat”;//參數(shù)的傳遞

…endmodule3.3數(shù)據(jù)類型及常量、變量被引用模塊參數(shù)名例化模塊名40[例]modulemod(out,ina,inb);…parametercycle=8,real_constant=2.039,file=“/user1/jmdong/design/mem_file.dat”;…endmodulemoduletest;…mod#(5,3.20,“../my_mem.dat”)mk(out,ina,inb);

//對模塊mod的實(shí)例引用

…endmodule3.3數(shù)據(jù)類型及常量、變量模塊實(shí)例引用時(shí)參數(shù)的傳遞——方法之二:利用特殊符號“#”

被引用模塊參數(shù)的傳遞必須與被引用模塊中的參數(shù)一一對應(yīng)!建議用此方法!被引用模塊名#(參數(shù)1,參數(shù)2,…)例化模塊名(端口列表);格式413.3數(shù)據(jù)類型及常量、變量三、變量在程序運(yùn)行過程中,其值可以改變的量,稱為變量。其數(shù)據(jù)類型有19種,常用的有3種:網(wǎng)絡(luò)型(netstype)寄存器型(registertype)數(shù)組(memorytype)1.nets型變量定義——輸出始終隨輸入的變化而變化的變量。表示結(jié)構(gòu)實(shí)體(如門)之間的物理連接。常用nets型變量:wire,tri:連線類型(兩者功能一致)wor,trior:具有線或特性的連線(兩者功能一致)wand,triand:具有線與特性的連線(兩者功能一致)tri1,tri0:上拉電阻和下拉電阻supply1,supply0:電源(邏輯1)和地(邏輯0)

nets型變量不能儲(chǔ)存值!423.3數(shù)據(jù)類型及常量、變量wire型變量最常用的nets型變量,常用來表示以assign語句賦值的組合邏輯信號。模塊中的輸入/輸出信號類型缺省為wire型??捎米鋈魏畏匠淌降妮斎?,或“assign”語句和實(shí)例元件的輸出。wire

數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名n;wire[n-1:0]

數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名m;或wire[n:1]

數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名m;每條總線位寬為n共有m條總線wire型向量(總線)格式433.3數(shù)據(jù)類型及常量、變量定義——對應(yīng)具有狀態(tài)保持作用的電路元件(如觸發(fā)器、寄存器等),常用來表示過程塊語句(如initial,always,task,function)內(nèi)的指定信號。常用register型變量:reg:常代表觸發(fā)器integer:32位帶符號整數(shù)型變量real:64位帶符號實(shí)數(shù)型變量time:無符號時(shí)間變量純數(shù)學(xué)的抽象描述2.register型變量443.3數(shù)據(jù)類型及常量、變量register型變量與nets型變量的根本區(qū)別是:register型變量需要被明確地賦值,并且在被重新賦值前一直保持原值。register型變量必須通過過程賦值語句賦值!不能通過assign語句賦值!在過程塊內(nèi)被賦值的每個(gè)信號必須定義成register型!453.3數(shù)據(jù)類型及常量、變量reg型變量定義——在過程塊中被賦值的信號,往往代表觸發(fā)器,但不一定就是觸發(fā)器(也可以是組合邏輯信號)!reg

數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名n;reg[n-1:0]

數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名m;或reg[n:1]

數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名m;每個(gè)向量位寬為n共有m個(gè)reg型向量[例]reg[4:1]regc,regd;//regc,regd為4位寬的reg型向量reg型向量(總線)格式463.3數(shù)據(jù)類型及常量、變量用reg型變量生成組合邏輯舉例:

modulerw1(a,b,out1,out2);

inputa,b;

outputout1,out2;

regout1;

wireout2;

assignout2=a;

always@(b)

out1<=~b;

endmoduleaout2BUFFbINVout1過程賦值語句連續(xù)賦值語句電平觸發(fā)Verilog中reg與wire的區(qū)別reg型變量既可生成觸發(fā)器,也可生成組合邏輯;wire型變量只能生成組合邏輯。473.3數(shù)據(jù)類型及常量、變量用reg型變量生成觸發(fā)器舉例:

modulerw2(clk,d,out1,out2);

inputclk,d;

outputout1,out2;

regout1;

wireout2;

assignout2=d&~out1;

always@(posedgeclk)

begin

out1<=d;

end

endmodule

過程賦值語句連續(xù)賦值語句dout2AND2i1clkout1DQDFF沿觸發(fā)483.3數(shù)據(jù)類型及常量、變量定義——由若干個(gè)相同寬度的reg型向量構(gòu)成的數(shù)組。VerilogHDL通過reg型變量建立數(shù)組來對存儲(chǔ)器建模。memory型變量可描述RAM、ROM和reg文件。memory型變量通過擴(kuò)展reg型變量的地址范圍來生成:reg[n-1:0]

存儲(chǔ)器名[m-1:0];或reg[n-1:0]存儲(chǔ)器名[m:1];每個(gè)存儲(chǔ)單元位寬為n共有m個(gè)存儲(chǔ)單元3.memory型變量——數(shù)組QuartusII不支持!VerilogHDL中的變量名、參數(shù)名等標(biāo)記符是對大小寫字母敏感的!493.3數(shù)據(jù)類型及常量、變量含義不同

[例]reg[n-1:0]

rega;//一個(gè)n位的寄存器

regmema[n-1:0];//由n個(gè)1位寄存器組成的存儲(chǔ)器

必須指明存儲(chǔ)單元的地址!0n-10n-1n-2···地址賦值方式不同

一個(gè)n位的寄存器可用一條賦值語句賦值;一個(gè)完整的存儲(chǔ)器則不行!若要對某存儲(chǔ)器中的存儲(chǔ)單元進(jìn)行讀寫操作,必須指明該單元在存儲(chǔ)器中的地址!

[例]rega=0;

//合法賦值語句

mema=0;

//非法賦值語句

mema[8]=1;

//合法賦值語句

mema[1023:0]=0;//合法賦值語句memory型變量與reg型變量的區(qū)別503.4運(yùn)算符及表達(dá)式一、算術(shù)運(yùn)算符二、邏輯運(yùn)算符三、位運(yùn)算符四、關(guān)系運(yùn)算符五、等式運(yùn)算符

內(nèi)容概要六、縮減運(yùn)算符七、移位運(yùn)算符八、條件運(yùn)算符九、位拼接運(yùn)算符十、運(yùn)算符的優(yōu)先級513.4運(yùn)算符及表達(dá)式運(yùn)算符按功能分為9類:算術(shù)運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符等式運(yùn)算符縮減運(yùn)算符條件運(yùn)算符位運(yùn)算符移位運(yùn)算符位拼接運(yùn)算符運(yùn)算符按操作數(shù)的個(gè)數(shù)分為3類:單目運(yùn)算符——帶一個(gè)操作數(shù)邏輯非!,按位取反~,縮減運(yùn)算符,移位運(yùn)算符雙目運(yùn)算符——帶兩個(gè)操作數(shù)算術(shù)、關(guān)系、等式運(yùn)算符,邏輯、位運(yùn)算符的大部分三目運(yùn)算符——帶三個(gè)操作數(shù)條件運(yùn)算符

523.4運(yùn)算符及表達(dá)式一、算術(shù)運(yùn)算符算術(shù)運(yùn)算符說明

+-*/%加減乘除求模雙目運(yùn)算符進(jìn)行整數(shù)除法運(yùn)算時(shí),結(jié)果值略去小數(shù)部分,只取整數(shù)部分!%稱為求模(或求余)運(yùn)算符,要求%兩側(cè)均為整型數(shù)據(jù);求模運(yùn)算結(jié)果值的符號位取第一個(gè)操作數(shù)的符號位!

[例]-11%3結(jié)果為-2進(jìn)行算術(shù)運(yùn)算時(shí),若某操作數(shù)為不定值x,則整個(gè)結(jié)果也為x。 MAX+PLUSII不支持“/”

和“%”運(yùn)算!QuartusII都支持!533.4運(yùn)算符及表達(dá)式[例]除法和求模運(yùn)算的區(qū)別注意/和%的區(qū)別!543.4運(yùn)算符及表達(dá)式9/4=29%4=1arithmetic.vwf553.4運(yùn)算符及表達(dá)式二、邏輯運(yùn)算符邏輯運(yùn)算符把它的操作數(shù)當(dāng)作布爾變量:非零的操作數(shù)被認(rèn)為是真(1‘b1);零被認(rèn)為是假(1‘b0);不確定的操作數(shù)如4’bxx00,被認(rèn)為是不確定的(可能為零,也可能為非零)(記為1’bx);但4’bxx11被認(rèn)為是真(記為1’b1,因?yàn)樗隙ㄊ欠橇愕模?。邏輯運(yùn)算符說明

&&(雙目)||(雙目)!(單目)邏輯與邏輯或邏輯非進(jìn)行邏輯運(yùn)算后的結(jié)果為布爾值(為1或0或x)!563.4運(yùn)算符及表達(dá)式“&&”和“||”的優(yōu)先級除高于條件運(yùn)算符外,低于關(guān)系運(yùn)算符、等式運(yùn)算符等幾乎所有運(yùn)算符;邏輯非“!”優(yōu)先級最高。[例](a>b)&&(b>c) 可簡寫為:a>b&&b>c

(a==b)||(x==y) 可簡寫為:a==b||x==y

(!a)||(a>b) 可簡寫為:!a||a>b為提高程序的可讀性,明確表達(dá)各運(yùn)算符之間的優(yōu)先關(guān)系,建議使用括號!573.4運(yùn)算符及表達(dá)式三、位運(yùn)算符位運(yùn)算符說明~&|^^~,~^按位取反按位與按位或按位異或按位同或雙目運(yùn)算符單目運(yùn)算符位運(yùn)算其結(jié)果與操作數(shù)位數(shù)相同。位運(yùn)算符中的雙目運(yùn)算符要求對兩個(gè)操作數(shù)的相應(yīng)位逐位進(jìn)行運(yùn)算。兩個(gè)不同長度的操作數(shù)進(jìn)行位運(yùn)算時(shí),將自動(dòng)按右端對齊,位數(shù)少的操作數(shù)會(huì)在高位用0補(bǔ)齊。

[例]若A=5’b11001,B=3’b101,則A&B=(5’b11001)&(5’b00101)=5’b00001

583.4運(yùn)算符及表達(dá)式[例]&&運(yùn)算符和&(按位與)的區(qū)別&&運(yùn)算的結(jié)果為1位的邏輯值注意&&和&的區(qū)別!被認(rèn)為是

1‘b1被認(rèn)為是

1‘bx邏輯與結(jié)果為

1‘bx593.4運(yùn)算符及表達(dá)式四、關(guān)系運(yùn)算符關(guān)系運(yùn)算符說明<<=>>=小于小于或等于大于大于或等于雙目運(yùn)算符括號內(nèi)先運(yùn)算!算術(shù)運(yùn)算先運(yùn)算!運(yùn)算結(jié)果為1位的邏輯值1或0或x。關(guān)系運(yùn)算時(shí),若關(guān)系為真,則返回值為1;若聲明的關(guān)系為假,則返回值為0;若某操作數(shù)為不定值x,則返回值為x。所有的關(guān)系運(yùn)算符優(yōu)先級別相同。關(guān)系運(yùn)算符的優(yōu)先級低于算術(shù)運(yùn)算符。[例]a<size-1 等同于:a<(size-1)size-(1<a) 不等同于:size-1<a603.4運(yùn)算符及表達(dá)式五、等式運(yùn)算符等式運(yùn)算符說明==!====!==等于不等于全等不全等雙目運(yùn)算符運(yùn)算結(jié)果為1位的邏輯值1或0或x。等于運(yùn)算符(==)和全等運(yùn)算符(===)的區(qū)別:使用等于運(yùn)算符時(shí),兩個(gè)操作數(shù)必須逐位相等,結(jié)果才為1;若某些位為x或z,則結(jié)果為x。使用全等運(yùn)算符時(shí),若兩個(gè)操作數(shù)的相應(yīng)位完全一致(如同是1,或同是0,或同是x,或同是z),則結(jié)果為1;否則為0。所有的等式運(yùn)算符優(yōu)先級別相同。===和!==運(yùn)算符常用于case表達(dá)式的判別,又稱為“case等式運(yùn)算符”。MAX+PLUSII和QuartusII都不支持!613.4運(yùn)算符及表達(dá)式[例]if(A

==

1’bx)$display(“AisX”);//當(dāng)A為不定值時(shí),式(A==1’bx)的運(yùn)算結(jié)果為x,則該語句不執(zhí)行

if(A

===

1’bx)$display(“AisX”);//當(dāng)A為不定值時(shí),式(A===1’bx)的運(yùn)算結(jié)果為1,該語句執(zhí)行==01xz01xz10xx01xxxxxxxxxx===01xz01xz1000010000100001表3-1“==”的真值表表3-2“===”的真值表等于運(yùn)算的結(jié)果可能為1或0或x全等于運(yùn)算的結(jié)果只有1或0623.4運(yùn)算符及表達(dá)式六、縮減運(yùn)算符縮減運(yùn)算符說明&~&|~|^^~,~^與與非或或非異或同或單目運(yùn)算符運(yùn)算法則與位運(yùn)算符類似,但運(yùn)算過程不同!對單個(gè)操作數(shù)進(jìn)行遞推運(yùn)算,即先將操作數(shù)的最低位與第二位進(jìn)行與、或、非運(yùn)算,再將運(yùn)算結(jié)果與第三位進(jìn)行相同的運(yùn)算,依次類推,直至最高位。運(yùn)算結(jié)果縮減為1位二進(jìn)制數(shù)。[例]reg[3:0]a;b=|a;//等效于b=((a[0]|a[1])|a(2))|a[3]注意縮減運(yùn)算符和位運(yùn)算符的區(qū)別!633.4運(yùn)算符及表達(dá)式七、移位運(yùn)算符移位運(yùn)算符說明>><<右移左移單目運(yùn)算符只有當(dāng)右操作數(shù)為常數(shù)時(shí)MAX+PLUSII支持!左移會(huì)擴(kuò)充位數(shù)!用法:A>>n或A<<n

將操作數(shù)右移或左移n位,同時(shí)用n個(gè)0填補(bǔ)移出的空位。[例]4’b1001>>3=4’b0001;4’b1001>>4=4’b00004’b1001<<1=5’b10010;4’b1001<<2=6’b100100;

1<<6=32’b1000000將操作數(shù)右移或左移n位,相當(dāng)于將操作數(shù)除以或乘以2n。右移位數(shù)不變,但右移的數(shù)據(jù)會(huì)丟失!643.4運(yùn)算符及表達(dá)式八、條件運(yùn)算符三目運(yùn)算符in1outMUXin0sel信號=條件?表達(dá)式1:表達(dá)式2條件運(yùn)算符為?:用法:[例]數(shù)據(jù)選擇器assignout=sel?in1:in0;當(dāng)條件為真,信號取表達(dá)式1的值;為假,則取表達(dá)式2的值。sel=1時(shí)out=in1;sel=0時(shí)out=in0653.4運(yùn)算符及表達(dá)式九、位拼接運(yùn)算符位拼接運(yùn)算符為{}用于將兩個(gè)或多個(gè)信號的某些位拼接起來,表示一個(gè)整體信號。用法:{信號1的某幾位,信號2的某幾位,……,信號n的某幾位}例如在進(jìn)行加法運(yùn)算時(shí),可將進(jìn)位輸出與和拼接在一起使用。[例1]output[3:0]sum;//和

outputcout;//進(jìn)位輸出

input[3:0]ina,inb;inputcin;assign{cout,sum}=ina+inb+cin;//進(jìn)位與和拼接在一起[例2]{a,b[3:0],w,3’b101}={a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}663.4運(yùn)算符及表達(dá)式可用重復(fù)法簡化表達(dá)式,如:{4{w}}//等同于{w,w,w,w}還可用嵌套方式簡化書寫,如:

{b,{3{a,b}}}//等同于{b,{a,b},{a,b},{a,b}},也等同于{b,a,b,a,b,a,b}用于表示重復(fù)的表達(dá)式必須為常數(shù)表達(dá)式!在位拼接表達(dá)式中,不允許存在沒有指明位數(shù)的信號,必須指明信號的位數(shù);若未指明,則默認(rèn)為32位的二進(jìn)制數(shù)!如{1,0}=64’h00000001_00000000,注意{1,0}不等于2‘b10673.4運(yùn)算符及表達(dá)式十、運(yùn)算符的優(yōu)先級類別運(yùn)算符優(yōu)先級邏輯、位運(yùn)算符!~高低算術(shù)運(yùn)算符*/%+-移位運(yùn)算符<<>>關(guān)系運(yùn)算符<<=>>=等式運(yùn)算符==!====!==縮減、位運(yùn)算符&~&^^~|~|邏輯運(yùn)算符&&||條件運(yùn)算符?:表3-3運(yùn)算符的優(yōu)先級為提高程序的可讀性,建議使用括號來控制運(yùn)算的優(yōu)先級![例](a>b)&&(b>c)

(a==b)||(x==y)

(!a)||(a>b)683.5語句賦值語句塊語句條件語句循環(huán)語句結(jié)構(gòu)說明語句編譯預(yù)處理語句內(nèi)容概要693.5語句賦值語句連續(xù)賦值語句過程賦值語句塊語句begin_end語句fork_join語句QuartusII不支持條件語句if_else語句case語句循環(huán)語句forever語句MAX+PLUSII不支持repeat語句MAX+PLUSII不支持while語句MAX+PLUSII不支持for語句結(jié)構(gòu)說明語句initial語句QuartusII不支持always語句task語句MAX+PLUSII不支持function語句編譯預(yù)處理語句‘define語句‘include語句QuartusII不支持‘timescale語句QuartusII不支持表3-4VerilogHDL的語句703.5語句注:上表中,凡QuartusII不支持的語句是不可綜合的,通常用在測試文件中;未注明“QuartusII不支持”的語句均是可綜合的。repeat語句和task語句MAX+PLUSII不支持,但QuartusII支持;forever語句、while語句MAX+PLUSII不支持,QuartusII支持,但通常用在測試模塊中;表中只有4種語句(fork_join,initial,‘include,‘timescale)是QuartusII不支持的,它們通常用在測試模塊中(ModelSim軟件支持)。713.6賦值語句和塊語句一、賦值語句二、非阻塞賦值與阻塞賦值的區(qū)別三、塊語句內(nèi)容概要723.6賦值語句和塊語句一、賦值語句分為兩類:(1)連續(xù)賦值語句——assign語句,用于對wire型變量賦值,是描述組合邏輯最常用的方法之一。

[例]assignc=a&b;//a、b、c均為wire型變量(2)過程賦值語句——用于對reg型變量賦值,有兩種方式:非阻塞(non-blocking)賦值方式:

賦值符號為<=,如b<=a;阻塞(blocking)賦值方式:

賦值符號為=,如b=a;733.6賦值語句和塊語句二、非阻塞賦值與阻塞賦值的區(qū)別1.非阻塞賦值方式

always@(posedgeclk)

begin

b<=a;

c<=b;

endclkDFFcDQDQabDFF非阻塞賦值在塊結(jié)束時(shí)才完成賦值操作!注:c的值比b的值落后一個(gè)時(shí)鐘周期!743.6賦值語句和塊語句2.阻塞賦值方式

always@(posedgeclk)

begin

b=a;

c=b;

end阻塞賦值在該語句結(jié)束時(shí)就完成賦值操作!clkDFFcDQab注:在一個(gè)塊語句中,如果有多條阻塞賦值語句,在前面的賦值語句沒有完成之前,后面的語句就不能被執(zhí)行,就像被阻塞了一樣,因此稱為阻塞賦值方式。這里c的值與b的值一樣

!753.6賦值語句和塊語句非阻塞(non-blocking)賦值方式(b<=a):b的值被賦成新值a的操作,并不是立刻完成的,而是在塊結(jié)束時(shí)才完成;塊內(nèi)的多條賦值語句在塊結(jié)束時(shí)同時(shí)賦值;硬件有對應(yīng)的電路。阻塞(blocking)賦值方式(b=a):b的值立刻被賦成新值a;完成該賦值語句后才能執(zhí)行下一句的操作;硬件沒有對應(yīng)的電路,因而綜合結(jié)果未知。非阻塞賦值與阻塞賦值方式的主要區(qū)別建議在初學(xué)時(shí)只使用一種方式,不要混用!建議在可綜合風(fēng)格的模塊中使用非阻塞賦值!763.6賦值語句和塊語句三、塊語句用來將兩條或多條語句組合在一起,使其在格式上更像一條語句,以增加程序的可讀性。塊語句有兩種:begin_end語句——標(biāo)識順序執(zhí)行的語句fork_join語句——標(biāo)識并行執(zhí)行的語句用begin_end標(biāo)識的塊QuartusII不支持,通常用在測試文件中1.順序塊特點(diǎn)塊內(nèi)的語句是順序執(zhí)行的;每條語句的延遲時(shí)間是相對于前一條語句的仿真時(shí)間而言的;直到最后一條語句執(zhí)行完,程序流程控制才跳出該順序塊。773.6賦值語句和塊語句begin

語句1;語句2;

語句n;endbegin:塊名塊內(nèi)聲明語句;語句1;語句2;

語句n;end注:塊內(nèi)聲明語句可以是參數(shù)聲明、reg型變量聲明、integer型變量聲明、real型變量聲明語句?;蝽樞驂K的格式783.6賦值語句和塊語句[例1]begin

b=a;

c=b;//c的值為a的值

end[例2]begin

b=a;

#10

c=b;//在兩條賦值語句間延遲10個(gè)時(shí)間單位

end注:這里標(biāo)識符“#”表示延遲;在模塊調(diào)用中“#”表示參數(shù)的傳遞舉例793.6賦值語句和塊語句

[例3]用順序塊和延遲控制組合產(chǎn)生一個(gè)時(shí)序波形。

parameterd=50;

reg[7:0]r;

begin //由一系列延遲產(chǎn)生的波形

#dr=’

h35;

#dr=’

hE2;

#dr=’

h00;

#dr=’

hF7;

#d–>end_wave;

//觸發(fā)事件end_wave

end注:每條語句的延遲時(shí)間d是相對于前一條語句的仿真時(shí)間而言的!803.6賦值語句和塊語句2.并行塊用fork_join標(biāo)識的塊特點(diǎn)塊內(nèi)的語句是同時(shí)執(zhí)行的;塊內(nèi)每條語句的延遲時(shí)間是相對于程序流程控制進(jìn)入到塊內(nèi)時(shí)的仿真時(shí)間而言的;延遲時(shí)間用于給賦值語句提供時(shí)序;當(dāng)按時(shí)間排序在最后的語句執(zhí)行完或一個(gè)disable語句執(zhí)行時(shí),程序流程控制跳出該并行塊。fork語句是不可綜合的!813.6賦值語句和塊語句fork

語句1;語句2;

語句n;joinfork:塊名塊內(nèi)聲明語句;語句1;語句2;

語句n;join或注:塊內(nèi)聲明語句可以是參數(shù)聲明、reg型變量聲明、integer型變量聲明、real型變量聲明語句、time型變量聲明語句和事件(event)說明語句。并行塊的格式823.6賦值語句和塊語句[例4]用并行塊和延遲控制組合產(chǎn)生一個(gè)時(shí)序波形。

reg[7:0]r;

fork

//由一系列延遲產(chǎn)生的波形

#50r=’

h35;

#100r=’

hE2;

#150r=’

h00;

#200r=’

hF7;

#250–>end_wave;

//觸發(fā)事件end_wave

join波形同例3注:在fork_join塊內(nèi),各條語句不必按順序給出!但為增加可讀性,最好按被執(zhí)行的順序書寫!833.7條件語句一、if-else語句二、case語句三、使用條件語句注意事項(xiàng)內(nèi)容概要843.7條件語句一、if-else語句判定所給條件是否滿足,根據(jù)判定的結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。if-else語句有3種形式其中“表達(dá)式”為邏輯表達(dá)式或關(guān)系表達(dá)式,或一位的變量。若表達(dá)式的值為0、或z,則判定的結(jié)果為“假”;若為1,則結(jié)果為“真”。語句可為單句,也可為多句;多句時(shí)一定要用“begin_end”語句括起來,形成一個(gè)復(fù)合塊語句。對于每個(gè)判定只有兩個(gè)分支條件語句分為兩種:if-else語句和case語句;它們都是順序語句,應(yīng)放在“always”塊內(nèi)!853.7條件語句允許一定形式的表達(dá)式簡寫方式,如:if(expression)等同于if(expression==1)if(!expression)等同于if(expression!=1)

if(表達(dá)式)語句1;if(表達(dá)式1)語句1;else

語句2;if(表達(dá)式1)語句1;elseif(表達(dá)式2)語句2;

…elseif(表達(dá)式n)語句n;方式1:方式2:方式3:適于對不同的條件,執(zhí)行不同的語句863.7條件語句if語句可以嵌套;若if與else的數(shù)目不一樣,注意用“begin_end”語句來確定if與else的配對關(guān)系!if(表達(dá)式1)

if(表達(dá)式2)語句1;

else

語句2;else

if(表達(dá)式3)語句3;

else

語句4;if(表達(dá)式1)

begin

if(表達(dá)式2)語句1;

endelse

語句2;當(dāng)if與else的數(shù)目不一樣時(shí),最好用“begin_end”語句將單獨(dú)的if語句括起來:if語句的嵌套:873.7條件語句[例]模為60的BCD碼加法計(jì)數(shù)器counter60.valways塊語句和assign語句是并行執(zhí)行的!在always塊內(nèi)的語句是順序執(zhí)行的!883.7條件語句注意:if(reset)elseif(load)elseif(cin)

不要寫成3個(gè)并列的if語句:

if(reset)if(load)if(cin)因?yàn)檫@樣寫則是同時(shí)對3個(gè)信號reset、load和cin進(jìn)行判斷,現(xiàn)實(shí)中很可能出現(xiàn)三者同時(shí)為“1”的情況,即3個(gè)條件同時(shí)滿足,則應(yīng)該同時(shí)執(zhí)行它們對應(yīng)的執(zhí)行語句,但3條執(zhí)行語句是對同一個(gè)信號qout賦不同的值,顯然相互矛盾。故編譯時(shí)會(huì)報(bào)錯(cuò)!893.7條件語句cin為來自下一級計(jì)數(shù)器的進(jìn)位always與assign語句是并行執(zhí)行的!count60.vwf置數(shù)進(jìn)位輸出當(dāng)cin=1則加1計(jì)數(shù)903.7條件語句二、case語句多分支語句case(敏感表達(dá)式)值1:語句1;值2:語句2;

值n:語句n;

default:

語句n+1;endcase1.case語句當(dāng)敏感表達(dá)式取不同的值時(shí),執(zhí)行不同的語句。功能:當(dāng)某個(gè)(控制)信號取不同的值時(shí),給另一個(gè)(輸出)信號賦不同的值。常用于多條件譯碼電路(如譯碼器、數(shù)據(jù)選擇器、狀態(tài)機(jī)、微處理器的指令譯碼)!case語句有3種形式:case,casez,casex適于對同一個(gè)控制信號取不同的值時(shí),輸出取不同的值!case語句與if-else語句有什么區(qū)別呢?

913.7條件語句說明:其中“敏感表達(dá)式”又稱為“控制表達(dá)式”,通常表示為控制信號的某些位。值1~值n稱為分支表達(dá)式,用控制信號的具體狀態(tài)值表示,因此又稱為常量表達(dá)式。default項(xiàng)可有可無,一個(gè)case語句里只能有一個(gè)default項(xiàng)!值1~值n必須互不相同,否則矛盾。值1~值n的位寬必須相等,且與控制表達(dá)式的位寬相同。92

溫馨提示

  • 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

提交評論