




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 抽象的級別和它們對應(yīng)的模塊類型??梢苑譃橐韵?種,即Verilog浯法支持?jǐn)?shù)字電路系統(tǒng)的5種不同描述方法: (1)(1)系統(tǒng)級系統(tǒng)級(system)(system); (2)(2)算法級算法級(algorithmic)(algorithmic); (3)RTL(3)RTL級級(Register-Transfer-Level)(Register-Transfer-Level); (4)(4)門級門級(gate-level)(gate-level); (5)(5)開關(guān)級開關(guān)級(switch-level)(switch-level)。 系統(tǒng)級、算法級和系統(tǒng)級、算法級和RTLRTL級是屬于行為級的。
2、門級是屬于結(jié)構(gòu)級是屬于行為級的。門級是屬于結(jié)構(gòu)級的。級的。 對于數(shù)字系統(tǒng)的邏輯設(shè)計(jì)工程師而言,熟練地掌握門級、RTL級,算法級、系統(tǒng)級是非常重要的。而對于電路基本部件(如與或非門、緩沖器、驅(qū)動器等)庫的設(shè)計(jì)者而言,則需要掌握用戶自定義源語元件(UDP)和開關(guān)級的描述。 一個(gè)邏輯電路是由許多邏輯門和開關(guān)所組成,因此用基本邏輯門的模型來描述邏輯電路結(jié)構(gòu)是最直觀的。Verilog HDL提供了一些描述門類型的關(guān)鍵宇,可以用于門級結(jié)構(gòu)建模。9.1.1 與非門、或門和反向器及其說明語法 Verilog HDL中有關(guān)門類型的關(guān)鍵字共有26個(gè),在本教材中只介紹最基本的8個(gè)。有關(guān)其他的門類型關(guān)鍵字,讀者可以通
3、過語法篇:Verilog硬件描述語言參考手冊,在設(shè)計(jì)的實(shí)踐中逐步掌握。下面列出了8個(gè)基本的門類型關(guān)鍵字和它們所表示的門的類型: and 與門; nand 與非門; nor 或非門; or 或門; xor 異或門; xnor 異或非門; buf 緩沖器; not 非門。 門與開關(guān)的說明語法可以用標(biāo)準(zhǔn)的聲明語句格式和一個(gè)簡單的實(shí)例引用加以說明。門聲明語句的格式如下: ,; 門的類型是門聲明語句所必須的,它可以是Verilog HDL語法規(guī)定的26種門類型中的任意一種。驅(qū)動能力和延時(shí)是可選項(xiàng),可根據(jù)不同的情況選不同的值或不選。門實(shí)例1是在本模塊中引用的第一個(gè)這種類型的門的名稱及其端口定義,而門實(shí)例n
4、是引用的第n個(gè)這種類型的門的名稱及其端口定義。有關(guān)驅(qū)動能力的選項(xiàng)在以后的章節(jié)里再詳細(xì)加以介紹。下面用一個(gè)具體的例子來說明門類型的引用: nand #10 nd1(a,data,clock,clear); 該例說明在模塊中使用了一個(gè)名為nd1的與非門(nand),輸入為data、clock和clear,輸出為a,輸出與輸入的延時(shí)為10個(gè)單位時(shí)間。 Verilog語法支持的基本邏輯部件其行為是由該基本邏輯部件的原語(Primitive)提供的,原語部件和本講中13節(jié)介紹的UDP沒有本質(zhì)上的差別。Verilog編譯或解釋器能正確地處理有關(guān)原語部件的語法現(xiàn)象。9.1.2 用門級結(jié)構(gòu)描述D觸發(fā)器 例9.
5、1是用Verilog HDL語言描述的D型主從觸發(fā)器模塊,通過這個(gè)例子,可以學(xué)習(xí)門級結(jié)構(gòu)建模的基本方法。 【例91】 用基本邏輯單元組成觸發(fā)器。 module flop(data,clock,clear,q,qb); input data,clock,clear; output q,qb; nand #10 nd1(a,data,clock,clear), /注意結(jié)束時(shí)用逗號,最后才用分號 nd2(b,ndata,clock), /表示nd1到nd8都是nand(與非門) nd4(d,c,b,clear), nd5(e,c,nclock), nd6(f,d,nclock), nd8(qb,q,
6、f,clear); nand #9 nd3(c,a,d), nd7(q,e,qb); not #10 iv1(ndata,data), iv2(nclock,clock);endmodule 注意:可綜合代碼中不能出現(xiàn)“# d”延時(shí)控制語句! 在這個(gè)Verilog HDL結(jié)構(gòu)描述的模塊中,flop定義了模塊名,設(shè)計(jì)上層模塊時(shí)可以用模塊名(flop)調(diào)用這個(gè)模塊;module,input,output,endmodule等都是關(guān)鍵字;nand和not分別表示與非門和反相器,在Verilog語法中有這兩個(gè)基本邏輯單元的行為,它們由原語(Primitive)描述,這是一種類似真值表的描述(見本講13
7、節(jié)用戶定義的原語UDP);#10和#9分別表示10個(gè)和9個(gè)單位時(shí)間的延時(shí);nd1,nd2,nd8,iv1,iv2分別為圖211中的各個(gè)基本部件。圖9.1 D型主從觸發(fā)器的電路結(jié)構(gòu)圖 9.1.3 由已經(jīng)設(shè)計(jì)成的模塊構(gòu)成更高一層的模塊 如果已經(jīng)編制了一個(gè)模塊,如1.1.2節(jié)中的flop,可以在另外的模塊中引用這個(gè)模塊。引用的方法與門類型的實(shí)例引用非常類似,只需在前面寫上已編的模塊名,緊跟著寫上本模塊引用的實(shí)例名,按順序?qū)懮蠈?shí)例的端口名即可,也可以用已編模塊的端口名按對應(yīng)的原則逐一填入,見下面的兩條語句: (1) flop flop_d(d1,clk,clrb,q,qn); (2)flop flop
8、_d(clock(clk),.q(q),.clear(clrb),.qb(qn),.data(d1); 這兩條語句都表示實(shí)例flop_d引用已編模塊flop。從中可以看出引用時(shí)flop_d的端口信號與flop的端口對應(yīng)有兩種不同的表示方法。模塊的端口名可以按序排列也可以不必按序排列。如果模塊的端口名按序排列,只需按序列出實(shí)例的端口名(見語句1)。如果模塊的端口名不按序排列,則實(shí)例的端口信號和被引用模塊的端口信號必須一一列出(見語句2)。 例92引用了9.1.2節(jié)中已設(shè)計(jì)的模塊flop,用它構(gòu)成一個(gè)4位寄存器?!纠?2】用觸發(fā)器組成帶清零端的4位寄存器。 include “flopv” modu
9、le hardreg(d,clk,clrb,q); Input clk,clrb; input 3:0 d; output 3:0 q; flop f1(d0,clk,clrb,q0,), 注意結(jié)束時(shí)用逗號,最后才用分號 f2(d1,clk,clrb,q1,), 表示f1到f4都是flop f3(d2,clk,clrb,q2,), f4(d3,clk,clrb,q3,); endmodule 在上面這個(gè)結(jié)構(gòu)描述的模塊中,hardreg定義了模塊名;f1,f2,f3,f4分別為圖2.1.2中的各個(gè)基本部件,而其后面括號中的參數(shù)分別為圖2.1.2中各基本部件的輸入、輸出信號。請注意當(dāng)請注意當(dāng)f1f
10、1f4f4實(shí)例引用已編模塊實(shí)例引用已編模塊flopflop時(shí),由于不時(shí),由于不需要需要flopflop端口中的端口中的qbqb口,故在引用時(shí)把它省去,但逗號仍需要保留???,故在引用時(shí)把它省去,但逗號仍需要保留。圖9.2 4位寄存器電路結(jié)構(gòu)圖 對于上面兩個(gè)例子,還可以用比較抽象Veritog描述方法來建立模型。 【例93】 用行為描述的方法來描述帶清零端的4位寄存器。 module hardreg(d,clk,clrb,q); input clk,clrb; input 3:0 d; output 3:0 q; reg 3:0q; always (posedge clk or posedge c
11、lrb) begin if(clrb) q0; else qend_first_pass; end $finish; endendmodule 在上面的例子中,大家看到了一個(gè)前面未見過的語法現(xiàn)象:event。它用來定義一個(gè)事件,以便在后面的操作中觸發(fā)這一事件。它的觸發(fā)方式是: #time(事件名) 表示等待time個(gè)時(shí)間單位后,立即觸發(fā)事件 上面簡單地介紹了利用Verilog HDL門級結(jié)構(gòu)建模,來設(shè)計(jì)復(fù)雜數(shù)字電路的最基本的思路。而實(shí)用的電路設(shè)計(jì)往往并沒有那么簡單,常需要利用多種方法來建立電路模型,既利用電路圖輸入的方法又利用Verilog HDL各種建模的方法,發(fā)揮各自在不同類型電路描述中的
12、長處。而且要在層次管理工具的協(xié)調(diào)下把各個(gè)既獨(dú)立又互相聯(lián)系的模塊組織成復(fù)雜的大型數(shù)字電路,只有這樣才能有效地設(shè)計(jì)出高質(zhì)量的數(shù)字電路來。10.1 加法器4位并行加法器: module add_4(X,Y,sum,C); input 3:0 X,Y; output3:0 sum; output C; assign C, sumX+Y; endmodule16位并行加法器只需擴(kuò)大位數(shù)即可: module add_16(X,Y,sum,C); input 15:0 X,Y; output 15;0 sum; output C; assign C, sumX+Y; endmodule用Verilog HD
13、L來描述乘法器是相當(dāng)容易的,只需要把運(yùn)算表達(dá)式寫出就可以了,見下列程序: module mult_4(X,Y,Product); input 3:0 X,Y; output 7:0 Product; assign Product=X*Y; endmodule 而8位乘法器只需要擴(kuò)大位數(shù)即可,見下列程序: module mult 8(X,Y,Product); input 7:0 X,Y; output 15:0 Product; assign ProductX*Y; endmodule module compare_n (X,Y,XGY,XSY,XEY); input width-1:0 X,
14、Y; output XGY, XSY,XEY; reg XGY, XSY, XEY; parameter width8; always (X or Y) 每當(dāng)X或Y變化時(shí) begin if(XY) XEY1; 設(shè)置X等于Y的信號為1 else XEY0; if(XY) XGY1; 設(shè)置X大于Y的信號為1 else XGY0; if(XY) XSY1; 設(shè)置X小于Y的信號為l else XSY0; end endmodule地址1 地址2 輸入1 輸入2 輸入3 輸入4 輸出 0 0in1in2in3in4輸入1 0 1in1in2in3in4輸入2 1 0in1in2in3in4輸入3 1 1
15、in1in2in3in4輸入4表10.3 四選一功能輸出module Mux_8(addr,in1,in2,in3,in4,in5,in6,in7,in8,Mout,nCS); input 2:0 addr; input with-1:0 in1,in2,in3,in4,in5,in6,in7,in8; input nCS; output wdth-1:0 Mout; reg wdth-1:0 Mout; parameter with8; always (addr or in1 or in2 or in3 or in4 or in5 or in6 or in7 or in8 or nCS) b
16、egin if(!nCS) nCS低電平使多路選擇器工作 case(addr) 3b000: Moutin1; 3b001: Moutin2; 3b010: Moutin3; 3b011: Moutin4; 3b100: Moutin5; 3b101: Moutin6; 3b110: Moutin7; 3b111: Moutin8; endcase else nCS高電子關(guān)閉多路選擇器 Mout0; end endmodule 總線是運(yùn)算部件之間數(shù)據(jù)流通的公共通道。在硬線邏輯構(gòu)成的運(yùn)算電路中只要電路的規(guī)模允許,我們可以比較自由地來確定總線的位寬,因此可以大大提高數(shù)據(jù)流通的速度。適當(dāng)?shù)目偩€位寬,
17、配合適當(dāng)并行度的運(yùn)算邏輯和步驟,就能顯著地提高專用信號處理邏輯電路的運(yùn)算能力。各運(yùn)算部件和數(shù)據(jù)寄存器組可以通過帶控制端的三態(tài)門與總線的連接。通過對控制端電平的控制來確定在某一時(shí)間片段內(nèi),總線歸哪兩個(gè)或哪幾個(gè)部件使用(任何時(shí)間片段只能有一個(gè)部件發(fā)送,但可以有一個(gè)或幾個(gè)接收)。用Verilog描述總線和總線操作是非常簡單的。下面是一個(gè)簡單的與總線有接口的模塊是如何對總線進(jìn)行操作的例子:圖10.6 三態(tài)數(shù)據(jù)總線的開關(guān)邏輯圖 module SampleOfBus(DataBus,read,write) inout 11:0 DataBus; /12位寬的總線雙向端口 input read,write;
18、 /向總線輸出數(shù)據(jù)的控制電平 reg 11:0 outsigs; /模塊內(nèi)12位寬數(shù)據(jù)寄存器 assign DataBus(read)?outsigs:12h zzz; /當(dāng)read為高電平時(shí)通過總線把儲存在outsigs的計(jì)算結(jié)果輸出 always (posedge write) /每當(dāng)write信號上跳沿時(shí) begin /接收總線上數(shù)據(jù) outsigs=DataBus; /把計(jì)算結(jié)果存入outsigs end endmodule總時(shí)間:max(max(T1,T3)+Tco,(T2+Tco)TcoT1,T2,T3傳播延遲時(shí)間:max(T1,T3)+T2clock 10nsS2開關(guān)S1tttS
19、nS3tttS4就可以產(chǎn)生任意復(fù)雜程度的時(shí)序邏輯 圖12.1表示的是時(shí)鐘同步狀態(tài)機(jī)的結(jié)構(gòu)。 狀態(tài)寄存器是由 一組觸發(fā)器組成,用來記憶狀態(tài)機(jī)當(dāng)前所處的狀態(tài)。如果狀態(tài)寄存器由n個(gè)觸發(fā)器組成,這個(gè)狀態(tài)機(jī)最多可以記憶2n個(gè)狀態(tài)。 所有的觸發(fā)器的時(shí)鐘端都連接在個(gè)共同的時(shí)鐘信號上,所以狀態(tài)的改變只可能發(fā)生在時(shí)鐘的跳變沿時(shí)刻??赡馨l(fā)生的狀態(tài)的改變由正跳變還是由負(fù)跳變觸發(fā),取決于觸發(fā)器的類型。狀態(tài)是否改變、怎樣改變還將取決于產(chǎn)生下一狀態(tài)的組合邏輯F的輸出,F(xiàn)是當(dāng)前狀態(tài)和輸入信號的函數(shù)。狀態(tài)機(jī)的輸出是由輸出組合邏輯G提供的,G也是當(dāng)前狀態(tài)和輸入信號的函數(shù)。 圖中的F和G兩部分都是純組合邏輯,它們的邏輯函數(shù)表達(dá)式
20、如下:下一個(gè)狀態(tài)=F(當(dāng)前狀態(tài),輸入信號);輸出信號=G(當(dāng)前狀態(tài),輸入信號);如果時(shí)序邏輯的輸出不僅取決于狀態(tài)還取決于輸入,稱之為如果時(shí)序邏輯的輸出不僅取決于狀態(tài)還取決于輸入,稱之為Mealy狀態(tài)機(jī)。狀態(tài)機(jī)。如果時(shí)序邏輯的輸出只取決于當(dāng)前的狀態(tài),稱之為如果時(shí)序邏輯的輸出只取決于當(dāng)前的狀態(tài),稱之為Moore狀態(tài)狀態(tài)機(jī)。機(jī)。圖12.1 時(shí)鐘同步的狀態(tài)機(jī)結(jié)構(gòu)(Mealy狀態(tài)機(jī))圖12.2 時(shí)鐘同步的狀態(tài)機(jī)結(jié)構(gòu)(Moore狀態(tài)機(jī)) 在設(shè)計(jì)高速電路時(shí),把狀態(tài)變量直接用作輸出。 這種設(shè)計(jì)中,需要在指定狀態(tài)編碼時(shí)需要考慮輸出狀態(tài)值,同時(shí)會增加所用寄存器數(shù)量。這種設(shè)計(jì)思路,在高速狀態(tài)機(jī)電路時(shí)常常使用,這稱之
21、為輸出編碼的狀態(tài)指定。這種狀態(tài)機(jī)也屬于圖12.2所示的Moore狀態(tài)機(jī).高速狀態(tài)機(jī)設(shè)計(jì)方法1: 在輸出邏輯G后面再加一組與時(shí)鐘同步的寄存器輸出流水線寄存器,讓G所有的輸出信號在下一個(gè)時(shí)鐘跳變沿時(shí)同時(shí)存入寄存器組,即完全同步地輸出,把這種輸出稱為流水線化的輸出(Pipelined outputs)的Mealy狀態(tài)機(jī)。高速狀態(tài)機(jī)設(shè)計(jì)方法2:圖12.3 帶流水線輸出的Mealy狀態(tài)機(jī) 在Verilog HDL中可以用多種方法來描述有限狀態(tài)機(jī)(FSM)。最常用的方法是用用always語句和語句和case語句語句。圖12.4所示的狀態(tài)轉(zhuǎn)移圖表示了一個(gè)簡單的有限狀態(tài)機(jī),例12.1的程序就是該有限狀態(tài)機(jī)的多
22、種Verilog HDL模型之一。 圖中所示的狀態(tài)轉(zhuǎn)移圖表示了一個(gè)4狀態(tài)的有限狀態(tài)機(jī),它的同步時(shí)鐘是Clock,輸入信號是A和Reset,輸出信號是K2和K1。狀態(tài)的轉(zhuǎn)移只能在同步時(shí)鐘(Clock)的上升沿時(shí)發(fā)生,往哪個(gè)狀態(tài)的轉(zhuǎn)移則取決于目前所在的狀態(tài)和輸入的信號(Reset和A)?!纠?2.1】Module fsm(Clock,Reset,A,K2,K1); input Clock,Reset,A; output K2,K1; reg K2,K1; reg 1:0 state; Parameter Idle=2b00,Start=2b01, stop=2b10,Clear=2b11; alw
23、ays (posedge Clock) if(!Reset) begin state=Idle;K2=0;k1=0; end else case(state) Idle: begin if(A) begin state=Start; K1=0; end else state=Idle; endStart: begin if(!A) state=Stop; else state=Start;Stop: begin if(A) begin state=Clear; K2=1; end else state=Stop; endClear: begin if(!A) begin state=Idle;
24、 K20; K1=1; end else state=Clear; end endcaseendmodule 12.3.2 用可綜合的Verilog模塊設(shè)計(jì)、用獨(dú)熱碼表示狀態(tài)機(jī)【例12.2】Module fsm(Clock,Reset,A,K2,K1);Input Clock,Reset,A;output K2,K1;reg K2,K1;reg 3:0 state;parameter Idle=4b1000,Start=4b0100, Stop=4b0010,Clear=4b0001;always (posedge Clock) if(!Reset) begin state=Idle;K2=0
25、;K1=0; end else case(state) Idle: begin if(A) begin state=Start; K1=0; end else state=Idle; endStart: begin if(!A) state=Stop; else state=Start; endStop: begin if(!A) begin state=Clear; K2=1; end else state=Stop; endClear: begin if(!A) begin state=Idle; K2=0;K1=1; end else state=Clear; enddefault: s
26、tate=Idle;endcaseendmodule 例122與例121的主要不同點(diǎn)是狀態(tài)編碼,例122采用了獨(dú)熱編碼。而例121則采用Gray編碼,究竟采用哪一種編碼好要看具體情況而定。對于用對于用FPGA實(shí)現(xiàn)的有限狀態(tài)機(jī)建議采用實(shí)現(xiàn)的有限狀態(tài)機(jī)建議采用獨(dú)熱碼獨(dú)熱碼,因?yàn)殡m然獨(dú)熱編碼多用了兩個(gè)觸發(fā)器,但所用組合電路因?yàn)殡m然獨(dú)熱編碼多用了兩個(gè)觸發(fā)器,但所用組合電路可省一些,因而使電路的速度和可靠性有顯著提高,而總的單元可省一些,因而使電路的速度和可靠性有顯著提高,而總的單元數(shù)并無顯著增加。采用獨(dú)熱編碼后出現(xiàn)多余的狀態(tài),即一些不可數(shù)并無顯著增加。采用獨(dú)熱編碼后出現(xiàn)多余的狀態(tài),即一些不可到達(dá)的狀態(tài)
27、,為此在到達(dá)的狀態(tài),為此在case語句的最后需要增加語句的最后需要增加default分支項(xiàng)。分支項(xiàng)。這可以用默認(rèn)項(xiàng)表示該項(xiàng),也可以用確定項(xiàng)表示,以確?;氐竭@可以用默認(rèn)項(xiàng)表示該項(xiàng),也可以用確定項(xiàng)表示,以確?;氐絀dle狀態(tài)。狀態(tài)。一般綜合器都可以通過綜合指令的控制來合理地處理默認(rèn)項(xiàng)。12.3.3 用可綜合的Verilog模塊設(shè)計(jì)、由輸出指定的碼表示狀態(tài)的狀態(tài)機(jī) 例12.3采用了另一種方法,即在狀態(tài)機(jī)結(jié)構(gòu)部分講過的,把把輸出直接指定為狀態(tài)碼輸出直接指定為狀態(tài)碼。也就是把狀態(tài)碼的指定與狀態(tài)機(jī)控制的也就是把狀態(tài)碼的指定與狀態(tài)機(jī)控制的輸出聯(lián)系起來,把狀態(tài)的變化直接用作輸出,這樣做可以提高輸輸出聯(lián)系起來,
28、把狀態(tài)的變化直接用作輸出,這樣做可以提高輸出信號的開關(guān)速度并節(jié)省電路器件。這種設(shè)計(jì)方法常用在高速狀出信號的開關(guān)速度并節(jié)省電路器件。這種設(shè)計(jì)方法常用在高速狀態(tài)機(jī)中,建議大家在設(shè)計(jì)高速狀態(tài)機(jī)時(shí)采用例態(tài)機(jī)中,建議大家在設(shè)計(jì)高速狀態(tài)機(jī)時(shí)采用例12.3的風(fēng)格。的風(fēng)格。例中state3和state0分別表示前面兩個(gè)例子中的輸出K2和K1。k2k1Idle0(復(fù)位)00Idle1(由Clear)01Start00Stop00Clear10【例12.3】module fsm(Clock,Reset,A,K2,K1);input Clock,Reset,A;output K2,K1;reg 4:0 state;
29、assign K2=state3; assign K1=state0; parameter/-K2-i-j-K1-輸出編碼狀態(tài)分配Zero= 4b0_0_0_0,Idle = 4b0_0_0_1,Start= 4b0_1_0_0,Stop= 4b0_0_1_0,Clear=4b1_0_0_0;always (posedge Clock)if(!Reset) begin state=Zero; endelsecase(state)Idle,Zero: begin if(A) begin state=Start; end else state=Idle; endStart: begin if(!A
30、) begin state=Clear; end else state=Stop; endClear: begin if(!A) begin state=Idle; end else state=Clear; enddefault: state=Zero;endcaseendmodule 12.3.4 用可綜合用可綜合Verilog模塊設(shè)計(jì)復(fù)雜的多輸出狀態(tài)機(jī)時(shí)常用模塊設(shè)計(jì)復(fù)雜的多輸出狀態(tài)機(jī)時(shí)常用的方法的方法 在比較復(fù)雜的狀態(tài)機(jī)設(shè)計(jì)過程中,一般把狀態(tài)的變化與輸出開關(guān)的控制分成兩部分來考慮,就像前面講過的Mealy狀態(tài)機(jī)輸出部分的組合邏輯。為了調(diào)試方便,還常常把每一個(gè)輸出開關(guān)寫成一個(gè)個(gè)獨(dú)立的alw
31、ays組合塊,這樣做比較容易發(fā)現(xiàn)問題和改正模塊編寫中出現(xiàn)的問題。建議大家在設(shè)計(jì)復(fù)雜的多輸出狀態(tài)機(jī)時(shí)采用例12.4所列程序,說明如下?!纠?2.4】 module fsm(Clock,Reset,A K2,K1); input Clock,Reset,A; output K2,K1; reg K2,K1; reg 1:0 state; parameter ldle2b00, Start2b01, Stop2b10, Clear2b11; always (posedge Clock) if (! Reset) state=Idle; else case(state) Idle: begin if(
32、A) begin state=start; end else state=Idle; end start:begin if(!A) stateStop; else state Start; end Stop:begin if(A) stateClear; else state=Stop; end Clear:begin if(! A) stateIdle; else stateClear; end default :state2bxx; endcase always (state or Reset or A) 產(chǎn)生輸出K2的組合邏輯 if (!Reset) K20; else if (stat
33、eClear)&A) K21: else K20;always (state or Reset) /產(chǎn)生輸出K1的組合邏輯 if(!Reset) K10; else if(stateIdle) & !A) K11; else K10;endmodule 上面4個(gè)例子是同一個(gè)狀態(tài)機(jī)的4種不同的Verilog HDL模型,它們都是可綜合的,在設(shè)計(jì)復(fù)雜程度不同的狀態(tài)機(jī)時(shí)有它們各自的優(yōu)勢。 有限狀態(tài)機(jī)設(shè)計(jì)的一般步驟:有限狀態(tài)機(jī)設(shè)計(jì)的一般步驟:(1)邏輯抽象,得出狀態(tài)轉(zhuǎn)換圖:就是把給出的一個(gè)實(shí)際邏輯關(guān)系表示為時(shí)序邏輯函數(shù)??梢杂脿顟B(tài)轉(zhuǎn)換表來描述,也可以用狀態(tài)轉(zhuǎn)換圖來描述。這就需要: 分析
34、給定的邏輯問題,確定輸入變量、輔出變量以及電路的狀態(tài)數(shù)。通常是取原因(或條件)作為輸入變量,取結(jié)果作為輸出變量。 定義輸入、輸出邏輯狀態(tài)的含義,并將電路狀態(tài)順序編號。 按照要求列出電路的狀態(tài)轉(zhuǎn)換表或畫出狀態(tài)轉(zhuǎn)換圖。 這樣,就把給定的邏輯問題抽象到一個(gè)時(shí)序邏輯函數(shù)了。(2)狀態(tài)化簡:如果在狀態(tài)轉(zhuǎn)移圖中出現(xiàn)這樣兩個(gè)狀態(tài):它們在相同的輸入下轉(zhuǎn)換到同一狀態(tài)去,并得到相同的輸出,則稱它們?yōu)榈葍r(jià)狀態(tài)。顯然等價(jià)狀態(tài)是重復(fù)的,可以合并為一個(gè)。電路的狀態(tài)數(shù)越少,存儲電路也就越簡單。狀態(tài)化簡的目的就在于將等價(jià)狀態(tài)盡可能地合并,以得到最簡的狀態(tài)轉(zhuǎn)換圖。 (3)狀態(tài)分配:狀態(tài)分配又稱狀態(tài)編碼。通常有很多編碼方法,編碼
35、方案選擇得當(dāng),設(shè)計(jì)的電路可以簡單;反之選得不好,則設(shè)計(jì)的電路就會復(fù)雜許多。在實(shí)際設(shè)計(jì)時(shí),須綜合考慮電路復(fù)雜度與電路性能這兩個(gè)因素。在觸發(fā)器資源豐富的FPGA或ASIC設(shè)計(jì)中,采用獨(dú)熱編碼(one-hot-coding)既可以使電路性能得到保證又可充分利用其觸發(fā)器數(shù)量多的優(yōu)勢,也可以采取輸出編碼的狀態(tài)指定來簡化電路結(jié)構(gòu),并提高狀態(tài)機(jī)的運(yùn)行速度。 (4)選定觸發(fā)器的類型并求出狀態(tài)方程、驅(qū)動方程和輸出方程。 (5)按照方程得出邏輯圖。 用Verilog HDL來描述有限狀態(tài)機(jī),可以充分發(fā)揮硬件描述語言的抽象建模能力,使用always塊語句和case,if等條件語句及賦值語句即可方便實(shí)現(xiàn)。具體的邏輯化
36、簡、邏輯電路和觸發(fā)器映射均可由計(jì)算機(jī)自動完成上述設(shè)計(jì)步驟中的第(2)步及(4)、(5)步不再需要很多的人為干預(yù),使電路設(shè)計(jì)工作得到簡化,效率也有很大的提高。1、大多數(shù)FPGA內(nèi)部的觸發(fā)器數(shù)目相當(dāng)多,獨(dú)熱碼狀態(tài)機(jī)的譯碼邏輯最為簡單,所以在設(shè)計(jì)采用FPGA實(shí)現(xiàn)的狀態(tài)機(jī)時(shí),通常采用獨(dú)熱碼狀態(tài)機(jī)(即每個(gè)狀態(tài)只有一個(gè)寄存器置位的狀態(tài)機(jī));2、盡量采用case,casex或casez語句來建立狀態(tài)機(jī)的模型,注意最好寫上Default項(xiàng),并將狀態(tài)變量設(shè)為bx,使得生成的電路最優(yōu)化;3、狀態(tài)機(jī)應(yīng)該有一個(gè)異步或同步復(fù)位端,以便在加電時(shí)將電路復(fù)位到有效狀態(tài),CPLD/FPGA器件都支持異步復(fù)位;4、為了能綜合出有
37、效的電路,用Verilog HDL描述的狀態(tài)機(jī)應(yīng)明確地由唯一時(shí)鐘觸發(fā)。5、盡量不要使用綜合工具來設(shè)計(jì)異步狀態(tài)機(jī)。因?yàn)槟壳按蠖鄶?shù)綜合工具在對異步狀態(tài)機(jī)進(jìn)行邏輯優(yōu)化時(shí)會胡亂地簡化邏輯,使綜合后的異步狀態(tài)機(jī)不能正常工作。如果一定要設(shè)計(jì)異步狀態(tài)機(jī),建議采用電路圖輸入的方法,或用實(shí)例引用的寫法把幾個(gè)引用的實(shí)例用異步時(shí)鐘連接起來,而不要直接用Verilog RTL級別的描述方法通過綜合來產(chǎn)生。狀態(tài)分配的兩種方法:狀態(tài)分配的兩種方法:使用參數(shù)(parameters)語句賦狀態(tài)值見下列程序: parameter state12h1,state22h2; current_statestate2; 把curren
38、tstate設(shè)置成2h2 . 使用宏定義(define)語句賦狀態(tài)值見下列程序: define state1 2h1 define state2 2h2 current_statestate2; 把current state設(shè)置成2h2綜合的一般原則為: (1)綜合之前一定要進(jìn)行仿真,這是因?yàn)榉抡鏁┞哆壿嬪e誤。 (2)每一次布局布線之后都要進(jìn)行仿真,在器件編程或流片之前要做最后的仿真。 (3)用Verilog HDL描述的異步狀態(tài)機(jī)是不能綜合的,因此應(yīng)該避免用綜合器來設(shè)計(jì),如果一定要設(shè)計(jì)異步狀態(tài)機(jī),則可用電路圖輸入的方法來設(shè)計(jì)。 (4)如果要為電平敏感的鎖存器建模,使用連續(xù)賦值語句是最簡單的
39、方法。 1always塊 (1)每個(gè)always塊只能有一個(gè)事件控制“(event-expression)”,而且要緊跟在always關(guān)鍵字的后面。 (2)always塊可以表示時(shí)序邏輯或者組合邏輯,也可以用always塊既表示電平敏感的透明鎖存器又同時(shí)表示組合邏輯,但是不推薦使用這種描述方法,因?yàn)檫@容易產(chǎn)生錯誤和多余的電平敏感的透明鎖存器。 (3)帶有posedge或negedge關(guān)鍵字的事件表達(dá)式表示沿觸發(fā)的時(shí)序邏輯,沒有posedge或negedge關(guān)鍵字的表示組合邏輯或電平敏感的鎖存器,或者兩種都表示。在表示時(shí)序和組合邏輯的事件控制表達(dá)式中,如有多個(gè)沿和多個(gè)電平,其間必須用關(guān)鍵字“or
40、”連接。 (4)每個(gè)表示時(shí)序always塊只能由一個(gè)時(shí)鐘跳變沿觸發(fā),置位或復(fù)位最好也由該時(shí)鐘跳變沿觸發(fā)。 (5)每個(gè)在always塊中賦值的信號都必須定義成reg型或整型。整型變量默認(rèn)為32位,使用Verilog操作符可對其進(jìn)行二進(jìn)制求補(bǔ)的算術(shù)運(yùn)算。綜合器還支持整型變量的范圍說明,這樣就允許產(chǎn)生不是32位的整型量。句法結(jié)構(gòu)為:integer : (6)always塊中應(yīng)該避免組合反饋回路(combinational feedback loops ) 。 用always塊設(shè)計(jì)純組合邏輯電路時(shí),在生成組合邏輯的always塊中參與賦值的所有信號都必須有明確的值,即在賦值表達(dá)式右端參與賦值的信號都在
41、賦值表達(dá)式右端參與賦值的信號都必須在必須在always (敏感電平列表敏感電平列表)中列出。中列出。如果在賦值表達(dá)式右端引用了敏感電平列表中沒有列出的信號,那么在綜合時(shí),將會為該信號隱含地產(chǎn)生一個(gè)透明鎖存器。這是因?yàn)樵撔盘柕淖兓粫⒖桃鹚x值的變化,而必須等到敏感電平列表中某一個(gè)信號變化時(shí),它的作用才顯現(xiàn)出來,也就是相當(dāng)于存在著一個(gè)透明鎖存器,即把該信號的變化暫存起來,待敏感電平列表中某一個(gè)信號變化時(shí)再起作用,純組合邏輯電路不可能做到這一點(diǎn)。這樣,綜合后所得的電路已經(jīng)不是純組合邏輯電路了,這時(shí)綜合器會發(fā)出警告,提示設(shè)計(jì)中插入了鎖存器。見下例。例如: input a,b,c; reg e,d
42、; always (a or b or c) begen ed & a & b; *因?yàn)閐沒有在敏感電平列表中,所以d變化時(shí),e不能立刻變化,要等到a或b或c變化時(shí)才體現(xiàn)出來。這就是說,實(shí)際上相當(dāng)于存在一個(gè)電平敏感的透明鎖存器在起作用,把d信號的變化鎖存其中。 de | c; end 2賦 值 (1)對一個(gè)寄存器型(reg)和整型(integer)變量給定位的賦值,只允許在一個(gè)always塊內(nèi)進(jìn)行,如在另一always塊中也對其賦值,這是非法的。即變量不即變量不能有多個(gè)驅(qū)動源。能有多個(gè)驅(qū)動源。 (2)把某一信號值賦為bx,綜合器就把它解釋成無關(guān)狀態(tài),因而綜合器為其生成的硬件電路
43、最簡潔。13.5.1 組合邏輯電路設(shè)計(jì)實(shí)例 【例13.1】 8位帶進(jìn)位端的加法器的設(shè)計(jì)實(shí)例(利用簡單的算法描述)。 module adder_8(cout,sum,a,b,cin); output cout; output 7:0 sum; input cin; input 7:0 a,b; assign cout,suma+b+cin; endmodule【例13.2】指令譯碼電路的設(shè)計(jì)實(shí)例(利用電平敏感的always塊來設(shè)計(jì)組合邏輯)。 /操作碼的宏定義 define plus 3d0 define minus 3d1 define band 3d2 define bor 3d3 defi
44、ne unegate 3d4 module alu(out,opcode,a,b); output 7:0 out; input 2:0 opcode; input 7:0 a,b; reg 7:0 out;always (opcode or a or b)/用電平敏感的always塊描述組合邏輯 begin case(opcode) /算術(shù)運(yùn)算 plus: out=a+b; minus: out=a-b; /位運(yùn)算 band:out=a&b; bor: out=a | b; /單目運(yùn)算 unegate:out=a; default: out=8hx; endcase endendmo
45、dule【例13.3】 利用task和電平敏感的always塊設(shè)計(jì)比較后重組信號的組合邏輯。module sort4(ra,rb,rc,rd,a,b,c,d); parameter t=3; output t:0 ra,rb,rc,rd; input t:0 a,b,c,d; reg t:0 ra,rb,rc,rd; always (a or b or c or d)/用電平敏感的always塊描述組合邏輯 begin reg t:0 va,vb,vc,vd; va,vb,vc,vda,b,c,d; sort2 (va,vc); sort2 (vb,vd); sort2 (va,vb); so
46、rt2 (vc,vd); sort2 (vb,vc); ra,rb,rc,rdva,vb,vc,vd; end task sort2; inout t:0 x,y; reg t:0 tmp; if(xy) begin tmp=x; x=y; y=tmp; end endtask endmodule【例13.4】 比較器的設(shè)計(jì)實(shí)例(利用賦值語句設(shè)計(jì)組合邏輯)。 module compare(equal,a,b); parameter size1; output equal; input size-1:0 a,b; assign equal(ab)?1:0; endmodule【例13.5】 38
47、譯碼器設(shè)計(jì)實(shí)例(利用賦值語句設(shè)計(jì)組合邏輯)。 module decoder(out,in); output 7:0 out; input 2:0 in; assign out1b1in;*把最低位的1左移in(根據(jù)從in口輸入的值)位,并賦于out* endmodule【例13.6】83編碼器的設(shè)計(jì)實(shí)例。編碼器設(shè)計(jì)方案之一:module encoder1(none_on,out,in); output none_on; output 2:0 out; input 7:0 in; reg 2:0 out; reg none_on; always (in) begin:local Integer
48、i; out0; none_on1; /*returns the value of the highest bit number turned on*/ for(i0;i8;ii+1) begin if(ini) begin out=i; none_on0; end end endendmodule編碼器設(shè)計(jì)方案之二:module encoder2 (none_on,out2,out1,out0,h,g,f, e, d, c, b, a); input h,g,f,e,d,c,b,a; output none_on,out2,out1,out0; wire 3:0 outvec; assign
49、 outvech?4b0111:g?4b0110:f?4b0101: e?4b0100:d?4b0011:c?4b0010: b?4b0001:a?4b0000:4b1000; assign none_onoutvec3; assign out2outvec2; assign out1outvec1; assign out0outvec0;endmodule編碼器設(shè)計(jì)方案之三:module encoder3(none_on,out2,out1,out0,h,g,f,e,d,c,b,a); input h,e,f,e,d,c,b,a; output out2,out1,out0; output
50、none_on; reg 3:0 outvec; assign none_on,out2,out1,out0outvec; always (a or b or c or d or e or f or g or h) begin if(h) outvec4b0111; else if(g) outvec4b0110; else if(f) outvec4b0101; else if(e) outvec4b0100; else if(d) outvec4b0011; else if(c) outvec4b0010; else if(b) outvec4b0001; else if(a) outve
51、c4b0000; else outvec4b1000; end endmodule 【例13.7】 多路器的設(shè)計(jì)實(shí)例。 使用連續(xù)賦值、case語句或if-else語句可以生成多路器電路。如果條件語句(case或if-else)中分支條件是互斥的話,綜合器能自動地生成并行的多路器。 多路器設(shè)計(jì)方案之一: module mux1(out,a,b,sel); output out; input a,b,sel; assign outsel?a:b; endmodule 多路器設(shè)計(jì)方案之二: module mux2(out,a,b,sel); output out; input a,b,sel; re
52、g out; /用電平觸發(fā)的always塊來設(shè)計(jì)多路器的組合邏輯 always (a or b or sel) begin *檢查輸入信號sel的值,如為1輔出out為a,如為0,輸出out為b* case(sel) 1b1:outa; 1b0:outb; default:outbx; endcase end endmodule多路器設(shè)計(jì)方案之三: module mux3(out,a,b,sel); output out; input a,b,sel; reg out; always (a or b or sel) begin if(sel) outa; else outb; end endm
53、odule【例13.8】 奇偶校驗(yàn)位生成器設(shè)計(jì)實(shí)例。 module parity(even_numbits,odd_numbits,input_bus); output even_numbits, odd_numbits; input 7:0 input_bus; assign odd_numbitsinput_bus; assign even_numbits=odd_numbits; endmodule【例13.9】三態(tài)輸出驅(qū)動器設(shè)計(jì)實(shí)例(用連續(xù)賦值語句建立三態(tài)門模型)。三態(tài)輸出驅(qū)動器設(shè)計(jì)方案之一: module trist1(out,in,enable); output out; inpu
54、t in,enable; assign out enable?in:bz; endmodule三態(tài)輸出驅(qū)動器設(shè)計(jì)方案之二: module trist2(out,in,enable); output out; input in,enable; /bufif1是一個(gè)Verilog門級原語(primitive) bufif1 mybuf1(out,in,enable); endmodule 【例13.10】 三態(tài)雙向驅(qū)動器設(shè)計(jì)實(shí)例。 module bidir(tri_inout,out,in,en,b); inout 7:0 tri_inout; output 7:0 out; input 7:0
55、in,b; input en; assign tri_inouten?in:bz; assign outtri_inoutb; endmodule內(nèi)部外部Tri_inoutoutinenb13.5.2 時(shí)序邏輯電路設(shè)計(jì)實(shí)例 【例13.11】 觸發(fā)器設(shè)計(jì)實(shí)例。 module dff(q,data,clk); output q; input data,clk; reg q; always (posedge clk) begin qdata; end endmodule 【例13.12】 電平敏感型鎖存器設(shè)計(jì)實(shí)例之一。 module latch1(q,data,clk); output q; inp
56、ut data,clk; assign qclk?data;q; endmodule 【例13.13】 帶置位和復(fù)位端的電平敏感型鎖存器設(shè)計(jì)實(shí)例之二。 module latch2(q,data,clkset,reset); output q; input data,clk,set,reset; assign qreset?0:(set?1:(clk?data:q); endmodule 【例13.14】 電平敏感型鎖存器設(shè)計(jì)實(shí)例之三。 module latch3(q,data,clk); output q; input data,clk, reg q; always (clk or data)
57、 begin if(clk) qdata; end endmodule 注意:有的綜合器會產(chǎn)生一警告信息,告訴你產(chǎn)生了一個(gè)電平敏感型鎖存器。 因?yàn)槲覀冊O(shè)計(jì)的就是一個(gè)電平敏感型鎖存器,就不用管這個(gè)警告信息。 【例13.15】 移位寄存器設(shè)計(jì)實(shí)例。 module shifter(din,clk,clr,dout); input din,clk,clr; output 7:0 dout, reg 7:0 dout; always (posedge clk) begin if(clr) 清零 dout8b0; else begin doutdout1; 左移一位 dout0din; 把輸入信號放入寄存
58、器的最低位 end end endmodule【例13.16】 8位計(jì)數(shù)器設(shè)計(jì)實(shí)例之一。 module counter1(out,cout,data,load,cin,clk); output 7:0 out; output cout; input 7:0 data; input load,cin,clk; reg 7:0 out; always (posedge clk) begin if(load) outdata; else outout+cin; end assign cout&out & cin;/只有當(dāng)cout7:0的所有位都為1,并且進(jìn)位cin也為1時(shí)才能產(chǎn)生進(jìn)位
59、cout endmoduleclkcindataloadcoutout【例13.17】 8位計(jì)數(shù)器設(shè)計(jì)實(shí)例之二。 module counter2(out,cout,data,load,cin,clk); output 7:0 out; output cout; input 7:0 data; input load,cin,clk; reg 7:0 out; reg cout; reg 7:0 preout; 創(chuàng)建8位寄存器 always (posedge clk) begin outpreout; end/*計(jì)算計(jì)數(shù)器和進(jìn)位的下一個(gè)狀態(tài),注意:為提高性能不希望加載影響進(jìn)位* always (o
60、ut or data or load or cin) begin cout,preoutout+cin; if(load) preoutdata; end endmodule 13.6.1 狀態(tài)機(jī)的異步置位與復(fù)位 異步置位與復(fù)位是與時(shí)鐘無關(guān)的。異步置位與復(fù)位是與時(shí)鐘無關(guān)的。當(dāng)異步置位與復(fù)位到來時(shí)它們立即分別置觸發(fā)器的輸出為1或0,不需要等到時(shí)鐘沿到來才置位或復(fù)位。 (1)事件控制語法: ()高電平有效的set,reset或上升沿觸發(fā)的時(shí)鐘-posedge低電平有效的set,reset或下降沿觸發(fā)的時(shí)鐘-negedge (2)事件控制實(shí)例: 異步高電平有效的置位(時(shí)鐘的上升沿): (posedge clk or posedge set) 異步低電
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工簽員工合同范本
- 倆兄弟合伙開店合同范本
- 與他人合伙經(jīng)營合同范本
- 共享汽車租車合同范本
- 冷鏈購銷合同范本
- 合伙出資金合同范本
- 員工協(xié)議簡易合同范本
- 合同范本水印有問題
- 共同建房合同范本
- 廠房質(zhì)押合同范本
- 三年級下冊豎式脫式計(jì)算
- 七年級數(shù)學(xué)蘇科版下冊 101 二元一次方程 課件
- 《財(cái)務(wù)風(fēng)險(xiǎn)的識別與評估管理國內(nèi)外文獻(xiàn)綜述》
- ??谑写媪糠抠I賣合同模板(范本)
- 經(jīng)典文學(xué)作品中的女性形象研究外文文獻(xiàn)翻譯2016年
- 高爐煤氣安全知識的培訓(xùn)
- 2008 年全國高校俄語專業(yè)四級水平測試試卷
- 需求供給與均衡價(jià)格PPT課件
- 金融工程鄭振龍課后習(xí)題答案
- 時(shí)間單位換算表
- DTSD342-9N說明書(精編版)
評論
0/150
提交評論