版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
數(shù)字邏輯北航計算機(jī)學(xué)院艾明晶牛建偉amj@niujianwei@2第2章邏輯代數(shù)和硬件描述語言基礎(chǔ)
本章介紹分析和設(shè)計數(shù)字邏輯電路的數(shù)學(xué)方法,包括:邏輯代數(shù)的基本概念,邏輯函數(shù)及其表示方法,邏輯代數(shù)的基本公式、常用公式和重要定理以及邏輯函數(shù)的簡化方法。并介紹硬件描述語言VerilogHDL的基本知識。2.1邏輯代數(shù)基本概念
2.2邏輯代數(shù)的運(yùn)算法則2.3邏輯函數(shù)的表達(dá)式2.4邏輯函數(shù)的公式簡化法2.5VerilogHDL基礎(chǔ)共7學(xué)時32.5.1VerilogHDL基本結(jié)構(gòu)2.5.2VerilogHDL的詞法2.5.3VerilogHDL常用語句2.5.4不同抽象級別的VerilogHDL模型2.5VerilogHDL基礎(chǔ)內(nèi)容概要4硬件描述語言簡介硬件描述語言(HradwareDescriptionLanguage)是一種用形式化方法(即文本形式)來描述和設(shè)計數(shù)字電路和數(shù)字系統(tǒng)的高級模塊化語言。它是設(shè)計人員和EDA工具之間的一個橋梁,主要用于編寫設(shè)計文件,在EDA工具中建立電路模型;也用來編寫測試文件進(jìn)行仿真。用HDL描述設(shè)計編程下載EDA工具綜合、仿真目標(biāo)文件HDL發(fā)展至今已有近三十年的歷史,到20世紀(jì)80年代,已出現(xiàn)了數(shù)十種硬件描述語言。80年代后期,HDL向著標(biāo)準(zhǔn)化、集成化的方向發(fā)展,最終VHDL、VerilogHDL先后成為IEEE標(biāo)準(zhǔn)。VHDL
:VHSICHardwareDescriptionLanguage(VHSIC——VeryHighSpeedIntegratedCircuits),甚高速集成電路的硬件描述語言,來源于美國軍方,1987年成為IEEE標(biāo)準(zhǔn)。目前標(biāo)準(zhǔn)化程度最高的一種HDL。5VerilogHDL簡介VerilogHDL是目前應(yīng)用最為廣泛的硬件描述語言,可以用來進(jìn)行數(shù)字電路的建模、仿真驗(yàn)證、時序分析、邏輯綜合。1983年,由GDA(GateWayDesignAutomation)公司的PhilMoorby首創(chuàng);1989年,Cadence公司收購了GDA公司;1990年,Cadence公司公開發(fā)表VerilogHDL;1995年,IEEE制定并公開發(fā)表VerilogHDL1364-1995標(biāo)準(zhǔn)。VerilogHDL模型可以是實(shí)際電路的不同級別的抽象。抽象級別可分為五級:系統(tǒng)級,算法級,RTL級,門級,開關(guān)級。6VerilogHDL的特點(diǎn)語法結(jié)構(gòu)上的主要特點(diǎn)形式化地表示電路的行為和結(jié)構(gòu);借用C語言的結(jié)構(gòu)和語句;可在多個層次上對所設(shè)計的系統(tǒng)加以描述,語言對設(shè)計規(guī)模不加任何限制;具有混合建模能力:一個設(shè)計中的各子模塊可用不同級別的抽象模型來描述;基本邏輯門、開關(guān)級結(jié)構(gòu)模型均內(nèi)置于VerilogHDL語言庫中,可直接調(diào)用;易創(chuàng)建用戶定義原語(UDP,UserDesignedPrimitive)。易學(xué)易用,功能強(qiáng)與C語言非常相似!7VerilogHDL與C語言的比較語句及函數(shù)的比較語句及函數(shù)C語言VerilogHDL函數(shù)無參函數(shù),有參函數(shù)function塊語句賦值語句賦值變量=表達(dá)式;阻塞賦值,非阻塞賦值條件語句if-elseif-else條件語句switchcase循環(huán)語句forfor循環(huán)語句whilewhile中止語句breakbreak宏定義語句define(以符號#開頭)define(以符號’開頭)格式輸出函數(shù)printfprintf8運(yùn)算符的比較C語言VerilogHDL功能C語言VerilogHDL功能++加<=<=小于等于--減====等于**乘!=!=不等于//除~~按位取反%%取模&&按位與!!邏輯非||按位或&&&&邏輯與^^按位異或||||邏輯或<<<<左移>>大于>>>>右移<<小于?:?:等同于if-else>=>=大于等于VerilogHDL與C語言的運(yùn)算符幾乎完全相同!9VerilogHDL與VHDL的比較VerilogHDLVHDL成為IEEE標(biāo)準(zhǔn)1995年1987年語法結(jié)構(gòu)√比VHDL簡單語法結(jié)構(gòu)比較嚴(yán)格,模塊風(fēng)格比較清晰學(xué)習(xí)難易程度√容易掌握較難掌握建模能力門級開關(guān)電路描述方面很強(qiáng)√系統(tǒng)級抽象能力較強(qiáng)測試激勵模塊容易編寫√適合由多人合作完成的特大型項(xiàng)目(一百萬門以上)?!梯^多的第三方工具的支持√仿真工具比較好用102.5.1VerilogHDL基本結(jié)構(gòu)一、簡單的VerilogHDL例子【例2.13】
8位全加器
moduleadder8(cout,sum,a,b,cin); outputcout; //輸出端口聲明
output[7:0]sum; input[7:0]a,b; //輸入端口聲明
inputcin; assign{cout,sum}=a+b+cin; endmoduleI/O說明端口定義功能描述模塊名(文件名)整個程序嵌套在module和endmodule聲明語句中。每條語句相對module和endmodule最好縮進(jìn)2格或4格!//……表示注釋部分,一般只占據(jù)一行。對編譯不起作用!單行注釋符11簡單的VerilogHDL例子(1/3)
【例2.14】
8位計數(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@(posedgeclk) begin if(load) out=data;//同步預(yù)置數(shù)據(jù)
else out=out+1+cin;//加1計數(shù)
endassigncout=&out&cin;//若out為8‘hFF,cin為1,則cout為1 endmodule功能描述信號類型聲明縮減運(yùn)算符按位與12簡單的VerilogHDL例子(2/3)【例2.15】三態(tài)驅(qū)動器
moduletrist2(out,in,enable); outputout; inputin,enable;
bufif1
mybuf(out,in,enable); endmodule例化元件名門元件關(guān)鍵字門元件例化——程序通過調(diào)用一個在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)*/endmodule簡單的VerilogHDL例子(3/3)【例2.16】三態(tài)驅(qū)動器(trist1.v)例化元件名(可省略)子模塊名頂層模塊子模塊模塊元件例化—頂層模塊(trist1)調(diào)用由某子模塊(mytri)定義的實(shí)例元件(tri_inst)來實(shí)現(xiàn)某功能。模塊元件例化14VerilogHDL基本結(jié)構(gòu)總結(jié)
1.VerilogHDL程序是由模塊構(gòu)成的。每個模塊嵌套在module和endmodule聲明語句中。模塊是可以進(jìn)行層次嵌套的。
2.每個VerilogHDL源文件中只準(zhǔn)有一個頂層模塊,其他為子模塊。源文件名稱與頂層模塊同名(后綴為.v)!
3.每個模塊要進(jìn)行端口定義,并說明輸入輸出端口,然后對模塊的功能進(jìn)行描述。
4.程序書寫格式自由,一行可以寫幾個語句,一個語句也可以分多行寫。
5.除了endmodule語句、begin_end語句和fork_join語句外,每個語句和數(shù)據(jù)定義的最后必須有分號。
6.可用/*.....*/和//.....對程序的任何部分作注釋。加上必要的注釋,以增強(qiáng)程序的可讀性和可維護(hù)性。15二、VerilogHDL模塊的結(jié)構(gòu)Verilog的基本設(shè)計單元是“模塊(block)”。Verilog模塊的結(jié)構(gòu)由在module和endmodule關(guān)鍵詞之間的4個主要部分組成:moduleblock1(a,b,c,d);
inputa,b,c;
outputd;
wirex;
assignd=a|x;
assignx=(b&~c);endmoduleI/O說明端口定義功能描述信號類型聲明123416模塊端口定義與I/O說明1、模塊端口定義模塊端口定義用來聲明設(shè)計電路模塊的輸入輸出端口,端口定義格式:
module模塊名(端口1,端口2,端口3,…);在端口定義的圓括弧中,是設(shè)計電路模塊與外界聯(lián)系的全部輸入輸出端口信號或引腳,它是設(shè)計實(shí)體對外的一個通信界面,是外界可以看到的部分(不包含電源和接地端),多個端口名之間用“,”分隔。2、I/O說明模塊的I/O說明用來聲明模塊端口定義中各端口數(shù)據(jù)流動方向,包括輸入(input)、輸出(output)和雙向(inout)。
input端口1,端口2,端口3,…;output
端口1,端口2,端口3,…;inout端口1,端口2,端口3,…;端口定義、I/O說明和程序語句中的標(biāo)點(diǎn)符號及圓括弧均要求用半角符號書寫!17信號類型聲明與功能描述3、信號類型聲明信號類型聲明用來說明設(shè)計電路的功能描述中,所用的信號的數(shù)據(jù)類型以及函數(shù)聲明。信號的數(shù)據(jù)類型主要有連線(wire)、寄存器(reg)、整型(integer)、實(shí)型(real)和時間(time)等類型。
4、功能描述功能描述是VerilogHDL程序設(shè)計中最主要的部分,用來描述設(shè)計模塊的內(nèi)部結(jié)構(gòu)和模塊端口間的邏輯關(guān)系,在電路上相當(dāng)于器件的內(nèi)部電路結(jié)構(gòu)。功能描述可以用assign語句、元件例化(instantiate)、always塊語句等方法來實(shí)現(xiàn),通常把確定這些設(shè)計模塊描述的方法稱為建模。18邏輯功能定義在Verilog模塊中有3種方法可以描述電路的邏輯功能:用assign語句
assignx=(b&~c);數(shù)據(jù)流描述常用于描述組合邏輯結(jié)構(gòu)描述例化元件名門元件關(guān)鍵字用元件例化(instantiate)
and
myand3(f,a,b,c);注1:元件例化即是調(diào)用VerilogHDL提供的元件或由某子模塊定義的實(shí)例元件;注2:元件例化包括門元件例化和模塊元件例化;注3:例化元件名也可以省略!若不省略,則每個實(shí)例元件的名字必須唯一!以避免與其它調(diào)用該元件的實(shí)例相混淆。19邏輯功能定義(續(xù))用“always”塊語句
always@(posedgeclk)//每當(dāng)時鐘上升沿到來時執(zhí)行一遍塊內(nèi)語句
begin if(load)out=data;//同步預(yù)置數(shù)據(jù)
elseout=data+1+cin;//加1計數(shù)
end行為描述注1:“always”塊語句常用于描述時序邏輯,也可描述組合邏輯。注2:“always”塊可用多種手段來表達(dá)邏輯關(guān)系,如用if-else語句或case語句。注3:“always”塊語句與assign語句是并發(fā)執(zhí)行的,assign語句一定要放在“always”塊語句之外!20VerilogHDL程序的三種描述方式
21三、VerilogHDL模塊的模板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)用
end22VerilogHDL模塊的模板(續(xù))//(3)元件例化
<module_name
><instance_name
>(<port_list>);//模塊元件例化
<gate_type_keyword><instance_name
>(<port_list>);//門元件例化endmodule例化元件名也可以省略!23
2.5.2VerilogHDL的詞法一、空白符和注釋VerilogHDL的空白符包括空格、Tab、換行和換頁符號。空白符如果不是出現(xiàn)在字符串中,編譯源程序時將被忽略。注釋用來幫助讀者理解程序,編譯源程序時將被忽略。注釋分為行注釋和塊注釋兩種方式。行注釋用符號//(兩個斜杠)開始,注釋到本行結(jié)束。塊注釋用/*開始,用*/結(jié)束。塊注釋可以跨越多行,但它們不能嵌套。VerilogHDL源程序由空白符分隔的詞法符號流組成。詞法符號包括空白符、注釋、操作符(運(yùn)算符)、常數(shù)、字符串、標(biāo)識符及關(guān)鍵字。24二、常數(shù)整數(shù)的3種表達(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常數(shù)包括整數(shù)、x(未知)和z(高阻)值、負(fù)數(shù)、實(shí)數(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ù)的寬度。整數(shù)型常量是可以綜合的,而實(shí)數(shù)型和字符串型常量都是不可綜合的建議最好寫明位寬和進(jìn)制——清楚,不易出錯!25x和z值x和z值x表示不定值,z表示高阻值;x和z代表的二進(jìn)制位數(shù)取決于所用的進(jìn)制“?”是z的另一種表示符號,建議在case語句中使用?表示高阻態(tài)z【例2.17】casez(select)4’b???1:out=a;4’b??1?:out=b;4’b?1??:out=c;4’b1???:out=d;endcase負(fù)數(shù)在位寬前加一個負(fù)號,即表示負(fù)數(shù),負(fù)數(shù)通常表示為該負(fù)數(shù)的二進(jìn)制補(bǔ)碼如:-8’d5//-5的補(bǔ)碼,=8‘b1111101126實(shí)數(shù)(Real)實(shí)數(shù)的兩種表示法十進(jìn)制表示法2.0,5.678,0.1 //合法2. //非法,小數(shù)點(diǎn)兩側(cè)都必須有數(shù)字科學(xué)計數(shù)法43_5.1e2
//等于435.1102=435105E-4 //等于510-4=0.0005,
e與E相同實(shí)數(shù)通過四舍五入被轉(zhuǎn)換為最相近的整數(shù)【例】42.446,42.45 //若轉(zhuǎn)換為整數(shù)都是4292.5,92.699 //若轉(zhuǎn)換為整數(shù)都是93-15.62,-25.26//若轉(zhuǎn)換為整數(shù)分別為-16,-25下劃線“_”可隨意用在整數(shù)或?qū)崝?shù)的數(shù)字中間,以提高可讀性;但數(shù)字的第1個字符不能是下劃線,也不能用在位寬和進(jìn)制處。27三、字符串字符串是用雙引號括起來的可打印字符序列,不能多行書寫。作用:在仿真時顯示一些相關(guān)信息,或者指定顯示的格式例:”INTERNALERROR”,”thisisanexampleforVerilogHDL”字符串能夠用在系統(tǒng)任務(wù)(如$display、$monitor)中作為變量,字符串的值可像數(shù)值一樣存儲在寄存器中,也可以像對數(shù)字一樣對字符串進(jìn)行賦值、比較和拼接操作【例】$display($time,,,”a=%hb=%hc=%h”,a,b,c);//顯示當(dāng)前仿真時間,空3格后顯示a=xxb=xxc=xx字符串屬于reg型變量,寬度為字符串中字符的個數(shù)乘以8。【例】reg[8*12:1]stringvar;initialbeginstringvar=“Helloworld!”;end28四、標(biāo)識符
任何用VerilogHDL語言描述的對象都通過其名字來識別,這個名字被稱為標(biāo)識符。標(biāo)識符可由字母、數(shù)字、下劃線和$符號構(gòu)成。如源文件名、模塊名、端口名、變量名、常量名、實(shí)例名等。定義標(biāo)識符時應(yīng)遵循如下規(guī)則①首字符必須是字母或下劃線,不能是數(shù)字或$符號?、谧址麛?shù)不能多于1024個。③大小寫字母是不同的。④不要與關(guān)鍵字同名!
不合法的名字:123a$datamodule7seg.vout* //不允許包含字符*合法的名字:A_99_ZReset_54MHz_Clock$Module
29五、關(guān)鍵字關(guān)鍵字(保留字)——VerilogHDL事先定義好的確認(rèn)符,用來組織語言結(jié)構(gòu);或者用于定義VerilogHDL提供的門元件(如and,not,or,buf)。每個關(guān)鍵字全部用小寫字母定義!
——如always,assign,begin,case,casex,else,end,endmodule,for,function,if,input,module,output,repeat,table,time,while,wireVerilog-1995的關(guān)鍵字有97個(見教材表2.14),Verilog-2001增加了5個共102個。
用戶程序中的模塊、變量、節(jié)點(diǎn)等的名稱不能與關(guān)鍵字同名!30六、運(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ù)的個數(shù)分為3類:單目運(yùn)算符——帶一個操作數(shù)邏輯非!,按位取反~,縮減運(yùn)算符,移位運(yùn)算符雙目運(yùn)算符——帶兩個操作數(shù)算術(shù)、關(guān)系、等值運(yùn)算符,邏輯運(yùn)算符(除邏輯非外)、位運(yùn)算符(除按位取反外)三目運(yùn)算符——帶三個操作數(shù)條件運(yùn)算符運(yùn)算符也稱為操作符,是VerilogHDL預(yù)定義的函數(shù)符號,這些函數(shù)對被操作的對象(即操作數(shù))進(jìn)行規(guī)定的運(yùn)算,得到一個結(jié)果。311、算術(shù)運(yùn)算符雙目運(yùn)算符算術(shù)運(yùn)算符功能+-*/%加減乘除求模進(jìn)行整數(shù)除法運(yùn)算時,結(jié)果值略去小數(shù)部分,只取整數(shù)部分!求模即是求一個數(shù)被另一個數(shù)相除后所得的余數(shù)。%稱為求模(或求余)運(yùn)算符,要求%兩側(cè)均為整型數(shù)據(jù);求模運(yùn)算結(jié)果值的符號位取第一個操作數(shù)的符號位!
【例】
-11%3
結(jié)果為-2進(jìn)行算術(shù)運(yùn)算時,若某操作數(shù)為不定值x,則整個結(jié)果也為x。 322、邏輯運(yùn)算符邏輯運(yùn)算符把它的操作數(shù)當(dāng)作布爾變量(邏輯1、邏輯0或不定值):非零的操作數(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)算符功能
&&(雙目)||(雙目)!(單目)邏輯與邏輯或邏輯非如果操作數(shù)不止一位,應(yīng)將操作數(shù)作為一個整體來對待!進(jìn)行邏輯運(yùn)算后的結(jié)果為布爾值(為1或0或x)!【例】
若A=4’b0000,B=4’b0101
則!A=1’b1,A&&B=1’b0,A||B=1’b1。333、位運(yùn)算符位運(yùn)算符功能~&|^^~,~^按位取反按位與按位或按位異或按位同或雙目運(yùn)算符單目運(yùn)算符位運(yùn)算符中的雙目運(yùn)算符要求對兩個操作數(shù)的相應(yīng)位逐位進(jìn)行邏輯運(yùn)算。位運(yùn)算其結(jié)果與操作數(shù)位數(shù)相同。兩個不同長度的操作數(shù)進(jìn)行位運(yùn)算時,將自動按右端對齊,位數(shù)少的操作數(shù)會在高位用0補(bǔ)齊。
【例】若A=5’b11001,B=3’b101,
則A&B=(5’b11001)&(5’b00101)=5’b00001
344、關(guān)系運(yùn)算符雙目運(yùn)算符用來對兩個操作數(shù)進(jìn)行比較。關(guān)系運(yùn)算符功能<<=>>=
小于小于或等于大于大于或等于括號內(nèi)先運(yùn)算算術(shù)運(yùn)算先運(yùn)算運(yùn)算結(jié)果為1位的邏輯值1或0或x。關(guān)系運(yùn)算時,若聲明的關(guān)系為真,則返回值為1;若關(guān)系為假,則返回值為0;若某操作數(shù)為不定值x,則返回值為x,表示結(jié)果是模糊的。所有的關(guān)系運(yùn)算符優(yōu)先級別相同。關(guān)系運(yùn)算符的優(yōu)先級低于算術(shù)運(yùn)算符?!纠?/p>
a<size-1 等同于:a<(size-1)size-(1<a)
不等同于:
size-1<a也是非阻塞賦值運(yùn)算的賦值符號355、等值運(yùn)算符雙目運(yùn)算符等值運(yùn)算符功能==!====!==等于不等于全等不全等運(yùn)算結(jié)果為1位的邏輯值1或0或x。所有的等值運(yùn)算符優(yōu)先級別相同。===和!==運(yùn)算符常用于case表達(dá)式的判別,又稱為“case等式運(yùn)算符”。QuartusII不支持!等于運(yùn)算符(==)和全等運(yùn)算符(===)的區(qū)別:使用等于運(yùn)算符時,兩個操作數(shù)必須逐位相等,結(jié)果才為1;若某些位為x或z,則結(jié)果為x。使用全等運(yùn)算符時,若兩個操作數(shù)的相應(yīng)位形式上完全一致(如同是1,或同是0,或同是x,或同是z),則結(jié)果為1;否則為0。366、縮減(縮位)運(yùn)算符單目運(yùn)算符運(yùn)算法則與位運(yùn)算符類似,但運(yùn)算對象只有一個,運(yùn)算過程不同!縮減運(yùn)算符功能&~&|~|^^~,~^與與非或或非異或同或?qū)蝹€操作數(shù)進(jìn)行遞推運(yùn)算,即先將操作數(shù)的最低位與第二位進(jìn)行與、或、與非、或非等運(yùn)算,再將運(yùn)算結(jié)果與第三位進(jìn)行相同的運(yùn)算,依次類推,直至最高位。運(yùn)算結(jié)果縮減為1位二進(jìn)制數(shù)。注意縮減運(yùn)算符和位運(yùn)算符的區(qū)別!
【例
】
reg[3:0]a;b=|a;//等效于b=((a[0]|a[1])|a(2))|a[3]【例2.18】設(shè)A=8’b11010001,則&A=0(在與縮減運(yùn)算中,只有A中的數(shù)字全為1時,結(jié)果才為1);|A=1(在或縮減運(yùn)算中,只有A中的數(shù)字全為0時,結(jié)果才為0)。位運(yùn)算符沒有377、移位運(yùn)算符單目運(yùn)算符常用于移位寄存器的設(shè)計移位運(yùn)算符功能>><<右移左移左移的數(shù)據(jù)會丟失!用法:A>>n或A<<n
將操作數(shù)右移或左移n位,同時用n個0填補(bǔ)移出的空位。注意操作數(shù)的位數(shù)不變!【例】
4’b1001>>3的結(jié)果=4’b0001;4’b1001>>4的結(jié)果=4’b00004’b1001<<1的結(jié)果=4’b0010;4’b1001<<2的結(jié)果=4’b0100;
1<<6=32’b00…01000000將操作數(shù)右移或左移n位,相當(dāng)于將操作數(shù)除以或乘以2n。右移的數(shù)據(jù)會丟失!388、條件運(yùn)算符三目運(yùn)算符常用于數(shù)據(jù)選擇器的設(shè)計in1outMUXin0sel信號=條件?表達(dá)式1:表達(dá)式2;條件運(yùn)算符為?:用法:
【例】數(shù)據(jù)選擇器assignout=sel?in1:in0;當(dāng)條件為真,信號取表達(dá)式1的值;為假,則取表達(dá)式2的值。sel=1時out=in1;sel=0時out=in0399、位拼接運(yùn)算符位拼接運(yùn)算符為{}用于將兩個或多個信號的某些位拼接起來,表示一個整體信號。用法:{信號1的某幾位,信號2的某幾位,……,信號n的某幾位}例如在進(jìn)行全加運(yùn)算時,可將進(jìn)位輸出與算術(shù)和拼接在一起使用?!纠?.19】output[3:0]sum;//算術(shù)和
outputcout;//進(jìn)位輸出
input[3:0]ina,inb;inputcin;assign{cout,sum}=ina+inb+cin;//進(jìn)位與算術(shù)和拼接在一起位拼接可以嵌套使用,或用重復(fù)法簡化書寫【例2.20】{3{a,b[3:0]}}={{a,b[3],b[2],b[1],b[0]},{a,b[3],b[2],b[1],b[0]},{a,b[3],b[2],b[1],b[0]}}40運(yùn)算符的優(yōu)先級類別運(yùn)算符優(yōu)先級邏輯非、按位取反!~高低算術(shù)運(yùn)算符*/%+-移位運(yùn)算符<<>>關(guān)系運(yùn)算符<<=>>=等式運(yùn)算符==!====!==縮減運(yùn)算符&~&^^~|~|邏輯運(yùn)算符&&||條件運(yùn)算符?:為避免錯誤,提高程序的可讀性,建議使用括號來控制運(yùn)算的優(yōu)先級!【例】(a>b)&&(b>c)
(a==b)||(x==y)
(!a)||(a>b)41七、VerilogHDL數(shù)據(jù)對象VerilogHDL數(shù)據(jù)對象是指用來存放各種類型數(shù)據(jù)的容器,包括常量和變量。
(1)常量常量用來存放一個恒定不變的數(shù)據(jù),一般在程序前部定義。用parameter來定義一個標(biāo)識符,代表一個常量,稱為符號常量或parameter常量。parameter常量名1=表達(dá)式,常量名2=表達(dá)式,…,常量名n=表達(dá)式;每個賦值語句的右邊必須為常數(shù)表達(dá)式,即只能包含數(shù)字或先前定義過的符號常量!parameter常量常用來定義延遲時間和變量寬度。當(dāng)程序中有多處地方用到相同的常量時,建議用parameter常量來定義—便于修改,有意義parameter常量是本地的,其定義只在本模塊內(nèi)有效。parameter是常量定義關(guān)鍵字,常量名是用戶定義的標(biāo)識符,表達(dá)式是為常量賦的值?!纠縫arameteraddrwidth=16;42變量(2)變量在程序運(yùn)行過程中,其值可以改變的量,稱為變量。其數(shù)據(jù)類型有19種,常用的有3種:網(wǎng)絡(luò)型(netstype)寄存器型(registertype)數(shù)組(memorytype)其它數(shù)據(jù)類型:large型、medium型、scalared型、small型、time型、tri型、tri0型、tri1型、triand型、trior型、trireg型、vectored型、wand型、wor型等43nets型變量1.nets型變量網(wǎng)絡(luò)型變量(nets型變量)是輸出值始終隨輸入的變化而變化的變量。一般用來定義電路中的各種物理連線。有兩種驅(qū)動方式:在結(jié)構(gòu)描述中將其連接到一個門元件或模塊的輸出端;或用assign語句對其賦值常用的nets型變量wire,tri:連線類型(兩者功能一致),可綜合wor,trior:具有線或特性的連線(兩者功能一致)wand,triand:具有線與特性的連線(兩者功能一致)tri1,tri0:上拉電阻和下拉電阻supply1,supply0:電源(邏輯1)和地(邏輯0),可綜合
nets型變量不能儲存值!44wire型變量wire型變量最常用的nets型變量,常用來表示以assign語句賦值的組合邏輯信號。模塊中的輸入/輸出信號類型缺省為wire型——當(dāng)對輸入/輸出信號不加以信號類型聲明時,則輸入/輸出信號為wire型??捎米鋈魏畏匠淌降妮斎?,或“assign”語句和實(shí)例元件的輸出。wire
變量名1,變量名2,…,變量名n;格式【例】
將輸入a賦值給wire型變量b
inputa;
wireb;/*中間節(jié)點(diǎn)。若為output信號,則默認(rèn)為wire型變量,不必單獨(dú)聲明*/assignb=a;//當(dāng)a變化時,b立即隨之變化45wire型向量(總線)wire[n-1:0]變量名1,變量名2,…,變量名m;或wire[n:1]變量名1,變量名2,…,變量名m;每條總線位寬為n共有m條總線格式【例】wire型向量
wire[7:0]in,out;assignout=in;//將等號右邊的值賦給等號左邊的變量。位寬為1位的變量稱為標(biāo)量,位寬超過1位的變量稱為向量。向量的寬度定義:[MSB:LSB]/*MSB(MostSignificantBit,最高有效位),LSB(LeastSignificantBit,最低有效位)
*/46register型變量寄存器型變量(register型變量)對應(yīng)具有狀態(tài)保持作用的電路元件(如觸發(fā)器、寄存器等),常用來表示過程塊語句(如initial,always,task,function)內(nèi)的指定信號。常用的register型變量reg:常代表觸發(fā)器、寄存器,可綜合integer:32位帶符號整數(shù)型變量,可綜合real:64位帶符號實(shí)數(shù)型變量,表示實(shí)數(shù)寄存器,用于仿真time:無符號時間變量,用于對仿真時間的存儲與處理純數(shù)學(xué)的抽象描述2.register型變量47register型變量與nets型變量的區(qū)別register型變量需要被明確地賦值,并且在被重新賦值前一直保持原值。register型變量必須通過過程賦值語句賦值!不能通過assign語句賦值!nets型變量必須通過assign語句賦值!不能通過過程賦值語句賦值!在always、initial、task、function等過程塊內(nèi)被賦值的每個信號必須定義成register型!48reg型變量reg型變量reg型變量是數(shù)字系統(tǒng)中存儲設(shè)備的抽象,常用于具體的硬件描述,是最常用的寄存器型變量。
它是在過程塊中被賦值的信號,往往代表觸發(fā)器(沿觸發(fā)時),但不一定就是觸發(fā)器(也可以是組合邏輯信號,電平觸發(fā)時)!reg變量名1,變量名2,……,變量名n;reg[n-1:0]變量名1,變量名2,…,變量名m;或reg[n:1]變量名1,變量名2,…,變量名m;【例】
reg[4:1]regc,regd;//regc,regd為4位寬的reg型向量reg[0:7]data;//8位寄存器型變量,最高有效位是0,最低有效位是7向量定義后可以采用多種使用形式(即賦值)data=8’b00000000;data[5:3]=3’B111;data[7]=1;
reg型向量(總線)格式reg型變量生成觸發(fā)器和組合邏輯舉例【例2.21】在時鐘沿觸發(fā)的always塊中,用reg型變量生成觸發(fā)器
modulerw1(clk,d,out1);
inputclk,d;
outputout1;
regout1;
always@(posedgeclk)//沿觸發(fā)
out1<=d;
endmodule
dclkout1DQDFF【例2.22】使用電平觸發(fā),用reg型變量生成組合邏輯
modulerw2(clk,d,out1);
inputclk,d;
outputout1;
regout1;
always@(d)//電平觸發(fā)
out1<=d;endmodule
dout1BUFF49返回50memory型變量存儲器型變量(memory型變量)是由若干個相同寬度的reg型向量構(gòu)成的數(shù)組。VerilogHDL通過reg型變量建立數(shù)組來對存儲器建模。定義存儲器,需定義存儲器的容量(存儲器中存儲單元的數(shù)量)和字長(每個存儲單元的數(shù)據(jù)寬度)memory型變量可描述RAM、ROM和reg文件。memory型變量通過擴(kuò)展reg型變量的地址范圍來生成:reg[n-1:0]
存儲器名[m-1:0];或reg[n-1:0]存儲器名[m:1];每個存儲單元位寬為n共有m個存儲單元3.memory型變量——數(shù)組QuartusII不支持!【例】
reg[7:0]
mema[m-1:0]
;//容量為m、字長為8位的存儲器實(shí)際設(shè)計中,我們是直接調(diào)用QuartusII提供的參數(shù)化的ROM、RAM來建立存儲器的!512.5.3VerilogHDL常用語句一、結(jié)構(gòu)聲明語句二、賦值語句三、條件語句四、循環(huán)語句五、語句的順序執(zhí)行與并行執(zhí)行語句是構(gòu)成VerilogHDL程序不可缺少的部分。VerilogHDL的語句包括賦值語句、條件語句、循環(huán)語句、結(jié)構(gòu)聲明語句和編譯預(yù)處理語句(本課程不學(xué)習(xí))等類型,每一類語句又包括幾種不同的語句。有些語句屬于順序執(zhí)行語句,有些語句屬于并行執(zhí)行語句。52VerilogHDL常用語句賦值語句門基元賦值語句連續(xù)賦值語句過程賦值語句塊語句begin_end語句fork_join語句QuartusII不支持條件語句if_else語句case語句循環(huán)語句forever語句repeat語句while語句for語句結(jié)構(gòu)聲明語句initial語句QuartusII不支持always語句task語句function語句編譯預(yù)處理語句‘define語句‘include語句QuartusII不支持‘timescale語句QuartusII不支持53一、結(jié)構(gòu)聲明語句具有某種獨(dú)立功能的電路,均在過程塊中描述,VerilogHDL的任何過程模塊都是放在結(jié)構(gòu)聲明語句中,結(jié)構(gòu)聲明語句分為4種:initial語句——沿時間軸只執(zhí)行一次always語句——不斷重復(fù)執(zhí)行,直到仿真結(jié)束task語句——可在程序模塊中的一處或多處調(diào)用function語句——可在程序模塊中的一處或多處調(diào)用1、always塊語句包含一個或一個以上的聲明語句(如:過程賦值語句、任務(wù)調(diào)用、條件語句和循環(huán)語句等),在仿真運(yùn)行的全過程中,在定時控制下被反復(fù)執(zhí)行。通常帶觸發(fā)條件;在always塊中被賦值的只能是register型變量。每個always塊在仿真一開始便開始執(zhí)行,當(dāng)執(zhí)行完塊中最后一個語句,繼續(xù)從always塊的開頭執(zhí)行。規(guī)則54always塊語句always
@(敏感信號表達(dá)式)begin//過程賦值語句;//if語句,case語句;//for語句,while語句,repeat語句;//tast語句、function語句;end格式一個變量不能在多個always塊中被賦值!錯誤的寫法:always@(posedgeclk)q=q+1;always@(negedgereset)q=0;
正確的寫法:always@(posedgeclkornegedgereset)beginif(!reset)q=0;//異步清零elseq=q+1;end55敏感信號表達(dá)式敏感信號表達(dá)式又稱事件表達(dá)式(event-expression),應(yīng)該列出影響塊內(nèi)取值的所有信號(一般指設(shè)計電路的輸入信號),多個信號之間用“or”連接。敏感信號分兩種類型:邊沿敏感型、電平敏感型,每一個always過程最好由一種敏感信號來觸發(fā)!always的時間控制可以為沿觸發(fā)(輸入信號上升沿或下降沿到來時執(zhí)行always塊中語句,常用于描述時序邏輯),也可為電平觸發(fā)(輸入信號發(fā)生電平變化時執(zhí)行always塊中語句,常用于描述組合邏輯)?!纠侩娖接|發(fā):always@(aorborc)d<=a&&b&&c;【例】沿觸發(fā):敏感信號表達(dá)式中用“posedge”和“negedge”這兩個關(guān)鍵字來聲明事件是由信號的上升沿或下降沿觸發(fā)。always@(posedgeclk)//事件由clk的上升沿觸發(fā);always@(negedgeclk)//事件由clk的下降沿觸發(fā)。電平觸發(fā)舉例56always語句舉例(1/2)
【例2.23】生成一個0延遲的無限循環(huán)跳變過程——形成仿真死鎖!
alwaysareg=~areg;正確的寫法:always@(posedgeclk)areg=~areg;注:always語句必須與一定的時序控制結(jié)合在一起才有用!如果沒有時序控制,則易形成仿真死鎖!modulehalf_clk_top;parameterhalf_period=10;regreset,clk;//輸入信號
wireclk_out;//輸出信號
always#half_periodclk=~clk;……endmodule 生成時鐘信號的第1種方法【例2.24】在測試文件中,用于生成一個無限延續(xù)的信號波形——時鐘信號。57always語句舉例(2/2)【例2.25】用always塊語句產(chǎn)生T’FF和8位二進(jìn)制計數(shù)器。58always塊語句使用注意事項(xiàng)當(dāng)always塊有多個敏感信號時,一定要采用if-elseif語句,而不能采用并列的if語句!否則易造成一個寄存器有多個時鐘驅(qū)動,將出現(xiàn)編譯錯誤?!纠磕?0的BCD碼加法計數(shù)器(異步)always@(posedgeclkorposedgeresetorposedgeload)
beginif(reset)qout=8’h00;//異步清零elseif(load) qout=data;//異步置數(shù)elsebeginif(cin)
//若cin=1,執(zhí)行加1計數(shù);否則qout保持不變……
end
千萬別寫成if哦!注意always塊語句中被賦值的變量一定要事先聲明為reg型變量!若為輸出信號,可以在一行中聲明:outputreg[7:0]qout;592、initial語句initial語句是面向模擬仿真的過程語句,通常不能被邏輯綜合工具支持。initial塊內(nèi)的語句僅執(zhí)行一次。initial
begin
語句1;語句2;
……
語句n;
endQuartusⅡ不支持!格式
【例2.26】對各變量進(jìn)行初始化。在仿真的初始狀態(tài)對各變量進(jìn)行初始化;在測試文件中生成激勵波形(如時鐘信號)作為電路的仿真信號。parametersize=16;reg[3:0]addr;regreg1;reg[7:0]memory[0:15];initialbeginreg1=0;for(addr=0;addr<size;addr=addr+1);memory[addr]=0;end用途不可綜合!常用在測試文件中60initial語句舉例【例2.27】利用initial語句生成激勵波形。
initialbegin:Clocking //生成時鐘信號
clk=0;forever#10clk=!clk;endinitialbegin//生成inputs信號
inputs=’b000000;#10inputs=’b011001;#10inputs=’b011011;#10inputs=’b011000;#10inputs=’b001000;end生成時鐘信號的第2種方法613、task語句task語句用來由用戶定義任務(wù),任務(wù)類似高級語言中的子程序,用來單獨(dú)完成某項(xiàng)具體任務(wù),并可以被模塊或其他任務(wù)調(diào)用。當(dāng)希望能夠?qū)Χ鄠€信號進(jìn)行一些運(yùn)算并輸出多個結(jié)果(即有多個輸出變量)時,宜采用任務(wù)結(jié)構(gòu)。常常利用任務(wù)來幫助實(shí)現(xiàn)結(jié)構(gòu)化的模塊設(shè)計,將批量的操作以任務(wù)的形式獨(dú)立出來,使設(shè)計簡單明了,而且便于調(diào)試。task<任務(wù)名>;端口聲明語句;數(shù)據(jù)類型聲明語句;實(shí)現(xiàn)邏輯功能的語句;endtask<任務(wù)名>
(端口1,端口2,……);
任務(wù)定義任務(wù)調(diào)用注意無端口列表!端口名列表與任務(wù)定義中的I/O變量一一對應(yīng)!62task語句使用注意事項(xiàng)【例】任務(wù)的定義與調(diào)用。taskmy_task;inputa,b;inoutc;outputd,e;……<語句>//執(zhí)行任務(wù)工作相應(yīng)的語句
……c=foo1;d=foo2;//對任務(wù)的輸出變量賦值
e=foo3;
endtaskmy_task(v,w,x,y,z);
任務(wù)定義任務(wù)調(diào)用
當(dāng)任務(wù)啟動時,由v、w和x傳入的變量賦給了a、b和c;當(dāng)任務(wù)完成后,輸出通過c、d和e賦給了x、y和z。注1:任務(wù)的定義與調(diào)用必須在一個module模塊內(nèi)!注2:任務(wù)被調(diào)用時,需列出端口名列表,端口名的排序與類型必須與任務(wù)定義中的I/O變量相一致!注3:一個任務(wù)可以調(diào)用其他任務(wù)和函數(shù)。63task語句舉例【例2.28】通過任務(wù)調(diào)用完成4個4位二進(jìn)制輸入數(shù)據(jù)的冒泡排序。
644個4位二進(jìn)制輸入數(shù)據(jù)的冒泡排序源程序任務(wù)的定義任務(wù)的調(diào)用65sort4.v的測試文件$random為系統(tǒng)任務(wù),返回一個32位的帶符號的隨機(jī)數(shù);一般用法為:$random%b
其中b>0,它給出了一個范圍在-b+1~b-1之間的隨機(jī)數(shù)。{$random}%15通過位拼接操作,產(chǎn)生一個0~14之間的隨機(jī)數(shù)。調(diào)用源程序66sort4.v的仿真波形task_Top.wlf按從小到大的順序排序674、function語句function語句用來定義函數(shù),函數(shù)的目的是通過返回一個用于某表達(dá)式的值,來響應(yīng)輸入信號。適于對不同變量采取同一運(yùn)算的操作。函數(shù)在模塊內(nèi)部定義,通常在本模塊中調(diào)用,也能根據(jù)按模塊層次分級命名的函數(shù)名從其他模塊調(diào)用。而任務(wù)只能在同一模塊內(nèi)定義與調(diào)用!function<返回值位寬或類型說明>函數(shù)名;端口聲明;局部變量定義;其他語句;endfunction缺省則返回1位reg型數(shù)據(jù)函數(shù)定義<函數(shù)名>
(<表達(dá)式1>,<表達(dá)式2>,……
)與函數(shù)定義中的輸入變量對應(yīng)!函數(shù)調(diào)用可以綜合!只能是input68function語句舉例函數(shù)的調(diào)用是通過將函數(shù)作為調(diào)用函數(shù)的表達(dá)式中的操作數(shù)來實(shí)現(xiàn)的!函數(shù)在綜合時被理解成具有獨(dú)立運(yùn)算功能的電路,每調(diào)用一次函數(shù),相當(dāng)于改變此電路的輸入,以得到相應(yīng)的計算結(jié)果?!纠?.29】
利用函數(shù)對一個8位二進(jìn)制數(shù)中為0的位進(jìn)行計數(shù)。function[3:0]get0;//函數(shù)的定義,計算x中0的個數(shù)
input[7:0]x;reg[3:0]count;integeri;begincount=0;for(i=0;i<=7;i=i+1)//循環(huán)核對x中的每一位if(x[i]=1’b0)count=count+1;
get0=count;//將運(yùn)算結(jié)果賦給與函數(shù)同名的內(nèi)部寄存器
endfunctionassignnumber=get0(rega);//對函數(shù)的調(diào)用內(nèi)部寄存器只有輸入變量對應(yīng)函數(shù)的輸入變量69函數(shù)的使用規(guī)則函數(shù)的定義不能包含任何時間控制語句——用延遲#、事件控制@或等待wait標(biāo)識的語句。函數(shù)不能啟動(即調(diào)用)任務(wù)!定義函數(shù)時至少要有一個輸入?yún)⒘?!且不能有任何輸出或輸?輸出雙向變量。在函數(shù)的定義中必須有一條賦值語句,給函數(shù)中的一個內(nèi)部寄存器賦以函數(shù)的結(jié)果值,該內(nèi)部寄存器與函數(shù)同名。函數(shù)的使用規(guī)則70任務(wù)與函數(shù)的區(qū)別任務(wù)(task)函數(shù)(function)目的或用途可計算多個結(jié)果值對輸入信號進(jìn)行運(yùn)算,每調(diào)用一次函數(shù)返回一個結(jié)果值。輸入與輸出變量可為各種類型(包括inout型)至少有一個輸入變量,但不能有任何output或inout型變量被調(diào)用只可在過程賦值語句中調(diào)用,不能在連續(xù)賦值語句中調(diào)用可作為表達(dá)式中的一個操作數(shù)來調(diào)用,在過程賦值和連續(xù)賦值語句中均可調(diào)用調(diào)用其他任務(wù)和函數(shù)任務(wù)可調(diào)用其他任務(wù)和函數(shù)函數(shù)可調(diào)用其他函數(shù),但不可調(diào)用其他任務(wù)返回值不向表達(dá)式返回值向調(diào)用它的表達(dá)式返回一個值71二、賦值語句賦值語句分為3類:
1、門基元賦值語句(門元件例化)基本邏輯門關(guān)鍵字(門輸出,門輸入1,門輸入2,…,門輸入n);基本邏輯門關(guān)鍵字是VerilogHDL預(yù)定義的邏輯門,包括and、or、not、xor、nand、nor等;圓括弧中內(nèi)容是被描述門的輸出和輸入信號。例如,具有a、b、c、d這4個輸入和y為輸出的與非門的門基元賦值語句為nand(y,a,b,c,d);該語句與assigny=!(a&&b&&c&&d);等效722、連續(xù)賦值語句(assign語句)用于對wire型變量賦值,是描述組合邏輯最常用的方法之一。【例】
4輸入與非門
assigny=!(a&&b&&c&&d);連續(xù)賦值語句的“=”號兩邊的變量都應(yīng)該是wire型變量。在執(zhí)行中,輸出y的變化跟隨輸入a、b、c、d的變化而變化,反映了信息傳送的連續(xù)性。assign
賦值變量=表達(dá)式;【例】2選1多路選擇器modulemux2_1(out,a,b,sel);inputa,b,sel;outputout;//輸入、輸出信號默認(rèn)為wire型變量
assignout=(sel==0)?a:b;//若sel為0,則out=a;否則out=bendmodule733、過程賦值語句3、過程賦值語句
用于對reg型變量賦值,過程賦值語句出現(xiàn)在initial和always塊語句中,有兩種賦值方式:阻塞(blocking)賦值方式:
賦值符號為=,如b=a;
賦值變量=表達(dá)式;非阻塞(non-blocking)賦值方式:
賦值符號為<=,如b<=a;
賦值變量<=表達(dá)式;74非阻塞賦值與阻塞賦值的區(qū)別(1)非阻塞賦值方式
always@(posedgeclk)
begin
b<=a;
c<=b;
endclkDFFcDQDQabDFF非阻塞賦值在塊結(jié)束時才完成賦值操作!c的值比b的值落后一個時鐘周期!若塊內(nèi)有多條賦值語句,則在塊結(jié)束時同時賦值。多條非阻塞賦值語句并行執(zhí)行!75非阻塞賦值與阻塞賦值的區(qū)別(續(xù))(2)阻塞賦值方式
always@(posedgeclk)
begin
b=a;
c=b;
end阻塞賦值在該語句結(jié)束時就完成賦值操作!clkDFFcDQabc的值與b的值一樣!在一個塊語句中,如果有多條阻塞賦值語句,在前面的賦值語句沒有完成之前,后面的語句就不能被執(zhí)行,就像被阻塞了一樣,因此稱為阻塞賦值方式。多條阻塞賦值語句順序執(zhí)行!76非阻塞賦值與阻塞賦值方式的主要區(qū)別非阻塞(non-blocking)賦值方式(b<=a)b的值被賦成新值a的操作,并不是立刻完成的,而是在塊結(jié)束時才完成;塊內(nèi)的多條賦值語句在塊結(jié)束時同時賦值;多條非阻塞賦值語句并行執(zhí)行;硬件有對應(yīng)的電路。阻塞(blocking)賦值方式(b=a)b的值立刻被賦成新值a;完成該賦值語句后才能執(zhí)行下一句的操作;多條阻塞賦值語句順序執(zhí)行;硬件沒有對應(yīng)的電路,因而綜合結(jié)果未知。建議在初學(xué)時只使用一種方式,不要混用!建議在可綜合風(fēng)格的模塊中使用非阻塞賦值!77三、條件語句對于每個判定只有兩個分支條件語句分為兩種:if-else語句和case語句;它們都是順序語句,應(yīng)放在“always”塊內(nèi)!1、if-else語句判定所給條件是否滿足,根據(jù)判定的結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。if-else語句有3種形式,格式與C語言中的if-else語句類似其中“表達(dá)式”為邏輯表達(dá)式或關(guān)系表達(dá)式,或一位的變量。若表達(dá)式的值為0、或x、或z,則判定的結(jié)果為“假”;若為1,則結(jié)果為“真”。執(zhí)行的語句可為單句,也可為多句;多句時一定要用“begin_end”語句括起來,形成一個復(fù)合塊語句。78if-else語句的表示方式允許一定形式的表達(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á)式3)語句3;
…else
語句n;方式1(非完整性IF語句):方式2(二重選擇的IF語句):方式3(多重選擇的IF語句):適于對不同的條件,執(zhí)行不同的語句else子句不能作為語句單獨(dú)使用,它是if語句的一部分,必須與if配對使用!79if-else語句舉例【例2.30】模為60的BCD碼加法計數(shù)器(同步)count60.valways塊語句和assign語句是并行執(zhí)行的!在always塊內(nèi)的語句是順序執(zhí)行的!復(fù)位信號的優(yōu)先級最高!80count60.v的仿真波形cin為來自下一級計數(shù)器的進(jìn)位置數(shù)進(jìn)位輸出當(dāng)cin=1則加1計數(shù)81if-else語句使用注意事項(xiàng)注意:if(reset)elseif(load)elseif(cin)
不要寫成3個并列的if語句:
if(reset)if(load)if(cin)因?yàn)檫@樣寫則是同時對3個信號reset、load和cin進(jìn)行判斷,現(xiàn)實(shí)中很可能出現(xiàn)三者同時為“1”的情況,即3個條件同時滿足,則應(yīng)該同時執(zhí)行它們對應(yīng)的執(zhí)行語句,但3條執(zhí)行語句是對同一個信號qout賦不同的值,顯然相互矛盾。故編譯時會報錯!822、case語句多分支選擇語句當(dāng)敏感表達(dá)式取不同的值時,執(zhí)行不同的語句。功能:當(dāng)某個或某組(控制)信號取不同的值時,給另一個(輸出)信號賦不同的值。常用于多條件譯碼電路(如譯碼器、數(shù)據(jù)選擇器、狀態(tài)機(jī)、微處理器的指令譯碼)!適于對同一組控制信號取不同的值時,輸出取不同的值!case語句的3種形式casecasezcasexcase語句與if-else語句有什么區(qū)別呢?
83case語句的語法格式case(敏感表達(dá)式)值1:語句1;值2:語句2;
…
值n:語句n;
default:
語句n+1;endcase說明:其中“敏感表達(dá)式”又稱為“控制表達(dá)式”,通常表示為控制信號的某些位。當(dāng)有多個信號時,可用位拼接符將它們連接起來:【例】
case({D3,D2,D1,D0})值1~值n稱為分支表達(dá)式,用控制信號的具體狀態(tài)值表示,因此又稱為常量表達(dá)式。default項(xiàng)可有可無,一個case語句里只能有一個default項(xiàng)!值1~值n必須互不相同,否則矛盾。值1~值n的位寬必須相等,且與控制表達(dá)式的位寬相同。84casez與casex語句(2)casez與casex語句是case語句的兩種變體在case語句中,分支表達(dá)式每一位的值都是確定的(或者為0,或者為1);在casez語句中,若分支表達(dá)式某些位的值為高阻值z,則不考慮對這些位的比較,只關(guān)注其他位的比較結(jié)果;在casex語句中,若分支表達(dá)式某些位的值為z或不定值x,則不考慮對這些位的比較,只關(guān)注其他位的比較結(jié)果。在分支表達(dá)式中,可用“?”來標(biāo)識x或z。
85casez語句舉例modulemux_z(out,a,b,c,d,select);outputout;inputa,b,c,d;input[3:0]select;regout;//必須聲明
always@(select[3:0]oraorborcord)begin
casez(select)4’b???1:out=a;
4’b??1?:out=b;
4’b?1??:out=c;
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東理工學(xué)院《法語視聽說ll》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東科技學(xué)院《軟件工程原理》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東行政職業(yè)學(xué)院《食品工程原理(雷諾實(shí)驗(yàn))》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東工程職業(yè)技術(shù)學(xué)院《電視節(jié)目制作技術(shù)與藝術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東第二師范學(xué)院《電子商務(wù)法專題研究》2023-2024學(xué)年第一學(xué)期期末試卷
- 小學(xué)生課件網(wǎng)頁
- 廣安職業(yè)技術(shù)學(xué)院《分子免疫學(xué)一》2023-2024學(xué)年第一學(xué)期期末試卷
- 函數(shù)圖像課件
- 安全直線管理培訓(xùn)課件
- 2022年上海海洋 大學(xué)自考英語(二)練習(xí)題(附答案解析)
- 《工商管理專業(yè)畢業(yè)實(shí)習(xí)》課程教學(xué)大綱
- 乳腺中心建設(shè)方案
- 國開電大本科《西方經(jīng)濟(jì)學(xué)(本)》網(wǎng)上形考(作業(yè)一至六)試題及答案
- 提高有風(fēng)險患者預(yù)防跌倒墜床護(hù)理措施落實(shí)率品管圈PDCA案例匯報
- 安環(huán)部2025年度工作計劃
- 交通運(yùn)輸安全風(fēng)險管控制度
- 北京城市學(xué)院《食品質(zhì)量檢測技術(shù)》2022-2023學(xué)年第一學(xué)期期末試卷
- 西那卡塞治療甲旁亢
- 無人駕駛 物流行業(yè)市場調(diào)研分析報告
- 浙江省寧波市慈溪市2023-2024學(xué)年高二上學(xué)期期末考試 數(shù)學(xué) 含解析
- 代理記賬有限公司簡介(5個范本)
評論
0/150
提交評論