《硬件描述語言》課件5 典型電路的Verilog實現(xiàn)_第1頁
《硬件描述語言》課件5 典型電路的Verilog實現(xiàn)_第2頁
《硬件描述語言》課件5 典型電路的Verilog實現(xiàn)_第3頁
《硬件描述語言》課件5 典型電路的Verilog實現(xiàn)_第4頁
《硬件描述語言》課件5 典型電路的Verilog實現(xiàn)_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、提綱組合邏輯實現(xiàn)方法與技巧組合邏輯實現(xiàn)實例時序邏輯實現(xiàn)方法與技巧時序邏輯實現(xiàn)實例狀態(tài)機實現(xiàn)方法與技巧狀態(tài)機實現(xiàn)實例組合邏輯的實現(xiàn)方法三種結(jié)構(gòu)都可以實現(xiàn)組合電路。連續(xù)賦值assign結(jié)構(gòu)always結(jié)構(gòu)元件實例化結(jié)構(gòu)三者可以混合使用組合邏輯實現(xiàn)技巧簡單組合邏輯最好采用連續(xù)賦值語句方式進(jìn)行描述。最直觀。且不會因為賦值運算符選擇錯誤、敏感列表不完整造成邏輯功能問題。較復(fù)雜的組合邏輯采用always塊進(jìn)行描述,而且應(yīng)當(dāng)將完成一個整體邏輯功能的信號賦值放在一個always塊中這樣做的好處是結(jié)構(gòu)清晰需要注意敏感列表的完整性使用阻塞賦值語句組合邏輯實現(xiàn)技巧更復(fù)雜的組合邏輯用結(jié)構(gòu)描述方式來實現(xiàn)將一個大的邏輯功

2、能分成多個相對獨立的單元,每個單元分別編寫成一個module。優(yōu)點是結(jié)構(gòu)更加清晰,電路連接關(guān)系明確。如果有需要使用參數(shù)化常量,則使用結(jié)構(gòu)描述方式。實際系統(tǒng)中的復(fù)雜組合邏輯實現(xiàn)實際系統(tǒng)中,組合邏輯總是和時序邏輯結(jié)合在一起的。要求有一定的工作時鐘。復(fù)雜的組合邏輯不能在要求的工作時鐘周期內(nèi)實現(xiàn)。往往需要借助于流水線技術(shù)。后續(xù)章節(jié)將專門介紹流水線的實現(xiàn)方法。提綱組合邏輯實現(xiàn)方法與技巧組合邏輯實現(xiàn)實例時序邏輯實現(xiàn)方法與技巧時序邏輯實現(xiàn)實例狀態(tài)機實現(xiàn)方法與技巧狀態(tài)機實現(xiàn)實例半加器的不同實現(xiàn)方式比較module half_adder1(a,b,out,carry);input a,b;output out,

3、carry;assign carry,out=a+b;endmodulemodule half_adder(a,b,out,carry);input a,b;output out,carry;xor n1(out,a,b);and n2(carry,a,b);endmodulemodule half_adder(a,b,out,carry);input a,b;output out,carry;reg out, carry;always (a or b) carry,out=a+b;endmodulemodule half_adder(a,b,out,carry);input a,b;outp

4、ut out,carry;reg out, carry;always (a or b) begin out = a b; carry = a & b;endendmoduleRTL ViewTechnology View全加器的不同實現(xiàn)方式module full_adder(a,b,cin,out,carry);input a,b,cin;output out,carry;reg out,carry;reg t1,t2,t3;always (a or b or cin)begin out = abcin; t1 = a&cin; t2 = b&cin; t3 = a&b; carry = t1

5、|t2|t3; endendmodulemodule full_adder(a,b,cin,out,carry);input a,b,cin;output out,carry;assign carry, out = a+b+cin;endmodulemodule full_adder(a,b,cin,out,carry);input a,b,cin;output out,carry;reg out,carry;always (a,b,cin)carry, out = a+b+cin;endmodule全加器的不同實現(xiàn)方式module full_adder(a,b,cin,out,carry);

6、input a,b,cin;output out,carry;reg out, carry;always (a,b,cin) case(a,b,cin) 3b111: begin carry = 1; out = 1; end 3b110: begin carry = 1; out = 0;end 3b101: begin carry = 1; out = 0; end endmodulemodule full_adder(a,b,cin,out,carry);input a,b,cin;output out,carry;wire t1, t2, t3, t4,t5;xor x1(t4, a,

7、 b);xor x2(out, t4, cin);and a1(t1,a,cin);and a2(t2,b,cin);and a3(t3,a,b);or o1(t5, t1,t2);or o2(carry, t5, t3); endmodule注意不同的實現(xiàn)方式綜合結(jié)果不完全相同,取決于綜合工具的解釋。對于這種小規(guī)模電路來說,不同實現(xiàn)風(fēng)格所占用資源情況差別不大。多位加法器的實現(xiàn)module adder_16bit_1(a,b,cin,out,carry);input 15:0 a, b;input cin;output 15:0 out;output carry;reg 15:0 out;re

8、g carry; always(a or b or cin) carry,out=a+b+cin;endmodulemodule s_adder(a,b,c_in,sum,c_out); parameter length=16; input length-1:0 a,b; input c_in; output c_out; output length-1:0 sum; wire length:1 c; full_adder p0 (a0,b0,c_in,sum0,c1); full_adder p1 (a1,b1,c1,sum1,c2); full_adder p2 (a2,b2,c2,sum

9、2,c3);full_adder p14 (a14,b14,c14,sum14,c15); full_adder p15 (a15,b15,c15,sum15,c_out );endmodule XST綜合結(jié)果比較結(jié)構(gòu)描述方法資源占用情況 Device utilization summary:-Selected Device : 3s100evq100-5 Number of Slices: 18 out of 960 1% Number of 4 input LUTs: 32 out of 1920 1% Number of IOs: 50 Number of bonded IOBs: 50

10、 out of 66 75% 行為描述方法資源占用情況:Device utilization summary:-Selected Device : 3s100evq100-5 Number of Slices: 8 out of 960 0% Number of 4 input LUTs: 16 out of 1920 0% Number of IOs: 50 Number of bonded IOBs: 50 out of 66 75% 注意不同描述方式雖然完成的功能相同,但是綜合結(jié)果不同,資源占用情況有較大差異。原因:上面的結(jié)構(gòu)描述方法限定的很死,造成綜合工具無法優(yōu)化設(shè)計,如:快速進(jìn)位邏輯

11、無法使用。行為描述方法完全交給綜合工具進(jìn)行優(yōu)化。編碼器的實現(xiàn)module encoder8x3(in,out);input 7:0 in;output 2:0 out;reg 2:0 out;reg 3:0 i;always (in)begin for(i=0;iY) XGY = 1; else XGY = 0; if(XY) XSY =1; else XSY = 0;end 多路選擇器的實現(xiàn)module mux4_1c(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;assig

12、n out=cntrl1 ? (cntrl2 ? in4:in3):(cntrl2 ? in2:in1);endmodulemodule mux4_1a(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;wire notcntrl1,notcntrl2,w,x,y,z;not (notcntrl1,cntrl2),(notcntrl2,cntrl2);and (w,in1,notcntrl1,notcntrl2), (x,in2,notcntrl1,cntrl2), (y,in3,

13、cntrl1,notcntrl2),(z,in4,cntrl1,cntrl2);or (out,w,x,y,z);endmodulemodule mux4_1b(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;reg out;always(in1 or in2 or in3 or in4 or cntrl1 or cntrl2)case(cntrl1,cntrl2)2b00:out=in1;2b01:out=in2;2b10:out=in3;2b11:out=in4;defaul

14、t:out=2bx;endcaseendmodule總線操作總線在同一時刻只能有一個部件驅(qū)動,但是可以有多個部件接收,所以需要用到三態(tài)。module SampleOfBus(DataBus, link_bus, write);inout 11:0 DataBus;input link_bus,write;reg11:0 outsigs;reg 13:0 insigs;assign DataBus = link_bus ? outsigs : 12hzzz;always (posedge write) begin insigs = DataBus*3; outsigs = insigs13:2;

15、 end提綱組合邏輯實現(xiàn)方法與技巧組合邏輯實現(xiàn)實例時序邏輯實現(xiàn)方法與技巧時序邏輯實現(xiàn)實例狀態(tài)機實現(xiàn)方法與技巧狀態(tài)機實現(xiàn)實例時序邏輯的實現(xiàn)方法實現(xiàn)時序邏輯常用以下兩種結(jié)構(gòu)。always結(jié)構(gòu)元件實例化結(jié)構(gòu)時序邏輯實現(xiàn)技巧大部分時序邏輯采用always塊進(jìn)行描述,使用時必須注意:時鐘信號必須在敏感列表中出現(xiàn),通常以某個時鐘沿的形式出現(xiàn)。應(yīng)該采用非阻塞賦值方式。鎖存器可以用assign形式實現(xiàn)例:module latch1(q,data,clk);output q;input data, clk;assign q = clk?data:q;endmodule提綱組合邏輯實現(xiàn)方法與技巧組合邏輯實現(xiàn)實例時

16、序邏輯實現(xiàn)方法與技巧時序邏輯實現(xiàn)實例狀態(tài)機實現(xiàn)方法與技巧狀態(tài)機實現(xiàn)實例正觸發(fā)型同步RS 觸發(fā)器module sy_rs_ff (clk, r, s, q, qb);input clk, r, s;output q, qb;reg q;assign qb = q;always (posedge clk) begincase(r, s)2b00: q = q;2b01: q = 1;2b10: q = 0;2b11: q = 1bx;endcaseendendmodule同步T觸發(fā)器的實現(xiàn)module sy_t_ff(clk, r,t, q, qb);input clk,t,r;output q,

17、 qb;reg q;assign qb = q; always (posedge clk)beginif(r)q = 0;else if(t)q = q;elseq = q;endendmoduleD觸發(fā)器(主從D觸發(fā)器)nand nd1(a,data,clock,clear), nd2(b,ndata,clock), nd3(c,a,d), nd4(d,c,b,clear), nd5(e,c,nclock), nd6(f,d,nclock), nd7(q,e,qb), nd8(qb,q,f,clear);not iv1(ndata,data), iv2(nclock,clock);endmo

18、dulemodule flop (data,clock,clear,q,qb); output q, qb; input data, clock, clear;注意標(biāo)點符號結(jié)構(gòu)描述結(jié)構(gòu)描述的問題這種描述方式對FPGA綜合而言不適合,因為綜合工具往往無法認(rèn)出這是D觸發(fā)器。會占用更多資源。D觸發(fā)器(行為描述)/無復(fù)位、使能等module dff1(clk, q,d);input clk,d;output q;reg q; always (posedge clk) begin q= d; endendmodule/高使能異步復(fù)位module dff2(clk, q,d,reset);input cl

19、k,d,reset;output q;reg q; always (posedge clk or posedge reset) begin if (reset) begin q = 1b0; end else begin q = d; endendmodule/高使能同步復(fù)位module dff3(clk, q,d,reset);input clk,d,reset;output q; always (posedge clk) begin if (reset) begin q = 1b0; end else begin q = d; endendmoduleD觸發(fā)器(行為描述)D觸發(fā)器/帶異步復(fù)

20、位、時鐘使能module dff4(clk, q, d, reset, ce)input clk,d,reset;output q; always (posedge clk or posedge reset) begin if (reset) begin q = 1b0; end else if (ce) begin q = d; endendmodule/帶同步復(fù)位、時鐘使能module dff5(clk, q,d,reset,ce)input clk,d,reset,ce;output q; always (posedge clk)begin if (reset) begin q = 1b

21、0; end else if (ce) begin q= d; end endmodule四位寄存器module reg4 (d, clk, clr, q); output3:0 q; output3:0 d; input clk, clr; reg3:0 q; always (posedge clk or posedge clr) begin if(clr) q=0; else q=d; endendmodule移位寄存器module Shift_Reg (D, Clock, Z) ; input D,Clock; output Z; parameter NUM_REG = 6; reg 1

22、: NUM_REG Q; integer P; always (negedge Clock) begin for (P = 1; P NUM_REG; P = P + 1) QP+1 = QP ; /寄存器右移一位 Q1 = D; /加載串行數(shù)據(jù) end assign Z = Q NUM_REG; /從最右端獲取輸出endmodule可以通過用不同的參數(shù)值引用模塊Shift_Reg獲取不同長度的移位寄存器。module top(Clk, Data, Za, Zb, Zc); input Data, Clk; output Za, Zb, Zc; Shift_Reg SRA (Data, Clk

23、, Za) ; / 6位移位寄存器 Shift_Reg #4 SRB (Data, Clk, Zb) ; / 4位移位寄存器 Shift_Reg #10 SRC (Data, Clk, Zc) ; / 10位移位寄存器endmodule 計數(shù)器/帶使能的計數(shù)器always(posedgeclk) begin if(enable) qa=qa+1; end /帶同步加載的計數(shù)器 always (posedge clk) begin if (!ld) qb = d; else qb = qb + 1; end /帶同步清除的計數(shù)器 always(posedgeclk) begin if(!clea

24、r) qc=0; else qc=qc+1; end /可加、減計數(shù)的計數(shù)器 always(posedgeclk) begin if(up_down) direction=1; else direction=-1; qd=qd+direction; end 計數(shù)器/帶同步清除和使能、/可加、減計數(shù)的計數(shù)器 always (posedge clk) begin if (up_down) direction = 1; else direction = -1; if (!clear) qm = 0; else if (enable) qm = qm + direction; end 有限狀態(tài)機實現(xiàn)方

25、法有限狀態(tài)機是由組合邏輯和時序邏輯混合構(gòu)成的。時鐘同步狀態(tài)機結(jié)構(gòu)時鐘同步狀態(tài)機的組成狀態(tài)寄存器:由一組觸發(fā)器組成,現(xiàn)代數(shù)字電路絕大多數(shù)采用的是D觸發(fā)器。所有觸發(fā)器的時鐘端都連接在同一個時鐘信號上。狀態(tài)的改變只發(fā)生在時鐘沿上。狀態(tài)是否改變、怎么改變?nèi)Q于產(chǎn)生下一狀態(tài)的組合邏輯F。F與當(dāng)前狀態(tài)和當(dāng)前輸入有關(guān)。狀態(tài)機的輸出是由輸出組合邏輯G提供的,G也與當(dāng)前的狀態(tài)有關(guān),還有可能和輸入有關(guān)。Mealy和Moore型有限狀態(tài)機Mealy型狀態(tài)機的輸出由狀態(tài)機的輸入和狀態(tài)機的狀態(tài)共同決定;而Moore型狀態(tài)機的輸出僅與狀態(tài)機的狀態(tài)有關(guān),與狀態(tài)機的輸入無關(guān)。兩種狀態(tài)機的適用場景實際設(shè)計工作中,大部分狀態(tài)機都

26、屬于Mealy型狀態(tài)機。因為實際系統(tǒng)的輸出有多個,部分與當(dāng)前輸入有關(guān),而另外幾個輸出與當(dāng)前輸入無關(guān)。在設(shè)計高速電路時,常常希望狀態(tài)機的輸出與時鐘幾乎完全同步,此時常把狀態(tài)變量直接作為輸出,這時候要對狀態(tài)編碼進(jìn)行適當(dāng)設(shè)計,此時狀態(tài)機變?yōu)镸oore型。狀態(tài)機的Verilog建模最常用的方法是用always語句結(jié)合case語句來實現(xiàn)狀態(tài)機。還可以把狀態(tài)變化部分放在時鐘沿觸發(fā)的always模塊中,而把狀態(tài)控制下的兩類組合邏輯放在獨立的always塊中,或者以assign形式產(chǎn)生。狀態(tài)編碼狀態(tài)編碼可以采用多種不同類型:StateBinary EncodingGray-Code EncodingOne-H

27、ot EncodingCustom EncodingIdle00000000001?State100100100010?State201001100100?State301101001000?State410011010000?不同狀態(tài)編碼的優(yōu)缺點二進(jìn)制編碼和格雷碼都是壓縮狀態(tài)編碼。優(yōu)點是使用的狀態(tài)向量最少;但二進(jìn)制編碼一個狀態(tài)轉(zhuǎn)換到相鄰狀態(tài)時,可能有多個比特位發(fā)生變化,易產(chǎn)生毛刺。格雷編碼在相鄰狀態(tài)的轉(zhuǎn)換中,每次只有1個比特位發(fā)生變化,減少了產(chǎn)生毛刺和一些暫態(tài)的可能,但不適用于有很多狀態(tài)跳轉(zhuǎn)的情況。獨熱碼獨熱碼是指對任意給定的狀態(tài),狀態(tài)向量中只有1位為1,其余位都為0。n狀態(tài)的狀態(tài)機需要n個

28、觸發(fā)器。這種狀態(tài)機的速度與狀態(tài)的數(shù)量無關(guān),速度很快。當(dāng)狀態(tài)機的狀態(tài)增加時,如果使用二進(jìn)制編碼,那么狀態(tài)機速度會明顯下降。而采用獨熱碼,雖然多用了觸發(fā)器,但由于狀態(tài)譯碼簡單,節(jié)省和簡化了組合邏輯電路。獨熱碼獨熱編碼還具有設(shè)計簡單、修改靈活、易于綜合和調(diào)試等優(yōu)點。對于寄存器數(shù)量多、而門邏輯相對缺乏的FPGA器件,采用獨熱編碼可以有效提高電路的速度和可靠性,也有利于提高器件資源的利用率。獨熱編碼有很多無效狀態(tài),應(yīng)該確保狀態(tài)機一旦進(jìn)入無效狀態(tài)時,可以立即跳轉(zhuǎn)到確定的已知狀態(tài)。狀態(tài)機編碼風(fēng)格用Verilog 語言描述有限狀態(tài)機可使用多種風(fēng)格,不同的風(fēng)格會影響電路性能。通常有3 種描述方式:單always

29、 塊、雙always 塊和三always 塊。單always塊單always 塊把組合邏輯和時序邏輯用同一個時序always 塊描述,其輸出是寄存器輸出。但是這種方式會產(chǎn)生多余的觸發(fā)器,代碼難于修改和調(diào)試,應(yīng)該盡量避免使用。雙always塊雙always 塊大多用于描述Mealy 狀態(tài)機和組合輸出的Moore 狀態(tài)機;時序always 塊描述當(dāng)前狀態(tài)邏輯,組合邏輯always 塊描述次態(tài)邏輯并給輸出賦值。這種方式結(jié)構(gòu)清晰,綜合后的面積和時間性能好。但組合邏輯輸出往往會有毛刺,當(dāng)輸出向量作為時鐘信號時,這些毛刺會對電路產(chǎn)生致命的影響。三always塊三always 塊大多用于同步Mealy 狀態(tài)

30、機。兩個時序always 塊分別用來描述現(xiàn)態(tài)邏輯和對輸出賦值。組合always 塊用于產(chǎn)生下一狀態(tài)。這種方式的狀態(tài)機也是寄存器輸出,輸出無毛刺,并且代碼比單always 塊清晰易讀,但是面積大于雙always 塊。隨著芯片資源和速度的提高,三always塊結(jié)構(gòu)更為常用。提綱有限狀態(tài)機實現(xiàn)方法與技巧有限狀態(tài)機實例簡單狀態(tài)機實例1簡單狀態(tài)機實例1module fsm (Clock, Reset, A, F, G);input Clock, Reset, A;output F,G;reg F,G;reg 1:0 state ;parameter Idle = 2b00, Start = 2b01,

31、Stop = 2b10, Clear = 2b11;always (posedge Clock) if (!Reset) begin state = Idle; F=0; G=0; end elsecase (state) Idle: begin if (A) state = Start; G=0; end Start: if (!A) state = Stop; Stop: begin if (A) state = Clear; F = 1; end Clear: begin if (!A) state =Idle; F=0; G=1; end endcaseendmodule 簡單的狀態(tài)機實例2module FSM(clk,clr,out,start,step2,step3);input clk,clr,start,step2,step3;output2:0 out;reg2:0 out;reg1:0 state,next_state;parameter state0=2b00,state1=2b01, state2=2b11,state3=2b10;always (posedge clk or posedge clr)beginif (clr) state = state0;else state = next_state;end簡單的狀態(tài)機實例2a

溫馨提示

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

評論

0/150

提交評論