計(jì)算機(jī)系統(tǒng)綜合課程設(shè)計(jì)2-Verilog HDL語(yǔ)言初步_第1頁(yè)
計(jì)算機(jī)系統(tǒng)綜合課程設(shè)計(jì)2-Verilog HDL語(yǔ)言初步_第2頁(yè)
計(jì)算機(jī)系統(tǒng)綜合課程設(shè)計(jì)2-Verilog HDL語(yǔ)言初步_第3頁(yè)
計(jì)算機(jī)系統(tǒng)綜合課程設(shè)計(jì)2-Verilog HDL語(yǔ)言初步_第4頁(yè)
計(jì)算機(jī)系統(tǒng)綜合課程設(shè)計(jì)2-Verilog HDL語(yǔ)言初步_第5頁(yè)
已閱讀5頁(yè),還剩231頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

VerilogHDL語(yǔ)言初步主講楊全勝東南大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院P.1計(jì)算機(jī)系統(tǒng)綜合課程設(shè)計(jì)第一部分VerilogHDL語(yǔ)言

§1綜述一.什么是硬件描述語(yǔ)言?P.2

硬件描述語(yǔ)言是一種用文本形式來(lái)描述和設(shè)計(jì)電路的語(yǔ)言。是硬件設(shè)計(jì)人員和電子設(shè)計(jì)自動(dòng)化(EDA)工具之間的界面。P.3功能:1)編寫設(shè)計(jì)文件;2)建立電子系統(tǒng)行為級(jí)的仿真模型;3)自動(dòng)綜合以生成符合要求且在電路結(jié)構(gòu)上可以實(shí)現(xiàn)的數(shù)字邏輯網(wǎng)表(Netlist);4)寫入到CPLD和FPGA器件中。二.為什么要用HDL?P.41、電路設(shè)計(jì)的規(guī)模越來(lái)越大,復(fù)雜度越來(lái)越高。2、電子領(lǐng)域的競(jìng)爭(zhēng)越來(lái)越激烈,開發(fā)周期要短。3、調(diào)試電路速度快。不必修改電路原理圖原型,只需要對(duì)HDL進(jìn)行修改。4、易于理解,易于維護(hù)。5、有許多易于掌握的仿真、綜合和布局布線工具。三、BottomUp和Topdown的設(shè)計(jì)方法P.51.BottomUp的設(shè)計(jì)方法1.由基本門構(gòu)成各個(gè)組合與時(shí)序邏輯2.由邏輯單元組成各個(gè)獨(dú)立的功能模塊3.由各個(gè)功能模塊連成一個(gè)完整系統(tǒng)4.完成整個(gè)系統(tǒng)測(cè)試與性能分析REGISTERPCRAMALU&1P.6傳統(tǒng)的電路系統(tǒng)設(shè)計(jì)方法的步驟:1.采用自下而上的設(shè)計(jì)方法-從狀態(tài)圖的簡(jiǎn)化,寫出最簡(jiǎn)邏輯表達(dá)式;2.采用通用邏輯元器件-通常采用74系列和CMOS4000系列的產(chǎn)品進(jìn)行設(shè)計(jì);3.在系統(tǒng)硬件設(shè)計(jì)的后期進(jìn)行調(diào)試和仿真;只有在部分或全部硬件電路連接完畢,才可以進(jìn)行電路調(diào)試,一旦考慮不周到,系統(tǒng)設(shè)計(jì)存在較大缺陷,則要重新設(shè)計(jì),使設(shè)計(jì)周期延長(zhǎng)。4.設(shè)計(jì)結(jié)果是一張電路圖;當(dāng)設(shè)計(jì)調(diào)試完畢后,形成電原理圖,該圖包括元器件型號(hào)和信號(hào)之間的互連關(guān)系等等P.7優(yōu)點(diǎn):1.設(shè)計(jì)人員對(duì)于用這種方法進(jìn)行設(shè)計(jì)比較熟悉;2.實(shí)現(xiàn)各個(gè)子塊電路所需的時(shí)間短。缺點(diǎn):1.一般來(lái)講,對(duì)系統(tǒng)的整體功能把握不足;2.實(shí)現(xiàn)整個(gè)系統(tǒng)的功能所需的時(shí)間長(zhǎng),因?yàn)楸仨毾葘⒏鱾€(gè)小模塊完成,使用這種方法對(duì)設(shè)計(jì)人員之間相互進(jìn)行協(xié)作有比較高的要求。P.82.Topdown的設(shè)計(jì)方法4.工藝庫(kù)映射3.各個(gè)功能模塊系統(tǒng)級(jí)聯(lián)合驗(yàn)證2.各個(gè)功能模塊劃分,設(shè)計(jì)和驗(yàn)證1.系統(tǒng)層:頂層模塊,行為級(jí)描述,功能模擬和性能評(píng)估REGISTERPCRAMALU&1CPUTopdown的設(shè)計(jì)方法的特點(diǎn):P.9從系統(tǒng)層開始設(shè)計(jì)和優(yōu)化,保證了設(shè)計(jì)結(jié)果的正確性適合復(fù)雜的、大規(guī)模電路的設(shè)計(jì)縮短設(shè)計(jì)周期依賴于先進(jìn)的EDA設(shè)計(jì)工具和環(huán)境,費(fèi)用昂貴需要精確的工藝庫(kù)支持四.設(shè)計(jì)過(guò)程P.10文本編輯器圖形編輯器生成VerilogHDL源程序邏輯綜合優(yōu)化FPGA/CPLD布線/適配器FPGA/CPLD編程、下載行為仿真功能仿真時(shí)序仿真硬件測(cè)試Verilog仿真器§2VerilogHDL設(shè)計(jì)初步P.11

內(nèi)容簡(jiǎn)介VerilogHDL與C語(yǔ)言的比較Verilog模塊的基本結(jié)構(gòu)邏輯功能的定義一.VerilogHDL與C語(yǔ)言的比較P.12C語(yǔ)言Verilog語(yǔ)言functionmodule,functionif-then-elseif-then-elseforforwhilewhilecasecasebreakbreakdefinedefineprintfprintfintintVerilogHDL是在C語(yǔ)言基礎(chǔ)上發(fā)展起來(lái)的,保留了C語(yǔ)言的結(jié)構(gòu)特點(diǎn)。但C語(yǔ)言的各函數(shù)之間是串行的,而Verilog的各個(gè)模塊間是并行的VerilogHDL與C語(yǔ)言運(yùn)算符的比較P.13C語(yǔ)言Verilog功能C語(yǔ)言Verilog功能++加>=>=大于等于--減<=<=小于等于**乘====等于//除!=!=不等于%%取模~~取反??!邏輯非&&按位與&&&&邏輯與||按位或||||邏輯或^^按位異或>>大于<<<<左移<<小于>>>>右移二.Verilog模塊的基本結(jié)構(gòu)P.14由關(guān)鍵詞module和endmodule定義module模塊名(端口列表)端口定義數(shù)據(jù)類型說(shuō)明邏輯功能定義endmodule模塊聲明結(jié)束行P.151.模塊聲明module——關(guān)鍵詞模塊名——

模塊唯一的標(biāo)識(shí)符端口列表——是由輸入、輸出和雙向端口的端口表達(dá)式按一定的次序組成的一個(gè)列表,它用來(lái)指明模塊所具有的端口,這些端口用來(lái)與其它模塊進(jìn)行連接。P.162.端口定義

又稱“端口聲明語(yǔ)句”,用來(lái)進(jìn)行端口方向的說(shuō)明。Verilog語(yǔ)言中有如下三種端口聲明語(yǔ)句:1)input——對(duì)應(yīng)的端口是輸入端口2)output——對(duì)應(yīng)的端口是輸出端口3)inout——對(duì)應(yīng)的端口是雙向端口moduleinputoutputinoutP.173.數(shù)據(jù)類型說(shuō)明

用來(lái)指定模塊內(nèi)用到的數(shù)據(jù)對(duì)象的類型。wire——連線型wireA,B,C,D;//定義信號(hào)A~D為wire型reg——寄存器型reg[3:0]out;//定義信號(hào)out的數(shù)據(jù)類型為

4位reg型缺省數(shù)據(jù)類型為wire型P.184.邏輯功能定義

模塊中最核心部分,有三種方法可在模塊中產(chǎn)生邏輯。1)用“assign”持續(xù)賦值語(yǔ)句定義例:assigna=b&c;2)調(diào)用元件(元件例化)類似于在電路圖輸入方式下調(diào)入圖形符號(hào)完成設(shè)計(jì)。P.19元件例化的格式為:門元件名<實(shí)例名>(<端口列表>);例:調(diào)用模塊的例子moduleMUX2-1(out,a,b,sel);

outputout;

inputa,b,sel;

not(sel_,sel);

and(a1,a,sel_);

and(b1,b,sel);

or(out,a1,b1);endmoduleP.20設(shè)計(jì)師自己設(shè)計(jì)的各種模塊也可以看作元件,被頂層文件或其他文件調(diào)用:模塊名<實(shí)例名>(<端口列表>);端口列表有兩種表示方式,第一種方式顯式給出端口與信號(hào)之間的對(duì)應(yīng)關(guān)系:(.端口名(信號(hào)值表達(dá)式),.端口名(信號(hào)值表達(dá)式),……)第二種方法是隱式給出端口與信號(hào)之間的關(guān)系:(信號(hào)值表達(dá)式,信號(hào)值表達(dá)式,……)這種方式下,例化的端口列表中信號(hào)的順序要與該模塊定義中的端口列表中端口順序嚴(yán)格一致。而第一種方法則無(wú)此要求。P.21舉例:由1位全加器組成的4位全加器modulefull_add(a,b,cin,sum,cout);inputa,b,cin;outputsum,cout;assign{cout,sum}=a+b+cin;endmodulemoduleadd4(sum,cout,a,b,cin);output[3:0]sum;outputcout;input[3:0]a,b;inputcin;P.22wirecin1,cin2,cin3;full_addf0(a[0],b[0],cin,sum[0],cin1);full_addf1(a[1],b[1],cin1,sum[1],cin2);full_addf2(.a(a[2]),.b(b[2]),.cin(cin2),.sum(sum[2]),.cout(cin3));full_addf3(.cin(cin3),.a(a[3]),.b(b[3]),.cout(cout),.sum(sum[3]));endmoduleP.233)用“always”過(guò)程塊賦值例:

always@(posedge

clk)

begin

if(reset)out=0;

elseout=out+1;

end過(guò)程塊、持續(xù)賦值語(yǔ)句與實(shí)例應(yīng)用要點(diǎn)總結(jié):P.24在Verilog模塊中,所有的過(guò)程塊(如initial、always)、持續(xù)賦值語(yǔ)句、實(shí)例引用之間都是并行的;它們表示的是一種通過(guò)變量名互相連接的關(guān)系;在同一模塊中這三者出現(xiàn)的先后順序沒(méi)有關(guān)系;只有持續(xù)賦值語(yǔ)句assign和實(shí)例引用語(yǔ)句可以獨(dú)立于過(guò)程塊而存在于模塊的功能定義部分?!?VerilogHDL語(yǔ)言要素P.25

內(nèi)容簡(jiǎn)介詞法數(shù)據(jù)類型寄存器和存儲(chǔ)器運(yùn)算符一.詞法P.26空白符(間隔符)

包括:空格(\b)、tab(\t)(制表符)、換行符(\n)及換頁(yè)符。 空白符使代碼錯(cuò)落有致、閱讀方便。綜合時(shí),空白符被忽略。但是在字符串中空白和制表符會(huì)被認(rèn)為是有意義的字符。P.27Verilog程序可以不分行:initialbeginina=3'b001;inb=3'b011;end也可以加入空白符采用多行編寫:initial

begin ina=3'b001; inb=3'b011;

endP.28注釋

有兩種注釋形式:?jiǎn)涡凶⑨專阂?/開始到本行結(jié)束。多行注釋:以/*開始到*/結(jié)束。/*舉例說(shuō)明*/moduleaddbit(a,b,ci,sum,co);//輸入端口inputa;inputb;…….P.293.數(shù)字與字符串VerilogHDL有下面4種基本邏輯狀態(tài):0——低電平、邏輯0或“假”1——高電平、邏輯1或“真”X——未知狀態(tài)Z——高阻態(tài)X、Z不分大小寫P.301)整數(shù)有4種進(jìn)制表示形式:二進(jìn)制整數(shù)(b或B)十進(jìn)制整數(shù)(d或D)十六進(jìn)制整數(shù)(h或H)八進(jìn)制整數(shù)(o或O)常數(shù)按照其數(shù)值類型可以劃分為整數(shù)和實(shí)數(shù)兩種P.31數(shù)字表達(dá)方式有以下3種:

<對(duì)應(yīng)的二進(jìn)制數(shù)的位寬'><進(jìn)制><數(shù)字><進(jìn)制><數(shù)字><數(shù)字>舉例:8'b11000101//位寬為8位的二進(jìn)制數(shù)8'hd5//位寬為8位的十六進(jìn)制數(shù)d5H5'o27 //位寬為5位的八進(jìn)制數(shù)27OP.324'B1X_01 //4位二進(jìn)制數(shù)1X015'HX //5位十六進(jìn)制數(shù)XX4'hz //4位十六進(jìn)制數(shù)z8'h2A //位寬與字符間允許有空格-8‘D5 //8位二進(jìn)制數(shù),-5的補(bǔ)碼X可以用來(lái)定義十六進(jìn)制數(shù)的4位二進(jìn)制狀態(tài),八進(jìn)制數(shù)的3位,二進(jìn)制數(shù)的1位。Z的表示方法同X類似。P.33

數(shù)值常量中的下劃線“_”是為了增加可讀性,可以忽略。如8'b1100_0110表示8位二進(jìn)制數(shù)。 數(shù)值常量中的“?”表示高阻狀態(tài)。例:2'B1?表示2位的二進(jìn)制數(shù)其中的一位是高阻狀態(tài)。P.34

如果沒(méi)有定義一個(gè)整數(shù)型的長(zhǎng)度,數(shù)的長(zhǎng)度為相應(yīng)值中定義的位數(shù)。下面是兩個(gè)例子:'o721 //9位2進(jìn)制位寬的八進(jìn)制數(shù)'hAF //8位2進(jìn)制位寬的十六進(jìn)制數(shù) 如果定義的長(zhǎng)度比為常量指定的長(zhǎng)度長(zhǎng),通常在左邊填0補(bǔ)位。但是如果數(shù)最左邊一位為x或z,就相應(yīng)地用x或z在左邊補(bǔ)位。例如:10'b10左邊添0占位,0000000010

10'bx0x1左邊添x占位,xxxxxxx0x1P.35

如果定義的位寬比實(shí)際的位數(shù)小,那么最左邊的位相應(yīng)地被截?cái)啵?'b1001_0011 //與3'b011相等5'h0FFF //與5'h1F相等P.362)實(shí)數(shù)有兩種表示方法:十進(jìn)制表示方法

2.05.672.//非法:小數(shù)點(diǎn)兩側(cè)必須有數(shù)字科學(xué)計(jì)數(shù)法

43_5.1e2 //43510.0(下劃線忽略)

9.6E2 //960.05E-4 //0.0005P.37下面的幾個(gè)例子是無(wú)效的格式:

.25 3. 7.E3 .8e-2實(shí)數(shù)可以轉(zhuǎn)化為整數(shù),根據(jù)四舍五入的原則,而不是截?cái)嘣瓌t,當(dāng)將實(shí)數(shù)賦給一個(gè)整數(shù)時(shí),這種轉(zhuǎn)化會(huì)自行發(fā)生,例如:在轉(zhuǎn)化成整數(shù)時(shí),實(shí)數(shù)25.5和25.8都變成26,而25.2則變成25。P.383)字符串 字符串是雙引號(hào)內(nèi)的字符序列,不能分成多行書寫。若字符串用做VerilogHDL表達(dá)式或賦值語(yǔ)句中的操作數(shù),則字符串被看作8位似的ASCII值序列,每一個(gè)字符對(duì)應(yīng)8位ASCII值。P.39例1:字符串變量聲明reg[8*12:1]stringvar;initialbegin stringvar=“helloworld!”;endP.40轉(zhuǎn)意符:特殊字符表示意義\n換行符\tTab鍵\\符號(hào)\\*符號(hào)*\ddd3位八進(jìn)制表示的ASCII值%%符號(hào)%P.414.標(biāo)識(shí)符

VerilogHDL中的標(biāo)識(shí)符可以是任意一組字母、數(shù)字以及符號(hào)“$”和“_”(下劃線)的組合,但是標(biāo)識(shí)符的第一個(gè)字符必須是字母或下劃線。標(biāo)識(shí)符是區(qū)分大小寫的。合法標(biāo)識(shí)符:count _A1_d2COUNT R56_68非法標(biāo)識(shí)符:30count //標(biāo)識(shí)符不允許以數(shù)字開頭out* //標(biāo)識(shí)符中不允許包含*P.425.關(guān)鍵字

VerilogHDL內(nèi)部已經(jīng)使用的詞稱為關(guān)鍵字或保留字。這些關(guān)鍵字用戶不能隨便使用。在編寫程序時(shí),變量的定義不要與這些關(guān)鍵詞沖突。所有的關(guān)鍵字都是小寫二.數(shù)據(jù)類型P.43

VerilogHDL中共有19種數(shù)據(jù)類型。數(shù)據(jù)類型是用來(lái)表示數(shù)字電路硬件中的數(shù)據(jù)儲(chǔ)存和傳送元件的。這里主要介紹4種最基本的數(shù)據(jù)類型。連線型(NetType)

nettype相當(dāng)于硬件電路中的各種物理連線。P.44NetType的變量不能存儲(chǔ)值,而且必須受到驅(qū)動(dòng)器的驅(qū)動(dòng)。兩種驅(qū)動(dòng)方式:1)在結(jié)構(gòu)描述中將它連接到一個(gè)邏輯門或模塊的輸出端。2)用持續(xù)賦值語(yǔ)句assign對(duì)其進(jìn)行賦值。特點(diǎn):輸出的值緊跟輸入值的變化而變化。當(dāng)沒(méi)有驅(qū)動(dòng)源對(duì)其驅(qū)動(dòng)時(shí),它將保持高阻態(tài)。P.45

為了能夠精確地反映硬件電路中各種可能的物理信號(hào)連接特性,VerilogHDL提供了多種連線型數(shù)據(jù)。常用的有wire型和tri型。這兩種變量都用于連接器件單元,它們具有相同的語(yǔ)法格式和功能。wire型變量:通常用來(lái)表示單個(gè)門驅(qū)動(dòng)或連續(xù)賦值語(yǔ)句驅(qū)動(dòng)的連線型數(shù)據(jù)。tri型變量:通常用來(lái)表示多驅(qū)動(dòng)器驅(qū)動(dòng)的連線型數(shù)據(jù)。P.46wire型變量的格式:wire[n-1:0]數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名n;wire——wire型數(shù)據(jù)確認(rèn)符;[n-1:0]——代表該數(shù)據(jù)的位寬。缺省狀態(tài),位寬默認(rèn)值為1。這里的位是二進(jìn)制的位。數(shù)據(jù)名——若一次定義多個(gè)數(shù)據(jù),數(shù)據(jù)名之間用逗號(hào)隔開。聲明語(yǔ)句的最后用分號(hào)表示語(yǔ)句的結(jié)束。P.47例1.定義數(shù)據(jù)總線寬8位,地址總線寬20位。wire[7:0]databus; //databus寬8位wire[19:0]addrbus; //addrbus寬20位或:wire[8:1]databus;wire[20:1]addrbus;wirea; //定義了一個(gè)1位的wire型數(shù)據(jù)P.48例2. 多位wire型數(shù)據(jù)可按下面方法使用 wire[7:0]in,out; //定義兩個(gè)8位wire型向量assignout=in;//assign就是持續(xù)賦值語(yǔ)句例3.可只使用多位數(shù)據(jù)中的幾位,但要注意位寬。wire[7:0]out;wire[3:0]in;assignout[5:2]=in;P.49說(shuō)明:1)wire型變量常用來(lái)表示以assign語(yǔ)句賦值的組合邏輯信號(hào)。2)輸入/輸出信號(hào)缺省時(shí)自動(dòng)定義為wire型。3)對(duì)綜合器而言,wire型信號(hào)的每一位可以取0,1,X或Z中的任意值。P.502.寄存器型(RegisterType) 寄存器是數(shù)據(jù)存儲(chǔ)單元的抽象。寄存器型數(shù)據(jù)對(duì)應(yīng)的是具有狀態(tài)保持作用的硬件電路,如觸發(fā)器、鎖存器等。寄存器型數(shù)據(jù)和連線型數(shù)據(jù)的區(qū)別: 寄存器型數(shù)據(jù)保持最后一次的賦值。而連線型數(shù)據(jù)需有持續(xù)的驅(qū)動(dòng)。P.51reg——常用的寄存器型變量reg型數(shù)據(jù)的格式:reg[n-1:0]數(shù)據(jù)名1,數(shù)據(jù)名2,…數(shù)據(jù)名n;例1.rega,b; //定義了兩個(gè)reg型變量reg[7:0]qout; //定義qout為8位寬的reg

型變量P.52說(shuō)明:1)reg型數(shù)據(jù)常用來(lái)表示“always”模塊內(nèi)的指定信號(hào),常代表觸發(fā)器。在“always”模塊內(nèi)被賦值的每一個(gè)信號(hào)都必須定義成reg型。2)對(duì)于reg型數(shù)據(jù),其賦值語(yǔ)句的作用就如同改變一組觸發(fā)器的存儲(chǔ)單元的值。3)若reg型數(shù)據(jù)未初始化(即缺?。?,則初始值為不定狀態(tài)。P.533.參數(shù)型(parameter)

在VerilogHDL中,用parameter來(lái)定義常量,即用它來(lái)定義變量的位寬及延時(shí)等。格式:parameter

參數(shù)名1=表達(dá)式1,參數(shù)名2=表達(dá)式2,…;parameter常用來(lái)定義延遲時(shí)間和變量寬度。P.54例:parametere=2,f=9;//定義兩個(gè)常數(shù)參數(shù)parameterr=5.7; //定義r為一個(gè)實(shí)型參數(shù)parametera_delay=(r+f)/2;

//用常數(shù)表達(dá)式賦值三.寄存器和存儲(chǔ)器P.55用reg類型變量可構(gòu)成寄存器和存儲(chǔ)器寄存器reg[7:0]mybyte;A=mybyte[6];//將mybyte的第6位賦值給AB=mybyte[5:2];//將mybyte的第5,4,3,2

位賦值給BP.56例:reg[7:0]a,b;reg[3:0]c;regd;d=a[7]&b[7]; //位選擇c=a[7:4]+b[3:0]; //域選擇寄存器可以取任意長(zhǎng)度。寄存器中的值通常被解釋為無(wú)符號(hào)數(shù)。P.572.存儲(chǔ)器

VerilogHDL通過(guò)對(duì)reg型變量建立數(shù)組來(lái)對(duì)存儲(chǔ)器建模,可以描述RAM型存儲(chǔ)器、ROM存儲(chǔ)器和reg文件。數(shù)組中的每一個(gè)單元通過(guò)一個(gè)數(shù)組索引進(jìn)行尋址。在Verilog語(yǔ)言中沒(méi)有多維數(shù)組存在,memory型數(shù)據(jù)是通過(guò)擴(kuò)展reg型數(shù)據(jù)的地址范圍來(lái)生成的。P.58格式:reg[n-1:0]存儲(chǔ)器名[m-1:0];或reg[n-1:0]存儲(chǔ)器名[m:1];reg[n-1:0]:定義了存儲(chǔ)器中每一個(gè)存儲(chǔ)單元的大小。[m-1:0]:定義了該存儲(chǔ)器中有多少個(gè)這樣的單元。P.59例1.

定義一個(gè)存儲(chǔ)器,1024個(gè)字節(jié),每個(gè)字節(jié)

8位。reg[7:0]mymem[1023:0];例2.

存儲(chǔ)器與寄存器的區(qū)別reg[n-1:0]rega; //一個(gè)n位的寄存器regmema[n-1:0]; //n個(gè)一位寄存器組成的存儲(chǔ)器組reg[3:0]Amem[63:0];P.60說(shuō)明:1)數(shù)組的維數(shù)不能大于2。2)存儲(chǔ)器屬于寄存器數(shù)組類型。連線數(shù)據(jù)類型沒(méi)有相應(yīng)的存儲(chǔ)器類型。3)單個(gè)寄存器說(shuō)明既能夠用于說(shuō)明寄存器類型,也可以用于說(shuō)明存儲(chǔ)器類型。P.61例:parameterADDR_SIZE=16,WORD_SIZE=8;reg[WORD_SIZE:1]RamPar[ADDR_SIZE-1:0],DataReg;RamPar——存儲(chǔ)器,是16個(gè)8位寄存器數(shù)組;DataReg——8位寄存器。P.624)在賦值語(yǔ)句中需要注意如下區(qū)別:存儲(chǔ)器賦值不能在一條賦值語(yǔ)句中完成,但是寄存器可以。因此在存儲(chǔ)器被賦值時(shí),需要定義一個(gè)索引。下例說(shuō)明它們之間的不同。reg[5:1]Dig; //Dig為5位寄存器。

...

Dig=5'b11011;//賦值正確

regBOg[5:1];//Bog為5個(gè)1位寄存器組成的的存儲(chǔ)器組...Bog=5'b11011;//賦值不正確P.63有一種存儲(chǔ)器賦值的方法是分別對(duì)存儲(chǔ)器中的每個(gè)字賦值。例如:reg[3:0]Xrom[4:1];Xrom[1]=4'hA;Xrom[2]=4'h8;Xrom[3]=4'hF;Xrom[4]=4'h2;四.運(yùn)算符P.64 Verilog語(yǔ)言參考了C語(yǔ)言中大多數(shù)運(yùn)算符的語(yǔ)義和句法。但Verilog中沒(méi)有增1(i++)和減1(i––)運(yùn)算符。1.算術(shù)運(yùn)算符+(一元加和二元加)-(一元減和二元減)*(乘)

/(除)%(取模)P.65說(shuō)明:1)兩個(gè)整數(shù)相除,結(jié)果值要略去小數(shù)部分,只取整數(shù)部分;2)取模運(yùn)算時(shí),結(jié)果的符號(hào)位采用模運(yùn)算式里第一個(gè)操作數(shù)的符號(hào)位;模運(yùn)算表達(dá)式結(jié)果說(shuō)明10%42余數(shù)為212%30整數(shù)-11%5-1余數(shù)為-1P.663)在進(jìn)行算術(shù)運(yùn)算操作時(shí),如果某個(gè)操作數(shù)有不確定的值X或Z,那么整個(gè)結(jié)果為X。例:'b10x1+'b01111結(jié)果為不確定數(shù)'bxxxxx4)無(wú)符號(hào)數(shù)和有符號(hào)數(shù)若操作數(shù)為寄存器型或連線型,或基數(shù)格式表示形式的整數(shù)則為無(wú)符號(hào)數(shù);若為整型或?qū)嵭?,則可以是有符號(hào)數(shù)。P.67例:reg[5:0]Bar;integerTab;

...Bar=-6'd12;//寄存器變量Bar的十進(jìn)制數(shù)為

52,向量值為110100。Tab=-6'd12;//整數(shù)Tab的十進(jìn)制數(shù)為-12,位形式為110100。P.685)算術(shù)操作結(jié)果的長(zhǎng)度 算術(shù)表達(dá)式結(jié)果的長(zhǎng)度由最長(zhǎng)的操作數(shù)決定。在賦值語(yǔ)句下,算術(shù)操作結(jié)果的長(zhǎng)度由操作符左端目標(biāo)長(zhǎng)度決定。reg[3:0]Arc,Bar,Crt;reg[5:0]Frx;

...

Arc=Bar+Crt;Frx=Bar+Crt;P.69例:算術(shù)運(yùn)算符應(yīng)用的一個(gè)例子。modulearithmetic(a,b,out1,out2,out3,

out4,out5)input[2:0]a,b;

output[3:0]out1;

output[4:0]out3;

output[2:0]out2,out4,out5;

reg[3:0]out1;

reg[4:0]out3;

reg[2:0]out2,out4,out5;P.70always@(aorb) begin out1=a+b;

out2=a-b;

out3=a*b;

out4=a/b;

out5=a%b;

endendmoduleP.712.邏輯運(yùn)算符邏輯運(yùn)算符有3種:&&(邏輯與)||(邏輯或)

!(邏輯非)說(shuō)明:1)&&和||為二目運(yùn)算符,要求有兩個(gè)操作數(shù)。例(a>b)&&(b>c),a&&b

(a<b)||(b<c),a||bP.722)!是單目運(yùn)算符,只要求一個(gè)操作數(shù)。例:!(a>b),!a

3)在一個(gè)邏輯表達(dá)式中,如果包含多個(gè)邏輯運(yùn)算符,如:!a&&b||(x>y)&&c按以下優(yōu)先次序:!&&||邏輯運(yùn)算符中,“&&”和“||”的優(yōu)先級(jí)別低于關(guān)系運(yùn)算符,“!”高于算術(shù)運(yùn)算符。P.733.位運(yùn)算~ 按位取反;

| 按位或;

& 按位與;

^ 按位異或;在Verilog語(yǔ)言中有7種位邏輯運(yùn)算符:^~或~^ 按位異或非;~& 按位與非;~| 按位或非;P.74例:若A=5'b11001;B=5'b10101,則:

~A=5'b00110 A&B=5'b10001 A|B=5'b11101 A^B=5'b01100說(shuō)明:1)按位運(yùn)算符中,除了“~”為單目運(yùn)算符外,其余均為雙目運(yùn)算符。P.752)對(duì)于雙目運(yùn)算符,如果操作數(shù)長(zhǎng)度不相等,長(zhǎng)度較小的操作數(shù)在最左側(cè)添0補(bǔ)位。3)無(wú)論單目按位運(yùn)算符還是雙目按位運(yùn)算符,經(jīng)過(guò)按位運(yùn)算后,原來(lái)的操作數(shù)有幾位,所得結(jié)果仍為幾位。4)不要將邏輯運(yùn)算符和按位運(yùn)算符相混淆。P.764.關(guān)系運(yùn)算符Verilog關(guān)系運(yùn)算符有:>(大于)<(小于)>=(大于等于)<=(小于等于)P.77例:關(guān)系運(yùn)算符應(yīng)用的一個(gè)例子。modulerelation(a,b,out1,out2,out3,out4)input[2:0]a,b;

outputout1,out2,out3,out4;

regout1,out2,out3,out4;

always@(aorb) begin out1=a<b;

out2=a<=b;

out3=a>b;

if(a>=b) out4=1 else out4=0endendmoduleP.78說(shuō)明:1)在進(jìn)行關(guān)系運(yùn)算時(shí),若聲明的關(guān)系為“假”,則返回值是“0”;若聲明的關(guān)系為“真”,則返回值是“1”;2)若某個(gè)操作數(shù)的值不定,則關(guān)系是模糊的,返回值是不定值。3)所有關(guān)系運(yùn)算符有著相同的優(yōu)先級(jí)別。關(guān)系運(yùn)算符的優(yōu)先級(jí)別低于算術(shù)運(yùn)算符。P.795.等式運(yùn)算符等式運(yùn)算符有4種==(等于)!=(不等于)===(全等)!==(非全等)

雙目運(yùn)算符,要求有兩個(gè)操作數(shù),得到的結(jié)果是1位的邏輯值。聲明的關(guān)系為真,結(jié)果為1;聲明的關(guān)系為假,結(jié)果為0;P.80“==”與“===”的區(qū)別:==01xz010xx101xxxxxxxzxxxx===01xz0100010100x0010z0001相等運(yùn)算符真值表全等運(yùn)算符真值表P.816.縮位運(yùn)算符(歸約運(yùn)算符)

單目運(yùn)算符,也有與、或、非運(yùn)算。包括下面幾種:&——與

~&——與非

|——或

~|——或非

^——異或

^~,~^——同或P.82其與、或、非運(yùn)算規(guī)則類似于位運(yùn)算符的運(yùn)算規(guī)則,但其運(yùn)算過(guò)程不同。對(duì)操作數(shù)的相應(yīng)位進(jìn)行與、或、非運(yùn)算,操作數(shù)是幾位數(shù),則運(yùn)算結(jié)果是幾位。位運(yùn)算:縮位運(yùn)算:對(duì)單個(gè)操作數(shù)進(jìn)行與、或、非遞推運(yùn)算,最后的運(yùn)算結(jié)果是1位的二進(jìn)制數(shù)。P.83具體運(yùn)算過(guò)程:第一步:先將操作數(shù)的第1位與第2位進(jìn)行與、或、非運(yùn)算;第二步:將運(yùn)算結(jié)果與第3位進(jìn)行與、或、非運(yùn)算,依次類推,直至最后一位。例:reg[3:0]a;regb;

b=&a;若:A=5'b11001則:&A=0;

|A=1;P.847.移位運(yùn)算符>>——右移<<——左移使用方法:

a>>n或a<<na——代表要進(jìn)行移位的操作數(shù);n——代表要移幾位這兩種移位運(yùn)算都用0來(lái)填補(bǔ)移出的空位P.85moduleshift;reg[3:0]start,result; initial bigin start=1; result=(start<<2); endendmoduleP.868.條件運(yùn)算符?:——條件運(yùn)算符,有三個(gè)操作數(shù),與C

語(yǔ)言相同。格式: 信號(hào)=條件?表達(dá)式1:表達(dá)式2;

當(dāng)條件成立時(shí),信號(hào)取表達(dá)式1的值,反之取表達(dá)式2的值。P.87moduleadd_or_sub(a,b,op,result);parameterADD=1'b0;input[7:0]a,b;inputop;output[7:0]result;assignresult=(op==ADD)?a+b:a-b;endmoduleP.889.位拼接運(yùn)算——{}這是一個(gè)特殊的運(yùn)算符,這一運(yùn)算符可以將兩個(gè)或更多個(gè)信號(hào)的某些位并接起來(lái)進(jìn)行運(yùn)算操作。其使用方法是把某些信號(hào)的某些位詳細(xì)地列出來(lái),中間用逗號(hào)分開,最后用大括號(hào)括起來(lái)表示一個(gè)整體信號(hào)。格式:{信號(hào)1的某幾位,信號(hào)2的某幾位,…,信號(hào)n的某幾位}P.89例:wire[7:0]Dbus;wire[11:0]Abus;assignDbus[7:4]={Dbus[0],Dbus[1],Dbus[2],Dbus[3]};//以反轉(zhuǎn)的順序?qū)⒌投?位賦給高端4位。

assignDbus={Dbus[3:0],Dbus[7:4]};//高4位與低4位交換。P.90

由于非定長(zhǎng)常數(shù)的長(zhǎng)度未知,不允許連接非定長(zhǎng)常數(shù)。例如,下列式子非法:{Dbus,5}//不允許連接操作非定長(zhǎng)常數(shù)。P.91運(yùn)算符優(yōu)先級(jí)排序:!~*/%+-<<>><<=>>===!====!==&^^~|&&||?:高優(yōu)先級(jí)別低優(yōu)先級(jí)別§4VerilogHDL行為語(yǔ)句P.92

內(nèi)容簡(jiǎn)介過(guò)程語(yǔ)句塊語(yǔ)句賦值語(yǔ)句條件語(yǔ)句循環(huán)語(yǔ)句編譯向?qū)дZ(yǔ)句P.93VerilogHDL是由模塊組成的行為描述方式結(jié)構(gòu)描述方式過(guò)程塊持續(xù)賦值語(yǔ)句模塊實(shí)例語(yǔ)句基本原語(yǔ)實(shí)例語(yǔ)句模塊數(shù)據(jù)流描述方式一.過(guò)程語(yǔ)句P.94過(guò)程塊過(guò)程語(yǔ)句語(yǔ)句塊initialalways過(guò)程性賦值語(yǔ)句高級(jí)程序語(yǔ)句過(guò)程賦值語(yǔ)句過(guò)程持續(xù)賦值語(yǔ)句條件分支語(yǔ)句循環(huán)控制語(yǔ)句1.always過(guò)程語(yǔ)句P.95格式:always@(敏感信號(hào)表達(dá)式)begin//過(guò)程賦值//if-else,case,casex,casez選擇語(yǔ)句//while,repeat,for循環(huán)//task,function調(diào)用end過(guò)程塊可選項(xiàng)P.961)敏感信號(hào)——只要表達(dá)式中某個(gè)信號(hào)發(fā)生變化,就會(huì)引發(fā)塊內(nèi)語(yǔ)句的執(zhí)行。@(a)//當(dāng)信號(hào)a的值發(fā)生變化時(shí)@(aorb)//當(dāng)信號(hào)a或b的值發(fā)生變化時(shí)@(posedgeclock)//當(dāng)clock上升沿到來(lái)時(shí)@(negedgeclock)//當(dāng)clock下降沿到來(lái)時(shí)@(posedgeclkor

negedgereset)//當(dāng)clk的上升沿或reset的下降沿到來(lái)時(shí)P.97modulemux4_1(out,in0,in1,in2,in3,sel);outputout;inputin0,in1,in2,in3;input[1:0]sel;regout;always@(in0orin1orin2orin3)

case(sel) 2'b00:out=in0;

2'b01:out=in1;P.98 2'b10:out=in2;

2'b11:out=in3;

default

:out=2'bx;

endcaseendmodule敏感信號(hào)分類邊沿敏感型電平敏感型wait語(yǔ)句P.992)posedge與negedge關(guān)鍵字例1:同步置數(shù)、同步清零的計(jì)數(shù)器modulecount(out,data,load,reset,clk);output[7:0]out;input

[7:0]data;inputload,clk,reset;reg

[7:0]out;always

@(posedgeclk)//clk上升沿觸發(fā)

beginP.100

if(!reset) out=8'h00;//同步清零,低有效

elseif(load) out=data;//同步預(yù)置

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

endendmodule例2:時(shí)鐘信號(hào)為clk,clear為異步清零信號(hào)always@(posedgeclkorposedgeclear)always

@(posedgeclkornegedgeclear)P.101錯(cuò)誤的描述:always

@(posedgeclkornegedgeclear)

begin

if(clear)

out=0;

else

out=in;

end

//應(yīng)改為if(!clear)P.1023)用always過(guò)程塊實(shí)現(xiàn)組合邏輯功能敏感信號(hào)表達(dá)式內(nèi)不能包含posedge與negedge關(guān)鍵字組合邏輯的所有輸入信號(hào)都要作為“信號(hào)名”出現(xiàn)在敏感信號(hào)表達(dá)式中。P.103例:有什么問(wèn)題?modulethree_and(f,a,b,c);outputf;input

a,b,c;reg

f;always

@(aorb)

begin f=a&b&c;

endendmodule//應(yīng)改為@(aorborc)P.1044)用always過(guò)程塊實(shí)現(xiàn)時(shí)序邏輯功能敏感信號(hào)表達(dá)式內(nèi)可以有posedge與negedge關(guān)鍵字,也可以只有信號(hào)名;不要求所有輸入信號(hào)都出現(xiàn)在敏感信號(hào)列表的“信號(hào)名”中。P.105moduleD_FF(Q,D,CLK);outputQ;inputD,CLK;regQ;always@(negedgeCLK)beginQ=D;endendmodule例:時(shí)鐘下降沿觸發(fā)的D觸發(fā)器P.106說(shuō)明:1)always過(guò)程語(yǔ)句后面可以是一個(gè)敏感事件列表,該敏感事件列表的作用是用來(lái)激活always過(guò)程語(yǔ)句的執(zhí)行;2)如果always過(guò)程塊中的敏感事件列表缺省,則認(rèn)為觸發(fā)條件始終被滿足,always過(guò)程塊將無(wú)條件地循環(huán)執(zhí)行下去,直到遇到$finish或$stop系統(tǒng)任務(wù)為止;3)進(jìn)行仿真時(shí),always過(guò)程塊是從模擬0開始執(zhí)行的,且always語(yǔ)句在仿真過(guò)程中是不斷重復(fù)執(zhí)行的;P.1074)敏感事件列表由一個(gè)或多個(gè)“事件表達(dá)式”構(gòu)成,事件表達(dá)式說(shuō)明了啟動(dòng)塊內(nèi)語(yǔ)句執(zhí)行時(shí)的觸發(fā)條件,當(dāng)存在多個(gè)事件表達(dá)式時(shí)要用關(guān)鍵詞or將多個(gè)觸發(fā)條件組合起來(lái)。Verilog規(guī)定:只要這些事件表達(dá)式所代表的多個(gè)觸發(fā)條件中有一個(gè)成立,就啟動(dòng)塊內(nèi)語(yǔ)句的執(zhí)行。5)切勿將變量引入敏感信號(hào)列表。6)always過(guò)程塊和initial過(guò)程塊都不能嵌套使用。P.108例:不恰當(dāng)使用always語(yǔ)句而產(chǎn)生仿真死鎖的情況。always begin clk=~clk; endalways begin #50clk=~clk; end加上時(shí)延控制“#50”產(chǎn)生一個(gè)周期為100的方波信號(hào)當(dāng)敏感信號(hào)列表缺省時(shí),語(yǔ)句塊將一直執(zhí)行下去,這就可能在仿真時(shí)產(chǎn)生仿真死鎖情況

2.initial過(guò)程塊P.109格式:initialbegin

語(yǔ)句1;語(yǔ)句2;

語(yǔ)句n;

end過(guò)程塊P.110說(shuō)明:1)initial語(yǔ)句后面沒(méi)有“敏感信號(hào)列表”;2)initial過(guò)程塊中的語(yǔ)句是從模擬0開始執(zhí)行,它在仿真過(guò)程中只執(zhí)行一次,在執(zhí)行完后,該initial過(guò)程塊就被掛起,不再執(zhí)行;3)initial過(guò)程塊的使用主要是面向功能模擬的,通常不具綜合性。P.111例1:用initial過(guò)程語(yǔ)句對(duì)測(cè)試變量A、B、C

賦值。

`timescale1ns/100psmoduletest;

regA,B,C;

initial begin A=0;B=1;C=0;

#50A=1;B=0;P.112#50A=0;C=1;

#50B=1;

#50B=0;C=0;

#50$finish;

endendmoduleP.113例2:initial過(guò)程塊用于對(duì)變量和存儲(chǔ)器進(jìn)行初始化。moduleregister_initialize(memory);inoutareg;inoutmemory;parametersize=1024,bytesize=8;reg[bytesize-1:0]memory[size-1:0];P.114initial

begin:SEQ-BLK-A

integer:index;

for(index=0;index<size;index=index+1) memory[index]=0;areg=0;endendmodule3.兩類語(yǔ)句在模塊中的使用P.115moduleteseregsa,sb,ze;initial begin sa=0; sb=0; #5sb=1 #5sa=1; #5sb=0; end

always@(saorsb)ze=sa^sb;endmodule二.塊語(yǔ)句P.116

在VerilogHDL中有兩類語(yǔ)句塊:1.串行塊(begin-end)格式:

begin:<塊名>

塊內(nèi)局部變量說(shuō)明; 時(shí)間控制1 行為語(yǔ)句1;

……

時(shí)間控制n 行為語(yǔ)句n;

endP.117說(shuō)明:1)串行塊內(nèi)的語(yǔ)句按順序方式執(zhí)行;2)每條語(yǔ)句中的時(shí)延值與其前一條語(yǔ)句執(zhí)行的仿真時(shí)間有關(guān);3)一旦順序語(yǔ)句塊執(zhí)行結(jié)束,跟隨順序語(yǔ)句塊過(guò)程的下一條語(yǔ)句繼續(xù)執(zhí)行。P.118例:用begin-end串行塊產(chǎn)生信號(hào)波形'timescale10ns/1nsmodulewave1;

regwave;

parametercycle=10;

initial begin wave=0;

#(cycle/2)wave=1;

#(cycle/2)wave=0;P.119 #(cycle/2)wave=1;

#(cycle/2)wave=0;

#(cycle/2)wave=1;

#(cycle/2)$finish;

endinitial$monitor($time,,,“wave=%b”,wave);endmoduleP.1202.并行塊(fork-join)格式:

fork:<塊名>

塊內(nèi)局部變量說(shuō)明; 時(shí)間控制1 行為語(yǔ)句1;

……

時(shí)間控制n 行為語(yǔ)句n;

joinP.121說(shuō)明:1)塊內(nèi)語(yǔ)句是同時(shí)執(zhí)行的,即程序流程控制一進(jìn)入到該并行塊,塊內(nèi)語(yǔ)句則開始同時(shí)并行執(zhí)行。2)塊內(nèi)每條語(yǔ)句的延遲時(shí)間是相對(duì)于程序流程控制進(jìn)入到塊內(nèi)的仿真時(shí)間的。3)延遲時(shí)間用來(lái)給賦值語(yǔ)句提供執(zhí)行時(shí)序。4)當(dāng)按時(shí)間時(shí)序排序在最后的語(yǔ)句執(zhí)行完后,程序流程控制跳出該程序塊。P.122例:用fork-join并行塊產(chǎn)生信號(hào)波形'timescale10ns/1ns

modulewave2;

regwave;

parametercycle=5;

initial

fork wave=0; #(cycle)wave=1;//5*10ns延遲

#(2*cycle)wave=0;//2*5*10ns延遲P.123 #(3*cycle)wave=1;//3*5*10ns延遲

#(4*cycle)wave=0;

#(5*cycle)wave=1;

#(6*cycle)$finish;

join

initial$monitor($time,,,“wave=%b”,wave);

endmodule三.賦值語(yǔ)句1.持續(xù)賦值語(yǔ)句(不能出現(xiàn)在過(guò)程塊中)P.124

持續(xù)賦值語(yǔ)句只能對(duì)連線型變量wire進(jìn)行賦值,不能對(duì)寄存器型變量進(jìn)行賦值。格式:連線型變量類型[連線型變量位寬]連線型變量名assign#(延時(shí)量)連線型變量名=賦值表達(dá)式可選項(xiàng)P.125“延時(shí)量”的基本格式:#(delay1,delay2,delay3)delay1——上升延時(shí);delay2——下降延時(shí);delay3——轉(zhuǎn)移到高阻態(tài)延時(shí)。如果“延時(shí)量”這項(xiàng)缺省,默認(rèn)為0延時(shí)。P.126例:moduleand_cont_assignment(z,x,y);input[3:0]x,y;output[3:0]z;wire[3:0]z,x,y;assign#(1.5,1.0,2.0)z=x&y;endmoduleP.1271)標(biāo)量連線型

wirea,b;assigna=b;2)向量連線型

wire[7:0]a,b;assigna=b;3)向量連線型變量中的某一位

wire[7:0]a,b;assigna[3]=b[3];P.1284)向量連線型變量中的某幾位

wire[7:0]a,b;assigna[3:2]=b[1:0];5)上面幾種類型的任意拼接運(yùn)算

wirea,c;wire[1:0]b;assign{a,c}=b;P.129說(shuō)明:1)持續(xù)賦值用來(lái)描述組合邏輯。2)持續(xù)賦值語(yǔ)句驅(qū)動(dòng)連線型變量,輸入操作數(shù)的值一發(fā)生變化,就重新計(jì)算并更新它所驅(qū)動(dòng)的變量。3)連線型變量沒(méi)有數(shù)據(jù)保持能力。4)若一個(gè)連線型變量沒(méi)有得到任何連續(xù)驅(qū)動(dòng),則它的取值將為不定態(tài)“x”。P.1305)在仿真時(shí),只要右端賦值表達(dá)式內(nèi)的任一操作數(shù)發(fā)生變化,就會(huì)立即觸發(fā)對(duì)被賦值連線型變量的更新操作。6)如果持續(xù)賦值語(yǔ)句帶有延時(shí),則在仿真時(shí)只要右端賦值表達(dá)式中的任一信號(hào)發(fā)生變化,都將立即對(duì)賦值表達(dá)式進(jìn)行重新計(jì)算,然后進(jìn)入延時(shí)等待狀態(tài),待指定延時(shí)過(guò)去后再進(jìn)行賦值。P.131例:用持續(xù)賦值語(yǔ)句實(shí)現(xiàn)4位全加器。moduleadder_4(a,b,ci,sum,co);input[3:0]a,b;inputci;output[3:0]sum;outputco;assign{co,sum}=a+b+ci;endmodule2.過(guò)程賦值語(yǔ)句P.132過(guò)程賦值是在always和initial語(yǔ)句內(nèi)的賦值,它只能對(duì)寄存器數(shù)據(jù)類型的變量賦值。過(guò)程賦值語(yǔ)句的分類阻塞型賦值非阻塞型賦值P.133格式:<被賦值變量>

=

<賦值表達(dá)式> ——阻塞型賦值<被賦值變量>

<=

<賦值表達(dá)式> ——非阻塞型賦值P.1341)非阻塞型賦值方式(如b<=a;)非阻塞賦值在整個(gè)過(guò)程塊結(jié)束時(shí)才完成賦值操作,即b的值并不是立即就改變的。P.135modulenon_block(c,b,a,clk);outputc,b;inputclk,a;reg

c,b;always@(posedge

clk)

begin b<=a; c<=b;

endendmodule例1:非阻塞賦值P.136P.1372)阻塞賦值方式(如b=a;) 阻塞賦值在該語(yǔ)句結(jié)束時(shí)就立即完成賦值操作,即b的值在該條語(yǔ)句結(jié)束后立即改變,如果在一個(gè)語(yǔ)句塊中有多條阻塞賦值語(yǔ)句,則前面賦值語(yǔ)句沒(méi)有完成之前,后面賦值語(yǔ)句不能被執(zhí)行,仿佛被阻塞一樣。P.138moduleblock(c,b,a,clk);outputc,b;inputclk,a;reg

c,b;always@(posedge

clk)

begin b=a; c=b;

endendmodule例2:阻塞賦值P.139四.條件語(yǔ)句P.140高級(jí)程序語(yǔ)句條件分支語(yǔ)句循環(huán)控制語(yǔ)句if-else條件分支case條件分支foreverrepeatwhilefor1.if-elseP.141VerilogHDL語(yǔ)言提供了3種形式的if語(yǔ)句:1)if(表達(dá)式)語(yǔ)句1;2)if(表達(dá)式)語(yǔ)句1;

else語(yǔ)句2;3)if(表達(dá)式1)語(yǔ)句1;

elseif(表達(dá)式2)語(yǔ)句2;

elseif(表達(dá)式3)語(yǔ)句3;

……elseif(表達(dá)式n)語(yǔ)句n;

else語(yǔ)句n+1;P.142說(shuō)明:1)3種形式的if語(yǔ)句在if后面都有“表達(dá)式”,一般為邏輯表達(dá)式或關(guān)系表達(dá)式。系統(tǒng)對(duì)表達(dá)式的值進(jìn)行判斷,若為0,x,z,按“假”處理;若為1,按“真”處理,執(zhí)行指定語(yǔ)句。2)在if和else后面可以包含單個(gè)或多個(gè)語(yǔ)句,多句時(shí)用“begin-end”塊語(yǔ)句括起來(lái)。3)在if語(yǔ)句嵌套使用時(shí),要注意if與else的配對(duì)關(guān)系。P.143例1:modulesel-from-three(q,sela,selb,a,b,c);

inputsela,selb,a,b,c;

outputq;

regq;

always@(selaorselboraorborc);

begin

if(sela)q=a;

elseif(selb)q=b;

elseq=c;

end endmoduleP.144例2:modulecount60(qout,cout,data,load,cin,

reset,clk);input[7:0]data;inputload,cin,reset,clk;output[7:0]qout;outputcout;reg[7:0]qout;always@(posedgeclk);

begin if(reset)qout<=0;

elseif(load)qout<=data;P.145

elseif(cin)

begin

if(qout[3:0]==9)

begin qout[3:0]<=0;

if(qout[7:4]==5)qout[7:4]<=0;

elseqout[7:4]<=qout[7:4]+1;

end

elseqout[3:0]<=qout[3:0]+1;

end

endassigncout=((qout==8'h59)&cin)?1:0;endmodule2.caseP.146 if語(yǔ)句有兩個(gè)分支,而case語(yǔ)句是一種多路分支語(yǔ)句,故case語(yǔ)句可用于譯碼器、數(shù)據(jù)選擇器、狀態(tài)機(jī)、微處理器的指令譯碼等。case語(yǔ)句有case、casez、casex三種表示方式:P.1471)case語(yǔ)句格式:

case(敏感表達(dá)式) 值1:語(yǔ)句1; 值2:語(yǔ)句2;

……

值n:語(yǔ)句n;

default:語(yǔ)句n+1;endcase例:BCD碼-七段數(shù)碼管顯示譯碼P.148moduledecode4_7(decodeout,indec);output[6:0]decodeout;input[3:0]indec;reg[6:0]decodeout;always@(indec)

begin

case(indec) 4'd0:decodeout=7'b1111110; 4'd1:decodeout=7'b0110000;P.149 4'd2:decodeout=7'b1101101; 4'd3:decodeout=7'b1111001; 4'd4:decodeout=7'b0110011; 4'd5:decodeout=7'b1011011; 4'd6:decodeout=7'b1011111; 4'd7:decodeout=7'b1110000; 4'd8:decodeout=7'b1111111; 4'd9:decodeout=7'b1111011;

default:decodeout=7'bx;

endcaseendendmoduleP.1502)casez與casex語(yǔ)句 casez與casex的格式與case完全相同,但在執(zhí)行時(shí)有區(qū)別。case01xz0100010100x0010z0001case語(yǔ)句比較規(guī)則casez01xz0100110101x0011z1111casez語(yǔ)句比較規(guī)則P.151casex01xz0101110111x1111z1111casex語(yǔ)句比較規(guī)則例1:用casez語(yǔ)句實(shí)現(xiàn)操作碼譯碼P.152moduledecode_casez(a,b,opcode,out);input[7:0]a,b;input[4:1]opcode;output[7:0]out;reg[7:0]out;always@(aorboropcode)begin casez(opcode) 4'b1zzz:out=a+b; 4'b01xx:out=a-b; 4'b0001:out=(~b)+1; endcaseendendmodule例2:用casex語(yǔ)句實(shí)現(xiàn)操作碼譯碼P.153moduledecode_casez(a,b,opcode,out);input[7:0]a,b;input[4:1]opcode;output[7:0]out;reg[7:0]out;always

@(aorboropcode) begin casex(opcode) 4'b1zzx:out=a+b; 4'b01xx:out=a-b; 4'b0001:out=(~b)+1; endcaseendendmodule3.條件語(yǔ)句使用要點(diǎn)P.154

在使用條件語(yǔ)句時(shí),應(yīng)注意列出所有條件分支,否則編譯器認(rèn)為條件不滿足時(shí),會(huì)引進(jìn)一個(gè)鎖存器保持原值。在組合電路中應(yīng)避免這種隱含鎖存器的存在。 因?yàn)槊總€(gè)變量至少有4種取值,為包含所有分支,可在if語(yǔ)句后加上else;在case語(yǔ)句后加上default。P.155例:隱含鎖存器舉例moduleburied_ff(c,b,a);outputc;inputb,a;regc;always@(aorb) begin if((b==1)&&(a==1))c=a&b; endendmoduleelsec=0;五.循環(huán)語(yǔ)句P.156

有4種類型的循環(huán)語(yǔ)句,可用來(lái)控制語(yǔ)句的執(zhí)行次數(shù):(1)forever:連續(xù)地執(zhí)行語(yǔ)句。(2)repeat:連續(xù)執(zhí)行一條語(yǔ)句n次。(3)while:執(zhí)行一條語(yǔ)句,直到某個(gè)條件不滿足。(4)for:有條件的循環(huán)語(yǔ)句。1.forever語(yǔ)句P.157功能:無(wú)限循環(huán)。一般用在initial中。格式:

forever語(yǔ)句;或 foreverbegin …… end用途:產(chǎn)生周期性波形作為仿真測(cè)試信號(hào)。例1:P.158moduleclk_gen(clk);outputclk;initial

begin clk=0; #1000;

forever #25clk=~clk;

endendmodule例2:P.159moduleclk_gen(clk);output

clk;integercounter;initial

begin counter=0; clk=0; #1000;P.160

begin:FOREVER_PART

forever begin counter=counter+1;

if(counter>200)disable

FOREVER_PART; #25clk=~clk;

endendendendmodule2.repeat語(yǔ)句P.161功能:該循環(huán)語(yǔ)句內(nèi)的循環(huán)體部分被重復(fù)執(zhí)行指定的次數(shù)。格式:

repeat(循環(huán)次數(shù)表達(dá)式)語(yǔ)句;或 repeat(循環(huán)次數(shù)表達(dá)式)

begin …… end例1:用repeat循環(huán)語(yǔ)句來(lái)實(shí)現(xiàn)循環(huán)移位P.162module

drift(data,num,ctrl);inout[16:1]data;input[4:1]num;inputctrl;reg[16:1]data;regtmp;always

@(ctrl)

if(ctrl==1)P.163

repeat(num)

begin tmp=data[16]; data={data[15:0],tmp};

endendmodule例2:用repeat實(shí)現(xiàn)8位二進(jìn)制數(shù)的乘法P.164modulemult_repeat(outcome,a,b);parametersize=8;input[size:1]a,b;output[2*size:1]outcome;reg[2*size:1]temp_a,outcome;reg[size:1]temp_b;always@(aorb)beginoutcome=0;P.165temp_a=a;temp_b=b;repeat(size) //size為循環(huán)次數(shù)

begin

if(temp_b[1])outcome=outcome+temp_a;temp_a=temp_a<<1; //操作數(shù)a左移一位

temp_b=t

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論