第3章Verilog設(shè)計入門~0BD71_第1頁
第3章Verilog設(shè)計入門~0BD71_第2頁
第3章Verilog設(shè)計入門~0BD71_第3頁
第3章Verilog設(shè)計入門~0BD71_第4頁
第3章Verilog設(shè)計入門~0BD71_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章Verilog設(shè)計入門主要內(nèi)容3.1組合電路的Verilog描述3.2時序模塊及其Verilog表述3.3二進制計數(shù)器及其Verilog設(shè)計Verilog概述什么是VerilogHDL?VerilogHDL(HardwareDiscriptionLanguage)是一種硬件描述語言,用于從算法級、門級到開關(guān)級的多種抽象設(shè)計層次的數(shù)字系統(tǒng)建模。Verilog的歷史最初是于1983年由GatewayDesignAutomation公司(后被Cadence收購)為其模擬器產(chǎn)品開發(fā)的硬件建模語言1990年,Cadence公司成立OVI(OpenVerilogInternational)組織來負責(zé)推廣Verilog1995年,IEEE制定了VerilogHDL標準,即IEEEStd1364-1995Verilog與VHDL目前,設(shè)計者使用Verilog和VHDL的情況美國:Verilog:60%,VHDL:40%臺灣:Verilog:50%,VHDL:50%3.1組合電路的Verilog描述3.1.12選1多路選擇器及其Verilog描述

3.1組合電路的Verilog描述3.1.12選1多路選擇器及其Verilog描述absy3.1組合電路的Verilog描述3.1.12選1多路選擇器及其Verilog描述

端口在模塊名字后的括號中列出端口等價于硬件的引腳(pin)端口可以說明為input,output及inoutmodule是層次化設(shè)計的基本構(gòu)件模塊內(nèi)部的邏輯功能和電路結(jié)構(gòu)Assign關(guān)鍵字引導(dǎo)的賦值語句標示符module(模塊)module能夠表示:物理塊,如IC或ASIC單元邏輯塊,如一個CPU設(shè)計的ALU部分整個系統(tǒng)每一個模塊的描述從關(guān)鍵詞module開始,有一個名稱(如SN74LS74,DFF,ALU等等),由關(guān)鍵詞endmodule結(jié)束。module是層次化設(shè)計的基本構(gòu)件邏輯描述放在module內(nèi)部模塊端口(moduleports)端口在模塊名字后的括號中列出端口可以說明為input,output及inout端口等價于硬件的引腳(pin)注意模塊的名稱DFF,端口列表及說明模塊通過端口與外部通信賦值語句條件操作符關(guān)鍵字賦值語句和條件操作符條件運算符三目運算符信號=條件?表達式1:表達式2條件運算符為?:用法:當(dāng)條件為真,信號取表達式1的值;為假,則取表達式2的值。關(guān)鍵字關(guān)鍵字——事先定義好的確認符,用來組織語言結(jié)構(gòu);或者用于定義VerilogHDL提供的門元件(如and,not,or,buf)。用小寫字母定義!——如always,assign,begin,case,casex,else,end,for,function,if,input,output,repeat,table,time,while,wire。用戶程序中的變量、節(jié)點等名稱不能與關(guān)鍵字同名!VerilogHDL關(guān)鍵字edgeelseendendcaseendfunctionendprimitiveendmoduleendspecifyendtableendtaskeventforforceforeverforkfunctionhighz0highz1ififnoneinitialinoutinputintegerjoinlargemacromodulemediummodulenandnegedgenornotnotif0notif1nmosoroutputparameterpmosposedgeprimitivepulldownpulluppull0pull1andalwaysassignbeginbufbufif0bufif1casecasexcasezcmosdeassigndefaultdefparamdisableVerilogHDL關(guān)鍵字(續(xù))tri0tri1vectoredwaitwandweak0weak1whilewireworxnorxorrcmosrealrealtimeregreleaserepeatrnmosrpmosrtranrtranif0rtranif1scalaredsmallspecifyspecparamstrengthstrong0strong1supply0supply1tabletasktrantranif0tranif1timetritriandtriortrireg標識符所謂標識別符就是用戶為程序描述中的Verilog對象所起的名字。標識符必須以英語字母(a-z,A-Z)起頭,或者用下橫線符(_)起頭。其中可以包含數(shù)字、$符和下橫線符。標識符最長可以達到1023個字符。模塊名、端口名和實例名都是標識符。Verilog語言是大小寫敏感的,因此sel和SEL是兩個不同的標識符。合法和非法標識符shift_reg_a

busa_index

bus26334neta*b_netn@263Verilog是大小寫敏感的。所有的Verilog關(guān)鍵詞都是小寫的。非法的合法的1、不能用數(shù)字開頭2、不能含有非字母符號*3、不能含有非字母符號@空格和注釋Verilog是一種格式很自由的語言??崭裨谖谋局衅鹨粋€分離符的作用,別的沒有其他用處。單行注釋符用//*********與C語言一致多行注釋符用/*-------------------*/與C語言一致規(guī)范的書寫格式規(guī)定了文本布局、命名和注釋的約定,以提高源代碼的可讀性和可維護性。最頂層的module_endmodule模塊放在最左側(cè)低一層次的語句向右靠一個TAB鍵的距離同一語句關(guān)鍵字對齊文件取名和存盤文件的擴展名為.v文件名與該程序的模塊名一致文件取名大小寫敏感文件名不應(yīng)該用中文和數(shù)字文件存在英文名字的文件夾中,不要存在根目錄或桌面上總結(jié)VerilogHDL程序是由模塊構(gòu)成的。每個模塊嵌套在module和endmodule聲明語句中。模塊是可以進行層次嵌套的。每個模塊要進行端口定義,并說明輸入輸出端口,然后對模塊的功能進行行為邏輯描述。程序書寫格式自由,一行可以寫幾個語句,一個語句也可以分多行寫。除了endmodule語句、begin_end語句和fork_join語句外,每個語句和數(shù)據(jù)定義的最后必須有分號。可用/*.....*/和//...對程序的任何部分作注釋。加上必要的注釋,以增強程序的可讀性和可維護性。3.1組合電路的Verilog描述3.1.24選1多路選擇器及其case語句表述方式3.1組合電路的Verilog描述主要的數(shù)據(jù)類型Verilog有幾種主要的數(shù)據(jù)類型:Nets表示器件之間的物理連接,稱為網(wǎng)絡(luò)連接類型Register表示抽象的儲存單元,稱為寄存器變量類型Parameter表示運行時的常數(shù),稱為參數(shù)類型寄存器陣列主要的數(shù)據(jù)類型---Net型變量定義Nets(網(wǎng)絡(luò)連線):由模塊或門驅(qū)動的連線。驅(qū)動端信號的改變會立刻傳遞到輸出的連線上。如果不明確地說明連接是何種類型,應(yīng)該是指wire類型。例如:右圖上,selb的改變,會自動地立刻影響或門的輸出。netsabslselbselansloutwire型變量最常用的nets型變量,常用來表示以assign語句賦值的組合邏輯信號。模塊中的輸入/輸出信號類型缺省為wire型??捎米鋈魏畏匠淌降妮斎?,或“assign”語句和實例元件的輸出。wire數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名n;wire[n-1:0]數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名m;或wire[n:1]數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名m;每條總線位寬為n共有m條總線wire型向量(總線)格式主要的數(shù)據(jù)類型---reg型變量定義

寄存器(register)類型變量

register型變量能保持其值,直到它被賦于新的值。register型變量常用于行為建模,產(chǎn)生測試的激勵信號常用行為語句結(jié)構(gòu)來給寄存器類型的變量賦值。如果信號變量是在過程塊(initial塊或always塊)中被賦值的,必須把它聲明為寄存器類型變量abslselbselansloutreg_areg_selreg_breg型變量定義——在過程塊中被賦值的信號,往往代表觸發(fā)器,但不一定就是觸發(fā)器(也可以是組合邏輯信號)!reg數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名n;reg[n-1:0]數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名m;或reg[n:1]數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名m;每個向量位寬為n共有m個reg型向量[例]reg[4:1]regc,regd;//regc,regd為4位寬的reg型向量reg型向量(總線)格式主要的數(shù)據(jù)類型---reg型變量定義用于行為建模兩種語句:initial只能執(zhí)行一次always循環(huán)執(zhí)行一個模塊內(nèi)可包含任意多個initial和always語句,它們相互并行執(zhí)行,即,它們的執(zhí)行順序與其在模塊中的順序無關(guān)過程語句結(jié)構(gòu)——always語句過程語句結(jié)構(gòu)——always語句always語句反復(fù)執(zhí)行例:always#5Clock=~Clock;由事件控制的順序過程的always語句例:moduleHalfAdder(A,B,Sum,Carry);inputA,B;outputSum,Carry;regSum,Carry;always@(AorB)beginSum=A^B;Carry=A&B;endendmodule電平敏感事件控制例:always@(AorB)邊沿觸發(fā)事件控制例:always@(negedgeClock)過程語句結(jié)構(gòu)——always語句塊語句begin_end塊語句用來將多個語句組織在一起,使得他們在語法上如同一個語句。塊語句分為兩類:順序塊:語句置于關(guān)鍵字begin和end之間,塊中的語句以順序方式執(zhí)行。并行塊:關(guān)鍵字fork和join之間的是并行塊語句,塊中的語句并行執(zhí)行。Fork和join語句常用于testbench描述。這是因為可以一起給出矢量及其絕對時間,而不必描述所有先前事件的時間。在順序塊中,語句一條接一條地計算執(zhí)行。在并行塊中,所有語句在各自的延遲之后立即計算執(zhí)行。begin#5a=3;#5a=5;#5a=4;endfork#5a=3;#15a=4;#10a=5;join上面的兩個例子在功能上是等價的。Fork-join例子里的賦值故意打亂順序是為了強調(diào)順序是沒有關(guān)系的。注意fork-join塊是典型的不可綜合語句,并且在一些仿真器時效率較差。塊語句begin_end條件語句-case語句case語句是測試表達式與另外一系列表達式分支是否匹配的一個多路條件語句。Case語句進行逐位比較以求完全匹配(包括x和z)。Default語句可選,在沒有任何條件成立時執(zhí)行。此時如果未說明default,Verilog不執(zhí)行任何動作。多個default語句是非法的。條件語句-case語句case<表達式><表達式>,<表達式>:賦值語句或空語句;<表達式>,<表達式>:賦值語句或空語句;default:賦值語句或空語句;endcase重要內(nèi)容:1、使用default語句是一個很好的編程習(xí)慣,特別是用于檢測x和z。2、Casez和casex為case語句的變體,允許比較無關(guān)(don‘t-care)值。case表達式或case項中的任何位為無關(guān)值時,在比較過程中該位不予考慮。在casez語句中,?和z被當(dāng)作無關(guān)值。在casex語句中,?,z和x被當(dāng)作無關(guān)值。數(shù)字表達(1)整數(shù)型常量(即整常數(shù))的4種進制表示形式:二進制整數(shù)(b或B);十進制整數(shù)(d或D);十六進制整數(shù)(h或H);八進制整數(shù)(o或O)。數(shù)字表達注:這里位寬指對應(yīng)二進制數(shù)的寬度。整常數(shù)的3種表達方式:數(shù)據(jù)表達(2)x和z值x表示不定值,z表示高阻值;8’b1001xxxx或8’h9x8’b1010zzzz或8’haz每個字符代表的二進制數(shù)的寬度取決于所用的進制;當(dāng)用二進制表示時,已標明位寬的數(shù)若用x或z表示某些位,則只有在最左邊的x或z具有擴展性!為清晰可見,最好直接寫出每一位的值![例]8’bzx=8’bzzzz_zzzx[例]8’b1x=8’b0000_001x“?”是z的另一種表示符號,建議在case語句中使用?表示高阻態(tài)z[例]casez(select)4’b???1:out=a;4’b??1?:out=b;4’b?1??:out=c;4’b1???:out=d;endcase3.1組合電路的Verilog描述3.1.34選1多路選擇器及其數(shù)據(jù)流描述方式按位邏輯操作符雙目運算符單目運算符位運算其結(jié)果與操作數(shù)位數(shù)相同。位運算符中的雙目運算符要求對兩個操作數(shù)的相應(yīng)位逐位進行運算。兩個不同長度的操作數(shù)進行位運算時,將自動按右端對齊,位數(shù)少的操作數(shù)會在高位用0補齊。[例]若A=5’b11001,B=3’b101,則A&B=(5’b11001)&(5’b00101)=5’b00001運算結(jié)果為1位的邏輯值1或0。等于運算符(==)和全等運算符(===)的區(qū)別:使用等于運算符時,兩個操作數(shù)必須逐位相等,結(jié)果才為1;若某些位為x或z,則結(jié)果為0。使用全等運算符時,若兩個操作數(shù)的相應(yīng)位完全一致(如同是1,或同是0,或同是x,或同是z),則結(jié)果為1;否則為0。所有的等式運算符優(yōu)先級別相同。===和!==運算符常用于case表達式的判別,又稱為“case等式運算符”。等式運算符--雙目運算符等式運算符--雙目運算符[例]if(A

==

1’bx)$display(“AisX”);//當(dāng)A為不定值時,式(A==1’bx)的運算結(jié)果為x,則該語句不執(zhí)行if(A

===

1’bx)$display(“AisX”);//當(dāng)A為不定值時,式(A===1’bx)的運算結(jié)果為1,該語句執(zhí)行表3-1“==”的真值表表3-2“===”的真值表等于運算的結(jié)果可能為1或0全等于運算的結(jié)果只有1或0賦值語句

分為兩類:連續(xù)賦值語句,過程賦值語句

(1)連續(xù)賦值語句——assign語句,用于對wire型變量賦值,是描述組合邏輯最常用的方法之一。

[例]assignc=a&b;//a、b、c均為wire型變量描述的是組合邏輯,并行操作在過程塊外部使用。用于net驅(qū)動。在等式左邊可以有一個簡單延時說明。只限于在表達式左邊用#delay形式可以是顯式或隱含的。語法:<assign>[#delay][strength]<net_name>=<expressions>;wireout;assignout=a&b;//顯式wireinv=~in;//隱含賦值語句(2)過程賦值語句——用于對reg型變量賦值,有兩種方式:非阻塞(non-blocking)賦值方式:

賦值符號為<=,如b<=a;阻塞(blocking)賦值方式:

賦值符號為=,如b=a;二、非阻塞賦值與阻塞賦值的區(qū)別1.非阻塞賦值方式

always@(posedgeclk)

begin

b<=a;

c<=b;

endclkDFFcDQDQabDFF非阻塞賦值在塊結(jié)束時才完成賦值操作!注:c的值比b的值落后一個時鐘周期!賦值語句2.阻塞賦值方式

always@(posedgeclk)

begin

b=a;

c=b;

end阻塞賦值在該語句結(jié)束時就完成賦值操作!clkDFFcDQab注:在一個塊語句中,如果有多條阻塞賦值語句,在前面的賦值語句沒有完成之前,后面的語句就不能被執(zhí)行,就像被阻塞了一樣,因此稱為阻塞賦值方式。這里c的值與b的值一樣

!賦值語句非阻塞(non-blocking)賦值方式(b<=a):b的值被賦成新值a的操作,并不是立刻完成的,而是在塊結(jié)束時才完成;塊內(nèi)的多條賦值語句在塊結(jié)束時同時賦值;硬件有對應(yīng)的電路。阻塞(blocking)賦值方式(b=a):b的值立刻被賦成新值a;完成該賦值語句后才能執(zhí)行下一句的操作;硬件沒有對應(yīng)的電路,因而綜合結(jié)果未知。非阻塞賦值與阻塞賦值方式的主要區(qū)別建議在初學(xué)時只使用一種方式,不要混用!建議在可綜合風(fēng)格的模塊中使用非阻塞賦值!賦值語句3.1組合電路的Verilog描述3.1.5加法器及其Verilog描述

3.1組合電路的Verilog描述3.1組合電路的Verilog描述3.1.5加法器及其Verilog描述

頂層模塊和例化語句模塊是可以進行層次嵌套的。每個VerilogHDL源文件中只準有一個頂層模塊,其他為子模塊。源文件與頂層模塊同名!應(yīng)在頂層模塊中對子模塊進行例化。元件例化:引入一種連接關(guān)系,將預(yù)先設(shè)計好的模塊定義為一個元件,用例化語句引入到上一層的設(shè)計中。可以將模塊的實例通過端口連接起來構(gòu)成一個大的系統(tǒng)或元件。自上而下層次化設(shè)計的一種重要途徑。例化可以是一個設(shè)計模塊(設(shè)計模塊例化),也可以是FPGA元件庫中的元件(門元件例化)例化是調(diào)用復(fù)制的含義門元件例化——程序通過調(diào)用一個在Verilog語言庫中現(xiàn)存的實例門元件來實現(xiàn)某邏輯門功能。模塊元件例化——頂層模塊(trist1)調(diào)用由某子模塊(mytri)定義的實例元件(tri_inst)來實現(xiàn)某功能。例化元件名門元件關(guān)鍵字

and

myand3(f,a,b,c);頂層模塊和例化語句moduletrist1(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例化元件名子模塊名頂層模塊子模塊頂層模塊和例化語句3.1組合電路的Verilog描述例化語句格式:端口名關(guān)聯(lián)法位置關(guān)聯(lián)法3.1組合電路的Verilog描述3.1.5加法器及其Verilog描述可綜合建模類型只有兩種:組合邏輯: 任何時候,如果輸出信號直接由當(dāng)前的輸入信號的組合決定,則此邏輯為組合邏輯。時序邏輯: 如果邏輯中具有記憶功能,則此邏輯為時序邏輯。在任何給定的時刻,如果輸出不能完全由輸入信號確定,則此邏輯具有記憶功能。3.2時序模塊及其Verilog表述

3.2時序模塊及其Verilog表述

3.2.1邊沿觸發(fā)型觸發(fā)器及其Verilog表述

3.2時序模塊及其Verilog表述

3.2.1邊沿觸發(fā)型觸發(fā)器及其Verilog表述

邊沿敏感時序時序控制@可以用在RTL級或行為級組合邏輯或時序邏輯描述中??梢杂藐P(guān)鍵字posedge(上升沿)和negedge(下降沿)限定信號敏感邊沿。敏感表中可以有多個信號,用關(guān)鍵字or連接。always@(negedgeClock)電平敏感事件控制always@(AorB)3.2時序模塊及其Verilog表述

3.2.2電平觸發(fā)型鎖存器及其Verilog表述

注:鎖存器的動作行為如下:當(dāng)時鐘信號為1時,輸入數(shù)據(jù)的值直接傳給輸出。當(dāng)時鐘信號為0時,輸出保持當(dāng)前狀態(tài)不變。用不完整的條件語句,產(chǎn)生時序電路復(fù)位控制信號是可綜合風(fēng)格有限狀態(tài)機代碼的重要組成部分,通常在有限狀態(tài)機建模中有復(fù)位控制信號。帶復(fù)位端的時序電路建模同步復(fù)位:moduleDFF2(q,clk,r,d);inputclk,d,r;outputq;regq;always@(posedgeclk)if(r)q=0;elseif(r==0)q=d;endmodule同步塊中的異步復(fù)位:moduleasync(q,ck,r,d);inputclk,d,r;outputq;regq;always@(posedgeclkornegedger)if(!r)

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論