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