verilog-5操作符教學(xué)講解課件_第1頁
verilog-5操作符教學(xué)講解課件_第2頁
verilog-5操作符教學(xué)講解課件_第3頁
verilog-5操作符教學(xué)講解課件_第4頁
verilog-5操作符教學(xué)講解課件_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

復(fù)習(xí)常數(shù):整數(shù)和實(shí)數(shù)

《位數(shù)》`《基數(shù)》《值》標(biāo)識(shí)符:模塊名、端口名及實(shí)例名必須以英語字母(a-z,A-Z)起頭,或者用下橫線符(_)起頭。其中可以包含數(shù)字、$符和下橫線符。邏輯值:0、1、x和z數(shù)據(jù)類型:Nets

表示器件之間的物理連接,用assign連續(xù)賦值語句,zRegister通過過程賦值語句驅(qū)動(dòng),x標(biāo)量與矢量第五講Verilog運(yùn)算符算術(shù)運(yùn)算符按位運(yùn)算符邏輯運(yùn)算符縮減運(yùn)算符移位運(yùn)算符關(guān)系運(yùn)算符等式運(yùn)算符條件運(yùn)算符運(yùn)算符類型運(yùn)算符優(yōu)先級(jí)注意“與”操作符的優(yōu)先級(jí)總是比相同類型的“或”操作符高。操作符類型符號(hào)連接及復(fù)制操作符一元操作符算術(shù)操作符邏輯移位操作符 關(guān)系操作符相等操作符按位操作符邏輯操作符條件操作符{}{{}}!~/%+-<<>>><>=<======!=!==&^~^|&&||?:最高最低優(yōu)先級(jí)運(yùn)算符的分類單目運(yùn)算符只有一個(gè)操作數(shù),且運(yùn)算符位于操作數(shù)的左邊雙目運(yùn)算符有兩個(gè)操作數(shù),各位于運(yùn)算符的兩邊三目運(yùn)算符屬于這一類的只有條件運(yùn)算符(?:)一個(gè)Verilog中的大小(size)與符號(hào)Verilog根據(jù)表達(dá)式中變量的長度對(duì)表達(dá)式的值自動(dòng)地進(jìn)行調(diào)整。Verilog自動(dòng)截?cái)嗷驍U(kuò)展賦值語句中右邊的值以適應(yīng)左邊變量的長度。當(dāng)一個(gè)負(fù)數(shù)賦值給無符號(hào)變量如reg時(shí),Verilog自動(dòng)完成二進(jìn)制補(bǔ)碼計(jì)算.modulesign_size;reg[3:0]a,b;reg[15:0]c;initialbegina=-1;//a是無符號(hào)數(shù),因此其值為1111b=8;c=8;//b=c=1000#10b=b+a;//結(jié)果10111截?cái)?b=0111#10c=c+a;//c=10111endendmodule說明Reg型數(shù)據(jù)的缺省初始值是不定值,Reg型數(shù)據(jù)可以賦正值,也可以賦負(fù)值。但當(dāng)一個(gè)表達(dá)式中的操作數(shù)是Reg型數(shù)據(jù)時(shí),他的值被當(dāng)作無符號(hào)值,即正值。算術(shù)運(yùn)算符注意:將負(fù)數(shù)賦值給reg或其它無符號(hào)變量使用2的補(bǔ)碼算術(shù)。如果操作數(shù)的某一位是x或z,則結(jié)果為x在整數(shù)除法中,余數(shù)舍棄模運(yùn)算中使用第一個(gè)操作數(shù)的符號(hào)用算術(shù)運(yùn)算符進(jìn)行RTL描述時(shí),最終生成的電路性能與使用的綜合工具有關(guān)。有些工具不支持乘法、除法及求模電路1.算術(shù)操作結(jié)果的長度算術(shù)表達(dá)式結(jié)果的長度由最長的操作數(shù)決定。在賦值語句下,算術(shù)操作結(jié)果的長度由操作符左端目標(biāo)長度決定??紤]如下實(shí)例:reg[0:3]Arc,Bar,Crt;reg[0:5]Frx;...Arc=Bar+Crt;Frx=Bar+Crt;第一個(gè)加的結(jié)果長度Arc長度決定,長度為4位。第二個(gè)加法操作的長度同樣由Frx的長度決定(Frx、Bat和Crt中的最長),長度為6位。在第一個(gè)賦值中,加法操作的溢出部分被丟棄;而在第二個(gè)賦值中,任何溢出的位存儲(chǔ)在結(jié)果位Frx[1]中。在較大的表達(dá)式中,中間結(jié)果的長度如何確定?在VerilogHDL中定義了如下規(guī)則:表達(dá)式中的所有中間結(jié)果應(yīng)取最大操作數(shù)的長度(賦值時(shí),此規(guī)則也包括左端目標(biāo))。實(shí)例:wire[4:1]Box,Drt;wire[1:5]Cfg;wire[1:6]Peg;wire[1:8]Adt;...assignAdt=(Box+Cfg)+(Drt+Peg);表達(dá)式右端的操作數(shù)最長為6,但是將左端包含在內(nèi)時(shí),最大長度為8。所以所有的加操作使用8位進(jìn)行。例如:Box和Cfg相加的結(jié)果長度為8位。2.無符號(hào)數(shù)和有符號(hào)數(shù)執(zhí)行算術(shù)操作和賦值時(shí),注意哪些操作數(shù)為無符號(hào)數(shù)、哪些操作數(shù)為有符號(hào)數(shù)非常重要。無符號(hào)數(shù)存儲(chǔ)在:?線網(wǎng)?一般寄存器?基數(shù)格式表示形式的整數(shù)有符號(hào)數(shù)存儲(chǔ)在:?整數(shù)寄存器?十進(jìn)制形式的整數(shù)下面是一些賦值語句的實(shí)例:reg[0:5]Bar;integerTab;...Bar=-4'd12;//寄存器變量Bar的十進(jìn)制數(shù)為52,向量值為110100。Tab=-4'd12;//整數(shù)Tab的十進(jìn)制數(shù)為-12,位形式為110100。-4‘d12/4//基數(shù)格式的為無符號(hào)數(shù),結(jié)果是-1。-12/4//結(jié)果是-3因?yàn)锽ar是普通寄存器類型變量,只存儲(chǔ)無符號(hào)數(shù)。右端表達(dá)式的值為'b110100(12的二進(jìn)制補(bǔ)碼)。因此在賦值后,Bar存儲(chǔ)十進(jìn)制值52。在第二個(gè)賦值中,右端表達(dá)式相同,值為'b110100,但此時(shí)被賦值為存儲(chǔ)有符號(hào)數(shù)的整數(shù)寄存器。Tab存儲(chǔ)十進(jìn)制值-12(位向量為110100)。注意在兩種情況下,位向量存儲(chǔ)內(nèi)容都相同;但是在第一種情況下,向量被解釋為無符號(hào)數(shù),而在第二種情況下,向量被解釋為有符號(hào)數(shù)。例modulearithops();parameterfive=5;integerans,int;reg[3:0]rega,regb;reg[3:0]num;initialbeginrega=3;regb=4'b1010;int=-3;//int=1111……1111_1101end

注意integer和reg類型在算術(shù)運(yùn)算時(shí)的差別。integer是有符號(hào)數(shù),而reg是無符號(hào)數(shù)。initialfork#10ans=five*int;//ans=-15#20ans=(int+5)/2;//ans=1#30ans=five/int;//ans=-1#40num=rega+regb;//num=1101#50num=rega+1;//num=0100#60num=int;//num=1101#70num=regb%rega;//num=1#80$finish;joinendmodule按位操作符名稱記號(hào)定義說明或例子位運(yùn)算符~按位取反~A=5’b00110&按位與A&B=5’b10001|按位或A|B=5’b11101^按位異或A^B=5’b01100^~,~^按位同或A~^B=5’b10011A=5’b11001;B=5’b10001位運(yùn)算符可直接用來邏輯門硬件建模,但要注意對(duì)于矢量是按照位生成邏輯門的,多用于編碼/解碼器硬件建模modulebitwise();reg[3:0]rega,regb,regc;reg[3:0]num;initialbeginrega=4'b1001;regb=4'b1010;regc=4'b11x0;endinitialfork#1num=~rega;//num=0110#10num=rega&0;//num=0000#20num=rega®b;//num=1000#30num=rega|regb;//num=1011#40num=regb®c;//num=10x0

#50num=regb|regc;//num=1110#60$finish;joinendmodule

按位操作符對(duì)矢量中相對(duì)應(yīng)位運(yùn)算。regb=4'b1010regc=4'b1x10num=regb®c=1010;位值為x時(shí)不一定產(chǎn)生x結(jié)果。如#50時(shí)的or計(jì)算。當(dāng)兩個(gè)操作數(shù)位數(shù)不同時(shí),位數(shù)少的操作數(shù)零擴(kuò)展到相同位數(shù)。a=4'b1011;b=8'b01010011;c=a|b;//a零擴(kuò)展為8'b00001011邏輯運(yùn)算符邏輯運(yùn)算符&&邏輯與A和B的與為A&&B;||邏輯或A和B的或?yàn)锳//B;!邏輯非A的非為!A;a=4`b1001;b=4`b0000a=1;b=0!a!ba||ba&&b0110!a!ba||ba&&b0110這些操作符在邏輯值0或1上操作。邏輯操作的結(jié)構(gòu)果為0或1。對(duì)于向量操作,非0向量作為1處理。多用于優(yōu)先級(jí)電路的硬件建模modulelogical();parameterfive=5;regans;reg[3:0]rega,regb,regc;initialbeginrega=4‘b0011; //邏輯值為“1”regb=4‘b10xz;//邏輯值為“1”regc=4‘b0z0x;//邏輯值為“x”endinitialfork#10ans=rega&&0;//ans=0#20ans=rega||0;//ans=1#30ans=rega&&five;//ans=1#40ans=regb&®a;//ans=1#50ans=regc||0;//ans=x#60$finish;joinendmodule

邏輯運(yùn)算符的結(jié)果為一位1,0或x。邏輯運(yùn)算符只對(duì)邏輯值運(yùn)算。如操作數(shù)為全0,則其邏輯值為false如操作數(shù)有一位為1,則其邏輯值為true若操作數(shù)只包含0、x、z,則邏輯值為x邏輯反操作運(yùn)算符將操作數(shù)的邏輯值取反。例如,若操作數(shù)為全0,則其邏輯值為0,邏輯反操作值為1。邏輯反與位反的對(duì)比modulenegation();reg[3:0]rega,regb;reg[3:0]bit;reglog;initialbeginrega=4'b1011;regb=4'b0000;endinitialfork#10bit=~rega;//num=0100#20bit=~regb;//num=1111#30log=!rega;//num=0#40log=!regb;//num=1#50$finish;joinendmodule!logicalnot邏輯反~bit-wisenot位反

邏輯反的結(jié)果為一位1,0或x。位反的結(jié)果與操作數(shù)的位數(shù)相同邏輯反操作符將操作數(shù)的邏輯值取反。例如,若操作數(shù)為全0,則其邏輯值為0,邏輯反操作值為1??s減運(yùn)算符(歸約運(yùn)算符)歸約運(yùn)算符在單一操作數(shù)的所有位上操作,并產(chǎn)生1位結(jié)果。歸約運(yùn)算符有:?&(歸約與)如果存在位值為0,那么結(jié)果為0;若如果存在位值為x或z,結(jié)果為x;否則結(jié)果為1。?~&(歸約與非)與歸約運(yùn)算符&相反。?|(歸約或)如果存在位值為1,那么結(jié)果為1;如果存在位x或z,結(jié)果為x;否則結(jié)果為0。?~|(歸約或非)與歸約運(yùn)算符|相反。?^(歸約異或)如果存在位值為x或z,那么結(jié)果為x;否則如果操作數(shù)中有偶數(shù)個(gè)1,結(jié)果為0;否則結(jié)果為1。?~^(歸約異或非)與歸約運(yùn)算符^正好相反。名稱記號(hào)定義縮減運(yùn)算符&與~&與非|或~|或非^異或^~,~^同或wirec;

wire[7:0]a;

assignc=~|a;//8bitinputnorassignc=~(a[7]|a[6]|a[5]|a[4]|a[3]|a[2]|a[1]|a[0]);

縮減運(yùn)算是對(duì)單個(gè)操作數(shù)進(jìn)行或與非遞推運(yùn)算,最后的運(yùn)算結(jié)果是一位的二進(jìn)制數(shù)。縮減運(yùn)算的具體運(yùn)算過程:第一步先將操作數(shù)的第一位與第二位進(jìn)行或與非運(yùn)算,第二步將運(yùn)算結(jié)果與第三位進(jìn)行或與非運(yùn)算,依次類推,直至最后一位。縮減運(yùn)算符assignall_one=cnt[3]&cnt[2]&cnt[1]&cnt[0];

assignall_parity=cnt[3]^cnt[2]^cnt[1]^cnt[0];assignall_one=&cnt;assignall_parity=

^cnt;縮減運(yùn)算符例modulereduction();regval;reg[3:0]rega,regb;initialbeginrega=4'b0100;regb=4'b1111;endinitialfork#10val=&

rega;//val=0#20val=|rega;//val=1#30val=®b;//val=1#40val=|regb;//val=1#50val=^rega;//val=1#60val=^regb;//val=0#70val=~|rega;//(nor)val=0#80val=~®a;//(nand)val=1#90val=^rega&&®b;//val=1$finish;joinendmodule注意:縮減運(yùn)算符的操作數(shù)只有一個(gè)。對(duì)操作數(shù)的所有位進(jìn)行位操作。結(jié)果只有一位,可以是0,1,X。wire[7:0]in,out;

wire[2:0]sft;

assignout=in<<sft;低位變零輸出wire[7:0]a,b;

assigna=b>>4;assigna[7:4]=4'b0000;

assigna[3:0]=b[7:4];

移位運(yùn)算符<<(左移位運(yùn)算符)和>>(右移位運(yùn)算符都用0來填補(bǔ)移出的空位。多用于移位寄存器硬件建模,特別對(duì)于位寬不定的移位寄存器建模移位運(yùn)算符moduleshift();reg[9:0]num,num1;reg[7:0]rega,regb;initialrega=8'b00001100;initialfork

#10num<=rega<<5;//num=01_1000_0000#10regb<=rega<<5;//regb=1000_0000#20num<=rega>>3;//num=00_0000_0001#20regb<=rega>>3;//regb=0000_0001#30num<=10'b11_1111_0000;

#40rega<=num<<2;//rega=1100_0000#40num1<=num<<2;//num1=11_1100_0000

#50rega<=num>>2;//rega=1111_1100#50num1<=num>>2;//num1=00_1111_1100#60$finish;joinendmodule>> 邏輯右移<< 邏輯左移在賦值語句中,如果右邊(RHS)的結(jié)果:位寬大于左邊,則把最高位截去位寬小于左邊,則零擴(kuò)展<<將左邊的操作數(shù)左移右邊操作數(shù)指定的位數(shù)>>將左邊的操作數(shù)右移右邊操作數(shù)指定的位數(shù)●第二個(gè)操作數(shù)(移位位數(shù))是無符號(hào)數(shù)●若第二個(gè)操作數(shù)是x或z則結(jié)果為x左移先補(bǔ)后移右移先移后補(bǔ)建議:表達(dá)式左右位數(shù)一致關(guān)系運(yùn)算符modulerelationals();reg[3:0]rega,regb,regc;regval;initialbeginrega=4'b0011;regb=4'b1010;regc=4'b0x10;endinitialfork

#10val=regc>rega;//val=x#20val=regb<rega;//val=0#30val=regb>=rega;//val=1

#40val=regb>regc;//val=1#50$finish;joinendmodule>

大于< 小于>= 大于等于<= 小于等于其結(jié)果是1’b1、1’b0或1’bx。在進(jìn)行關(guān)系運(yùn)算時(shí),如果聲明的關(guān)系是假的(flase),則返回值是0,如果聲明的關(guān)系是真的(true),則返回值是1,如果某個(gè)操作數(shù)的值不定,則關(guān)系是模糊的,返回值是不定值。無論x為何值,regb>regcrega和regc的關(guān)系取決于x可直接對(duì)比較器硬件建模,也可用于生成優(yōu)先級(jí)電路名稱記號(hào)定義用途注釋等式運(yùn)算符==等于電路功能描述等于!=不等于電路功能描述不等于===全等于仿真X,Z也作為比較對(duì)象!===不全等于仿真==01XZ010XX101XXXXXXXZXXXX===01XZ0100010100X0010Z0001等于全等于等式運(yùn)算符===和!==不能綜合;多用于編解碼硬件電路建模等式運(yùn)算符

賦值運(yùn)算符,將等式右邊表達(dá)式的值拷貝到左邊。注意邏輯等與case等的差別=2‘b1x==2’b0x值為0,因?yàn)椴幌嗟?‘b1x==2’b1x值為x,因?yàn)榭赡懿幌嗟?,也可能相?‘b1x===2’b0x值為0,因?yàn)椴幌嗤?‘b1x===2’b1x值為1,因?yàn)橄嗤琣=2'b1x;b=2'b1x;if(a==b)$display("aisequaltob");else$display("aisnotequaltob");a=2'b1x;b=2'b1x;if(a===b)$display("aisidenticaltob");else$display("aisnotidenticaltob");Case等只能用于行為描述,不能用于RTL描述。相等算符逐位比較二個(gè)操作數(shù)相應(yīng)位的值是否相等,只有當(dāng)每一位都相等時(shí),相等關(guān)系才滿足。如果任何一個(gè)操作數(shù)中的某一位存在不定態(tài)或高阻態(tài),則將得到一個(gè)不定態(tài)的結(jié)果。全等算符將不定態(tài)或高阻態(tài)看作是邏輯狀態(tài)的一種而參與比較。相等運(yùn)算符

邏輯等邏輯不等==!=moduleequalities1();reg[3:0]rega,regb,regc;regval;initialbeginrega=4'b0011;regb=4'b1010;regc=4'b1x10;endinitialfork#10val=rega==regb;//val=0#20val=rega!=regc;//val=1#30val=regb!=regc;//val=x#40val=regc==regc;//val=x#50$finish;joinendmodule

其結(jié)果是1’b1、1’b0或1’bx。如果左邊及右邊為確定值并且相等,則結(jié)果為1。如果左邊及右邊為確定值并且不相等,則結(jié)果為0。如果左邊及右邊有值不能確定的位,但值確定的位相等,則結(jié)果為x。!=的結(jié)果與==相反值確定是指所有的位為0或1。不確定值是有值為x或z的位。相等運(yùn)算符相同(case等)不相同(case不等)===!==moduleequalities2();reg[3:0]rega,regb,regc;regval;initialbeginrega=4'b0011;regb=4'b1010;regc=4'b1x10;endinitialfork#10val=rega===regb;//val=0#20val=rega!==regc;//val=1#30val=regb===regc;//val=0#40val=regc===regc;//val=1#50$finish;joinendmodule

其結(jié)果是1’b1、1’b0或1’bx。如果左邊及右邊的值相同(包括x、z),則結(jié)果為1。如果左邊及右邊的值不相同,則結(jié)果為0。!==的結(jié)果與===相反綜合工具不支持條件運(yùn)算符條件?:modulelikebufif(in,en,out);inputin;inputen;outputout;assignout=(en==1)?in:'bz;endmodulemodulelike4to1(a,b,c,d,sel,out);inputa,b,c,d;input[1:0]sel;outputout;assignout=sel==2'b00?a:sel==2'b01?b:sel==2'b10?c:d;endmodule如果條件值為x或z,則結(jié)果可能為x或z多用于多路選擇器硬件建模條件操作符條件操作符的語法為:<LHS>=<condition>?<true_expression>:<false_expression>其意思是:ifconditionisTRUE,thenLHS=true_expression,elseLHS=false_expression每個(gè)條件操作符必須有三個(gè)參數(shù),缺少任何一個(gè)都會(huì)產(chǎn)生錯(cuò)誤。最后一個(gè)操作數(shù)作為缺省值。上式中,若condition為真則register等于true_value;若condition為假則register等于false_value。一個(gè)很有意思的地方是,如果條件值不確定,且true_value和false_value不相等,則輸出不確定值。例如:assignout=(sel==0)?a:b;若sel為0則out=a;若sel為1則out=b。如果sel為x或z,若a=b=0,則out=0;若a≠b,則out值不確定。位拼接運(yùn)算符位拼接運(yùn)算符{}。用這個(gè)運(yùn)算符可以把兩個(gè)或多個(gè)信號(hào)的某些位拼接起來進(jìn)行運(yùn)算操作。其使用方法如下:{信號(hào)1的某幾位,信號(hào)2的某幾位,..,..,信號(hào)n的某幾位}{a,b[3:0],w,3’b101}也可以寫成為{a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}在位拼接表達(dá)式中不允許存在沒有指明位數(shù)的信號(hào)。拼接還可以用重復(fù)法來簡化表達(dá)式。{4{w}}//這等同于{w,w,w,w}位拼接還可以用嵌套的方式來表達(dá)。{b,{3{a,b}}}//這等同于{b,a,b,a,b,a,b}用于表

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論