數(shù)字電子技術(shù) 教學(xué)課件 作者 包曉敏第4章_第1頁
數(shù)字電子技術(shù) 教學(xué)課件 作者 包曉敏第4章_第2頁
數(shù)字電子技術(shù) 教學(xué)課件 作者 包曉敏第4章_第3頁
數(shù)字電子技術(shù) 教學(xué)課件 作者 包曉敏第4章_第4頁
數(shù)字電子技術(shù) 教學(xué)課件 作者 包曉敏第4章_第5頁
已閱讀5頁,還剩140頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡介

數(shù)字電子技術(shù)書號:978-7-111-36240-1機(jī)械工業(yè)出版社本書課件及答案下載網(wǎng)頁鏈接為:http:///book/book!webDetails.do?book_id=2011536第4章VerilogHDL硬件描述語言與軟件實(shí)現(xiàn)

章目錄節(jié)目錄目錄4.1VerilogHDL的特點(diǎn)與基本結(jié)構(gòu)4.2VerilogHDL語言要素4.3VerilogHDL基本語句4.4VerilogHDL門元件和結(jié)構(gòu)描述方式4.5仿真驗證與可綜合設(shè)計4.6組合邏輯電路設(shè)計實(shí)踐4.7有限狀態(tài)機(jī)的設(shè)計章目錄節(jié)目錄

4.1VerilogHDL的特點(diǎn)與基本結(jié)構(gòu)

特點(diǎn):適合于各個層次的電路計設(shè)計和描述開關(guān)級系統(tǒng)級行為級RTL(RegisterTransferLevel)級門級章目錄節(jié)目錄基本結(jié)構(gòu)module<模塊名>(<端口列表>)<I/O聲明><變量類型聲明><功能描述>

endmodule數(shù)字系統(tǒng)模塊(Module)VerilogHDL章目錄節(jié)目錄模塊定義I/O與變量類型說明功能描述結(jié)束行模塊名【例】用Verilog語言描述一位加法器moduleadder(a,b,sum);端口列表inputa,b;output[1:0]sum;wirea,b;reg[1:0]sum;always@(aorb)beginsum=a+b;endendmodulemodule模塊名稱(端口1,端口2,…,端口N);端口狀態(tài):input(output)數(shù)據(jù)類型:wire,reg

always語句和begin-end串行塊章目錄節(jié)目錄VerilogHDL模塊例化模塊例化:程序調(diào)用模塊名例化名(.端口1信號名(連接端口1信號名),.端口2信號名(連接端口2信號名),.端口3信號名(連接端口3信號名),);例化方法:位置映射法信號名稱映射法混合映射法廣泛采用章目錄節(jié)目錄例如:modulecompare_app1(result0,a0,b0,result1,a1,b1);input[7:0]a0,b0,a1,b1;outputresult0,result1;//第1次調(diào)用比較器子模塊,利用信號名稱映射法

compare_coreinst_compare_core0(.result(result0),.a(a0),.b(b0));//第2次調(diào)用比較器子模塊,利用信號名稱映射法

compare_coreinst_compare_core1(.a(a1),.b(b1),.result(result1));endmodule章目錄節(jié)目錄4.2VerilogHDL語言要素章目錄節(jié)目錄4.2.1標(biāo)識符與注釋4.2.2數(shù)據(jù)類型4.2.3運(yùn)算符4.2.4編譯預(yù)處理語句4.2.5系統(tǒng)任務(wù)與系統(tǒng)函數(shù)Sdfj_kiu//允許在標(biāo)識符內(nèi)部包含下劃線)_sdfji//允許以下劃線開頭字母區(qū)分大小寫標(biāo)識符(Identifier):賦給對象的唯一名稱,通過標(biāo)識符可提及相應(yīng)的對象。如:1.標(biāo)識符必須由字母(a~z,A~z)或下劃線開頭;2.字母區(qū)分大小寫,后續(xù)部分可以是字母、數(shù)字、下劃線和$符號的組合;3.總長度要小于1024個字符長度。注意4.2.1標(biāo)識符與注釋章目錄節(jié)目錄轉(zhuǎn)義標(biāo)識符:以反斜杠“\”開頭,以空白符(空白符可以是一個空格、一個Tab鍵、一個制表符或者一個換行符等)結(jié)尾的任意字符串序列。轉(zhuǎn)義標(biāo)識符本身沒有意義。如:

標(biāo)識符不能和VerilogHDL語言的關(guān)鍵詞重復(fù),關(guān)鍵詞是用小寫字母定義的,用戶命名時要避免使用。注意\n\t\\\”

\(*+7u)\23kie//可以以任意可打印的字符開頭章目錄節(jié)目錄alwaysandassignautomaticbeginbufbufif()bufif1casecasexcasezcellcmosconfigdeassigndefaultdefparamdesigndisableedgeelseendendcaseendconfigendfunctionendgenerateendmoduleendprimitiveendspecifyendtableendtaskeventforforceforeverforkfunctiongenerategenvarhighz()highz1ififnoneincdirincludeinitialinoutinputinstanceintegerjoinlargeliblistlibrarylocalparammacromodulemediummodulenandnegedgenmosnornoshowcancellednotnotif()notif1oroutputparameterpmosposedgeprimitivepull0pull1pulldownpulluppulsestyle_oneventpulsestyle_ondetectrcmosrealrealtimeregreleaserepeatrnmosrpmosrtranrtranif()rtranif1scalaredshowcancelledsignedsmallspecifyspecparamstrong()strong1supply()supply1tabletasktimetrantranif()tranif1tritri()tri1triandtriortriregunsignedusevectoredwaitwandweak()weak1whilewireworxnorxor

注釋(Comment)

:在代碼中添加注釋行可以提高代碼的可讀性和可維護(hù)性。單行注釋多行注釋VerilogHDL中有以下兩種形式的注釋。(1)//注釋內(nèi)容(2)/*注釋內(nèi)容*/章目錄節(jié)目錄4.2.2數(shù)據(jù)類型

數(shù)據(jù)類型(Datatypes)常量變量整型實(shí)型字符型線型寄存器型章目錄節(jié)目錄1.邏輯數(shù)值(Number)基本邏輯數(shù)值0:邏輯0或“假”;1:邏輯1或“真”;x:未知;z:高阻。(1)x、z不區(qū)分大小寫;(2)也可以用?表示z。注意章目錄節(jié)目錄2.常量(Constants)常量整數(shù)(integer)實(shí)數(shù)(reals)字符串(strings)章目錄節(jié)目錄整數(shù)定義的格式為:<位寬>

'<基數(shù)><數(shù)值>(1)整數(shù)(integer)二進(jìn)制八進(jìn)制十進(jìn)制十六進(jìn)制8'h3F

(8位十六進(jìn)制數(shù))

'h15(十六進(jìn)制15)整數(shù)8'b1100_0001(8位二進(jìn)制數(shù))

'b01x

(二進(jìn)制01x)9'd6

(9位十進(jìn)制數(shù))

15(十進(jìn)制15)常量的位數(shù)(B)(O)(D)(H)基數(shù)默認(rèn)為十進(jìn)制數(shù)數(shù)值可為0、1、x(X)、z(Z)或?下劃線“_”增加可讀性章目錄節(jié)目錄(2)實(shí)數(shù)(Reals)實(shí)數(shù)十進(jìn)制計數(shù)法科學(xué)計數(shù)法如

0.5,128.78329如

1.7e8(指數(shù)符號:e或E)實(shí)數(shù)可根據(jù)四舍五入的原則轉(zhuǎn)化為整數(shù),將實(shí)數(shù)賦值給一個整數(shù)時,這種轉(zhuǎn)化會自行發(fā)生。章目錄節(jié)目錄(3)字符串(Strings)在表達(dá)式和賦值語句中用字符串作為操作數(shù),其數(shù)據(jù)類型轉(zhuǎn)換成無符號整型常量,取值為對應(yīng)字符的ASCII碼(一個字符用8位二進(jìn)制數(shù)表示)。注意字符串必須寫在雙引號內(nèi),不能分多行寫;reg[1:8*7]Char;Char=‘’counter’’存儲字符串’’ounter’’,

變量需要8×7位章目錄節(jié)目錄(3)字符串(Strings)特殊字符含義\n換行\(zhòng)tTab鍵\\反斜杠\\”引號”\101用八進(jìn)制數(shù)(101)表示ASCII碼(41H)%%%輸出特定格式特殊字符,需要一些特殊字符配合章目錄節(jié)目錄(3)字符串(Strings)【實(shí)例】字符串modulestring_test;reg[8*14-1]stringvar;initialbegin

stringvar=”helloworld”;

$display(“%sisstord%h”,stringvar,stringvar);

stringvar={stringvar,”!!!”};

$display(“%sisstordas%h”,stringvar,stringvar);endendmoduleHelloworldisstordas00000048656c6c6f20776f726c64Helloworld!!!isstordas48656c6c6f20776f726c64212121

如果字符串的位數(shù)超出字符串變量的位數(shù),截掉字符串的高位部分,低位對齊;

反之,如果字符串的位數(shù)少于字符串變量的位數(shù),高位部分用0補(bǔ)齊。章目錄節(jié)目錄參數(shù)是特殊的常量,常用來定義時延和變量寬度等。參數(shù)定義的格式為:parameter參數(shù)名1=表達(dá)式1,參數(shù)名2=表達(dá)式2,參數(shù)名2=表達(dá)式2,…;3.參數(shù)(Parameters)用參數(shù)delay代替延時常數(shù)10,用bus_width代替總線寬度常數(shù)32,用msb、lsb代替最高有效位7和最低有效位0【例4.2.2】參數(shù)定義moduleexample_for_parameters(reg_a,bus_addr,…);

parametermsb=7,1sb=0,delay=10,bus_width=32;reg[msb:1sb]reg_a;

reg[bus_width-1:0]bus_addr;and#delay(out,and1,and2);

…endmodule章目錄節(jié)目錄例4.2.2參數(shù)定義moduleexample_for_parameters(reg_a,bus_addr,…);parametermsb=7,1sb=0,delay=10,bus_width=32;reg[msb:1sb]reg_a;reg[bus_width-1:0]bus_addr;and#delay(out,and1,and2);…endmodule章目錄節(jié)目錄線型變量的值由驅(qū)動元件的值決定,并具有實(shí)時更新性;通常表示硬件電路中元器件間的物理連接;變量的每一位可以是0、1、x或z;線型變量在無驅(qū)動源時呈高阻態(tài)(trireg保持在不定態(tài))。4.線型變量(Nets)線型變量功能說明wire,tri標(biāo)準(zhǔn)連線wor,trior多重驅(qū)動時,具有線或特性的連線wand,triand多重驅(qū)動時,具有線或特性的連線tri1,tri0上拉電阻、下拉電阻supply1,suply0電源線、地線trireg具有電荷保持特性的連線章目錄節(jié)目錄4.線型變量(Nets)wire型變量是常用的線型變量,其賦值只能通過assign語句來完成,不能用于always語句中。VerilogHDL模塊的輸入/輸出端口的默認(rèn)值就是wire型。其定義的格式為:wirein1,in2;

//inl、in2默認(rèn)為1位寬的線型變量wire[7:0]local_bus;

//local_bus定義為8位寬的線型變量章目錄節(jié)目錄寄存器型變量的定義方式為:regin3,in4;//in3、in4默認(rèn)為1位寬的寄存器型變量reg[7:0]local_bus;//local_bus為8位寬的寄存器型變量

5、寄存器型變量(Registers)具有“寄存”性:在接受下一次賦值前,保持原值不變;寄存器型變量的默認(rèn)值是不定值x;寄存器型變量只能在always語句和initial語句中被賦值;寄存器型變量沒有強(qiáng)度之分;寄存器類變量必須明確給出類型說明(無默認(rèn)狀態(tài))。章目錄節(jié)目錄寄存器型變量功能說明reg常用的寄存器型變量integer32位帶符號整數(shù)型變量real64位帶符號實(shí)數(shù)型變量time無符號時間變量5、寄存器型變量(Registers)常用寄存器型變量及說明

reg型變量是常用的寄存器型變量。integer、real和time用于純數(shù)學(xué)的抽象描述,不對應(yīng)硬件電路。章目錄節(jié)目錄VerilogHDL通過對reg型變量建立數(shù)組來對存儲器建模,可描述RAM、ROM存儲器和寄存器數(shù)組。數(shù)組中的每一個單元通過索引進(jìn)行尋址。Memory型通過擴(kuò)展reg型數(shù)據(jù)的地址范圍來達(dá)到二維數(shù)組的效果。6、存儲器(Memories)定義的格式如下:reg[wordsize-1:0]

memory_name[memsize-1:0];例如:parameterwordsize=16,memsize=1024;reg[wordsize-1:0]

mem_ram[memsize-1:0];定義了一個由1024個16位寄存器構(gòu)成的存儲器,即存儲器的字長為16位,容量為1K。章目錄節(jié)目錄一個由n個1位寄存器構(gòu)成的存儲器組是不同于一個n位寄存器;reg[n-1:0]rega;

//一個n位寄存器regmema[n-1:0]

//一個由n個1位寄存器構(gòu)成的存儲器組memory類型變量和reg類型變量的區(qū)別:對memory中的存儲單元進(jìn)行讀/寫操作,必須指定該單元在存儲器中的地址。進(jìn)行尋址的地址索引可以是表達(dá)式,從而實(shí)現(xiàn)對存儲器中的不同單元進(jìn)行操作。mema[4]=0;

//將memory中的第4個存儲單元賦值為0章目錄節(jié)目錄4.2.3運(yùn)算符運(yùn)算符:是VerilogHDL預(yù)定義的函數(shù)符號,這些函數(shù)符號對被操作的對象(即操作數(shù))進(jìn)行規(guī)定的運(yùn)算。運(yùn)算符可分為三種:(1)單目運(yùn)算符(Unaryoperator):可以帶一個操作數(shù),操作數(shù)放在運(yùn)算符的右邊;(2)雙目運(yùn)算符(Binaryoperabr):可以帶兩個操作數(shù),操作數(shù)放在運(yùn)算符的兩邊;(3)三目運(yùn)算符(Ternaryoperator):可以帶三個操作數(shù),操作數(shù)被運(yùn)算符隔開。章目錄節(jié)目錄VerilogHDL的運(yùn)算符運(yùn)算符分類所含運(yùn)算符1算術(shù)運(yùn)算符+,-,*,、,%2邏輯運(yùn)算符!,&&,||3位運(yùn)算符~,&,|,^,^~/或~^4縮位運(yùn)算符&,~&,|,~|,^~/或~^5關(guān)系運(yùn)算符<,>,<=,>=6相等與全等運(yùn)算符==,!=,===,!==7邏輯移位運(yùn)算符<<,>>8連接運(yùn)算符{}例{exp1,exp2,…,expN}9條件運(yùn)算符?:例

cond_exp?exp1:exp2章目錄節(jié)目錄1.算術(shù)運(yùn)算符(Arithmeticoperators)算術(shù)運(yùn)算符又稱為二進(jìn)制運(yùn)算符,包括:(1)+加法運(yùn)算符,或正值運(yùn)算符,如a+b,+3;(2)-減法運(yùn)算符,或負(fù)值運(yùn)算符,如a-3,-3;(3)*乘法運(yùn)算符,如a*3;(4)/除法運(yùn)算符,如5/3;(5)%求余運(yùn)算符,要求%兩邊均為整型數(shù)據(jù),如7%3的值為1。章目錄節(jié)目錄2.邏輯運(yùn)算符(logicaloperators)在Verilog語言中有三種邏輯運(yùn)算符:(1)&&邏輯與例如:a&&b//表示a和b相與(2)||邏輯或例如:b||c//表示a和b相或(3)!

邏輯非

例如:!a//表示a的非

&&和||是雙目運(yùn)算符,!是單目運(yùn)算符。章目錄節(jié)目錄若操作數(shù)是一位的,邏輯運(yùn)算的真值表如下:2.邏輯運(yùn)算符(logicaloperators)ab!a!ba&&ba||b001100011001100101110011若操作數(shù)不止一位,應(yīng)將操作數(shù)作為一個整體來對待。即如果操作數(shù)的各位全是0,則相當(dāng)于邏輯0,只要某一位是1,則操作數(shù)整體看作邏輯1。例如:a的數(shù)值是4‘b0110,b的數(shù)值是4’b0000;則!a=0,!b=1,a&&b=0,a||b=1。邏輯運(yùn)算符的運(yùn)算結(jié)果是一位的。章目錄節(jié)目錄3.位邏輯運(yùn)算符(Bit-wiseoperators)位運(yùn)算符是對兩個操作數(shù)按位依次進(jìn)行邏輯運(yùn)算。VerilogHDL有五種位邏輯運(yùn)算符:

設(shè)A=8'b11010001,B=5'b11001(1)~按位取反(非運(yùn)算)

~A=8'b00101110(2)&按位與

A&B=8'b00010001(3)|按位或

A|B=8'b11011001(4)^按位異或

A^B=8'b11001000(5)^~或~^按位同或(異或非)

A^~B=8'b00110111兩個長度不同的數(shù)據(jù)進(jìn)行位運(yùn)算時,系統(tǒng)會自動地將兩者按右端對齊,位數(shù)少的操作數(shù)會在相應(yīng)的高位用0填滿。章目錄節(jié)目錄

4.縮位運(yùn)算符(Reductionoperators)

(1)&與

(2)~&與非

(3)|或

(4)~|或非

(5)^異或

(6)^~或~^同或

縮位運(yùn)算符是單目運(yùn)算符,對單個操作數(shù)的各位進(jìn)行與、或、非等操作;操作符放在操作數(shù)的前面,運(yùn)算的結(jié)果是一位邏輯值0或1;其具體運(yùn)算過程如下:&A等效于A[0]&A[l])&A[2])&A[3]。例如:若a=5'b1000l,b=4'b1111,則有:|a的數(shù)值等于1;&b的數(shù)值等于1。章目錄節(jié)目錄5.關(guān)系運(yùn)算符(Relationaloperators)(1)>大于(2)>=大于等于(3)<小于(4)<=小于等于如果操作數(shù)之間的關(guān)系成立,返回值為1;反之關(guān)系不成立返回值為0;若某一個操作數(shù)的值不定,返回值是不定值x。其中“<=”操作符也用于表示信號過程賦值語句。章目錄節(jié)目錄6.等式運(yùn)算符(Equalityoperators)等式運(yùn)算符有四種:(1)==相等(2)!=不相等(3)===全等(4)!==不全等等式運(yùn)算符都是雙目遠(yuǎn)算符,得到的結(jié)果是一位邏輯值;等式運(yùn)算符的比較是按位進(jìn)行的;章目錄節(jié)目錄6.等式運(yùn)算符(Equalityoperators)例如:設(shè)A=8‘b1101xx01,B=8’b1101xx01,

則A==B的結(jié)果為x;A===B的結(jié)果為1。相等與全等運(yùn)算符運(yùn)算符運(yùn)算規(guī)則a===b按位比較,含x或z的位參與比較,a與b完全相等,結(jié)果為1a!==b按位比較,含x或z的位參與比較,a與b不相等,結(jié)果為1a==ba和b中含有x或z,結(jié)果是xa和b中不含有x或z,完全相等,結(jié)果為1a!=ba和b中含有x或z,結(jié)果是xa和b中不含有x或z,不相等,結(jié)果為1章目錄節(jié)目錄7.邏輯移位運(yùn)算符(Shiftoperators)邏輯移位運(yùn)算符包括:(1)<<左移(2)>>右移其用法為:a>>n;//a右移n位,從左邊開始用0填補(bǔ)移出的位數(shù)b<<n;

//a左移n位,從右邊開始用0填補(bǔ)移出的位數(shù)例如:設(shè)A=8‘b11010001,則

A>>4的結(jié)果是A=8‘b00001101;

A<<4的結(jié)果是A=8'b00010000。章目錄節(jié)目錄8.位連接運(yùn)算符(Concatenations)位連接運(yùn)算符:將兩個或多個信號的某些位拼接起來。其操作符為:{}使用格式如下:{expl,exp2,…,expN}例如:

{a[1:0],b[3:2]}

等于{a[1],a[0],b[3],b[2]}章目錄節(jié)目錄

9.條件運(yùn)算符(Conditionaloperater)

條件運(yùn)算符是唯一的一個三目運(yùn)算符。其符號為:?使用格式如下:

操作數(shù)=<條件表達(dá)式>?<條件為真表達(dá)式>:<條件為假時的表達(dá)式>例如:對二選一的MUX采用如下描述:Out1=select?input1:input2;即select=1時,輸出為input1,否則為input2。章目錄節(jié)目錄運(yùn)算符的優(yōu)先級運(yùn)算符優(yōu)先級+-正、負(fù)!~單目&~&^~^|~|縮位運(yùn)算符最高*/%+-算術(shù)運(yùn)算符<<>>邏輯移位運(yùn)算符<<=>>=關(guān)系運(yùn)算符==!====!==相等與全等運(yùn)算符&^~^|位運(yùn)算符最低&&||邏輯運(yùn)算符?:條件運(yùn)算符章目錄節(jié)目錄4.2.4編譯預(yù)處理語句編譯預(yù)處理:編譯系統(tǒng)會對一些特殊命令進(jìn)行預(yù)處理,將預(yù)處理結(jié)果和源代碼一起進(jìn)行編譯處理;編譯預(yù)處理語句是以“

`”(反引號)開始的某些標(biāo)識符,結(jié)束時沒有分號;編譯時,特定的編譯器指令在整個編譯過程中有效(編譯過程可跨越多個文件),直到遇到其它的不同編譯程序指令。VerilogHDL完整的編譯預(yù)處理語句如下:`define`endif`ifdef

`else`undef`default_nettpe

`include`timescale`resetall`unconnected_drive`nounconnected_drive`celldefine`endcelldefine

常用的六個章目錄節(jié)目錄1.宏定義`define宏定義的格式:`define<宏名><宏定義的文本內(nèi)容>

`define指令通過一個指定的標(biāo)識符代表一個字符串;通常寫在模塊外面,用于模塊的任意位置,有效范圍從宏定義開始到源代碼結(jié)束;建議采用大寫字母表示宏名,與變量名相區(qū)別。例如:`defineWORDSIZE8reg[1:`WORDSIZE]data;`definesumina+inb+inc...assignout=

`sum+ind每條宏定義語句只可以定義一個宏替換,結(jié)束時沒有分號。調(diào)用宏定義時,也需要用撇號“

`‘’作開頭,后面跟隨宏定義的宏名。章目錄節(jié)目錄1.宏定義`defineParameter和`define有什么不同?

parameter只能對常數(shù)進(jìn)行參數(shù)定義;`define則能夠?qū)θ我鈨?nèi)容進(jìn)行替換。宏替換的作用僅局限在提高程序可讀性上。章目錄節(jié)目錄2.條件編譯命令`if條件編譯指令包括:`ifdef、`else、`endif。應(yīng)用格式有兩類:(1)`ifdef

MacroName

語句塊; `endif(2)`ifdef

MacroName

語句塊1; `else

語句塊2; `endif`else程序指令對于`ifdef指令是可選的章目錄節(jié)目錄2.條件編譯命令`if條件編譯語句可在程序的任何地方調(diào)用,其規(guī)則如下:(1)如果宏的名字已經(jīng)用了`define定義,那么只編譯Verilog代碼的第一個塊;(2)如果沒有定義宏的名字而且出現(xiàn)`else偽指令,那么只編譯第二個塊;(3)這些偽指令可以嵌套;(4)不被編譯的代碼都應(yīng)是有效的Verilog代碼。章目錄節(jié)目錄3.仿真時間尺度`timescale例如:`timescale1ns/100ps表示以1ns作為仿真的時間單位,時延精度為100ps。仿真時間尺度:定義仿真器的時間單位和時間精度。格式為:

`timescale<時間單位>/<時間精度>定義模塊內(nèi)部仿真時間和延遲時間的基準(zhǔn)單位聲明該模塊仿真時間的精確程度章目錄節(jié)目錄3.仿真時間尺度`timescale時間單位和時間精度都是由整數(shù)和計時單位組成的;合理的整數(shù)有1、10、100;計時單位為s、ms(10-3s)、μs(10-6s)、ns(10-9s)、ps(10-12s)和fs(10-l5s)。時間精度和時間單位的差別不要太大(仿真時間是以時間精度累計的,兩者差異越大,仿真花費(fèi)的時間就越長);時間精度值不能大于時間單位值;若一個設(shè)計中存在多個`timescale,則采用最小的時間單位。章目錄節(jié)目錄(3)寄存器變量的仿真延時initialbegin

#10y=0;//從仿真開始在10ns時刻執(zhí)行該語句

#20

y=1;//從仿真開始在30ns時刻執(zhí)行該語句…end幾種常用延時模型的表示方法:(1)門延時and#10gatea(out,a1,b1);

//門延時是指從門的輸入端發(fā)生變化到輸出發(fā)生變化的延遲時間(2)assign賦值延時

assign#10y=c|d;

//等號右端變量發(fā)生變化到等號左端發(fā)生相應(yīng)變化的延遲時間章目錄節(jié)目錄4.文件包含`include文件名中可以指定包含文件的路徑,既可以是相對路徑名,也可以是完整的路徑名;每條文件包含語句只能夠用于一個文件的包含,但是允許嵌套包含,即包含的文件中允許再去包含另外一個文件。`include指令:在文件編譯過程中,將語句中指定的源代碼全部包含到另外一個文件中。格式:`include“文件名”

例如:

`include“global.v”`include“c:/library/mux.v”章目錄節(jié)目錄`include"adder.v",

moduleadderl6(cout,sum,a,b,cin);outputcout;parametermy_size=16;output[my_size-1:0]sum;input[my_size-1:0]a,b;inputcin;addermy_adder(cout,sum,a,b,cin);endmodulemoduleadder(cout,sum,a,b,cin);parametersize=16;outputcout;output[size-1:0]sum;inputcin;input[size-1:0]a,b;assign{coutsum}=a+b+cin;endmodule【例】文件包含`include的應(yīng)用。

章目錄節(jié)目錄4.2.5系統(tǒng)任務(wù)與系統(tǒng)函數(shù)(1)顯示任務(wù);

(5)時序驗證任務(wù);(2)文件輸入/輸出任務(wù);

(6)仿真時間函數(shù);(3)時間標(biāo)度任務(wù);

(7)實(shí)數(shù)變化函數(shù);(4)仿真控制任務(wù);

(8)概率分布函數(shù)。VerilogHDL語言中,以“$”字符開始的標(biāo)識符表示系統(tǒng)任務(wù)或系統(tǒng)函數(shù)。系統(tǒng)任務(wù)和函數(shù)是在語言中預(yù)定義的任務(wù)和函數(shù)。系統(tǒng)任務(wù)功能強(qiáng)大,主要分為以下幾類:章目錄節(jié)目錄$display與$write屬顯示類系統(tǒng)任務(wù)(Displaysystemtasks),用于仿真過程中,將一些信息或仿真結(jié)果按用戶指定的格式輸出。調(diào)用格式為:

$display(“顯示格式控制符”,輸出變量列表)

$write

(“顯示格式控制符”,輸出變量列表)1.系統(tǒng)任務(wù)$display與$write

兩者的區(qū)別:$display在數(shù)據(jù)結(jié)束后可以自動換行,而$write需要使用換行符才能實(shí)現(xiàn)換行。章目錄節(jié)目錄格式控制符輸出格式%h或%H以十六進(jìn)制數(shù)的形式輸出%d或%D以十進(jìn)制數(shù)的形式輸出%o或%O以八進(jìn)制數(shù)的形式輸出%b或%B以二進(jìn)制數(shù)的形式輸出%c或%C以ASCII進(jìn)制數(shù)的形式輸出%s或%S以字符串的形式輸出%v或%V輸出線型數(shù)據(jù)的驅(qū)動強(qiáng)度%m或%M輸出模塊的名稱常用顯示格式控制符章目錄節(jié)目錄moduledisp_exp;reg[31:0]rval;initialbegin

rval=101;$display("rval=%hhex%ddecimal",rval,rval);$display("rval=%ooctal\nrval=%bbin",rval,rval);$display("rvalhas%casciicharactervalue",rval);$display("currentscopeis%m");$display("%sisasciivaluefor101\n",101);$wirte("rval=%hhex%ddecimal",rval,rval);$wirte("rval=%ooctal\nrval=%bbin",rval,rval);$wirte("rvalhas%casciicharactervalue\n",rval);$wirte("currentscopeis%m");$wirte("%sisasciivaluefor101\n",101);endendmodulerval=00000065hex101decimalrval=00000000145octalrval=00000000000000000000000001100101binrvalhaseasciicharactervaluecurrentscopeisdisp_expeisasciivaluefor101rval=00000065hex101decimalrval=00000000145octalrval=0000000000000000000000001100101binrvalhaseasciicharactervaluecurrentscopeisdisp_expeisasciivaluefor101顯示內(nèi)容用””括起來例

顯示系統(tǒng)任務(wù)的調(diào)用。章目錄節(jié)目錄$display和$write和$monitor有什么不同?2.系統(tǒng)任務(wù)$monitor$monitor:屬顯示類系統(tǒng)任務(wù),用于仿真過程中信息或仿真結(jié)果的輸出。使用格式:

$monitor(“顯示格式控制符”,輸出變量列表);$display和$write只有執(zhí)行到該語句時才進(jìn)行相應(yīng)的顯示操作;$monitor具有監(jiān)控功能,每當(dāng)輸出變量列表中的變量發(fā)生變化,$monitor任務(wù)就執(zhí)行一次,將整個參數(shù)列表中變量或表達(dá)式的值輸出顯示。與$display和$write中定義的完全相同章目錄節(jié)目錄$readmem用于存儲器的初始化,將文件中的數(shù)值賦予存儲器。調(diào)用格式為:3.系統(tǒng)任務(wù)$readmem$readmemb(“<數(shù)據(jù)文件名>”,<存儲器名>,<起始地址>,<結(jié)束地址>);二進(jìn)制數(shù)$readmemh(“<數(shù)據(jù)文件名>”,<存儲器名>,<起始地址>,<結(jié)束地址>);十六進(jìn)制數(shù)注意:地址可省略。省略起始地址,表示從首地址開始存儲;

省略結(jié)束地址,表示存儲到存儲器的結(jié)束地址。數(shù)據(jù)寬度與存儲器位寬一致,用空格分隔不同存儲單元的數(shù)據(jù);數(shù)據(jù)文件中第一個數(shù)據(jù)存儲到存儲器起始地址中。也可用“@地址”在數(shù)據(jù)文件中指明數(shù)據(jù)所屬的存儲單元,地址是十六進(jìn)制數(shù)。章目錄節(jié)目錄//RAM的定義(由65536個8位寄存器構(gòu)成的存儲器)reg[7:0]

mn[0:65535];write[7:0]

data_inreg[7:0]data_out

//輸出數(shù)據(jù)的設(shè)計always@(negedgeCLK)begin

//@(negedgeCLK)行為語句是信號跳變沿事件語句if(~RW)#4ram[ADDRESS]=data_in;end//測試矢量庫的調(diào)入initialbegin$readmemh(“c:/SimFile/00_test_all.txt”,ram);…end【例】8位MCU測試代碼以及數(shù)據(jù)文件的部分內(nèi)容。數(shù)據(jù)文件"c:/SimFile/00_test_all.txt”內(nèi)容為:@0000232323456567…@fff023345467…數(shù)據(jù)為十六進(jìn)制0000H:FFFFH章目錄節(jié)目錄$stop與$finish用于控制仿真過程;$stop表示暫停當(dāng)前仿真過程;$finish表示結(jié)束當(dāng)前仿真過程。4.系統(tǒng)任務(wù)$stop與$finish調(diào)用格式:$finish;$finish(N);$stop;$stop(N);N可取0,1或2,含義如下:0:不打印顯示任何信息。1:打印顯示仿真時間和具體位置,這也是默認(rèn)取值。2:打印顯示仿真時間和具體位置,同時給出仿真過程中內(nèi)存和CPU占有時間情況。章目錄節(jié)目錄$time與$realtime是顯示仿真時間類系統(tǒng)函數(shù)(Simulationtimesystemfunctions),被調(diào)用時,返回當(dāng)前的仿真時刻值;$time返回的是整數(shù)時間值;$realtime返回的是實(shí)數(shù)時間值。5.系統(tǒng)函數(shù)$time與$realtime$time與$realtime經(jīng)常與顯示任務(wù)配合使用。例$time與$monitor應(yīng)用示例。章目錄節(jié)目錄`timescale1ns/1psmoduleshow1;parameterDELAY=10.1;integera;initialbegin#delaya=1;#delaya=2;endinitial$monitor($time,"a=",a);endmodule仿真輸出顯示結(jié)果為:#0a=x#10a=1#20a=2如果將$time改為$realtime,輸出顯示為:#0a=x#10.1a=1.0#20.2a=2.0使用$realtime時需與`timescale仿真時間精度配合,若采用`timescale1ns/1ns,$realtime無法正確顯示。章目錄節(jié)目錄$random是隨機(jī)數(shù)產(chǎn)生系統(tǒng)任務(wù);使用格式:

$random[數(shù)值];6.系統(tǒng)函數(shù)$random例如:$random%16//m=16產(chǎn)生一個-15到+15之間的隨機(jī)數(shù)若省略數(shù)值,則任務(wù)返回一個32位的等概率有符號隨機(jī)數(shù);若給具體數(shù)值m,則返回一個在-m+1到m-1之間的等概率隨機(jī)數(shù)。例如:

{random}%1024//m=1024產(chǎn)生一個0到1023之間的隨機(jī)數(shù)位拼接操作返回?zé)o符號數(shù),可用來產(chǎn)生0到m-1之間的隨機(jī)數(shù)章目錄節(jié)目錄4.3VerilogHDL基本語句(1)賦值語句(Assignments)

連續(xù)賦值語句(Continuousassignments)

過程賦值語句(Proceduralassignments

)(2)條件語句(Conditionalstatement)If-else,case(3)循環(huán)語句

for,repeat,while,forever(4)塊語句(Blockstatements)

串行塊(begin-end)

并行塊(fork-join)(5)結(jié)構(gòu)化語句(Structuredprocedures)initial語句

always語句task語句function函數(shù)章目錄節(jié)目錄順序語句:按程序書寫的順序自上而下一條一條地執(zhí)行。并行語句:是VerilogHDL最具有特色的語句結(jié)構(gòu),它在設(shè)計模塊中的執(zhí)行是同時進(jìn)行的,或者說是并行運(yùn)行的,其執(zhí)行方式與語句書寫的順序無關(guān)。當(dāng)多條并行語句都滿足執(zhí)行條件時,它們同時運(yùn)行。章目錄節(jié)目錄4.3.1賦值語句賦值語句:對線型和寄存器型變量賦值,分為連續(xù)賦值語句和過程賦值語句。兩者主要區(qū)別在于:(1)賦值對象不同;連續(xù)賦值語句(線型變量)過程賦值語句(寄存器變量)(2)賦值實(shí)現(xiàn)方式不同;線型變量被連續(xù)賦值語句賦值后,賦值語句右端表達(dá)式中信號的任何變化,就會立即對左端的線型變量進(jìn)行更新操作;過程賦值語句只在語句被執(zhí)行到時,賦值過程才能夠進(jìn)行,賦值過程的具體執(zhí)行時間還受到各種因素的影響。章目錄節(jié)目錄4.3.1賦值語句(4)語句出現(xiàn)的位置不同(3)語句結(jié)構(gòu)不同連續(xù)賦值語句以關(guān)鍵詞assign為先導(dǎo);過程賦值語句不需要任何先導(dǎo)關(guān)鍵詞,但賦值分阻塞型和非阻塞型。連續(xù)賦值語句不能出現(xiàn)在過程塊中;過程賦值語句只能出現(xiàn)在過程塊中。章目錄節(jié)目錄assign連續(xù)賦值語句只能用于對線型變量進(jìn)行賦值。其基本的語法格式如下:

線型變量類型[線型變量位寬]線型變量名;assign#[delsy]<線型變量名>=<賦值表達(dá)式>;

//delay是賦值延時【例】四位加法器的verilog描述。moduleadder(sum_out,carry_out,carry_in,ina,inb);input[3:0]ina,inb;inputcarry_in;output[3:0]sum_out;outputcarry_out;wirecarry_out,carry_in;wire[3:0]sum_out,ina,inb;assign{carry_out,sum_out}=ina+inb+carry_in;//通過連續(xù)賦值語句對進(jìn)位位和運(yùn)算結(jié)果統(tǒng)一賦值endmodule1.assign連續(xù)賦值語句(Continuousassignments)章目錄節(jié)目錄過程賦值語句用于initial和always模塊,對寄存器型變量賦值。它有兩種賦值形式:阻塞型過程賦值和非阻塞型過程賦值。賦值語句的基本格式如下:(1)<寄存器型變量>=<表達(dá)式>;

//阻塞型過程賦值(2)<寄存器型變量><=<表達(dá)式>;//非阻塞性過程賦值2.過程賦值語句(Proceduralassignments)例如:regc;always@(a)

//@(a)行為語句是電平觸發(fā)事件控制語句Begin

c=1'b0;//阻塞型過程賦值語句end章目錄節(jié)目錄兩者主要區(qū)別在于:阻塞型賦值語句由符號“=”來完成;”阻塞”是指當(dāng)前賦值完成前阻塞其它類型的賦值任務(wù),但是如果右端表達(dá)式中含有延時語句,則在延時沒有結(jié)束前不會阻塞其它賦值任務(wù);阻塞型賦值語句的執(zhí)行受到前后順序的影響.3.阻塞型過程賦值與非阻塞型過程賦值的深入理解(Bloking&nonblockingproceduralassignment)章目錄節(jié)目錄非阻塞型賦值語句由符號“<=”來完成;”非阻塞賦值”在一個時間步的開始估計右端表達(dá)式的值,并在這個時間步結(jié)束時用等式右邊的值更新取代左端表達(dá)式。在估計右端表達(dá)式和更新左端表達(dá)式的中間時間段,其它的對左端表達(dá)式的非阻塞賦值可以被執(zhí)行。即“非阻塞賦值”從估計右端表達(dá)式開始并不阻礙執(zhí)行其它的非阻塞賦值任務(wù)。非阻塞賦值語句的結(jié)果與語句出現(xiàn)順序無關(guān)。章目錄節(jié)目錄(1)對組合邏輯建模采用阻塞型賦值;(2)對時序邏輯建模采用非阻塞型賦值;(3)用多個always塊分別對組合和時序邏輯建模;(4)不要在同一個always塊里面混合使用“阻塞賦值”和“非阻塞賦值”,如果在同一個always塊里面既為組合邏輯又為時序邏輯建模,應(yīng)使用“非阻塞賦值”;(5)當(dāng)為鎖存器(latch)建模時,使用“非阻塞賦值”。幾種常用的編碼風(fēng)格:章目錄節(jié)目錄moduleblk_nonblk(out_a,out_b,out_c,out_d,data_in,clock);inputdata_in,clock;outputout_a,out_b,out_c,out_d;

reg

out_a,out_b,out_c,out_d;

always@(posedgeclock)begin

out_a=data_in;//blockassignment

out_b=out_a;//blockassignmentend

always@(posedgeclock)begin

out_c<=data_in;//nonblockassignment

out_d<=out_c;//nonblockassignmentendendmodule例:阻塞型賦值語句與非阻塞型賦值語句的比較章目錄節(jié)目錄moduletest_blk_nonblk;

reg

data_in,clock;wireout_a,out_b,out_c,out_d;

blk_nonblk

blk_nonblk(out_a,out_b,out_c,out_d,data_in,clock);initialbeginclock=0;data_in=0;#40data_in=1;endalways#50clock=~clock;always#100data_in=~data_in;initialbegin#1000$stop;#20$finish;endendmodule測試程序:out_a、out_b和out_c的波形一致,但out_d比out_c晚一個時鐘周期章目錄節(jié)目錄非阻塞型賦值語句的綜合結(jié)果兩種賦值語句的綜合結(jié)果阻塞型賦值語句的綜合結(jié)果章目錄節(jié)目錄4.3.2條件語句if語句使用方法有以下3種:(1)if(條件1)語句塊1;(2)if(條件1)語句塊1;

else

語句塊2;(3)if(條件1)語句塊1;

elseif(條件2)語句塊2;…

elseif(條件n)

語句塊n;

else語句塊n+1;

1.if語句“條件”一般為邏輯表達(dá)式或者關(guān)系表達(dá)式,也可以是一位的變量。若表達(dá)式的值出現(xiàn)0、x、z,則按“假”處理;若為1,則按“真”處理;在多重if語句嵌套時,語句塊要用“beginend”塊括起來,便于檢查if與else的匹配;在應(yīng)用中,盡量保持if語句分支的完整性。章目錄節(jié)目錄【例】一個4路數(shù)據(jù)選擇器的設(shè)計。

modulesel_4(sel_in,data_a_in,data_b_in,data_c_in,data_d_in,data_out);

input[1:0]sel_in;input[4:0]data_a_in,data_b_in,data_c_in,data_d_in;output[4:0]data_out;

reg[4:0]data_out;always@(data_a_inordata_b_inordata_c_inordata_d_inorsel_in)begin

if(sel_in==2'b00)begin

data_out<=data_a_in;end

elseif(sel_in==2'b01)begin

data_out<=data_b_in;

end

elseif(sel_in==2'b10)begin

data_out<=data_c_in;

End

else

begin

data_out<=data_d_in;

endendendmodule章目錄節(jié)目錄case語句是多路條件分支形式,常用于多路譯碼器、狀態(tài)機(jī)以及微處理器的指令譯碼等,有case、casez和casex3種形式。(1)cace語句

case語句的語法格式如下:

case(<條件表達(dá)式>)

值1:語句塊1;

值2:語句塊2;

……

值n:語句塊n

default:語句塊n十1;

endcase2.case語句章目錄節(jié)目錄【例】case語句實(shí)現(xiàn)3-8線譯碼器moduledecode3_8(data_in,data_out);input[2:0]data_in;output[7:0]data_out;reg[7:0]data_out;

always@(data_in)begin

case(data_in)3'b000:data_out=8'b00000001;3'b001:data_out=8'b00000010;3'b010:data_out=8'b00000100;3'b011:data_out=8'b00001000;3'b100:data_out=8'b00010000;3‘b101:data_out=8’b00100000;3‘b110:data_out=8’b01000000;3‘b111:data_out=8’b10000000;

endcaseendendmodule章目錄節(jié)目錄(2)casez和casex語句用來處理分支項中存在z和x的情況casez的語法格式如下:casez(<條件表達(dá)式>)值1:語句塊1;值2:語句塊2;……值n:語句塊n;default:語句塊n十1;endcasecasez(casex)認(rèn)為,如果給定值中有某位是高阻態(tài)z(高阻態(tài)z或不定態(tài)x),則該位為“真”,條件表達(dá)式與給定值比較時只需比較其它位。當(dāng)其它位也為“真”時,執(zhí)行給定值后面的語句塊。若條件表達(dá)式與所有給定值比較都不為“真”時,執(zhí)行default值后面的語句塊。casex的語法格式如下:casex(<條件表達(dá)式>)值1:語句塊1;值2:語句塊2;……值n:語句塊n;default:語句塊n十1;endcase章目錄節(jié)目錄【例】首“1”位置檢測電路。//檢測輸入數(shù)據(jù)中從低位到高位第一個“1”出現(xiàn)的位置。modulefirst_one_location(data_in,location);input[3:0]data_in;output[2:0]location;reg[2:0]location;

always@(data_in)begin

casex(data_in)4'bxxx1:location=1;4'bxx10:location=2;4'bx100:location=3;4'b1000:location=4;default:location=0;

endcaseendendmodule章目錄節(jié)目錄4.3.3循環(huán)語句VerilogHDL中有以下四種類型的循環(huán)語句:(1)for語句(2)repeat語句

(3)while比語句

(4)forever語句可綜合不可綜合章目錄節(jié)目錄1.for語句for循環(huán)語句實(shí)現(xiàn)“條件循環(huán)”,其格式為:for(循環(huán)變量賦初值;循環(huán)執(zhí)行條件;循環(huán)變量增值)循環(huán)體語句的語句塊;“循環(huán)變量賦初值”語句只在第一次循環(huán)前被執(zhí)行;“循環(huán)執(zhí)行條件”在每次循環(huán)開始之前都會被執(zhí)行;“循環(huán)變量增值”語句在每次循環(huán)結(jié)束之后被執(zhí)行。章目錄節(jié)目錄【例】采用for語句統(tǒng)計輸入數(shù)據(jù)中包含零比特的個數(shù)。modulecounter_zero(data_in.count);input[7:0]data_in;output[2:0]count;reg[2:0]count;reg[2:0]count_aux;

always@(data_in)begin

count_aux=3'b000;

for(i=0;i<8;i=i+1)begin

if(!a[i])

count_auxcount_aux+1;endcount=count_aux;endendmodule

章目錄節(jié)目錄2.repeat語句語法形式:repeat(循環(huán)次數(shù)表達(dá)式)begin

語句塊;end循環(huán)次數(shù)表達(dá)式是常量表達(dá)式,給出語句塊的循環(huán)次數(shù)[例]用repeat語句實(shí)現(xiàn)8位二進(jìn)制數(shù)乘法modulemult_8b_repeat(data_a,data_b,data_out);parameterbsize=8;input[bsize-1:0]data_a,data_b;output[2*bsize-1:0]data_out;reg[2*bsize-1:0]data_a_temp,data_out;reg[bsize-1:0]data_b_temp;always@(data_aordata_b)begin

data_out=0;

data_a_temp=data_a;

data_b_temp=data_b;repeat(bsize)begin

if(data_b_temp[0])

data_out=data_out+data_a_temp;

data_a_temp=data_a_temp<<1;

data_b_temp=data_b_temp<<1;endendendmodule章目錄節(jié)目錄3.while語句描述格式為:while(循環(huán)執(zhí)行條件表達(dá)式)begin

語句塊;endwhile語句在執(zhí)行時,先判斷循環(huán)執(zhí)行表達(dá)式是否為真,若為真,執(zhí)行后面的語句塊,再返回判斷循環(huán)執(zhí)行條件表達(dá)式是否為真,依據(jù)判斷結(jié)果確定是否繼續(xù)執(zhí)行。[例]用while語句實(shí)現(xiàn)從0到10的求和initialbeginsum=0;count=0;

while(count<11)begincount=count+sum;count=count+1;endend章目錄節(jié)目錄4.forever語句forever語句可無條件連續(xù)執(zhí)行語句;描述格式為:

forever語句塊;forever語句多用在initial塊中,常用在測試代碼中,以產(chǎn)生時鐘或其它周期性波形,是不可綜合語句。[例]用forever語句生成50MHz的時鐘信號。

`timescale1ns/100psinitialbeginclock=0;

forever#10clock=~clock;end章目錄節(jié)目錄4.3.4塊語句塊語句將多條語句組合在一起,有兩種格式:(1)begin…end語句,常用來啟動順序執(zhí)行的串行激勵。(2)fork…join語句,用來啟動多任務(wù)并行執(zhí)行的并行激勵。1.串行塊(begin-end)的特點(diǎn):串行塊中的每條語句都是按塊中的排列次序順序執(zhí)行;串行塊中每條語句的延時都是相對于前一條語句執(zhí)行結(jié)束的相對時間;串行塊的起始執(zhí)行時間是塊中第一條語句開始執(zhí)行的時間,結(jié)束時間是最后一條語句執(zhí)行結(jié)束的時間。章目錄節(jié)目錄2.并行塊(fork-join)具有如下特點(diǎn):(1)并行塊內(nèi)各語句同時、獨(dú)立地執(zhí)行,與排列次序無關(guān);(2)并行塊中每條語句的延時都是相對于整個并行塊開始執(zhí)行時刻的絕對延時;(3)并行塊所有語句都執(zhí)行完后,仿

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論