




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、 主要內(nèi)容主要內(nèi)容類別類別語句語句可綜合性可綜合性過程語句過程語句initialalways塊語句塊語句串行塊串行塊begin-end并行塊并行塊fork-join賦值語句賦值語句持續(xù)賦值持續(xù)賦值assign過程賦過程賦值值=、=條件語句條件語句if-elsecase循環(huán)語句循環(huán)語句forrepeatwhileforever編譯向?qū)дZ句編譯向?qū)дZ句defineincludeifdef, else, endif綜合(綜合(Synthesis) 將較高層次的設計描述自動轉(zhuǎn)化為較低層次描述的過程;將較高層次的設計描述自動轉(zhuǎn)化為較低層次描述的過程; 綜合器是能自動實現(xiàn)上述轉(zhuǎn)換的軟件工具,是能將原理圖綜
2、合器是能自動實現(xiàn)上述轉(zhuǎn)換的軟件工具,是能將原理圖或或HDL語言描述的電路功能轉(zhuǎn)化為具體電路網(wǎng)表的工具;語言描述的電路功能轉(zhuǎn)化為具體電路網(wǎng)表的工具; 對于設計者而言,采用的描述級別越高,設計越容易。但對于設計者而言,采用的描述級別越高,設計越容易。但對綜合器而言,有可能無法將某些抽象級別高的描述轉(zhuǎn)化為對綜合器而言,有可能無法將某些抽象級別高的描述轉(zhuǎn)化為電路。因此設計者應了解綜合器的性能。電路。因此設計者應了解綜合器的性能。 很多綜合器可將很多綜合器可將HDL文本對應的硬件電路以圖形的方式文本對應的硬件電路以圖形的方式呈現(xiàn)出來,非常直觀,便于學習者建立呈現(xiàn)出來,非常直觀,便于學習者建立HDL程序與
3、硬件電路程序與硬件電路之間的對應關系。之間的對應關系。菜單菜單TOOLS/Netlist Viewer-RTL(寄存器傳輸級寄存器傳輸級) ViewerC、ASM.程序程序CPUCPU指令指令/ /數(shù)據(jù)代碼:數(shù)據(jù)代碼:010010 100010 1100010010 100010 1100軟件程序編譯器軟件程序編譯器 COMPILER軟件編譯器和硬件綜合器區(qū)別軟件編譯器和硬件綜合器區(qū)別VHDL/VERILOG.程序程序 硬件描述語言硬件描述語言 綜合器綜合器 SYNTHESIZERSYNTHESIZER為為ASICASIC設計提供的設計提供的 電路網(wǎng)表文件電路網(wǎng)表文件(a)軟件語言設計目標流程
4、軟件語言設計目標流程(b)硬件語言設計目標流程硬件語言設計目標流程module aoi(a,b,c,d,f);/* 模塊名為模塊名為aoi,端口列表,端口列表a,b,c,d,f */input a,b,c,d;/模塊的輸入端口為模塊的輸入端口為a,b,c,doutput f; /模塊的輸出端口為模塊的輸出端口為fwire a,b,c,d,f; /定義信號的數(shù)據(jù)類型定義信號的數(shù)據(jù)類型assign f=(a&b)|(c&d); /邏輯功能描述邏輯功能描述endmodule例例4.1“與與-或或-非非”電路電路 o Verilog程序是由模塊module構(gòu)成的。每個模塊的內(nèi)容都嵌在module和en
5、dmodule兩個關鍵字之間;每個模塊實現(xiàn)特定的功能。o 每個模塊首先要進行端口定義,并說明輸入和輸出口(input、output或inout),然后對模塊的功能進行定義。o Verilog程序書寫格式自由,一行可以寫幾個語句,一個語句也可以分多行寫。o 除了endmodule等少數(shù)語句外,每個語句的最后必須有分號。o 可用 /*/ 和 /對Verilog程序作注釋。 o 模塊聲明包括模塊名字,模塊輸入、輸出端口列表。模塊定義格式如下:module 模塊名(端口1,端口2,端口3,);如圖1所示,在What is the name of this project的欄目中輸入工程的名字,即取名模
6、塊名,同時下面的頂層實體名Top-Level Entity也同步顯示模塊名;與設計文件保存時一致,即模塊名.v。如圖1所示,在What is the name of this project的欄目中輸入工程的名字,即取名模塊名,同時下面的頂層實體名Top-Level Entity也同步顯示模塊名;o 對模塊的輸入輸出端口要明確說明,其格式為:input 端口名1,端口名2, 端口名n;/輸入端口輸入端口output 端口名1,端口名2, 端口名n;/輸出端口輸出端口inout 端口名1,端口名2, 端口名n;/輸入輸出雙向端口輸入輸出雙向端口注意:每個端口還要聲明其數(shù)據(jù)類型;注意:每個端口還要
7、聲明其數(shù)據(jù)類型; 輸入和雙向端口不能聲明為寄存器型;輸入和雙向端口不能聲明為寄存器型; 在測試模塊中不需要定義端口。在測試模塊中不需要定義端口。 輸入輸出端口數(shù)目之和與端口列表的總數(shù)目相同!輸入輸出端口數(shù)目之和與端口列表的總數(shù)目相同!o 對模塊中所用到的所有信號(包括端口信號、節(jié)點信號等)都必須進行數(shù)據(jù)類型的定義。Verilog語言提供了各種信號類型,分別模擬實際電路中的各種物理連接和物理實體。o 如果信號的數(shù)據(jù)類型沒有定義,則綜合器將其默認為是wire型。 reg3:0 out; /定義信號定義信號out的數(shù)據(jù)類型為的數(shù)據(jù)類型為4位位reg型;型; wire a,b,c,d,f; /定義信號
8、定義信號a,b,c,d,f為為wire(連線)(連線)型型o模塊中最核心的部分是邏輯功能定義。o定義邏輯功能的幾種基本方法:(1)用assign持續(xù)賦值語句定義assign語句多用于組合邏輯的賦值,稱為持續(xù)賦值方式。 assign cout=(qout=9)?1:0;(2)用always過程塊定義always過程語句既可以用來描述組合電路,也可以描述時序電路。 它只有兩種狀態(tài):等待狀態(tài)和執(zhí)行狀態(tài),其狀態(tài)取決于敏感信號,當敏感信號中的任何一個信號發(fā)生變化,并滿足條件時,過程就會啟動并將過程中的語句執(zhí)行一遍;否則過程處于等待或掛起狀態(tài)。always (ina,inb,cin)always (pos
9、edge clk) / always過程塊及敏感信號列表(3)調(diào)用元件(元件例化) component instantiation 調(diào)用元件的方法類似于在電路圖輸入方式下調(diào)入圖形符號來完成設計,這種方法側(cè)重于電路的結(jié)構(gòu)描述。 門元件關鍵字(); o and a3(out,a,b,c);/*調(diào)入一個調(diào)入一個三輸入與門三輸入與門*/3:8 DECODERABG1CG2ANG2BNY0NY1NY2NY3NY4NY5NY6NY7N74138instAND3inst1o (4)調(diào)用任務任務task,函數(shù)函數(shù)function(5)調(diào)用其他模塊-Chapter7();module();output輸出端口列
10、表;/輸出端口聲明input輸入端口列表;/輸入端口聲明/*定義數(shù)據(jù),信號的類型,函數(shù)聲明*/reg信號名;/邏輯功能定義assign=;/使用assign語句定義邏輯功能/用always塊描述邏輯功能always()begin/過程賦值/if-else,case語句/while,repeat,for循環(huán)語句/task,function調(diào)用end/調(diào)用其他模塊-P1777.6();/門元件例化門元件關鍵字();Endmodule兩個或更多個“always”過程塊、“assign”持續(xù)賦值語句、實例元件調(diào)用等操作都是同時執(zhí)行的。o initialo alwayso 在一個模塊(在一個模塊(mod
11、ule)中,使用中,使用initial和和always語句的次數(shù)是不受限制的。語句的次數(shù)是不受限制的。initial語句常用于仿語句常用于仿真中的初始化,真中的初始化,initial過程塊中的語句僅執(zhí)行一過程塊中的語句僅執(zhí)行一次;次;always塊內(nèi)的語句則是不斷重復執(zhí)行的。塊內(nèi)的語句則是不斷重復執(zhí)行的。o N N個個always塊是并發(fā)執(zhí)行的。塊是并發(fā)執(zhí)行的。o always ()begin/過程賦值過程賦值/if-else,case,casex,casez條件語句條件語句/while,repeat,for循環(huán)循環(huán)/task,function調(diào)用調(diào)用endo “always”過程語句通常是帶
12、有觸發(fā)條件的,觸發(fā)條件過程語句通常是帶有觸發(fā)條件的,觸發(fā)條件寫在敏感信號表達式中,只有當觸發(fā)條件滿足時,其后寫在敏感信號表達式中,只有當觸發(fā)條件滿足時,其后的的“begin-end”塊語句才能被執(zhí)行。塊語句才能被執(zhí)行。o 敏感信號表達式又稱事件表達式或敏感信號列表,敏感信號表達式又稱事件表達式或敏感信號列表,即當該表達式中變量的值改變時,就會引發(fā)塊內(nèi)即當該表達式中變量的值改變時,就會引發(fā)塊內(nèi)語句的執(zhí)行。因此語句的執(zhí)行。因此敏感信號表達式中應列出影響敏感信號表達式中應列出影響塊內(nèi)取值的所有信號。塊內(nèi)取值的所有信號。若有兩個或兩個以上信號若有兩個或兩個以上信號時,它們之間用時,它們之間用“or”連
13、接。連接。o 例如:例如: ( (a) a) / /當信號當信號a a的值發(fā)生改變的值發(fā)生改變 ( (a or b) a or b) / /當信號當信號a a或信號或信號b b的值發(fā)生改變的值發(fā)生改變 ( (posedgeposedge clock) / clock) /當當clock clock 的上升沿到來時的上升沿到來時 ( (negedgenegedge clock) / clock) /當當clock clock 的下降沿到來時的下降沿到來時 ( (posedgeposedge clkclk or or negedgenegedge reset) reset) / /當當clkclk
14、的上升沿到來或的上升沿到來或resetreset信號的下降沿到來信號的下降沿到來module mux4_1(out,in0,in1,in2,in3,sel);output out;input in0,in1,in2,in3;input1:0 sel; reg out;always (in0 or in1 or in2 or in3 or sel) /敏感信號列表敏感信號列表case(sel) 2b00: out=in0; 2b01: out=in1; 2b10: out=in2; 2b11: out=in3; default: out=2bx;endcaseendmodule4選選1數(shù)據(jù)選擇器
15、數(shù)據(jù)選擇器 邊沿敏感 電平敏感 always (posedge clk or en)o Xo always (posedge clk or negedge clr)o begino if(clr) out=0; / X /if(!clr)塊內(nèi)的邏輯描述要與敏感信號表達式中信號的有效電平一致o else out=in;o endo 對于時序電路,事件通常是由時鐘邊沿觸發(fā)的,為表達邊對于時序電路,事件通常是由時鐘邊沿觸發(fā)的,為表達邊沿這個概念,沿這個概念,Verilog提供了提供了posedge和和negedge關鍵字來描關鍵字來描述。比如:述。比如:o 【例】同步置數(shù)、同步清零的計數(shù)器【例】同步
16、置數(shù)、同步清零的計數(shù)器module count(out,data,load,reset,clk);output7:0 out; input7:0 data;input load,clk,reset; reg7:0 out;always (posedge clk) /clk上升沿觸發(fā)上升沿觸發(fā) begin if(!reset) out=8h00; /同步清同步清0,低電平有效,低電平有效 else if(load) out=data; /同步預置同步預置 else out=out+1; /計數(shù)計數(shù) endendmodule【例例4.11】 帶異步清帶異步清0/異步置異步置1(低電平有效)的(低電
17、平有效)的D觸發(fā)器觸發(fā)器module dff_asyn(q,qn,d,clk,set,reset);input d,clk,set,reset; output reg q,qn;always(posedge clk or negedge set or negedge reset)/下降沿下降沿 beginif(reset) begin q=1b0;qn=1b1; end/異步清異步清0,低電平有效,低電平有效else if(set) begin q=1b1;qn=1b0; end/異步置異步置1,低電平有效,低電平有效else begin q=d;qn=d; end endendmoduleo
18、 塊語句是由塊標志符塊語句是由塊標志符begin-end或并行塊或并行塊fork-join界定的一界定的一組語句,組語句,當塊語句只包含一條語句時,塊標志符可以缺省當塊語句只包含一條語句時,塊標志符可以缺省。o begin-end串行塊中的語句按串行塊中的語句按串行方式順序執(zhí)行串行方式順序執(zhí)行。比如:。比如:beginregb=rega;regc=regb;endo 由于由于begin-end塊內(nèi)的語句順序執(zhí)行,在最后,將塊內(nèi)的語句順序執(zhí)行,在最后,將regb、regc 的值都更新為的值都更新為rega的值,該的值,該begin-end塊執(zhí)行完后,塊執(zhí)行完后,regb、regc 的值是相同的。
19、的值是相同的。assign為持續(xù)賦值語句,主要用于對為持續(xù)賦值語句,主要用于對wire型變量的賦值。型變量的賦值。比如:比如:assign c=a&b;在上面的賦值中,在上面的賦值中,a、b、c三個變量皆為三個變量皆為wire型變量,型變量,a和和b信號的任何變化,都將隨時反映到信號的任何變化,都將隨時反映到c上來。上來。5.3.1 net型n Net型數(shù)據(jù)相當于硬件電路中的各種物理連接,其特點是型數(shù)據(jù)相當于硬件電路中的各種物理連接,其特點是輸出的值緊跟輸入值的變化而變化。對連線型有兩種驅(qū)輸出的值緊跟輸入值的變化而變化。對連線型有兩種驅(qū)動方式,一種方式是在結(jié)構(gòu)描述中將其連接到一個門元動方式,一
20、種方式是在結(jié)構(gòu)描述中將其連接到一個門元件或模塊的輸出端;件或模塊的輸出端;另一種方式是用持續(xù)賦值語句另一種方式是用持續(xù)賦值語句assign對其進行賦值。對其進行賦值。n wire是最常用的是最常用的Net型型變量。變量。n wire型變量的定義格式如下:型變量的定義格式如下:wire 數(shù)據(jù)名數(shù)據(jù)名1,數(shù)據(jù)名,數(shù)據(jù)名2,數(shù)據(jù)名數(shù)據(jù)名n;例如:例如: wire a,bwire a,b; / /定義了兩個定義了兩個wirewire型變量型變量a a和和b bn Examples:wire7:0 databus; /databus的寬度是的寬度是8位位wire19:0 addrbus; /addrbu
21、s的寬度是的寬度是20位位5.3.2 Variable型n variable型變量必須放在過程語句(如型變量必須放在過程語句(如initial、always)中)中,通過過程賦值語句賦值;,通過過程賦值語句賦值;在在always、initial等過程塊內(nèi)被等過程塊內(nèi)被賦值的信號也必須定義成賦值的信號也必須定義成variable型型。n 注意:注意:variable型變量并不意味著一定對應著硬件上的一個型變量并不意味著一定對應著硬件上的一個觸發(fā)器或寄存器等存儲元件,在綜合器進行綜合時,觸發(fā)器或寄存器等存儲元件,在綜合器進行綜合時,variable型變量會根據(jù)具體情況來確定是映射成連線還是映型變量
22、會根據(jù)具體情況來確定是映射成連線還是映射為觸發(fā)器或寄存器。射為觸發(fā)器或寄存器。 n reg型變量是最常用的一種型變量是最常用的一種variable型變量型變量。定義格式如下:。定義格式如下: reg 數(shù)據(jù)名數(shù)據(jù)名1,數(shù)據(jù)名,數(shù)據(jù)名2,數(shù)據(jù)名數(shù)據(jù)名n; 例如:例如:reg a,b; /定義了兩個定義了兩個reg型變量型變量a,bn Examples:reg7:0 qout; /定義定義qout為為8位寬的位寬的reg型向量型向量reg8:1 qout; /*信號定義信號定義?clk: 時鐘信號;時鐘信號;clr: 異步復位信號;異步復位信號;pause: 暫停信號;暫停信號; msh,msl:
23、百分秒的高位和低位;百分秒的高位和低位;sh,sl: 秒信號的高位和低位;秒信號的高位和低位; mh,ml: 分鐘信號的高位和低位。分鐘信號的高位和低位。*/ module paobiao(clk,clr,pause,msh,msl,sh,sl,mh,ml);oinput clk,clr,pause;output3:0 msh,msl,sh,sl,mh,ml;oreg3:0 msh,msl,sh,sl,mh,ml; reg cn1,cn2;/cn1為百分秒向秒的進位,為百分秒向秒的進位,cn2為秒向分的進位為秒向分的進位o/*百分秒計數(shù)進程,每滿百分秒計數(shù)進程,每滿100,cn1產(chǎn)生一個進位產(chǎn)
24、生一個進位*oalways (posedge clk or posedge clr)o begin if(clr) begin msh,msl=8h00;cn1=0;end/異步復位異步復位oelse if(!pause) /pause為為0時正常計數(shù),為時正常計數(shù),為1時暫停計數(shù)時暫停計數(shù)obeginoif(msl=9) msl=0;o else if(msh=9) begin msh=0; cn1=1; endoelse msh=msh+1;endo else begin msl=msl+1; cn1=0; endoendoendo /*秒計數(shù)進程,每計滿秒計數(shù)進程,每計滿60,cn2產(chǎn)生
25、一個進位產(chǎn)生一個進位*o always (posedge cn1 or posedge clr)o begin if(clr) begin sh,sl=8h00;cn2=0;end/異步復位異步復位oelse if(sl=9) /低位是否為低位是否為9obegin sl=0;o if(sh=5) begin sh=0; cn2=1; endoelse sh=sh+1;endoelse begin sl=sl+1; cn2=0; end oendo/*分鐘計數(shù)進程,每分鐘計數(shù)進程,每計滿計滿60,系統(tǒng)自動清零,系統(tǒng)自動清零*o always (posedge cn2 or posedge clr
26、)o begin if(clr) begin mh,ml=8h00;end/異步復位異步復位oelse if(ml=9)obegin ml=0;oif(mh=5) mh=0;oelse mh=mh+1;endoelse ml=ml+1;oendo endmoduleo 過程賦值語句多用于對過程賦值語句多用于對reg型變量進行賦值。型變量進行賦值。(1)非阻塞()非阻塞(non_blocking)賦值方式賦值方式 賦值符號為賦值符號為“=”, 如:如:b= a; 非阻塞賦值在整個過程塊結(jié)束時才完成賦值操作,即非阻塞賦值在整個過程塊結(jié)束時才完成賦值操作,即b的的值并不是立刻就改變的。值并不是立刻就
27、改變的。(2)阻塞()阻塞(blocking)賦值方式賦值方式賦值符號為賦值符號為“=”, 如:如:b= a; 阻塞賦值在該語句結(jié)束時就立即完成賦值操作,即阻塞賦值在該語句結(jié)束時就立即完成賦值操作,即b的值的值在該條語句結(jié)束后立刻改變。如果在一個塊語句中,有多條在該條語句結(jié)束后立刻改變。如果在一個塊語句中,有多條阻塞賦值語句,那么在前面的賦值語句沒有完成之前,后面阻塞賦值語句,那么在前面的賦值語句沒有完成之前,后面的語句就不能被執(zhí)行,仿佛被阻塞了(的語句就不能被執(zhí)行,仿佛被阻塞了(blocking)一樣,因一樣,因此稱為阻塞賦值方式。此稱為阻塞賦值方式。非阻塞賦值非阻塞賦值module non
28、_block(c,b,a,clk);output c,b; input clk,a;reg c,b;always (posedge clk) begin b=a; c=b; endendmodule阻塞賦值阻塞賦值module block(c,b,a,clk);output c,b;input clk,a;reg c,b;always (posedge clk) begin b=a; c=b; endendmodule同時同時 順序順序module non_block(c,b,a,clk);output c,b; reg c,b;input clk,a;always (posedge clk)
29、 begin b=a; endalways (posedge clk) begin c=b; endendmodule 非阻塞賦值仿真波形圖非阻塞賦值仿真波形圖 阻塞賦值仿真波形圖阻塞賦值仿真波形圖 非阻塞賦值綜合結(jié)果非阻塞賦值綜合結(jié)果阻塞賦值綜合結(jié)果阻塞賦值綜合結(jié)果o 在可綜合的硬件設計中,使用阻塞和非阻塞賦值在可綜合的硬件設計中,使用阻塞和非阻塞賦值語句時,應注意以下原則語句時,應注意以下原則(1)當用)當用“always”塊來描述組合邏輯時,既可以用阻塞塊來描述組合邏輯時,既可以用阻塞賦值,也可以采用非阻塞賦值,應盡量使用阻塞賦值。賦值,也可以采用非阻塞賦值,應盡量使用阻塞賦值。(2)對
30、時序邏輯描述和建模,使用非阻塞賦值方式。)對時序邏輯描述和建模,使用非阻塞賦值方式。(3)為鎖存器()為鎖存器(Latch)建模,應使用非阻塞賦值。)建模,應使用非阻塞賦值。(4)若在同一個)若在同一個“always”過程塊中既為組合邏輯建模,過程塊中既為組合邏輯建模,又為時序邏輯建模,最好使用非阻塞賦值方式。又為時序邏輯建模,最好使用非阻塞賦值方式。 例例10.13o 在可綜合的硬件設計中,使用阻塞和非阻塞在可綜合的硬件設計中,使用阻塞和非阻塞賦值語句時,應注意以下原則賦值語句時,應注意以下原則(5)在一個)在一個“always”過程塊中,最好不要混合使過程塊中,最好不要混合使用阻塞賦值和非
31、阻塞賦值,雖然同時使用這兩種賦用阻塞賦值和非阻塞賦值,雖然同時使用這兩種賦值方式在綜合時并不一定會出錯,但對同一個變量值方式在綜合時并不一定會出錯,但對同一個變量不能既進行阻塞賦值,又進行非阻塞賦值,這樣在不能既進行阻塞賦值,又進行非阻塞賦值,這樣在綜合時會報錯。綜合時會報錯。例例10.1415(6)不能在兩個或兩個以上的)不能在兩個或兩個以上的“always”過程塊中過程塊中對同一個變量賦值,這樣會引發(fā)沖突,在綜合時會對同一個變量賦值,這樣會引發(fā)沖突,在綜合時會報錯。報錯。mod13BCD(7)仿真時使用)仿真時使用$strobe顯示非阻塞賦值的變量。顯示非阻塞賦值的變量。o assign
32、cout=(qout=9)?1:0;條件運算符omodule paobiao(clk,clr,pause,msh,msl,sh,sl,mh,ml);oinput clk,clr,pause;output3:0 msh,msl,sh,sl,mh,ml;oreg3:0 msh,msl,sh,sl,mh,ml;oreg cn1,cn2;/cn1為百分秒向秒的進位,cn2為秒向分的進位o/*百分秒計數(shù)進程,每滿100,cn1產(chǎn)生一個進位* o/*秒計數(shù)進程,每計滿60,cn2產(chǎn)生一個進位*o oalways (posedge cn1 or posedge clr)obegin if(clr) begi
33、n sh,sl=8h00;cn2=0;end/異步復位oelse if(sl=9) /低位是否為9obegin sl=0;oif(sh=5) begin sh=0;cn2=1;endoelse sh=sh+1;endoelse begin sl=sl+1;cn2=0;end oendo/*分鐘計數(shù)進程,每計滿60,系統(tǒng)自動清零oalways (posedge cn2 or posedge clr)obegin if(clr) begin mh,ml=8h00;end/異步復位oelse if(ml=9)obegin ml=0;oif(mh=5) mh=0;oelse mh=mh+1;endoe
34、lse ml=ml+1;/begin cn2=0;endoendoendmodule/*行為描述*/【例例10.9】 阻塞賦值方式描述的移位寄存器阻塞賦值方式描述的移位寄存器1module block1(q0,q1,q2,q3,din,clk);input clk,din; output reg q0,q1,q2,q3;always (posedge clk)begin q3=q2; /注意賦值語句的順序注意賦值語句的順序 q2=q1; q1=q0; q0=din;end endmoduleo 例例10.9的的RTL綜合結(jié)果綜合結(jié)果 【例例10.10】 阻塞賦值方式描述的移位寄存器阻塞賦值方式
35、描述的移位寄存器2。module block2(q0,q1,q2,q3,din,clk);input clk,din; output reg q0,q1,q2,q3;always (posedge clk)begin q3=q2; q1=q0; /該句與下句的順序與例該句與下句的順序與例10.9顛倒顛倒 q2=q1; q0=din;end endmoduleo 例例10.10的的RTL綜合結(jié)果綜合結(jié)果 【例例10.11】 阻塞賦值方式描述的移位寄存器阻塞賦值方式描述的移位寄存器3。module block3(q0,q1,q2,q3,din,clk);input clk,din; output
36、reg q0,q1,q2,q3;always (posedge clk)begin q0=din; /4條賦值語句的順序與例條賦值語句的順序與例10.9中完全顛倒中完全顛倒 q1=q0; q2=q1; q3=q2;end endmoduleo 例例10.11的的RTL綜合結(jié)果綜合結(jié)果 【例例10.12】 非阻塞賦值方式描述的移位寄存器。非阻塞賦值方式描述的移位寄存器。module block4(q0,q1,q2,q3,din,clk);input clk,din; output reg q0,q1,q2,q3;always (posedge clk)begin q3=q2; q1=q0; q2
37、=q1; q0=din;end endmoduleo 例例10.12的的RTL綜合結(jié)果綜合結(jié)果 o 對于阻塞賦值來說,賦值語句的順序?qū)ψ詈髮τ谧枞x值來說,賦值語句的順序?qū)ψ詈蟮木C合結(jié)果有著直接的影響。而如果采用非的綜合結(jié)果有著直接的影響。而如果采用非阻塞賦值方式來描述的話,則可以不考慮賦阻塞賦值方式來描述的話,則可以不考慮賦值語句的排列順序,只需將其連接關系描述值語句的排列順序,只需將其連接關系描述清楚即可。清楚即可。o 例例10.12o( if-else語句)語句)o if-else語句使用方法有以下語句使用方法有以下3種:種:(1)if(表達式)表達式) 語句語句1;/非完整性非完整性i
38、f語句語句(2)if(表達式)表達式) 語句語句1; /二重選擇的二重選擇的if語句語句 else 語句語句2;(3)if(表達式表達式1) 語句語句1; /多重選擇的多重選擇的if語句語句 else if(表達式表達式2) 語句語句2; else if(表達式表達式3) 語句語句3; else if(表達式表達式n) 語句語句n; else 語句語句n+1;o 要點:o 表達式為邏輯表達式,其值為時為值真;0, x, z為假。o 語句若為多句,用 begin-end括起來。o if語句的嵌套,最好用 begin-end括起來。always(posedge co or negedge en)/
39、A state machine for preset valuesbeginif(!en)beginAVALUE=agreen;/initial value,important!state=1;endelsebegincase(state)0:begin AVALUE=agreen;state=1;end1:begin AVALUE=ayellow;state=2;end2:begin AVALUE=aleft;state=3;end3:begin AVALUE=ayellow;state=4;end4:begin AVALUE=ared;state=0;endendcaseendendIf語
40、句實例modulepulse(in,clk,out);inputin,clk;outputout;regout;reg1:0counter;regflag;always(posedgeclk)beginif(in)beginif(!flag)beginout=1;counter=counter+1;endif(counter=3)beginout=0;flag=1;endendelsebeginflag=0;counter=0;out=0;endendendmodule例:脈沖發(fā)生器o/*秒計數(shù)進程,每計滿秒計數(shù)進程,每計滿60,cn2產(chǎn)生一產(chǎn)生一個進位個進位*oalways (posedge
41、 cn1 or posedge clr)o begin if(clr) begin sh,sl=8h00;cn2=0;end/異步復位,異步復位,位拼接運算符oelse if(sl=9) /低位是否為低位是否為9o begin sl=0;oif(sh=5) begin sh=0;cn2=1;endoelse sh=sh+1;o endo else begin sl=sl+1;cn2=0;end o end o /assign cout=(qout=8d59)?1:0; Xo 條件運算符o 模模12BCD碼加法計數(shù)器?碼加法計數(shù)器?o output7:0 qout;o 59的的BCD表示表示 q
42、out7:4=0101& qout3:0= 1001o 12的BCD(qout4=1&qout1=1)等價于等價于qout7:4=0001& qout3:0= 00102.2-置零法置零法【例6.15】模60BCD碼計數(shù)器-多重嵌套的if語句omodule count_60(qout,cout,data,load,reset,clk);ooutput7:0 qout;ooutput cout;oinput7:0 data;oinput load,clk,reset;oreg7:0 qout;oalways(posedge clk)oBegin if(reset) qout=0; /同步復位同步
43、復位oelse if(load) qout=data; /同步置數(shù);同步置數(shù);oelseobeginoif(qout3:0=9) /模模10控制;控制;obeginoqout3:0=0; /域域選擇選擇oif(qout7:4=5) qout7:4=0; /模模60控制;控制;oelse qout7:4=qout7:4+1; /域域選擇選擇oendoelse qout3:0=qout3:0+1;oendoendoassign cout=(qout=8d59)?1:0; /進位控制;進位控制; Xo/qout7:4=0101& qout3:0= 1001oendmodule/模模60BCD碼減法計
44、數(shù)器?碼減法計數(shù)器?o 1、case語句語句o case語句的使用格式如下。語句的使用格式如下。 case (敏感表達式)敏感表達式) 值值1: 語句語句1;/case分支項分支項 值值2: 語句語句2; 值值n: 語句語句n; default:語句語句n+1; endcaseo 要點:o 敏感表達式一般為一個變量或表達式;o 一般要列出敏感表達式的所有可能取值,不能窮舉時,剩余其它情況執(zhí)行 default語句;o 多用于條件譯碼電路,如描述譯碼器、數(shù)據(jù)選擇器、狀態(tài)機及微處理器的指令譯碼等;【例例4.5】 三人表決電路的三人表決電路的Verilog描述描述-P107 數(shù)據(jù)流描述數(shù)據(jù)流描述 VS
45、P149 【例例6.16】行為描述行為描述 module vote(a,b,c,f);/模塊名與端口列表模塊名與端口列表input a,b,c;/模塊的輸入端口模塊的輸入端口output f;/模塊的輸出端口模塊的輸出端口wire a,b,c,f; /定義信號的數(shù)據(jù)類型定義信號的數(shù)據(jù)類型assign f=(a&b)|(a&c)|(b&c);/邏輯功能描述邏輯功能描述Endmodule/&和和|屬于位運算符,分別表示按位與、按位或?qū)儆谖贿\算符,分別表示按位與、按位或/23 25 27 -for參考參考P150例例6.171、位拼接運算符、位拼接運算符 input3:0 indec; input
46、D3,D2,D1,D0;assign indec= D3,D2,D1,D0;output6:0 decodeout;output a,b,c,d,e,f,g;assign decodeout= a,b,c,d,e,f,g;2、一個共陰、一個共陰數(shù)碼管3、段碼與位碼4、靜態(tài)與動態(tài)顯示module decode4_7(decodeout,indec);output6:0 decodeout;input3:0 indec; reg6:0 decodeout;always (indec) begin case(indec) /用用case語句進行譯碼語句進行譯碼 4d0:decodeout=7b111
47、1110; 4d1:decodeout=7b0110000; 4d2:decodeout=7b1101101; 4d3:decodeout=7b1111001; 4d4:decodeout=7b0110011; 4d5:decodeout=7b1011011; 4d6:decodeout=7b1011111; 4d7:decodeout=7b1110000; 4d8:decodeout=7b1111111; 4d9:decodeout=7b1111011; default: decodeout=7bx; endcase endendmodule2、casez與與casex語句語句1)當case
48、的分支取值某些位為高阻z,那末對這些位不予比較,只關注別的位的比較結(jié)果,這時用casez語句;)當case的分支取值某些位為不定值x,那末對這些位不予比較,只關注別的位的比較結(jié)果,這時用casex語句;Casez(select)4b?1:out=a;4b?10:out=b;4b?100:out=c;4b1000:out=d;endcase參考參考P151例例6.19o repeat loopinitialbeginfor(i=0;i4;i=i+1)out=out+1;endinitialbeginrepeat(5)out=out+1;endinitialbegini=0;while(i0)i=
49、i+1;endn for loopn while loop在在Verilog中存在四種類型的循環(huán)語句,用來控制語句的執(zhí)行次數(shù)。這四中存在四種類型的循環(huán)語句,用來控制語句的執(zhí)行次數(shù)。這四種語句分別為種語句分別為:(1)forever:連續(xù)地執(zhí)行語句;多用在連續(xù)地執(zhí)行語句;多用在“initial”塊中,以生成時鐘等周塊中,以生成時鐘等周期性波形。期性波形。(2)repeat:連續(xù)執(zhí)行一條語句連續(xù)執(zhí)行一條語句n次。次。(3)while:執(zhí)行一條語句直到某個條件不滿足。執(zhí)行一條語句直到某個條件不滿足。(4)for:有條件的循環(huán)語句。有條件的循環(huán)語句。o for語句的使用格式如下(同語句的使用格式如下(
50、同C語言):語言):for(表達式表達式1;表達式;表達式2;表達式;表達式3)語句;)語句;即:即:for(循環(huán)變量賦初值;循環(huán)結(jié)束條件;循循環(huán)變量賦初值;循環(huán)結(jié)束條件;循環(huán)變量增值)執(zhí)行語句;環(huán)變量增值)執(zhí)行語句;P153- P153- 例例6.216.21 例例6.16 case6.16 casemodule voter7(pass,vote);output pass;input6:0 vote;reg2:0 sum; integer i; reg pass;always (vote) begin sum=0;for(i=0;i=4else pass=0; endendmodule含主、
51、副專家裁判含主、副專家裁判5人表決器?人表決器?o repeat語句的使用格式為:語句的使用格式為: repeat(循環(huán)次數(shù)表達式)循環(huán)次數(shù)表達式) 語句;語句;或或 repeat(循環(huán)次數(shù)表達式)循環(huán)次數(shù)表達式) begin endmodule mult_repeat(outcome, a, b);parameter size=8; / 參數(shù)定義參數(shù)定義 inputsize:1 a,b;output2*size:1 outcome;reg2*size:1 temp_a,outcome;regsize:1 temp_b;always (a or b)begin outcome=0; temp_
52、a=a; temp_b=b;repeat(size) /repeat語句,語句,size為循環(huán)次數(shù)為循環(huán)次數(shù)beginif(temp_b1) /如果如果temp_b的最低位為的最低位為1,就執(zhí)行下面的加法,就執(zhí)行下面的加法outcome=outcome +temp_a;temp_a=temp_a1; /操作數(shù)操作數(shù)b右移一位右移一位end endendmoduleo Verilog允許在程序中使用特殊的編譯向?qū)г试S在程序中使用特殊的編譯向?qū)В–ompiler Directives)語句,在編譯時,通常先語句,在編譯時,通常先對這些向?qū)дZ句進行對這些向?qū)дZ句進行“預處理預處理”,然后再將預處,然
53、后再將預處理的結(jié)果和源程序一起進行編譯。理的結(jié)果和源程序一起進行編譯。o 向?qū)дZ句以符號向?qū)дZ句以符號“”開頭,以區(qū)別于其它語句。開頭,以區(qū)別于其它語句。Verilog提供了十幾條編譯向?qū)дZ句,如:提供了十幾條編譯向?qū)дZ句,如:define、ifdef、else、endif、restall等。比較常用的有等。比較常用的有define,include和和ifdef、else、endif等。等。 o define語句用于將一個簡單的名字或標志符(或稱語句用于將一個簡單的名字或標志符(或稱為宏名)來代替一個復雜的名字或字符串,其使為宏名)來代替一個復雜的名字或字符串,其使用格式為:用格式為: def
54、ine 宏名(標志符)宏名(標志符) 字符串字符串 如:如: define sum define sum ina+inb+inc+indina+inb+inc+ind 在上面的語句中,用簡單的宏名在上面的語句中,用簡單的宏名sum來代替了一個來代替了一個復雜的表達式復雜的表達式ina+inb+inc+ind,采用了這樣的定采用了這樣的定義形式后,在后面的程序中,就可以直接用義形式后,在后面的程序中,就可以直接用sum來來代表表達式代表表達式ina+inb+inc+ind了。了。o include是文件包含語句,它可將一個文件全部包是文件包含語句,它可將一個文件全部包含到另一個文件中。其格式為:
55、含到另一個文件中。其格式為:include “文件名文件名”o 使用使用include語句時應注意以下幾點:語句時應注意以下幾點:(1)一個)一個include語句只能指定一個被包含的文件。語句只能指定一個被包含的文件。(2)include語句可以出現(xiàn)在源程序的任何地方。被語句可以出現(xiàn)在源程序的任何地方。被包含的文件若與包含文件不在同一個子目錄下,必包含的文件若與包含文件不在同一個子目錄下,必須指明其路徑名。須指明其路徑名。(3)文件包含允許多重包含,比如文件)文件包含允許多重包含,比如文件1包含文件包含文件2,文件文件2又包含文件又包含文件3等。等。 o 任務(任務(task)o 任務定義格
56、式:任務定義格式: task ; /注意無端口列表注意無端口列表 端口及數(shù)據(jù)類型聲明語句;端口及數(shù)據(jù)類型聲明語句; 其它語句;其它語句; endtasko 任務調(diào)用的格式為:任務調(diào)用的格式為: (端口(端口1,端口,端口2,);o 需要注意的是:任務調(diào)用時和定義時的端口變量應是一需要注意的是:任務調(diào)用時和定義時的端口變量應是一一對應的。一對應的。o 任務的定義與調(diào)用須在一個任務的定義與調(diào)用須在一個module模塊內(nèi)。模塊內(nèi)。o 定義任務時,沒有端口名列表,但需要緊接著進行定義任務時,沒有端口名列表,但需要緊接著進行輸入輸出端口和數(shù)據(jù)類型的說明。輸入輸出端口和數(shù)據(jù)類型的說明。o 當任務被調(diào)用時,
57、任務被激活。當任務被調(diào)用時,任務被激活。任務的調(diào)用與模塊任務的調(diào)用與模塊調(diào)用一樣通過任務名調(diào)用實現(xiàn),調(diào)用一樣通過任務名調(diào)用實現(xiàn),調(diào)用時,需列出端調(diào)用時,需列出端口名列表,端口名的排序和類型必須與任務定義中口名列表,端口名的排序和類型必須與任務定義中的相一致。的相一致。o 一個任務可以調(diào)用別的任務和函數(shù),可以調(diào)用的任一個任務可以調(diào)用別的任務和函數(shù),可以調(diào)用的任務和函數(shù)個數(shù)不限。務和函數(shù)個數(shù)不限。 o 函數(shù)的目的是返回一個值,以用于表達式計算函數(shù)的目的是返回一個值,以用于表達式計算o 函數(shù)的定義格式:函數(shù)的定義格式: function 函數(shù)名;函數(shù)名; 端口聲明;端口聲明; 局部變量定義;局部變量
58、定義; 其它語句;其它語句;endfunctiono 是一個可選項,如果是一個可選項,如果缺省,則返回值為缺省,則返回值為1位寄存器類型的數(shù)據(jù)。位寄存器類型的數(shù)據(jù)。function7:0 get0;input7:0 x; reg7:0 count;integer i; begin count=0; for (i=0;i=7;i=i+1) if(xi=1b0) count=count+1; get0=count; endendfunction 上面的上面的get0函數(shù)循環(huán)核對輸入數(shù)據(jù)函數(shù)循環(huán)核對輸入數(shù)據(jù)x的每一位,計算出的每一位,計算出x中中0的個數(shù),并返回一個適當?shù)闹怠5膫€數(shù),并返回一個適當?shù)?/p>
59、值。o 函數(shù)的定義與調(diào)用須在一個函數(shù)的定義與調(diào)用須在一個module模塊內(nèi)。模塊內(nèi)。o 函數(shù)只允許有輸入變量且必須至少有一個輸入變量,函數(shù)只允許有輸入變量且必須至少有一個輸入變量,輸出變量由函數(shù)名本身擔任,在定義函數(shù)時,需對函數(shù)輸出變量由函數(shù)名本身擔任,在定義函數(shù)時,需對函數(shù)名說明其類型和位寬。名說明其類型和位寬。o 定義函數(shù)時,沒有端口名列表,但調(diào)用函數(shù)時,需列定義函數(shù)時,沒有端口名列表,但調(diào)用函數(shù)時,需列出端口名列表,端口名的排序和類型必須與定義時的相出端口名列表,端口名的排序和類型必須與定義時的相一致。這一點與任務相同一致。這一點與任務相同o 函數(shù)可以出現(xiàn)在持續(xù)賦值函數(shù)可以出現(xiàn)在持續(xù)賦值
60、assign的右端表達式中。的右端表達式中。o 函數(shù)不能調(diào)用任務,而任務可以調(diào)用別的任務和函數(shù),函數(shù)不能調(diào)用任務,而任務可以調(diào)用別的任務和函數(shù),且調(diào)用任務和函數(shù)個數(shù)不受限制。且調(diào)用任務和函數(shù)個數(shù)不受限制。o【例例7.26】 用函數(shù)定義的用函數(shù)定義的8線線3線優(yōu)先編碼器線優(yōu)先編碼器74148的的Verilog描述描述omodule coder83(din,dout);oinput7:0 din;ooutput2:0 dout;ofunction2:0 code; /函數(shù)定義函數(shù)定義oinput7:0 din; /函數(shù)只有輸入端口,輸出為函數(shù)函數(shù)只有輸入端口,輸出為函數(shù)名本身名本身oif(din7
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025裝修工程合同書范文
- 2025版本的申通快遞運輸合同
- 人教部編版一年級上冊課文 39 明天要遠足教學設計及反思
- 2025年江西省建筑施工企業(yè)勞動合同樣本
- 2025教育器材采購合同
- 2025年土地轉(zhuǎn)讓合同范本
- 2025租房合同修訂范本
- 《環(huán)保法規(guī)概要》課件
- 《法學專業(yè)指導》課件 - 深入解讀法律學科
- 《商用中央空調(diào)市場拓展策略》課件
- 2025世界防治哮喘日知識講座專題課件
- 糧食安全時政試題及答案
- 小學開展常規(guī)教育經(jīng)驗交流活動方案
- 第四單元專題學習《孝親敬老傳承家風》公開課一等獎創(chuàng)新教學設計-(同步教學)統(tǒng)編版語文七年級下冊名師備課系列
- 茂名市生活垃圾焚燒發(fā)電項目
- 2025年03月四川成都農(nóng)業(yè)科技中心公開招聘筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 大學英語四級考試2024年6月真題(第1套)翻譯
- 2024年鄭州鐵路職業(yè)技術學院單招職業(yè)技能測試題庫必考題
- 2025年03月國家機關事務管理局所屬事業(yè)單位公開招聘應屆畢業(yè)生14人筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 城市交通中的共享出行模式研究
- 全過程工程咨詢投標方案(技術方案)
評論
0/150
提交評論