




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第四講 同步狀態(tài)機(jī)的原理、結(jié)構(gòu)和設(shè)計(jì) 有限狀態(tài)機(jī)是由寄存器組和組合邏輯構(gòu)成的硬件時(shí)序電路,其狀態(tài)(即由寄存器組的1和0的組合狀態(tài)所構(gòu)成的有限個(gè)狀態(tài))只可能在同一時(shí)鐘跳變沿的情況下才能從一個(gè)狀態(tài)轉(zhuǎn)向另一個(gè)狀態(tài),究竟轉(zhuǎn)向哪一狀態(tài)還是留在原狀態(tài)不但取決于各個(gè)輸入值,還取決于當(dāng)前所在狀態(tài)。(這里指的是米里Mealy型有限狀態(tài)機(jī),而莫爾Moore型有限狀態(tài)機(jī)究竟轉(zhuǎn)向哪一狀態(tài)只決于當(dāng)前狀態(tài)。) 在Verilog HDL中可以用許多種方法來(lái)描述有限狀態(tài)機(jī),最常用的方法是用always語(yǔ)句和case語(yǔ)句。下面的狀態(tài)轉(zhuǎn)移圖表示了一個(gè)有限狀態(tài)機(jī) 圖中所示的狀態(tài)轉(zhuǎn)移圖中所示的狀態(tài)轉(zhuǎn)移圖表示了一個(gè)四狀態(tài)的有圖表示了一
2、個(gè)四狀態(tài)的有限狀態(tài)機(jī),它的同步時(shí)鐘限狀態(tài)機(jī),它的同步時(shí)鐘是是Clock,輸入信號(hào)是輸入信號(hào)是 A 和和 Reset,輸出信號(hào)是輸出信號(hào)是 F 和和 G。狀態(tài)的轉(zhuǎn)移只能在同步時(shí)狀態(tài)的轉(zhuǎn)移只能在同步時(shí)鐘(鐘(Clock)的上升沿時(shí))的上升沿時(shí)發(fā)生,往哪個(gè)狀態(tài)的轉(zhuǎn)移發(fā)生,往哪個(gè)狀態(tài)的轉(zhuǎn)移則取決于目前所在的狀態(tài)則取決于目前所在的狀態(tài)和輸入的信號(hào)和輸入的信號(hào)Reset 和和 A)例4.1:module fsm (Clock, Reset, A, K2, K1); input Clock, Reset, A; output K2, K1; reg K2 , K1; reg 1:0 state ;Param
3、eter Idle = 2b00, Start = 2b01; Stop = 2b10, Clear = 2b11;always (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; end Start : begin if (!A) state = Stop; else state = start; endStop : begin if
4、(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; end endcaseendmodule例例4.1 4.1 采用采用GrayGray碼碼例4.2:module fsm (Clock, Reset, A, K2, K1); input Clock, Reset, A; output K2,K1; reg K2,K1; reg 3:0 state ; parameter Id
5、le = 4b1000, Start = 4b0100, Stop = 4b0010, Clear = 4b0001; always (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; endStop: begin if (A)
6、begin state = Clear; K2 = 1; end else state = Stop; endClear: begin if (!A) begin state =Idle; K2=0; K1=1; end else state = Clear; end default: state =Idle; endcaseendmodule例4.2采用了獨(dú)熱編碼例4.3Module fsm( Clock, Reset, A, K2, K1); input Clock, Reset, A; output K2, K1; reg 3:0 state; assign K2=state3; ass
7、ign K1=state0; parameter 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; end else Case (state) Idle,Zero: begin if (A) begin state=Start; end else state=Idle; endStart: begin if (! A) state=Stop; else
8、state=Start; endStop: begin if (A) begin state=Clear; end else state=Stop; endClear: begin if(!A) begin state=Idle; end else state=Clear; endDefault: state=Zero;endcaseendmodule例4.3 把輸出直接指定為狀態(tài)碼例4.4module fsm (Clock, Reset, A, K2, K1); input Clock, Reset, A; output K2, K1; reg K2, K1; reg 1:0 state;p
9、arameter Idle = 2b00, Start = 2b01, Stop = 2b10, Clear = 2b11;always (posedge Clock) if ( ! Reset) state = Idle; else case(state) Idle: begin if (A) begin state = Start; end else state = Idle; end Start: begin if ( ! A) state = Stop; else state = Start; endStop: begin if (A) state = Clear; else stat
10、e = Stop; endClear: begin if ( ! A) state = Idle; else state = Clear; endDefault : state y ) begin tmp = x; x = y; y = tmp; end endtaskendmodule5.5.1 組合邏輯電路設(shè)計(jì)實(shí)例例5.4. 比較器的設(shè)計(jì)實(shí)例(利用賦值語(yǔ)句設(shè)計(jì)組合邏輯) module compare(equal,a,b); parameter size=1; output equal; input size-1:0 a, b; assign equal =(a=b)? 1 : 0; end
11、module5.5.1 組合邏輯電路設(shè)計(jì)實(shí)例例5.5. 3-8譯碼器設(shè)計(jì)實(shí)例(利用賦值語(yǔ)句設(shè)計(jì)組合邏輯) module decoder(out,in); output 7:0 out; input 2:0 in; assign out = 1b1in; /* 把最低位的1左移 in(根據(jù)從in口輸入的值)位,并賦予out */ endmodule5.5.1 組合邏輯電路設(shè)計(jì)實(shí)例例5.6. 8-3編碼器的設(shè)計(jì)實(shí)例 u 編碼器設(shè)計(jì)方案之一:module encoder1(none_on,out,in); output none_on; output 2:0 out; input 7:0 in; r
12、eg 2:0 out; reg none_on; always (in) begin: local Integer i; out = 0; none_on = 1; /*returns the value of the highest bitnumber turned on*/ for( i=0; i8; i=i+1 ) begin if( ini ) begin out = i; none_on = 0; end end endendmodule 5.5.1 組合邏輯電路設(shè)計(jì)實(shí)例module encoder2 ( none_on, out2, out1, out0, h, g, f, e,
13、d, c, b, a); input h, g, f, e, d, c, b, a; output none_on, out2, out1, out0; wire 3:0 outvec; assign outvec= h? 4b0111 : g? 4b0110 : f? 4b0101: e? 4b0100 : d? 4b0011 :c? 4b0010 : b? 4b0001: a? 4b0000 : 4b1000; assign none_on = outvec3; assign out2 = outvec2; assign out1 = outvec1; assign out0 = outv
14、ec0;endmoduleu 編碼器設(shè)計(jì)方案之二:編碼器設(shè)計(jì)方案之二:5.5.1 組合邏輯電路設(shè)計(jì)實(shí)例module encoder3 (none_on, out2, out1, out0, h, g, f, e, d, c, b, a); input h, g, f, e, d, c, b, a; output out2, out1, out0; output none_on; reg 3:0 outvec;assign none_on,out2,out1,out0 = outvec;always ( a or b or c or d or e or f or g or h)u 編碼器設(shè)計(jì)方案
15、之三:編碼器設(shè)計(jì)方案之三: begin if(h) outvec=4b0111; else if(g) outvec=4b0110; else if(f) outvec=4b0101; else if(e) outvec=4b0100; else if(d) outvec=4b0011; else if(c) outvec=4b0010; else if(b) outvec=4b0001; else if(a) outvec=4b0000; else outvec=4b1000; endendmodule5.5.1 組合邏輯電路設(shè)計(jì)實(shí)例例5.7. 多路器的設(shè)計(jì)實(shí)例。 使用連續(xù)賦值、case語(yǔ)句
16、或if-else語(yǔ)句可以生成多路器電路,如果條件語(yǔ)句(case或if-else)中分支條件是互斥的話,綜合器能自動(dòng)地生成并行的多路器。n 多路器設(shè)計(jì)方案之一多路器設(shè)計(jì)方案之一: :modul emux1(out, a, b, sel); output out; input a, b, sel; assign out = sel? A : b;endmodule5.5.1 組合邏輯電路設(shè)計(jì)實(shí)例l 多路器設(shè)計(jì)方案之二多路器設(shè)計(jì)方案之二: : module mux2( out, a, b, sel); output out; input a, b, sel; reg out; /用電平觸發(fā)的alwa
17、ys塊來(lái)設(shè)計(jì)多路器的組合邏輯 always ( a or b or sel ) begin /*檢查輸入信號(hào)sel的值,如為1,輸出out為a,如為0,輸出out為 b.*/ case( sel ) 1b1: out = a; 1b0: out = b; default: out = bx; endcase end endmodule5.5.1 組合邏輯電路設(shè)計(jì)實(shí)例l 多路器設(shè)計(jì)方案之三: module mux3( out, a, b, sel); output out; input a, b, sel; reg out; always ( a or b or sel ) begin if(
18、sel ) out = a; else out = b; end endmodule5.5.1 組合邏輯電路設(shè)計(jì)實(shí)例例5.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_numbits = input_bus; assign even_numbits = odd_numbits;endmodule5.5.1 組合邏輯電路設(shè)計(jì)實(shí)例例5.9. 三態(tài)輸出驅(qū)動(dòng)器設(shè)計(jì)實(shí)例(用連續(xù)賦值語(yǔ)句建
19、立三態(tài)門(mén)模型)l 三態(tài)輸出驅(qū)動(dòng)器設(shè)計(jì)方案之一: module trist1( out, in, enable); output out; input in, enable; assign out = enable? in: bz; endmodule5.5.1 組合邏輯電路設(shè)計(jì)實(shí)例l三態(tài)輸出驅(qū)動(dòng)器設(shè)計(jì)方案之二: module trist2( out, in, enable ); output out; input in, enable; /bufif1是 一個(gè) Verilog門(mén)級(jí)原語(yǔ)(primitive) bufif1 mybuf1(out, in, enable); endmodule5.5
20、.1 組合邏輯電路設(shè)計(jì)實(shí)例l三態(tài)輸出驅(qū)動(dòng)器設(shè)計(jì)方案之二:module trist2( out, in, enable ); output out; input in, enable; /bufif1是 一個(gè) Verilog門(mén)級(jí)原語(yǔ)(primitive) bufif1 mybuf1(out, in, enable);endmodule5.5.1 組合邏輯電路設(shè)計(jì)實(shí)例例5.10. 三態(tài)雙向驅(qū)動(dòng)器設(shè)計(jì)實(shí)例module bidir(tri_inout, out, in, en, b); inout tri_inout; output out; input in, en, b; assign tri_i
21、nout = en? In : bz; assign out = tri_inout b;endmodule例5.10. 三態(tài)雙向驅(qū)動(dòng)器設(shè)計(jì)實(shí)例module bidir(tri_inout, out, in, en, b); inout tri_inout; output out; input in, en, b; assign tri_inout = en? In : bz; assign out = tri_inout b;endmodule5.5.2 時(shí)序邏輯電路設(shè)計(jì)實(shí)例例5.11觸發(fā)器設(shè)計(jì)實(shí)例 module dff( q, data, clk); output q; input dat
22、a, clk; reg q; always ( posedge clk ) begin q = data; end endmodule5.5.2 時(shí)序邏輯電路設(shè)計(jì)實(shí)例例5.12. 電平敏感型鎖存器設(shè)計(jì)實(shí)例之一 module latch1( q, data, clk); output q; input data, clk; assign q = clk? data : q; endmodule5.5.2 時(shí)序邏輯電路設(shè)計(jì)實(shí)例例5.13. 帶置位和復(fù)位端的電平敏感型鎖存器設(shè)計(jì)實(shí)例之二 module latch2( q, data, clk, set, reset); output q; input
23、 data, clk, set, reset; assign q= reset? 0 : ( set? 1:(clk? data : q ) );endmodule5.5.2 時(shí)序邏輯電路設(shè)計(jì)實(shí)例例5.14. 電平敏感型鎖存器設(shè)計(jì)實(shí)例之三 module latch3( q, data, clk); output q; input data, clk; reg q; always (clk or data) begin if(clk) q=data; end endmodule注意:有的綜合器會(huì)產(chǎn)生一注意:有的綜合器會(huì)產(chǎn)生一警告信息警告信息 告訴你產(chǎn)生了一告訴你產(chǎn)生了一個(gè)電平敏感型鎖存器。因?yàn)閭€(gè)
24、電平敏感型鎖存器。因?yàn)槲覀冊(cè)O(shè)計(jì)的就是一個(gè)電平敏我們?cè)O(shè)計(jì)的就是一個(gè)電平敏感型鎖存器,就不用管這個(gè)感型鎖存器,就不用管這個(gè)警告信息。警告信息。5.5.2 時(shí)序邏輯電路設(shè)計(jì)實(shí)例例5.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) /清零清零 dout = 8b0; else begin dout = dout1; /左移一位左移一位 dout0 = din; /把輸入信號(hào)放
25、入寄存器的最低位把輸入信號(hào)放入寄存器的最低位 end end endmodule5.5.2 時(shí)序邏輯電路設(shè)計(jì)實(shí)例例5.16. 八位計(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 ) out = data; else out = out + cin; end assign cout= & out
26、 & cin; /只有當(dāng)out7:0的所有各位都為1,并且進(jìn)位cin也為1時(shí)才能產(chǎn)生進(jìn)位cout endmodule5.5.2 時(shí)序邏輯電路設(shè)計(jì)實(shí)例例5.17. 八位計(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 out = preout; e
27、nd/*計(jì)算計(jì)數(shù)器和進(jìn)位的下一個(gè)狀態(tài),注意:為提高性能不希望加載影響進(jìn)位*/always ( out or data or load or cin ) begin cout, preout = out + cin; if(load) preout = data; endendmodule5.6.1 狀態(tài)機(jī)的異步置位與復(fù)位( ( ) ) 沿關(guān)鍵詞包括沿關(guān)鍵詞包括 posedge(用(用于高電平有效的于高電平有效的set、reset或上或上升沿觸發(fā)的時(shí)鐘)和升沿觸發(fā)的時(shí)鐘)和 negedge(用于低電平有效的(用于低電平有效的set、reset或下降沿觸發(fā)的時(shí)鐘),信號(hào)可或下降沿觸發(fā)的時(shí)鐘),信號(hào)
28、可以按任意順序列出。以按任意順序列出。1)異步、高電平有效的置位(時(shí)鐘的上升沿)異步、高電平有效的置位(時(shí)鐘的上升沿)(posedge clk or posedge set)2) 異步低電平有效的復(fù)位(時(shí)鐘的上升沿)異步低電平有效的復(fù)位(時(shí)鐘的上升沿) (posedge clk or negedge reset)3) 異步低電平有效的置位和高電平有效的復(fù)位(時(shí)鐘的上升沿)異步低電平有效的置位和高電平有效的復(fù)位(時(shí)鐘的上升沿) ( posedge clk or negedge set or posedge reset )5.6.1 狀態(tài)機(jī)的異步置位與復(fù)位4) 帶異步高電平有效的置位與復(fù)位的alw
29、ays塊樣板always (posedge clk or posedge set or posedge reset) begin if(reset) begin /*置輸出為置輸出為0*/ end else if(set) begin /*置輸出為置輸出為1*/ end else begin /*與時(shí)鐘同步的邏輯與時(shí)鐘同步的邏輯*/ end end5.6.1 狀態(tài)機(jī)的異步置位與復(fù)位5) 5) 帶異步高電平有效的置帶異步高電平有效的置/ /復(fù)位端的復(fù)位端的D D觸發(fā)器實(shí)例觸發(fā)器實(shí)例module dff1( q, qb, d, clk, set, reset ); input d, clk, se
30、t, reset; output q, qb; /聲明聲明q和和qb為為reg類(lèi)型類(lèi)型,因?yàn)樗枰谝驗(yàn)樗枰赼lways塊塊內(nèi)賦值內(nèi)賦值 reg q, qb; always ( posedge clk or posedge set or posedge reset ) begin if(reset) begin q = 0; qb = 1; endelse if (set) begin q = 1; qb = 0; end else begin q = d; qb = d; endendendmodule5.6.2 狀態(tài)機(jī)的同步置位與復(fù)位 同步置位與復(fù)位是指只有在時(shí)鐘的有效跳變沿時(shí)刻置位或
31、復(fù)位信同步置位與復(fù)位是指只有在時(shí)鐘的有效跳變沿時(shí)刻置位或復(fù)位信號(hào)才能使觸發(fā)器置位或復(fù)位號(hào)才能使觸發(fā)器置位或復(fù)位( (即即, ,使觸發(fā)器的輸出分別轉(zhuǎn)變?yōu)檫壿嬍褂|發(fā)器的輸出分別轉(zhuǎn)變?yōu)檫壿? 1或或0)0)。() 其中沿關(guān)鍵詞指 posedge(正沿觸發(fā))或 negedge(負(fù)沿觸發(fā))1) 正沿觸發(fā)正沿觸發(fā) (posedge clk)2) 負(fù)沿觸發(fā)負(fù)沿觸發(fā) (negedge clk)3) 同步的具有高電平有效的置位與復(fù)位同步的具有高電平有效的置位與復(fù)位端的端的always塊樣板塊樣板always (posedge clk) begin if(reset) begin /*置輸出為置輸出為0*/ en
32、d else if(set) begin /*置輸出為置輸出為1*/ end else begin /*與時(shí)鐘同步的邏輯與時(shí)鐘同步的邏輯*/ end end5.6.2 狀態(tài)機(jī)的同步置位與復(fù)位4) 同步的具有高電平有效的置位/復(fù)位端的D觸發(fā)器module dff2( q, qb, d, clk, set, reset); input d, clk, set, reset; output q, qb; reg q, qb; always (posedge clk) begin if(reset) begin q=0; qb=1; endelse if(set) begin q=1; qb=0; e
33、nd else begin q=d; qb=d; end endendmoduleVerilog 數(shù)字系統(tǒng)設(shè)計(jì)教程第六講 深入理解阻塞和非阻塞賦值的不同6.1 深入理解阻塞和非阻塞賦值的不同l 在描述組合邏輯的always 塊中用阻塞賦值,則綜合成組合邏輯的電路結(jié)構(gòu)。l 在描述時(shí)序邏輯的always 塊中用非阻塞賦值,則綜合成時(shí)序邏輯的電路結(jié)構(gòu)。RHS 方程式右手方向的表達(dá)式或變量可分別縮寫(xiě)為:方程式右手方向的表達(dá)式或變量可分別縮寫(xiě)為: RHS 表達(dá)式或表達(dá)式或 RHS 變量。變量。LHS 方程式左手方向的表達(dá)式或變量可分別縮寫(xiě)為:方程式左手方向的表達(dá)式或變量可分別縮寫(xiě)為: LHS 表達(dá)式或表
34、達(dá)式或 LHS 變量。變量。6.1.1 阻塞賦值阻塞賦值的執(zhí)行可以認(rèn)為是只有一個(gè)步驟的操作:阻塞賦值的執(zhí)行可以認(rèn)為是只有一個(gè)步驟的操作: 計(jì)算計(jì)算RHS 并更新并更新LHS,此時(shí)不能允許有來(lái)自任何其他,此時(shí)不能允許有來(lái)自任何其他Verilog 語(yǔ)句的干擾。語(yǔ)句的干擾。 所謂阻塞的概念是指在同一個(gè)所謂阻塞的概念是指在同一個(gè)always 塊中,其后塊中,其后面的賦面的賦值語(yǔ)句從概念上(即使不設(shè)定延遲)是在前一句賦值語(yǔ)句結(jié)束后值語(yǔ)句從概念上(即使不設(shè)定延遲)是在前一句賦值語(yǔ)句結(jié)束后再開(kāi)始再開(kāi)始賦值的。賦值的。 例例6.16.1 用阻塞賦值的反饋振蕩器module fbosc1 (y1, y2, cl
35、k, rst); output y1, y2; input clk, rst; reg y1, y2; always (posedge clk or posedge rst) if (rst) y1 = 0; / reset else y1 = y2; always (posedge clk or posedge rst) if (rst) y2 = 1; / preset else y2 = y1;endmodule 如果在一個(gè)過(guò)程塊中阻塞賦值如果在一個(gè)過(guò)程塊中阻塞賦值的的RHS RHS 變量正好是另一個(gè)過(guò)程塊中變量正好是另一個(gè)過(guò)程塊中阻塞賦值的阻塞賦值的LHS LHS 變量,這兩個(gè)過(guò)程變量
36、,這兩個(gè)過(guò)程塊又用同一個(gè)時(shí)鐘沿觸發(fā),如果阻塊又用同一個(gè)時(shí)鐘沿觸發(fā),如果阻塞賦值的次序安排不好,就會(huì)出現(xiàn)塞賦值的次序安排不好,就會(huì)出現(xiàn)競(jìng)爭(zhēng)。若這兩個(gè)阻塞賦值操作用同競(jìng)爭(zhēng)。若這兩個(gè)阻塞賦值操作用同一個(gè)時(shí)鐘沿觸發(fā),則執(zhí)行的次序是一個(gè)時(shí)鐘沿觸發(fā),則執(zhí)行的次序是無(wú)法確定的。無(wú)法確定的。并并行行執(zhí)執(zhí)行行如果前一個(gè)如果前一個(gè)always塊的復(fù)位信號(hào)先塊的復(fù)位信號(hào)先到到0 時(shí)刻,則時(shí)刻,則y1 和和y2 都會(huì)取都會(huì)取1,而,而如果后一個(gè)如果后一個(gè)always 塊的復(fù)位信號(hào)先塊的復(fù)位信號(hào)先到到0 時(shí)刻,則時(shí)刻,則y1 和和y2 都會(huì)取都會(huì)取0。這。這清楚地說(shuō)明這個(gè)清楚地說(shuō)明這個(gè)Verilog 模塊是不穩(wěn)模塊是不
37、穩(wěn)定的會(huì)產(chǎn)生冒險(xiǎn)和競(jìng)爭(zhēng)的情況。定的會(huì)產(chǎn)生冒險(xiǎn)和競(jìng)爭(zhēng)的情況。6.1.2 非阻塞賦值非阻塞賦值的操作可以看作為兩個(gè)步驟的過(guò)程:非阻塞賦值的操作可以看作為兩個(gè)步驟的過(guò)程:1) 1) 在賦值時(shí)刻開(kāi)始時(shí),計(jì)算非阻塞賦值在賦值時(shí)刻開(kāi)始時(shí),計(jì)算非阻塞賦值RHS RHS 表達(dá)式。表達(dá)式。2) 2) 在賦值時(shí)刻結(jié)束時(shí),更新非阻塞賦值在賦值時(shí)刻結(jié)束時(shí),更新非阻塞賦值LHS LHS 表達(dá)式。表達(dá)式。 例例6.26.2 用非阻塞賦值的反饋振蕩器module fbosc2 (y1, y2, clk, rst); output y1, y2; input clk, rst; reg y1, y2; always (pos
38、edge clk or posedge rst) if (rst) y1 = 0; / reset else y1 = y2; always (posedge clk or posedge rst) if (rst) y2 = 1; / preset else y2 = y1;endmodule非阻塞賦值操作只能用于對(duì)寄存器類(lèi)型變量進(jìn)行賦值,因此只能用在initial塊和always塊等過(guò)程塊中。非阻塞賦值不允許用于連續(xù)賦值。并并行行執(zhí)執(zhí)行行無(wú)論哪一個(gè)always 塊的復(fù)位信號(hào)先到, 兩個(gè)always 塊中的非阻塞賦值都在賦值開(kāi)始時(shí)刻計(jì)算RHS 表達(dá)式,而在結(jié)束時(shí)刻才更新LHS 表達(dá)式。所以這
39、兩個(gè)always 塊在復(fù)位信號(hào)到來(lái)后,在always 塊結(jié)束時(shí) y1 為0 而y2為1 是確定的。從用戶的角度看這兩個(gè)非阻塞賦值正好是并行執(zhí)行的。6.2 Verilog模塊編程要點(diǎn) 掌握一下掌握一下8個(gè)要點(diǎn)可以解決綜合后仿真出現(xiàn)的個(gè)要點(diǎn)可以解決綜合后仿真出現(xiàn)的90以以上的競(jìng)爭(zhēng)和冒險(xiǎn)。上的競(jìng)爭(zhēng)和冒險(xiǎn)。1) 時(shí)序電路建模時(shí),用非阻塞賦值。時(shí)序電路建模時(shí),用非阻塞賦值。2) 鎖存器電路建模時(shí),用非阻塞賦值。鎖存器電路建模時(shí),用非阻塞賦值。3) 用用always 塊建立組合邏輯模型時(shí),用阻塞賦值。塊建立組合邏輯模型時(shí),用阻塞賦值。4) 在同一個(gè)在同一個(gè)always 塊中建立時(shí)序和組合邏輯電路時(shí),用非阻
40、塊中建立時(shí)序和組合邏輯電路時(shí),用非阻塞賦值。塞賦值。5) 在同一個(gè)在同一個(gè)always 塊中不要既用非阻塞賦值又用阻塞賦值。塊中不要既用非阻塞賦值又用阻塞賦值。6) 不要在一個(gè)以上的不要在一個(gè)以上的always 塊中為同一個(gè)變量賦值。塊中為同一個(gè)變量賦值。7) 用用$strobe 系統(tǒng)任務(wù)來(lái)顯示用非阻塞賦值的變量值系統(tǒng)任務(wù)來(lái)顯示用非阻塞賦值的變量值8) 在賦值時(shí)不要使用在賦值時(shí)不要使用 #0 延遲延遲6.3 Verilog的層次化事件隊(duì)列 所謂層次化事件隊(duì)列指的是用于調(diào)度仿真事件的不同的Verilog 事件隊(duì)列。 在IEEE 1364-1995 Verilog 標(biāo)準(zhǔn)的5.3 節(jié)中定義了: 層次
41、化事件隊(duì)列在邏輯上分為用于當(dāng)前仿真時(shí)間的4 個(gè)不同的隊(duì)列, 和用于下一段仿真時(shí)間的若干個(gè)附加隊(duì)列。6.3 Verilog的層次化事件隊(duì)列(1)動(dòng)態(tài)事件隊(duì)列:l 阻塞賦值;l 計(jì)算非阻塞語(yǔ)句右邊的表達(dá)式;l 連續(xù)賦值;l 執(zhí)行$display命令;l 計(jì)算原語(yǔ)的輸入和輸出變化。(2)停止運(yùn)行的事件隊(duì)列: 0延時(shí)阻塞賦值6.3 Verilog的層次化事件隊(duì)列(3)非阻塞事件隊(duì)列: 更新非阻塞賦值語(yǔ)句LHS(左邊變量)的值;(4)監(jiān)控事件隊(duì)列l(wèi) 執(zhí)行$monitor命令;l 執(zhí)行$strobe命令;(5)其他指定的PLI命令隊(duì)列。 大多數(shù)Verilog 事件是由動(dòng)態(tài)事件隊(duì)列調(diào)度的,這些事件包括阻塞賦
42、值、連續(xù)賦值、$display 命令、實(shí)例和原語(yǔ)的輸入變化以及他們的輸出更新、非阻塞賦值語(yǔ)句RHS 的計(jì)算等。而非阻塞賦值語(yǔ)句LHS 的更新卻不由動(dòng)態(tài)事件隊(duì)列調(diào)度。6.4 自觸發(fā)always塊一般而言,Verilog 的always 塊不能觸發(fā)自己例6.3 使用阻塞賦值的非自觸發(fā)振蕩器 module osc1 (clk); output clk; reg clk; initial #10 clk = 0; always (clk) #10 clk = clk; endmodule 上例描述的時(shí)鐘振蕩器使用了阻塞賦值。阻塞賦值時(shí),計(jì)上例描述的時(shí)鐘振蕩器使用了阻塞賦值。阻塞賦值時(shí),計(jì)算算RHS 表
43、達(dá)式并更新表達(dá)式并更新LHS 的值,此時(shí)不允許其他語(yǔ)句的干擾。的值,此時(shí)不允許其他語(yǔ)句的干擾。阻塞賦值必須在阻塞賦值必須在(clk)邊沿觸發(fā)到來(lái)時(shí)刻之前完成。當(dāng)觸發(fā)邊沿觸發(fā)到來(lái)時(shí)刻之前完成。當(dāng)觸發(fā)事件到來(lái)時(shí),阻塞賦值已經(jīng)完成了,因此沒(méi)有來(lái)自事件到來(lái)時(shí),阻塞賦值已經(jīng)完成了,因此沒(méi)有來(lái)自always 塊塊內(nèi)部的觸發(fā)事件來(lái)觸發(fā)內(nèi)部的觸發(fā)事件來(lái)觸發(fā)(clk),是一個(gè)非自觸發(fā)振蕩器。,是一個(gè)非自觸發(fā)振蕩器。6.4 自觸發(fā)always塊 例例6.4 6.4 采用非阻塞賦值的自觸發(fā)振蕩器采用非阻塞賦值的自觸發(fā)振蕩器 module osc2 (clk); output clk; reg clk; initia
44、l #10 clk = 0; always (clk) #10 clk = clk;endmodule6.5移位寄存器模型l下圖表示是一個(gè)簡(jiǎn)單的移位寄存器方框圖。圖圖2.6.1 2.6.1 移位寄存器電路移位寄存器電路6.5移位寄存器模型例6.5 不正確地使用的阻塞賦值來(lái)描述移位寄存器。(方式 #1) module pipeb1 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) begin q1 = d; q2 = q1; q3 = q2; end Endm
45、odule在上面的模塊中,按順序在上面的模塊中,按順序進(jìn)行的阻塞賦值將使得在下一進(jìn)行的阻塞賦值將使得在下一個(gè)時(shí)鐘上升沿時(shí)刻,所有的寄個(gè)時(shí)鐘上升沿時(shí)刻,所有的寄存器輸出值都等于輸入值存器輸出值都等于輸入值d d。在。在每個(gè)時(shí)鐘上升沿,輸入值每個(gè)時(shí)鐘上升沿,輸入值d d 將將無(wú)延時(shí)地直接輸出到無(wú)延時(shí)地直接輸出到q3q3。6.5移位寄存器模型例6.6 用阻塞賦值來(lái)描述移位寄存器也是可行的,但這種風(fēng)格并不好。(方式 #2 ) module pipeb2 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; al
46、ways (posedge clk) begin q3 = q2; q2 = q1; q1 = d; end endmodule 在上面的模塊中,阻塞賦值的次序是經(jīng)過(guò)仔細(xì)安排的,以使仿真的結(jié)果與移位寄存器相一致。雖然該模塊可被綜合成圖2.6.1所示的移位寄存器,但我們不建議使用這種風(fēng)格的模塊來(lái)描述時(shí)序邏輯。6.5 移位寄存器模型例6.7 不用阻塞賦值來(lái)描述移位時(shí)序邏輯的風(fēng)格(方式 #3)module pipeb3 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge cl
47、k) q1 = d; always (posedge clk) q2 = q1; always (posedge clk) q3 = q2;endmodule 本例中,阻塞賦值分別被放在不同的always 塊里。仿真時(shí),這些塊的先后順序是隨機(jī)的,因此可能會(huì)出現(xiàn)錯(cuò)誤的結(jié)果。這是Verilog 中的競(jìng)爭(zhēng)冒險(xiǎn)。按不同的順序執(zhí)行這些塊將導(dǎo)致不同的結(jié)果。但是, 這些代碼的綜合結(jié) 果卻是正確的流水 線寄存器。也就 是說(shuō),前仿真和 后仿真的結(jié)果可 能會(huì)不一致。6.5 移位寄存器模型例6.8 不用阻塞賦值來(lái)描述移位時(shí)序邏輯的風(fēng)格(方式 #4)module pipeb4 (q3, d, clk); output
48、 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) q2 = q1; always (posedge clk) q3 = q2; always (posedge clk) q1 = d;endmodule6.5 移位寄存器模型例6.9 正確使用非阻塞賦值來(lái)描述時(shí)序邏輯的設(shè)計(jì)風(fēng)格 (方式 #1) module pipen1 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge c
49、lk) begin q1 = d; q2 = q1; q3 = q2; end endmodule6.5 移位寄存器模型例6.10 正確使用非阻塞賦值來(lái)描述時(shí)序邏輯的設(shè)計(jì)風(fēng)格(方式 #2) module pipen2 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) begin q3 = q2; q2 = q1; q1 = d; end endmodule6.5 移位寄存器模型例6.11 正確使用非阻塞賦值來(lái)描述時(shí)序邏輯的設(shè)計(jì)風(fēng)格 (方式 #3) modul
50、e pipen3 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) q1 = d; always (posedge clk) q2 = q1; always (posedge clk) q3 = q2; endmodule6.5 移位寄存器模型例6.12 正確使用非阻塞賦值來(lái)描述時(shí)序邏輯的設(shè)計(jì)風(fēng)格 (方式 #4) module pipen4 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:
51、0 q3, q2, q1; always (posedge clk) q2 = q1; always (posedge clk) q3 = q2; always (posedge clk) q1 = d; endmodule6.5 移位寄存器模型以上移位寄存器時(shí)序邏輯電路設(shè)計(jì)的例子表明:l 4種阻塞賦值設(shè)計(jì)方式中有1種可以保證仿真正確l 4種阻塞賦值設(shè)計(jì)方式中有3種可以保證綜合正確l 4種非阻塞賦值設(shè)計(jì)方式全部可以保證仿真正確l 4種非阻塞賦值設(shè)計(jì)方式全部可以保證綜合正確6.6 阻塞賦值及一些簡(jiǎn)單的例子例6.13 module dffb (q, d, clk, rst); output q;
52、input d, clk, rst; reg q; always (posedge clk) if (rst) q = 1b0; else q = d; endmodule 雖然可行也很簡(jiǎn)單,但我們不建議這種用阻塞賦值來(lái)描述D 觸發(fā)器模型的風(fēng)格。如果要把所有的模塊寫(xiě)到一個(gè)always 塊里,是可以采用阻塞賦值得到正確的建模、仿真并綜合成期望的邏輯。但是,這種想法將導(dǎo)致使用阻塞賦值的習(xí)慣,而在較為復(fù)雜的多個(gè)always 塊的情況下可能會(huì)導(dǎo)致競(jìng)爭(zhēng)冒險(xiǎn).6.6 阻塞賦值及一些簡(jiǎn)單的例子例6.14 使用非阻塞賦值來(lái)描述D 觸發(fā)器是建議使用的風(fēng)格 module dffx (q, d, clk, rst)
53、; output q; input d, clk, rst; reg q; always (posedge clk) if (rst) q = 1b0; else q = d; endmodule 養(yǎng)成在描述時(shí)序邏輯的多個(gè)always 塊(甚至在單個(gè)always 塊)中使用非阻塞賦值的習(xí)慣比較好,此例就是這個(gè)例子。6.7 時(shí)序反饋移位寄存器建模l 線性反饋移位寄存器(線性反饋移位寄存器(Linear Feedback Shift-Register 簡(jiǎn)稱(chēng)簡(jiǎn)稱(chēng)LFSR)是帶反饋回路的時(shí)序邏輯。反饋回路給習(xí)慣于用順序)是帶反饋回路的時(shí)序邏輯。反饋回路給習(xí)慣于用順序阻塞賦值描述時(shí)序邏輯的設(shè)計(jì)人員帶來(lái)了
54、麻煩。阻塞賦值描述時(shí)序邏輯的設(shè)計(jì)人員帶來(lái)了麻煩。l 例6.15 用阻塞賦值實(shí)現(xiàn)的線性反饋移位寄存器,實(shí)際上并不具有LFSR 的功能 module lfsrb1 (q3, clk, pre_n); output q3; input clk, pre_n; reg q3, q2, q1; wire n1; assign n1 = q1 q3; always (posedge clk or negedge pre_n) if (!pre_n) begin q3 = 1b1; q2 = 1b1; q1 = 1b1; endelse begin q3 = q2; q2 = n1; q1 = q3; en
55、dendmodule6.7 時(shí)序反饋移位寄存器建模例6.16 用阻塞賦值描述的線性反饋移位寄存器,其功能正確,但模型的含義較難理解。 module lfsrb2 (q3, clk, pre_n); output q3; input clk, pre_n; reg q3, q2, q1; always (posedge clk or negedge pre_n) if (!pre_n) q3,q2,q1 = 3b111; else q3,q2,q1 = q2,(q1q3),q3; endmodule 如果將例如果將例6.15 6.15 和例和例6.16 6.16 中的阻塞賦值用非阻塞賦值代中的阻
56、塞賦值用非阻塞賦值代替,如例替,如例6.17 6.17 和例和例6.18 6.18 所示,仿真結(jié)果都和所示,仿真結(jié)果都和LFSR LFSR 的功能相的功能相一致。一致。6.7 時(shí)序反饋移位寄存器建模例6.17 用非阻塞語(yǔ)句描述的LFSR,可綜合其功能正確。module lfsrn1 (q3, clk, pre_n); output q3; input clk, pre_n; reg q3, q2, q1; wire n1; assign n1 = q1 q3; always (posedge clk or negedge pre_n)if (!pre_n) begin q3 = 1b1; q2
57、 = 1b1; q1 = 1b1;endelse begin q3 = q2; q2 = n1; q1 = q3;endendmodule6.7 時(shí)序反饋移位寄存器建模例6.18 用非阻塞語(yǔ)句描述的LFSR,可綜合其功能正確。 module lfsrn2 (q3, clk, pre_n); output q3; input clk, pre_n; reg q3, q2, q1; always (posedge clk or negedge pre_n) if (!pre_n) q3,q2,q1 = 3b111; else q3,q2,q1 = q2,(q1q3),q3; endmodule6.
58、7 時(shí)序反饋移位寄存器建模l從上面介紹的移位寄存器的例子以從上面介紹的移位寄存器的例子以及及LFSR LFSR 的例子,建議使用非阻塞的例子,建議使用非阻塞賦值實(shí)現(xiàn)時(shí)序邏輯。而用非阻塞賦賦值實(shí)現(xiàn)時(shí)序邏輯。而用非阻塞賦值語(yǔ)句實(shí)現(xiàn)鎖存器也是最為安全的。值語(yǔ)句實(shí)現(xiàn)鎖存器也是最為安全的。因此,有以下原則:因此,有以下原則:6.8 組合邏輯建模時(shí)應(yīng)使用阻塞賦值l 在在Verilog Verilog 中可以用多種方法來(lái)描述組合邏輯,但是中可以用多種方法來(lái)描述組合邏輯,但是當(dāng)用當(dāng)用always always 塊來(lái)描述組合邏輯時(shí),應(yīng)該用阻塞賦值。塊來(lái)描述組合邏輯時(shí),應(yīng)該用阻塞賦值。l 有些設(shè)計(jì)人員提倡非阻塞賦
59、值語(yǔ)句不僅可以用于時(shí)序有些設(shè)計(jì)人員提倡非阻塞賦值語(yǔ)句不僅可以用于時(shí)序邏輯,也可以用于組合邏輯的描述。對(duì)于簡(jiǎn)單的組合邏輯,也可以用于組合邏輯的描述。對(duì)于簡(jiǎn)單的組合alwasys alwasys 塊是可以這樣的,但是當(dāng)塊是可以這樣的,但是當(dāng)always always 塊中有多個(gè)塊中有多個(gè)賦值語(yǔ)句時(shí),如例賦值語(yǔ)句時(shí),如例6.19 6.19 所示的四輸入與或門(mén)邏輯,使所示的四輸入與或門(mén)邏輯,使用沒(méi)有延時(shí)的非阻塞賦值可能導(dǎo)致仿真結(jié)果不正確。有用沒(méi)有延時(shí)的非阻塞賦值可能導(dǎo)致仿真結(jié)果不正確。有時(shí)需要在時(shí)需要在always always 塊的入口附加敏感事件參數(shù),才能使塊的入口附加敏感事件參數(shù),才能使仿真正確
60、,因而從仿真的時(shí)間效率角度看也不合算。仿真正確,因而從仿真的時(shí)間效率角度看也不合算。6.8 組合邏輯建模時(shí)應(yīng)使用阻塞賦值例6.19 使用非阻塞賦值語(yǔ)句來(lái)描述組合邏輯不建議使用這種風(fēng)格。 module ao4 (y, a, b, c, d); output y; input a, b, c, d; reg y, tmp1, tmp2; always (a or b or c or d) begin tmp1 = a & b; tmp2 = c & d; y = tmp1 | tmp2; end endmodule例19 中,輸出y 的值由三個(gè)時(shí)序語(yǔ)句計(jì)算得到。由于非阻塞賦值語(yǔ)句在LHS 更新前,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 管理咨詢服務(wù)合同(2025年版)
- 實(shí)心板橋施工方案
- 針灸學(xué)課程實(shí)驗(yàn)教學(xué)大綱
- 窗口側(cè)壁施工方案
- 汽車(chē)美容行業(yè)品牌建設(shè)策略試題及答案
- 汽車(chē)維修行業(yè)人才培養(yǎng)策略試題及答案
- 教學(xué)工作督導(dǎo)機(jī)制計(jì)劃
- 班級(jí)團(tuán)體競(jìng)賽的組織與管理計(jì)劃
- 藥理學(xué)考試2024年快速提升試題及答案
- 年度預(yù)算的執(zhí)行與回顧計(jì)劃
- 生物質(zhì)能源綜合利用項(xiàng)目可行性分析報(bào)告
- 【道法】做自強(qiáng)不息的中國(guó)人課件+-2024-2025學(xué)年統(tǒng)編版道德與法治七年級(jí)下冊(cè)
- 【道法】人生當(dāng)自強(qiáng)課件-2024-2025學(xué)年統(tǒng)編版道德與法治七年級(jí)下冊(cè)
- 汽車(chē)維修質(zhì)量保證制度
- 外研版(三起)(2024)三年級(jí)下冊(cè)英語(yǔ)Unit 3 單元測(cè)試卷(含答案)
- 2024年廣州市衛(wèi)生健康系統(tǒng)招聘“優(yōu)才計(jì)劃”考試真題
- 重點(diǎn)營(yíng)業(yè)線施工方案
- 餐飲店菜品成本計(jì)算表
- 《水土保持監(jiān)測(cè)技術(shù)規(guī)范SLT 277-2024》知識(shí)培訓(xùn)
- 2025年江蘇南京事業(yè)單位招聘(787人)高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 第11課《山地回憶》公開(kāi)課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論