




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
VerilogHDL語言初步主講楊全勝東南大學計算機科學與工程學院P.1計算機系統綜合課程設計第一部分VerilogHDL語言
§1綜述一.什么是硬件描述語言?P.2
硬件描述語言是一種用文本形式來描述和設計電路的語言。是硬件設計人員和電子設計自動化(EDA)工具之間的界面。P.3功能:1)編寫設計文件;2)建立電子系統行為級的仿真模型;3)自動綜合以生成符合要求且在電路結構上可以實現的數字邏輯網表(Netlist);4)寫入到CPLD和FPGA器件中。二.為什么要用HDL?P.41、電路設計的規模越來越大,復雜度越來越高。2、電子領域的競爭越來越激烈,開發周期要短。3、調試電路速度快。不必修改電路原理圖原型,只需要對HDL進行修改。4、易于理解,易于維護。5、有許多易于掌握的仿真、綜合和布局布線工具。三、BottomUp和Topdown的設計方法P.51.BottomUp的設計方法1.由基本門構成各個組合與時序邏輯2.由邏輯單元組成各個獨立的功能模塊3.由各個功能模塊連成一個完整系統4.完成整個系統測試與性能分析REGISTERPCRAMALU&1P.6傳統的電路系統設計方法的步驟:1.采用自下而上的設計方法-從狀態圖的簡化,寫出最簡邏輯表達式;2.采用通用邏輯元器件-通常采用74系列和CMOS4000系列的產品進行設計;3.在系統硬件設計的后期進行調試和仿真;只有在部分或全部硬件電路連接完畢,才可以進行電路調試,一旦考慮不周到,系統設計存在較大缺陷,則要重新設計,使設計周期延長。4.設計結果是一張電路圖;當設計調試完畢后,形成電原理圖,該圖包括元器件型號和信號之間的互連關系等等P.7優點:1.設計人員對于用這種方法進行設計比較熟悉;2.實現各個子塊電路所需的時間短。缺點:1.一般來講,對系統的整體功能把握不足;2.實現整個系統的功能所需的時間長,因為必須先將各個小模塊完成,使用這種方法對設計人員之間相互進行協作有比較高的要求。P.82.Topdown的設計方法4.工藝庫映射3.各個功能模塊系統級聯合驗證2.各個功能模塊劃分,設計和驗證1.系統層:頂層模塊,行為級描述,功能模擬和性能評估REGISTERPCRAMALU&1CPUTopdown的設計方法的特點:P.9從系統層開始設計和優化,保證了設計結果的正確性適合復雜的、大規模電路的設計縮短設計周期依賴于先進的EDA設計工具和環境,費用昂貴需要精確的工藝庫支持四.設計過程P.10文本編輯器圖形編輯器生成VerilogHDL源程序邏輯綜合優化FPGA/CPLD布線/適配器FPGA/CPLD編程、下載行為仿真功能仿真時序仿真硬件測試Verilog仿真器§2VerilogHDL設計初步P.11
內容簡介VerilogHDL與C語言的比較Verilog模塊的基本結構邏輯功能的定義一.VerilogHDL與C語言的比較P.12C語言Verilog語言functionmodule,functionif-then-elseif-then-elseforforwhilewhilecasecasebreakbreakdefinedefineprintfprintfintintVerilogHDL是在C語言基礎上發展起來的,保留了C語言的結構特點。但C語言的各函數之間是串行的,而Verilog的各個模塊間是并行的VerilogHDL與C語言運算符的比較P.13C語言Verilog功能C語言Verilog功能++加>=>=大于等于--減<=<=小于等于**乘====等于//除!=!=不等于%%取模~~取反!!邏輯非&&按位與&&&&邏輯與||按位或||||邏輯或^^按位異或>>大于<<<<左移<<小于>>>>右移二.Verilog模塊的基本結構P.14由關鍵詞module和endmodule定義module模塊名(端口列表)端口定義數據類型說明邏輯功能定義endmodule模塊聲明結束行P.151.模塊聲明module——關鍵詞模塊名——
模塊唯一的標識符端口列表——是由輸入、輸出和雙向端口的端口表達式按一定的次序組成的一個列表,它用來指明模塊所具有的端口,這些端口用來與其它模塊進行連接。P.162.端口定義
又稱“端口聲明語句”,用來進行端口方向的說明。Verilog語言中有如下三種端口聲明語句:1)input——對應的端口是輸入端口2)output——對應的端口是輸出端口3)inout——對應的端口是雙向端口moduleinputoutputinoutP.173.數據類型說明
用來指定模塊內用到的數據對象的類型。wire——連線型wireA,B,C,D;//定義信號A~D為wire型reg——寄存器型reg[3:0]out;//定義信號out的數據類型為
4位reg型缺省數據類型為wire型P.184.邏輯功能定義
模塊中最核心部分,有三種方法可在模塊中產生邏輯。1)用“assign”持續賦值語句定義例:assigna=b&c;2)調用元件(元件例化)類似于在電路圖輸入方式下調入圖形符號完成設計。P.19元件例化的格式為:門元件名<實例名>(<端口列表>);例:調用模塊的例子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設計師自己設計的各種模塊也可以看作元件,被頂層文件或其他文件調用:模塊名<實例名>(<端口列表>);端口列表有兩種表示方式,第一種方式顯式給出端口與信號之間的對應關系:(.端口名(信號值表達式),.端口名(信號值表達式),……)第二種方法是隱式給出端口與信號之間的關系:(信號值表達式,信號值表達式,……)這種方式下,例化的端口列表中信號的順序要與該模塊定義中的端口列表中端口順序嚴格一致。而第一種方法則無此要求。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”過程塊賦值例:
always@(posedge
clk)
begin
if(reset)out=0;
elseout=out+1;
end過程塊、持續賦值語句與實例應用要點總結:P.24在Verilog模塊中,所有的過程塊(如initial、always)、持續賦值語句、實例引用之間都是并行的;它們表示的是一種通過變量名互相連接的關系;在同一模塊中這三者出現的先后順序沒有關系;只有持續賦值語句assign和實例引用語句可以獨立于過程塊而存在于模塊的功能定義部分。§3VerilogHDL語言要素P.25
內容簡介詞法數據類型寄存器和存儲器運算符一.詞法P.26空白符(間隔符)
包括:空格(\b)、tab(\t)(制表符)、換行符(\n)及換頁符。 空白符使代碼錯落有致、閱讀方便。綜合時,空白符被忽略。但是在字符串中空白和制表符會被認為是有意義的字符。P.27Verilog程序可以不分行:initialbeginina=3'b001;inb=3'b011;end也可以加入空白符采用多行編寫:initial
begin ina=3'b001; inb=3'b011;
endP.28注釋
有兩種注釋形式:單行注釋:以//開始到本行結束。多行注釋:以/*開始到*/結束。/*舉例說明*/moduleaddbit(a,b,ci,sum,co);//輸入端口inputa;inputb;…….P.293.數字與字符串VerilogHDL有下面4種基本邏輯狀態:0——低電平、邏輯0或“假”1——高電平、邏輯1或“真”X——未知狀態Z——高阻態X、Z不分大小寫P.301)整數有4種進制表示形式:二進制整數(b或B)十進制整數(d或D)十六進制整數(h或H)八進制整數(o或O)常數按照其數值類型可以劃分為整數和實數兩種P.31數字表達方式有以下3種:
<對應的二進制數的位寬'><進制><數字><進制><數字><數字>舉例:8'b11000101//位寬為8位的二進制數8'hd5//位寬為8位的十六進制數d5H5'o27 //位寬為5位的八進制數27OP.324'B1X_01 //4位二進制數1X015'HX //5位十六進制數XX4'hz //4位十六進制數z8'h2A //位寬與字符間允許有空格-8‘D5 //8位二進制數,-5的補碼X可以用來定義十六進制數的4位二進制狀態,八進制數的3位,二進制數的1位。Z的表示方法同X類似。P.33
數值常量中的下劃線“_”是為了增加可讀性,可以忽略。如8'b1100_0110表示8位二進制數。 數值常量中的“?”表示高阻狀態。例:2'B1?表示2位的二進制數其中的一位是高阻狀態。P.34
如果沒有定義一個整數型的長度,數的長度為相應值中定義的位數。下面是兩個例子:'o721 //9位2進制位寬的八進制數'hAF //8位2進制位寬的十六進制數 如果定義的長度比為常量指定的長度長,通常在左邊填0補位。但是如果數最左邊一位為x或z,就相應地用x或z在左邊補位。例如:10'b10左邊添0占位,0000000010
10'bx0x1左邊添x占位,xxxxxxx0x1P.35
如果定義的位寬比實際的位數小,那么最左邊的位相應地被截斷:3'b1001_0011 //與3'b011相等5'h0FFF //與5'h1F相等P.362)實數有兩種表示方法:十進制表示方法
2.05.672.//非法:小數點兩側必須有數字科學計數法
43_5.1e2 //43510.0(下劃線忽略)
9.6E2 //960.05E-4 //0.0005P.37下面的幾個例子是無效的格式:
.25 3. 7.E3 .8e-2實數可以轉化為整數,根據四舍五入的原則,而不是截斷原則,當將實數賦給一個整數時,這種轉化會自行發生,例如:在轉化成整數時,實數25.5和25.8都變成26,而25.2則變成25。P.383)字符串 字符串是雙引號內的字符序列,不能分成多行書寫。若字符串用做VerilogHDL表達式或賦值語句中的操作數,則字符串被看作8位似的ASCII值序列,每一個字符對應8位ASCII值。P.39例1:字符串變量聲明reg[8*12:1]stringvar;initialbegin stringvar=“helloworld!”;endP.40轉意符:特殊字符表示意義\n換行符\tTab鍵\\符號\\*符號*\ddd3位八進制表示的ASCII值%%符號%P.414.標識符
VerilogHDL中的標識符可以是任意一組字母、數字以及符號“$”和“_”(下劃線)的組合,但是標識符的第一個字符必須是字母或下劃線。標識符是區分大小寫的。合法標識符:count _A1_d2COUNT R56_68非法標識符:30count //標識符不允許以數字開頭out* //標識符中不允許包含*P.425.關鍵字
VerilogHDL內部已經使用的詞稱為關鍵字或保留字。這些關鍵字用戶不能隨便使用。在編寫程序時,變量的定義不要與這些關鍵詞沖突。所有的關鍵字都是小寫二.數據類型P.43
VerilogHDL中共有19種數據類型。數據類型是用來表示數字電路硬件中的數據儲存和傳送元件的。這里主要介紹4種最基本的數據類型。連線型(NetType)
nettype相當于硬件電路中的各種物理連線。P.44NetType的變量不能存儲值,而且必須受到驅動器的驅動。兩種驅動方式:1)在結構描述中將它連接到一個邏輯門或模塊的輸出端。2)用持續賦值語句assign對其進行賦值。特點:輸出的值緊跟輸入值的變化而變化。當沒有驅動源對其驅動時,它將保持高阻態。P.45
為了能夠精確地反映硬件電路中各種可能的物理信號連接特性,VerilogHDL提供了多種連線型數據。常用的有wire型和tri型。這兩種變量都用于連接器件單元,它們具有相同的語法格式和功能。wire型變量:通常用來表示單個門驅動或連續賦值語句驅動的連線型數據。tri型變量:通常用來表示多驅動器驅動的連線型數據。P.46wire型變量的格式:wire[n-1:0]數據名1,數據名2,……,數據名n;wire——wire型數據確認符;[n-1:0]——代表該數據的位寬。缺省狀態,位寬默認值為1。這里的位是二進制的位。數據名——若一次定義多個數據,數據名之間用逗號隔開。聲明語句的最后用分號表示語句的結束。P.47例1.定義數據總線寬8位,地址總線寬20位。wire[7:0]databus; //databus寬8位wire[19:0]addrbus; //addrbus寬20位或:wire[8:1]databus;wire[20:1]addrbus;wirea; //定義了一個1位的wire型數據P.48例2. 多位wire型數據可按下面方法使用 wire[7:0]in,out; //定義兩個8位wire型向量assignout=in;//assign就是持續賦值語句例3.可只使用多位數據中的幾位,但要注意位寬。wire[7:0]out;wire[3:0]in;assignout[5:2]=in;P.49說明:1)wire型變量常用來表示以assign語句賦值的組合邏輯信號。2)輸入/輸出信號缺省時自動定義為wire型。3)對綜合器而言,wire型信號的每一位可以取0,1,X或Z中的任意值。P.502.寄存器型(RegisterType) 寄存器是數據存儲單元的抽象。寄存器型數據對應的是具有狀態保持作用的硬件電路,如觸發器、鎖存器等。寄存器型數據和連線型數據的區別: 寄存器型數據保持最后一次的賦值。而連線型數據需有持續的驅動。P.51reg——常用的寄存器型變量reg型數據的格式:reg[n-1:0]數據名1,數據名2,…數據名n;例1.rega,b; //定義了兩個reg型變量reg[7:0]qout; //定義qout為8位寬的reg
型變量P.52說明:1)reg型數據常用來表示“always”模塊內的指定信號,常代表觸發器。在“always”模塊內被賦值的每一個信號都必須定義成reg型。2)對于reg型數據,其賦值語句的作用就如同改變一組觸發器的存儲單元的值。3)若reg型數據未初始化(即缺省),則初始值為不定狀態。P.533.參數型(parameter)
在VerilogHDL中,用parameter來定義常量,即用它來定義變量的位寬及延時等。格式:parameter
參數名1=表達式1,參數名2=表達式2,…;parameter常用來定義延遲時間和變量寬度。P.54例:parametere=2,f=9;//定義兩個常數參數parameterr=5.7; //定義r為一個實型參數parametera_delay=(r+f)/2;
//用常數表達式賦值三.寄存器和存儲器P.55用reg類型變量可構成寄存器和存儲器寄存器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]; //域選擇寄存器可以取任意長度。寄存器中的值通常被解釋為無符號數。P.572.存儲器
VerilogHDL通過對reg型變量建立數組來對存儲器建模,可以描述RAM型存儲器、ROM存儲器和reg文件。數組中的每一個單元通過一個數組索引進行尋址。在Verilog語言中沒有多維數組存在,memory型數據是通過擴展reg型數據的地址范圍來生成的。P.58格式:reg[n-1:0]存儲器名[m-1:0];或reg[n-1:0]存儲器名[m:1];reg[n-1:0]:定義了存儲器中每一個存儲單元的大小。[m-1:0]:定義了該存儲器中有多少個這樣的單元。P.59例1.
定義一個存儲器,1024個字節,每個字節
8位。reg[7:0]mymem[1023:0];例2.
存儲器與寄存器的區別reg[n-1:0]rega; //一個n位的寄存器regmema[n-1:0]; //n個一位寄存器組成的存儲器組reg[3:0]Amem[63:0];P.60說明:1)數組的維數不能大于2。2)存儲器屬于寄存器數組類型。連線數據類型沒有相應的存儲器類型。3)單個寄存器說明既能夠用于說明寄存器類型,也可以用于說明存儲器類型。P.61例:parameterADDR_SIZE=16,WORD_SIZE=8;reg[WORD_SIZE:1]RamPar[ADDR_SIZE-1:0],DataReg;RamPar——存儲器,是16個8位寄存器數組;DataReg——8位寄存器。P.624)在賦值語句中需要注意如下區別:存儲器賦值不能在一條賦值語句中完成,但是寄存器可以。因此在存儲器被賦值時,需要定義一個索引。下例說明它們之間的不同。reg[5:1]Dig; //Dig為5位寄存器。
...
Dig=5'b11011;//賦值正確
regBOg[5:1];//Bog為5個1位寄存器組成的的存儲器組...Bog=5'b11011;//賦值不正確P.63有一種存儲器賦值的方法是分別對存儲器中的每個字賦值。例如:reg[3:0]Xrom[4:1];Xrom[1]=4'hA;Xrom[2]=4'h8;Xrom[3]=4'hF;Xrom[4]=4'h2;四.運算符P.64 Verilog語言參考了C語言中大多數運算符的語義和句法。但Verilog中沒有增1(i++)和減1(i––)運算符。1.算術運算符+(一元加和二元加)-(一元減和二元減)*(乘)
/(除)%(取模)P.65說明:1)兩個整數相除,結果值要略去小數部分,只取整數部分;2)取模運算時,結果的符號位采用模運算式里第一個操作數的符號位;模運算表達式結果說明10%42余數為212%30整數-11%5-1余數為-1P.663)在進行算術運算操作時,如果某個操作數有不確定的值X或Z,那么整個結果為X。例:'b10x1+'b01111結果為不確定數'bxxxxx4)無符號數和有符號數若操作數為寄存器型或連線型,或基數格式表示形式的整數則為無符號數;若為整型或實型,則可以是有符號數。P.67例:reg[5:0]Bar;integerTab;
...Bar=-6'd12;//寄存器變量Bar的十進制數為
52,向量值為110100。Tab=-6'd12;//整數Tab的十進制數為-12,位形式為110100。P.685)算術操作結果的長度 算術表達式結果的長度由最長的操作數決定。在賦值語句下,算術操作結果的長度由操作符左端目標長度決定。reg[3:0]Arc,Bar,Crt;reg[5:0]Frx;
...
Arc=Bar+Crt;Frx=Bar+Crt;P.69例:算術運算符應用的一個例子。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.邏輯運算符邏輯運算符有3種:&&(邏輯與)||(邏輯或)
!(邏輯非)說明:1)&&和||為二目運算符,要求有兩個操作數。例(a>b)&&(b>c),a&&b
(a<b)||(b<c),a||bP.722)!是單目運算符,只要求一個操作數。例:!(a>b),!a
3)在一個邏輯表達式中,如果包含多個邏輯運算符,如:!a&&b||(x>y)&&c按以下優先次序:!&&||邏輯運算符中,“&&”和“||”的優先級別低于關系運算符,“!”高于算術運算符。P.733.位運算~ 按位取反;
| 按位或;
& 按位與;
^ 按位異或;在Verilog語言中有7種位邏輯運算符:^~或~^ 按位異或非;~& 按位與非;~| 按位或非;P.74例:若A=5'b11001;B=5'b10101,則:
~A=5'b00110 A&B=5'b10001 A|B=5'b11101 A^B=5'b01100說明:1)按位運算符中,除了“~”為單目運算符外,其余均為雙目運算符。P.752)對于雙目運算符,如果操作數長度不相等,長度較小的操作數在最左側添0補位。3)無論單目按位運算符還是雙目按位運算符,經過按位運算后,原來的操作數有幾位,所得結果仍為幾位。4)不要將邏輯運算符和按位運算符相混淆。P.764.關系運算符Verilog關系運算符有:>(大于)<(小于)>=(大于等于)<=(小于等于)P.77例:關系運算符應用的一個例子。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說明:1)在進行關系運算時,若聲明的關系為“假”,則返回值是“0”;若聲明的關系為“真”,則返回值是“1”;2)若某個操作數的值不定,則關系是模糊的,返回值是不定值。3)所有關系運算符有著相同的優先級別。關系運算符的優先級別低于算術運算符。P.795.等式運算符等式運算符有4種==(等于)!=(不等于)===(全等)!==(非全等)
雙目運算符,要求有兩個操作數,得到的結果是1位的邏輯值。聲明的關系為真,結果為1;聲明的關系為假,結果為0;P.80“==”與“===”的區別:==01xz010xx101xxxxxxxzxxxx===01xz0100010100x0010z0001相等運算符真值表全等運算符真值表P.816.縮位運算符(歸約運算符)
單目運算符,也有與、或、非運算。包括下面幾種:&——與
~&——與非
|——或
~|——或非
^——異或
^~,~^——同或P.82其與、或、非運算規則類似于位運算符的運算規則,但其運算過程不同。對操作數的相應位進行與、或、非運算,操作數是幾位數,則運算結果是幾位。位運算:縮位運算:對單個操作數進行與、或、非遞推運算,最后的運算結果是1位的二進制數。P.83具體運算過程:第一步:先將操作數的第1位與第2位進行與、或、非運算;第二步:將運算結果與第3位進行與、或、非運算,依次類推,直至最后一位。例:reg[3:0]a;regb;
b=&a;若:A=5'b11001則:&A=0;
|A=1;P.847.移位運算符>>——右移<<——左移使用方法:
a>>n或a<<na——代表要進行移位的操作數;n——代表要移幾位這兩種移位運算都用0來填補移出的空位P.85moduleshift;reg[3:0]start,result; initial bigin start=1; result=(start<<2); endendmoduleP.868.條件運算符?:——條件運算符,有三個操作數,與C
語言相同。格式: 信號=條件?表達式1:表達式2;
當條件成立時,信號取表達式1的值,反之取表達式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.位拼接運算——{}這是一個特殊的運算符,這一運算符可以將兩個或更多個信號的某些位并接起來進行運算操作。其使用方法是把某些信號的某些位詳細地列出來,中間用逗號分開,最后用大括號括起來表示一個整體信號。格式:{信號1的某幾位,信號2的某幾位,…,信號n的某幾位}P.89例:wire[7:0]Dbus;wire[11:0]Abus;assignDbus[7:4]={Dbus[0],Dbus[1],Dbus[2],Dbus[3]};//以反轉的順序將低端4位賦給高端4位。
assignDbus={Dbus[3:0],Dbus[7:4]};//高4位與低4位交換。P.90
由于非定長常數的長度未知,不允許連接非定長常數。例如,下列式子非法:{Dbus,5}//不允許連接操作非定長常數。P.91運算符優先級排序:!~*/%+-<<>><<=>>===!====!==&^^~|&&||?:高優先級別低優先級別§4VerilogHDL行為語句P.92
內容簡介過程語句塊語句賦值語句條件語句循環語句編譯向導語句P.93VerilogHDL是由模塊組成的行為描述方式結構描述方式過程塊持續賦值語句模塊實例語句基本原語實例語句模塊數據流描述方式一.過程語句P.94過程塊過程語句語句塊initialalways過程性賦值語句高級程序語句過程賦值語句過程持續賦值語句條件分支語句循環控制語句1.always過程語句P.95格式:always@(敏感信號表達式)begin//過程賦值//if-else,case,casex,casez選擇語句//while,repeat,for循環//task,function調用end過程塊可選項P.961)敏感信號——只要表達式中某個信號發生變化,就會引發塊內語句的執行。@(a)//當信號a的值發生變化時@(aorb)//當信號a或b的值發生變化時@(posedgeclock)//當clock上升沿到來時@(negedgeclock)//當clock下降沿到來時@(posedgeclkor
negedgereset)//當clk的上升沿或reset的下降沿到來時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敏感信號分類邊沿敏感型電平敏感型wait語句P.992)posedge與negedge關鍵字例1:同步置數、同步清零的計數器modulecount(out,data,load,reset,clk);output[7:0]out;input
[7:0]data;inputload,clk,reset;reg
[7:0]out;always
@(posedgeclk)//clk上升沿觸發
beginP.100
if(!reset) out=8'h00;//同步清零,低有效
elseif(load) out=data;//同步預置
else out=out+1;//計數
endendmodule例2:時鐘信號為clk,clear為異步清零信號always@(posedgeclkorposedgeclear)always
@(posedgeclkornegedgeclear)P.101錯誤的描述:always
@(posedgeclkornegedgeclear)
begin
if(clear)
out=0;
else
out=in;
end
//應改為if(!clear)P.1023)用always過程塊實現組合邏輯功能敏感信號表達式內不能包含posedge與negedge關鍵字組合邏輯的所有輸入信號都要作為“信號名”出現在敏感信號表達式中。P.103例:有什么問題?modulethree_and(f,a,b,c);outputf;input
a,b,c;reg
f;always
@(aorb)
begin f=a&b&c;
endendmodule//應改為@(aorborc)P.1044)用always過程塊實現時序邏輯功能敏感信號表達式內可以有posedge與negedge關鍵字,也可以只有信號名;不要求所有輸入信號都出現在敏感信號列表的“信號名”中。P.105moduleD_FF(Q,D,CLK);outputQ;inputD,CLK;regQ;always@(negedgeCLK)beginQ=D;endendmodule例:時鐘下降沿觸發的D觸發器P.106說明:1)always過程語句后面可以是一個敏感事件列表,該敏感事件列表的作用是用來激活always過程語句的執行;2)如果always過程塊中的敏感事件列表缺省,則認為觸發條件始終被滿足,always過程塊將無條件地循環執行下去,直到遇到$finish或$stop系統任務為止;3)進行仿真時,always過程塊是從模擬0開始執行的,且always語句在仿真過程中是不斷重復執行的;P.1074)敏感事件列表由一個或多個“事件表達式”構成,事件表達式說明了啟動塊內語句執行時的觸發條件,當存在多個事件表達式時要用關鍵詞or將多個觸發條件組合起來。Verilog規定:只要這些事件表達式所代表的多個觸發條件中有一個成立,就啟動塊內語句的執行。5)切勿將變量引入敏感信號列表。6)always過程塊和initial過程塊都不能嵌套使用。P.108例:不恰當使用always語句而產生仿真死鎖的情況。always begin clk=~clk; endalways begin #50clk=~clk; end加上時延控制“#50”產生一個周期為100的方波信號當敏感信號列表缺省時,語句塊將一直執行下去,這就可能在仿真時產生仿真死鎖情況
2.initial過程塊P.109格式:initialbegin
語句1;語句2;
語句n;
end過程塊P.110說明:1)initial語句后面沒有“敏感信號列表”;2)initial過程塊中的語句是從模擬0開始執行,它在仿真過程中只執行一次,在執行完后,該initial過程塊就被掛起,不再執行;3)initial過程塊的使用主要是面向功能模擬的,通常不具綜合性。P.111例1:用initial過程語句對測試變量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過程塊用于對變量和存儲器進行初始化。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.兩類語句在模塊中的使用P.115moduleteseregsa,sb,ze;initial begin sa=0; sb=0; #5sb=1 #5sa=1; #5sb=0; end
always@(saorsb)ze=sa^sb;endmodule二.塊語句P.116
在VerilogHDL中有兩類語句塊:1.串行塊(begin-end)格式:
begin:<塊名>
塊內局部變量說明; 時間控制1 行為語句1;
……
時間控制n 行為語句n;
endP.117說明:1)串行塊內的語句按順序方式執行;2)每條語句中的時延值與其前一條語句執行的仿真時間有關;3)一旦順序語句塊執行結束,跟隨順序語句塊過程的下一條語句繼續執行。P.118例:用begin-end串行塊產生信號波形'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:<塊名>
塊內局部變量說明; 時間控制1 行為語句1;
……
時間控制n 行為語句n;
joinP.121說明:1)塊內語句是同時執行的,即程序流程控制一進入到該并行塊,塊內語句則開始同時并行執行。2)塊內每條語句的延遲時間是相對于程序流程控制進入到塊內的仿真時間的。3)延遲時間用來給賦值語句提供執行時序。4)當按時間時序排序在最后的語句執行完后,程序流程控制跳出該程序塊。P.122例:用fork-join并行塊產生信號波形'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三.賦值語句1.持續賦值語句(不能出現在過程塊中)P.124
持續賦值語句只能對連線型變量wire進行賦值,不能對寄存器型變量進行賦值。格式:連線型變量類型[連線型變量位寬]連線型變量名assign#(延時量)連線型變量名=賦值表達式可選項P.125“延時量”的基本格式:#(delay1,delay2,delay3)delay1——上升延時;delay2——下降延時;delay3——轉移到高阻態延時。如果“延時量”這項缺省,默認為0延時。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)標量連線型
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)上面幾種類型的任意拼接運算
wirea,c;wire[1:0]b;assign{a,c}=b;P.129說明:1)持續賦值用來描述組合邏輯。2)持續賦值語句驅動連線型變量,輸入操作數的值一發生變化,就重新計算并更新它所驅動的變量。3)連線型變量沒有數據保持能力。4)若一個連線型變量沒有得到任何連續驅動,則它的取值將為不定態“x”。P.1305)在仿真時,只要右端賦值表達式內的任一操作數發生變化,就會立即觸發對被賦值連線型變量的更新操作。6)如果持續賦值語句帶有延時,則在仿真時只要右端賦值表達式中的任一信號發生變化,都將立即對賦值表達式進行重新計算,然后進入延時等待狀態,待指定延時過去后再進行賦值。P.131例:用持續賦值語句實現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.過程賦值語句P.132過程賦值是在always和initial語句內的賦值,它只能對寄存器數據類型的變量賦值。過程賦值語句的分類阻塞型賦值非阻塞型賦值P.133格式:<被賦值變量>
=
<賦值表達式> ——阻塞型賦值<被賦值變量>
<=
<賦值表達式> ——非阻塞型賦值P.1341)非阻塞型賦值方式(如b<=a;)非阻塞賦值在整個過程塊結束時才完成賦值操作,即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;) 阻塞賦值在該語句結束時就立即完成賦值操作,即b的值在該條語句結束后立即改變,如果在一個語句塊中有多條阻塞賦值語句,則前面賦值語句沒有完成之前,后面賦值語句不能被執行,仿佛被阻塞一樣。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四.條件語句P.140高級程序語句條件分支語句循環控制語句if-else條件分支case條件分支foreverrepeatwhilefor1.if-elseP.141VerilogHDL語言提供了3種形式的if語句:1)if(表達式)語句1;2)if(表達式)語句1;
else語句2;3)if(表達式1)語句1;
elseif(表達式2)語句2;
elseif(表達式3)語句3;
……elseif(表達式n)語句n;
else語句n+1;P.142說明:1)3種形式的if語句在if后面都有“表達式”,一般為邏輯表達式或關系表達式。系統對表達式的值進行判斷,若為0,x,z,按“假”處理;若為1,按“真”處理,執行指定語句。2)在if和else后面可以包含單個或多個語句,多句時用“begin-end”塊語句括起來。3)在if語句嵌套使用時,要注意if與else的配對關系。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語句有兩個分支,而case語句是一種多路分支語句,故case語句可用于譯碼器、數據選擇器、狀態機、微處理器的指令譯碼等。case語句有case、casez、casex三種表示方式:P.1471)case語句格式:
case(敏感表達式) 值1:語句1; 值2:語句2;
……
值n:語句n;
default:語句n+1;endcase例:BCD碼-七段數碼管顯示譯碼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語句 casez與casex的格式與case完全相同,但在執行時有區別。case01xz0100010100x0010z0001case語句比較規則casez01xz0100110101x0011z1111casez語句比較規則P.151casex01xz0101110111x1111z1111casex語句比較規則例1:用casez語句實現操作碼譯碼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語句實現操作碼譯碼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.條件語句使用要點P.154
在使用條件語句時,應注意列出所有條件分支,否則編譯器認為條件不滿足時,會引進一個鎖存器保持原值。在組合電路中應避免這種隱含鎖存器的存在。 因為每個變量至少有4種取值,為包含所有分支,可在if語句后加上else;在case語句后加上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;五.循環語句P.156
有4種類型的循環語句,可用來控制語句的執行次數:(1)forever:連續地執行語句。(2)repeat:連續執行一條語句n次。(3)while:執行一條語句,直到某個條件不滿足。(4)for:有條件的循環語句。1.forever語句P.157功能:無限循環。一般用在initial中。格式:
forever語句;或 foreverbegin …… end用途:產生周期性波形作為仿真測試信號。例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語句P.161功能:該循環語句內的循環體部分被重復執行指定的次數。格式:
repeat(循環次數表達式)語句;或 repeat(循環次數表達式)
begin …… end例1:用repeat循環語句來實現循環移位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實現8位二進制數的乘法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為循環次數
begin
if(temp_b[1])outcome=outcome+temp_a;temp_a=temp_a<<1; //操作數a左移一位
temp_b=t
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 理解專利代理對企業知識產權的貢獻試題及答案
- 藥物相互作用常識試題及答案
- 激發對2024年專利代理人考試的學習興趣試題及答案
- 山東春考醫技試題及答案
- 行之有效的計劃2025年稅務師考試試題及答案
- 綜合復習光電工程師證書試題及答案
- 藥物科學研究課題選擇試題及答案
- 光電工程師證書考試科目精講試題及答案
- 藥劑考試知識更新策略試題及答案
- 藥學職業方向的多樣化探討試題及答案
- 澳大利亞東水西調
- 腦卒中后吞咽障礙患者進食護理(2023年中華護理學會團體標準)
- 機構與零件應用智慧樹知到課后章節答案2023年下山東輕工職業學院
- 綠色信貸項目節能減排量測算指引
- 哈薩克斯坦勞動法中文版
- 表面粗糙度儀檢定證書
- 健身長拳《起勢、開步雙劈、按掌前推》教案
- 高職學生職業生涯規劃-全章課件
- 森林管護措施及造林工作思考
- 順豐ai面試19道題自我介紹
- 國家開放大學一網一平臺電大《建筑測量》實驗報告1-5題庫
評論
0/150
提交評論