




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Abstract FSM 在數(shù)位電路中非常重要,藉由 FSM ,可以讓數(shù)位電路也能循序地執(zhí)行起演算法。本文將詳 細討論各種 FSM coding style的優(yōu)缺點,並歸納出推薦的 coding style 。 Introduction 使用環(huán)境: Debussy 5.4 v9 + ModelSim SE 6.3e+ Quartus II 8.1 本文將討論以下主題: 1. Moore FSM 的架構(gòu) 2. Moore FSM 各種 coding style 比較 3. Mealy FSM 架構(gòu) 4. Mealy FSM 各種 coding style 比較 5. 實務(wù)上推薦的 coding
2、style 6. Conclusion 若要讓數(shù)位電路也能循序地執(zhí)行演算法,最簡單的方式可以使用 D-FF 產(chǎn)生 counter ,根據(jù) counter 的值去決定要執(zhí)行不同的程式碼,如此也能達到使數(shù)位電路循序執(zhí)行演算法的目的, 不過這種方式僅適用於很簡單的演算法,在一般規(guī)模的演算法若使用 counter 方式,程式碼將 不容易維護,所以實務(wù)上會使用 FSM 方式來實現(xiàn)演算法。 其實 FSM 方式也是利用 counter 來實現(xiàn), 所謂的 counter ,並不是只有 counter = counter + 1 才算是 counter , FSM 的 state register 就是廣義的
3、counter ,只是這種 counter 不是一直 加1 而已,而是有自己的遞增規(guī)則。 FSM 只是提供了一種較為高階與較容易維護的方式來實現(xiàn) 演算法。 Moore FSM 架構(gòu) input c lock 一般在寫FSM時,會以 Moore FSM 為主,所以先討論 Moore。由上圖可知,Moore FSM 內(nèi) 部由 3 個 block 所構(gòu)成:Next state logic , State register 與 Output logic 。 Next state logic:純粹的組合邏輯,以整個 module 的in put與目前的state為輸入,目 的在產(chǎn)生下一個state 值存
4、入state register 。 State register :由 D-FF 所構(gòu)成,將 Next state logic所產(chǎn)生的 state 存入 register 。 Output logic:純粹的組合邏輯,根據(jù)目前的state 產(chǎn)生整個module 的output。 所以可以發(fā)現(xiàn),整個 Moore FSM事實上是由2塊的組合邏輯與1塊D-FF所構(gòu)成,我們常聽 到所謂的一段式、二段式與三段式FSM,事實上就是由這3個block排列組合而成。 為了要實際比較各種codi ng style,在此舉一個簡單的例子,若in put w_i 為連續(xù)2個clk為 high,貝U output 會
5、在下1個clk產(chǎn)生周期為 1 T的high pulse , timing diagram 如上圖所 示。 因此設(shè)計了 Moore FSM , state diagram 如上圖所示,接下來要做的就是用各種coding style 來實現(xiàn)這個Moore FSM 。 1.使用3個always ( 三段式) input clock simple_fsm_moore_3_always_best.v / Verilog 1 /* 2 (C) OOMusou 2011 http:/ 3 3 File name : simple_fsm_moore_3_always_best.v 4 Synthesizer
6、 : Quartus II 8.1 5 Description : 3 always block for moore fsm (BEST) 7 Release :Ju n.05,2011 1.0 8 */ 9 10 module simple_fsm ( 11 elk. 12 rst_n. 13 w_i, 14 z_o 15 ); 16 17 in put clk; 18 in put rst_n; 19 in put w_i; 20 output z_o; 21 22 parameter IDLE = 2b00; 23 parameter SO = 2b01; 24 parameter S1
7、 = 2b10; 25 26 reg 1 :0 curr_state; 27 reg 1 :0 next_state; 28 reg z_o; 29 30 / state reg 31 always (posedge clk or negedge rst_n) 32 if (rst_n) curr_state = IDLE; 33 else curr_state = n ext_state; 34 35 / n ext state logic 36 always (*) 37 case (curr_state) 38 IDLE : if (w_i) n ext_state =S0; 39 el
8、sen ext_state = IDLE; 40 S0 : if (w_i) next_state : =S1; 41 elsen ext_state = IDLE; 42 S1: if (w_i) next_state : =S1; 43 elsen ext_state = IDLE; 44 default : n ext_state = IDLE; 45 endcase 46 47 / output logic 48 always (*) 49 case (curr_state) 50 IDLE : z_o = =1 b0; 51 S0 :z_o =1b0; 52 S1:z_o =1b1;
9、 53 default :z_o =1 b0; 54 endcase 55 56 en dmodule 35行 / next state logic always (*) case (curr_state) IDLE :if (w_i) next_state = SO; elsen ext_state = IDLE; SO :if (w_i) n ext_state = S1; elsen ext_state = IDLE; elsen ext_state = IDLE; default :n ext_state = IDLE; endcase 使用1個always 描述next state
10、logic,因為是純粹組合邏輯,所以使用blocking 。 根據(jù)Moore FSM 架構(gòu)圖所示,next state logic 的結(jié)果與in put與目前state 有關(guān),所以先 用case對目前state做一次大分類,然後每個state再根據(jù)in put做if判斷。 30行 / state reg always (posedge clk or negedge rst_n) if (rst_n) curr_state = IDLE; else curr_state after_rst; end / w_i in itialbegi n (after_rst); repeat (2)( po
11、sedge elk); / 60ns w_i =1 b1; ( posedge elk); / 80 ns w_i =1 b0; ( posedge elk); / 100 ns w_i =1 b1; repeat ( 2)( posedge elk); / 140 ns w_i =1 b0; ( posedge elk); / 160 ns w_i =1 b1; repeat ( 3)( posedge elk); / 220 ns w_i =1 b0; end in itialbegi n $fsdbDumpfile(simple_fsm.fsdb); $fsdbDumpvars(0, s
12、imple_fsm_tb); end 52 52 simple_fsm u_simple_fsm ( 53 .elk(elk), 54 .rst_n (rst_n), 55 .w_i(w_i), 56 .z_o(z_o) 57 ); 59 58 endmodule 執(zhí)行結(jié)果 2.使用2個always ( 二段式) 由於要使用2個always去描述3個block,根據(jù)排列組合原理,C3取2,共有3種可能,我 們一個一個討論。 2.1 state register 與 next state logic 合一 input clock Output logic Next state logic Moa
13、re FS M State register * output simple_fsm_moore_2_always_0_cs_n s_good.v / Verilog 1 /* 2 (C) OOMusou 2011 http:/ 3 3 File name : simple_fsm_moore_2_always_0_cs_ ns_good.v 4 Synthesizer : Quartus II 8.1 5 Description : 2 always block for moore fsm (GOOD) 6 Release : Jun.05,2011 1.0 7 */ 9 8 module
14、simple_fsm ( 9 clk, 10 rst_n, 11 w_i, 12 z_o 13 ); 16 14 in putclk; 15 in putrst_n; 16 in putw_i; 17 output z o; 22 parameter IDLE = 2b00; 23 parameter SO = 2b01; 24 parameter S1 = 2b10; 25 26 reg 1:0 curr_state; 27 reg z_o; 28 29 / state reg + next state logic 30 always (posedge clk or negedge rst_
15、n) 31 if (rst_n) curr_state = IDLE; 32 else 33 case (curr_state) 34 IDLE :if (w_i) curr_state = S0; 35 else curr_state = IDLE; 36 S0 :if (w_i) curr_state = S1; 37 else curr_state = IDLE; 38 S1 :if (w_i) curr_state = S1; 39 else curr_state = IDLE; 40 default: curr_state = IDLE; 41 endcase 42 43 / out
16、put logic 44 always (*) 45 case (curr_state) 46 IDLE : z_o = 1b0; 47 S0 :z_o = 1b0; 48 S1:z_o = 1b1; 49 default : z_o = 1b0; 50 endcase 51 52 endmodule 29行 / state reg + n ext state logic always (posedge clk or negedge rst_n) if (rst_n) curr_state = IDLE; else case (curr_state) IDLE : if (w_i) curr_
17、state = S0; elsecurr_state = IDLE; SO if (w_i) curr_state = S1; elsecurr_state = IDLE; S1: if (w_i) curr_state = S1; elsecurr_state = IDLE; default curr_state = IDLE; endcase 將 state register 與 next state logic合起來用 1 個 always 去描述,雖然 next state logic 是純粹的組合邏輯,為了遷就於帶clk的state register ,且要用一個 always 描述
18、,就必須改 用 non blocking 。 由於 state register 與next state logic合一,所以可以少宣告next state reg,不過這並 不會影響合成結(jié)果,只是可以少打幾個字而已 因為 next state logic 由in put與state所構(gòu)成,所以先用case對state做一次大分類,然後 每個state再根據(jù)in put做if判斷。 43行 / output logic always (*) case (curr_state) IDLE : z_o = 1b0; 50 : z_o =1 bO; 51 : z_o =1 b1; default :
19、 z_o =1 bO; endcase 使用1個always 描述output logic,因為是純粹組合邏輯,所以使用blocking 。 根據(jù)Moore FSM 架構(gòu)圖所示,output logic的結(jié)果只與目前 state有關(guān),所以只需用 case 對state做一次分類即可。 使用 2 個 always (state register 與 next state logic 合一)寫法有幾個優(yōu)點: 1. 程式碼較3個always寫法精簡 2. 可輕易地將state diagram 改用Verilog 表示 3. 因為state register原本程式碼就不多,將 next state
20、logic與st ate register合一後,next state logic仍與 output logic 分開,因 此不會增加code的複雜度,便於日後維護 2 個 always (state register 與 next state logic 合一)也是一個推薦的寫法 與 output logic 合一 input 匸 lock 接下來要討論的都是不推薦的寫法,主要目的是了解為什麼不推薦的原因 2.2 state register simple_fsm_moore_2_always_1_cs_ol_ ng.v / Verilog 1 /* 2 (C) OOMusou 2011 h
21、ttp:/ 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 File name : simple_fsm_moore_2_always_1_cs_ ol_n g.v Syn thesizer : Quartus II 8.1 Description : 2 always block for moore fsm (NO GOOD) Release : Jun.05,2011 1.0 */ module simple_fsm ( clk, rst_n, w_i, z_o ); i
22、n put clk; in putrst_ n; in put w_i; output z_o; parameter IDLE = 2b00; parameter S0 = 2b01; parameter S1 = 2b10; reg 1:0 curr_state; reg 1:0 next_state; reg z_o; / state reg + output logic always (posedge clk or negedge rst_n) 1 b0; if (rst_n) curr_state, z_o = IDLE, elsebeg in 34 curr_state = n ex
23、t_state; 35 36 case (next_state) 37 IDLE : z_o = 1b0; 38 S0 : z_o = 1b0; 39 S1 : z_o = 1b1; 40 default: z_ _o =1b0; 41 endcase 42 end 43 44 / n ext state logic 45 always (*) 46 case (curr_state) 47 IDLE :if (w_i) n ext_state =S0; 48 else n ext_state = IDLE; 49 S0 :if (w_i) n ext_state : =S1; 50 else
24、 n ext_state = IDLE; 51 S1:if (w_i) n ext_state : =S1; 52 else n ext_state = IDLE; 53 default : n ext_state = IDLE; 54 endcase 55 56 en dmodule 30行 / state reg + output logic 1 bO; always (posedge elk or negedge rst_n) if (rst_n) curr_state, z_o = IDLE, else begi n curr_state = n ext_state; case (n
25、ext_state) IDLE :z_o = 1bO; S0 :z_o = 1bO; S1 :z_o = 1b1; default : z_o = 1b0 endcase end 將state register 與output logic合起來用1個always 去描述,雖然 output logic 是純粹 的組合邏輯,為了遷就於帶elk的state register,且要用一個 always 描述,就必須改用 non block ing。 因為output logic 只與state有關(guān),所以只用ease對state 做一次分類即可。 這種寫法最大的問題是:output logic 必須用
26、next_state 去判斷! 依照Moore FSM 的架構(gòu)圖得知,output logic只與目前state 有關(guān),之前的幾種 FSM寫法, output logic 也是由目前state去判斷,為什麼這種寫法要靠next_state去判斷呢? 主要原因是根據(jù) Moore FSM的定義,output logic只與目前state有關(guān),且是個純粹的組合 邏輯,但目前強迫將state register 與output logic放在同一個 always,迫使output logic 必須使用nonblocking的方式呈現(xiàn),也就是若output logic仍然使用目前 state去做判斷, 則
27、output logic 會多delay 1 個clk,為了讓output logic結(jié)果正常,只好提前1個clk 做判斷,也就是提前到next_state去做判斷。 所以當我們從 state diagram 換成 Verilog 表示時,若使用2個always ,且是state register 與output logic合一時,必須很小心要使用next_state去做output logic 判斷,因為這個地 方很不直覺,很容易出錯,所以不推薦這種寫法。 44行 / next state logic always (*) IDLE case (curr_state) if (w_i) ne
28、xt_state = S0; elsen ext_state = IDLE; S0 : if (w_i) next_state = S1; elsen ext_state = IDLE; S1: if (w_i) next_state = S1; elsen ext_state = IDLE; default n ext_state = IDLE; endcase 使用1個always 描述next state logic,因為是純粹組合邏輯,所以使用blocking 。 根據(jù) Moore FSM 架構(gòu)圖所示,next state logic的結(jié)果與in put與目前state有關(guān),所以先 用
29、case對目前state做一次大分類,然後每個state再根據(jù)in put做if判斷。 使用 2 個 always (state register 與 output logic 合一)寫法的缺點: 當使用 1 個 always 去描述 state register 與 output logic 時,outpu t logic必須使用next_state做判斷,而非用目前state判斷,由於寫法 不直覺,一不小心很容易弄錯 不推薦 2 個 always (state register與 output logic 合一)寫法。 或許你會說,在實務(wù)上卻??吹絪tate register 與outpu
30、t logic合一的寫法,為什麼不會岀問 題?那是因為儘管是用Moore FSM ,我們?yōu)榱?timing 更好,常會在output時多敲一個 D-FF , 讓 Output Logic 的組合邏輯不要與其他module 的in put的組合邏輯合併,而造成critical path,假如是這種需求,state register 與output logic合一後,可以直接判斷curr_state 不用提早一個clk判斷next_state 。 2.3 next state logic與 output logic 合一 input clock 1 2 3 4 5 6 7 8 9 10 11 12
31、 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 simple fsm moore 2 always 2 ns ol ng.v / Verilog /* (C) OOMusou 2011 http:/ File name : simple_fsm_moore_2_always_2_ ns_ol_ ng.v Synthesizer: Quartus II 8.1 Description : 2 always block for moore fsm (NO GOOD) Release : Jun.05,2011 1.0 */ module simpl
32、e_fsm ( clk, rst_n, w_i, z_o ); in put clk; in putrst_ n; in put w_i; output z_o; parameter IDLE = 2b00; parameter SO = 2b01; parameter S1 = 2b10; reg 1:0 curr_state; reg 1:0 next_state; reg z_o; 29 30 / state reg 31 always (posedge clk or negedge rst_n) 32 if (rst_n) curr_state = IDLE; 33 else curr
33、_state = n ext_state; 34 35 / n ext state logic + output logic 43 else n ext_state, z_o = IDLE, 1b1; / always output 1 b1 44 default n ext_state, z_o = IDLE, 1 bO; 45 endcase 46 47 en dmodule 37 case (curr_state) 38 IDLE if (w_i) n ext_state, z_o =S0 , 1 b0; 39 else n ext_state, z_o= IDLE, 1 b0; 40
34、S0 if (w_i) n ext_state, z_o: =S1 , 1 b0; 41 else n ext_state, z_o= IDLE, 1 b0; 42 S1 if (w_i) n ext_state, z_o: =S1 , 1b1; always (*) 36 / always output 1 b1 30行 / state reg always (posedge clk or negedge rst_n) else if (rst_n) curr_state = IDLE; curr_state = n ext_state; non block ing。 使用1個always
35、描述state register ,因為是D-FF且含clk,所以使用 由於state register區(qū)塊並不包含任何邏輯,所以不會因為不同F(xiàn)SM而有不同寫法,不同F(xiàn)SM 只會改變 next state logic 與 output logic 的寫法。 35行 / n ext state logic + output logic always (*) case (curr_state) IDLE : if (w_i) next_state, z_o = SO , 1 bO; 1 b0; else n ext_state, z_o= IDLE, S0 : if (w_i) n ext_sta
36、te, z_o: =S1 , 1 b0; else n ext_state, z_o= IDLE, 1 b0; S1: if (w_i) n ext_state, z_o: =S1 , 1b1; / always output 1 b1 else n ext_state, z_o= IDLE, 1b1; / always output 1 b1 default : n ext_state, z_o = IDLE, 1 b0; endcase 將 next state logic 與output logic使用同一個always 去描述,由於 next state logic output lo
37、gic都是純粹的組合邏輯,所以使用block ing 描述沒有問題。 由於next state logic 與in put與目前state有關(guān),但output logic卻只與目前 state 有關(guān), 因為都是先用目前state做case判斷,然後再對in put做if判斷,所以會岀現(xiàn) output兩次都 岀現(xiàn)1的情形,起因於 output logic只與目前state有關(guān),與in put無關(guān),固任何in put都會 岀現(xiàn)1。 使用 2 個 always (next state logic與 output logic 合一)寫法的缺點: 1. 將next state logic與output
38、logic 合一只會增加 code的複雜度, 日後維護會更加困難 2. 很類似Mealy FSM 寫法,容易讓人誤以為是Mealy FSM 不推薦 2 個 always (next state logic與 output logic 合一)寫法。 3.使用1個always ( 一段式) input clock output simple_fsm_moore_1_always_ ng.v / Verilog 1 /* 2 (C) OOMusou 2011 http:/ 3 3 File name : simple_fsm_moore_1_always_ ng.v 4 Synthesizer :
39、Quartus II 8.1 5 Description : 1 always block for moore fsm (NO GOOD) 6 Release : Jun.05,2011 1.0 7 */ 9 10 module simple_fsm ( 11 clk, 12 rst_n, 13 w_i, 14 z_o 15 ); 16 17 in put clk; 18 in putrst_ n; 19 in putw_i; 20 output z_o; 22 parameter IDLE =2b00; 23 parameter SO =2b01; 24 parameter S1 =2b10
40、; 25 26 reg 1:0 eurr_state; 27 reg z_o; 28 29 always (posedge elk or negedge rst_n) 30 if (rst_n) eurr_state, z_o = IDLE, 1 b0; 31 else 32 ease (eurr_state) 33 IDLE : if (w_i) eurr_state, z_o = S0, 1b0; 34 elseeurr_state, z_o = IDLE, 1 b0; 35 SO : if (w_i) eurr_state, z_o = S1, 1b1; 36 elseeurr_stat
41、e, z_o = IDLE, 1 b0; 37 S1 : if (w_i) eurr_state, z_o = S1, 1b1; 38 elseeurr_state, z_o = IDLE, 1 b0; 39 default: eurr_state, z_o = IDLE, 1b0; 40 endease 41 42 en dmodule 29 行 always (posedge elk or negedge rst_n) if (rst_n) eurr_state, z_o = IDLE, 1 b0; else ease (eurr_state) IDLE :if (w_i) eurr_st
42、ate, z_o = S0, 1 b0; elseeurr_state, z_o = IDLE, 1 b0; SO :if (w_i) eurr_state, z_o = S1, 1b1; / /? else curr_state, z_o = IDLE,1 bO; S1 :if (w_i) curr_state, z_o = S1,1 b1; / /? else curr_state, z_o = IDLE,1 b0; default :curr_state, z_o = IDLE,1 b0; endcase 使用 1 個 always 同時描述 next state logic 、stat
43、e register 與 output logic ,雖然 next state logic與output logic 是純粹的組合邏輯,但為了遷就於帶clk的state register ,所以必須使 用 non blocking 。 根據(jù)之前的經(jīng)驗,由於Moore FSM 的output logic 只與目前state state有關(guān),且是純粹的 組合邏輯,若硬要與 state register 用同一個always去描述,判斷上會岀現(xiàn)一些問題,需提 早 1 個 clk 用 next state 判斷(在 state register 與 output logic合一時曾經(jīng)遇過)。 在1個
44、always 內(nèi),連 next_state也省了,所以在 35行 50 :if (w_i) curr_state, z_o = S1,1 b1; 當目前state 為S0且輸入為1b1時,output 必須提前為1,因為這是在 nonblocking內(nèi)! 37行 51 :if (w_i) curr_state, z_o = S1,1 b1; 同理,在目前 state為S1且輸入為1b1時,output也必須提前為1,也因為這是在 non block ing內(nèi)! 使用1個always寫法的缺點: 1.因為使用non block ing 去描述output logic,所以要提早1個clk判斷,
45、要特別小心處理,一不小心很容易弄錯 2.1 個 always 內(nèi)同時包含 next state logic與 output logic,會增加 code的複雜度,日後維護更加困難 不推薦1個always 寫法。 Mealy FSM 架構(gòu) input clock output 談完了 Moore FSM ,接下來談 Mealy FSM ,與Moore FSM 的差別只在於 Moore FSM 的 output logic 只由目前 state 決定,但是 Mealy FSM 可由目前 state 與in put 共同決定。 將之前的例子用 Mealy FSM 重新改寫,原本在 Moore FSM
46、 下,若in put w_i 為連續(xù)2個clk 為high,則output 會在下1個clk產(chǎn)生週期為1 T的high pulse ,若改用 Mealy FSM ,則 output會提早1個clk岀現(xiàn),如上圖所示 原本 Moore FSM 需要3個state,若改用 Mealy FSM 後,會只剩下 2個state,接下來要用 各種 coding style 來實現(xiàn) Mealy FSM 1. 使用3個always ( 三段式) input clock simple_fsm_mealy_3_always_best.v / Verilog 1 /* 2 (C) OOMusou 2011 http:
47、/ 3 3 File name : simple_fsm_mealy_3_always_best.v 4 Synthesizer : Quartus II 8.1 5 Description : 3 always block for mealy fsm (BEST) 6 Release : Jun.05,2011 1.0 7 */ 9 8 module simple_fsm ( 9 clk, 10 rst_n, 11 w_i, 12 z_o 13 ); 16 14 in putclk; 15 in putrst_n; 16 in putw_i; 17 output z_o; 21 22 par
48、ameter IDLE =2b00; reg 1:0 curr_state; reg 1:0 next_state; reg z; reg z_o; / state reg always (posedge clk or negedge rst_n) if (rst_n) curr_state = IDLE; else curr_state = n ext_state; / n ext state logic always (*) case (curr_state) IDLE :if (w_i) next_state = S0; 23 24 25 26 27 28 29 30 31 32 33
49、34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 else n ext_state = IDLE; S0 else n ext_state = IDLE; default :n ext_state = IDLE; endcase / output logic always (*) case (curr_state) IDLE :if (w_i) z =1b0; else 1b0; S0 :if (w_i) z =1 b1; else 1b0; default 1b0; 53 endcase 54 54 / mealy output
50、 to delay 1 clk for moore 55 always (posedge clk or negedge rst_n) 56 if (rst_n) z_o =1 bO; 57 else z_o = z; 59 58 endmodule 30行 / state reg always (posedge clk or negedge rst_n) if (rst_n) curr_state = IDLE; else curr_state = n ext_state; 使用 1 個 always 描述 state register 。 35行 / next state logic alw
51、ays (*) case (curr_state) IDLE :if (w_i) next_state = S0; elsen ext_state = IDLE; S0 :if (w_i) n ext_state = S0; elsen ext_state = IDLE; default :n ext_state = IDLE; endcase 使用 1 個 always 描述 next state logic 。 45行 / output logic always (*) case (curr_state) IDLE : if (w_i) z = 1bO; elsez = 1bO; S0 :
52、 if (w_i) z = 1b1; elsez = 1bO; default z = 1bO; endcase 使用1個always 描述 output logic o 以上3個always 寫法與Moore FSM 的3個always 並無差異,基本上只要state diagram 畫的岀來,就能等效地用Verilog 描述岀來。 55行 / mealy output to delay 1 clk for moore always (posedge clk or negedge rst_n) if (rst_n) z_o =1 bO; else z_o = z; 之前提到使用 Mealy
53、FSM 會少 Moore FSM 1 個 state,且 output 會早 Moore FSM 1 個 clk , 所以最後特別將 output 在敲一級delay 1 個clk,這樣Mealy FSM 就會完全與 Moore FSM 一樣。 使用3個always寫法有幾個優(yōu)點: 1. 可忠實地反映出原本的Mealy FSM硬體架構(gòu) 2. 可輕易地將state diagram 改用Verilog 表示 3. 將Next state logic 與output logic 分開,可降低code的複雜度, 便於日後維護 3個always是一個推薦的寫法。 2. 使用2個always ( 兩段式)
54、 由於要使用2個always去描述3個block,根據(jù)排列組合原理,C3取2,共有3種可能,我 們一個一個討論。 input clock * output * output simple_fsm_mealy_2_always_0_cs_ ns_good.v / Verilog 1 /* 2 (C) OOMusou 2011 http:/ 3 3 File name : simple_fsm_mealy_2_always_0_cs_ ns_good.v 4 Synthesizer : Quartus II 8.1 5 Description : 2 always block for mealy
55、fsm (GOOD) 6 Release : Jun.05,2011 1.0 7 */ 9 8 module simple_fsm ( 9 clk, 10 rst_n, 11 w_i, 12 z_o 13 ); 16 14 in putclk; 15 in putrst_n; 16 in putw_i; 17 output z_o; parameter SO = 2b01; reg 1:0 curr_state; reg z; reg z_o; / state reg + n ext state logic always (posedge clk or negedge rst_n) if (r
56、st_n) curr_state = IDLE; else case (curr_state) IDLE : if (w_i) curr_state = S0; elsecurr_state = IDLE; S0 : if (w_i) curr_state = S0; elsecurr_state = IDLE; default curr_state = IDLE; endcase / output logic always (*) case (curr_state) IDLE : if (w_i) z = 1b0; else z = 1b0; S0 : if (w_i) z = 1b1; e
57、lse z = 1b0; default endcase z = 1b0; 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 / mealy output to delay 1 clk for moore 52 always (posedge elk or negedge rst_n) 53 if (rst_n) z_o =1 bO; 54 else z_o = z; 55 55 endmodule 29行 / state reg + n ext state log
58、ic always (posedge clk or negedge rst_n) if (rst_n) curr_state = IDLE; else case (curr_state) IDLE :if (w_i) curr_state = S0; elsecurr_state = IDLE; S0 :if (w_i) curr_state = S0; elsecurr_state = IDLE; default :curr_state = IDLE; endcase 使用 1 個 always 同時描述 state register 與 next state logic 41行 / out
59、put logic always (*) case (curr_state) IDLE : if (w_i) z = 1b0; elsez = 1b0; S0 : if (w_i) z = 1b1; elsez = 1b0; default z = 1b0; endcase 使用 1 個 always 描述 output logic 以上 2 個 always 寫法(state register 與 next state logic 合一)與 Moore FSM 的 2 個 always 寫法(state register與next state logic合一)並無差異,基本上只要 state
60、 diagram 畫的岀 來,就能等效地用 Verilog描述岀來。 51行 / mealy output to delay 1 clk for moore always (posedge clk or negedge rst_n) if (rst_n) z_o =1 bO; else z_o = z; 之前提到使用 Mealy FSM 會少 Moore FSM 1 個 state,且 output 會早 Moore FSM 1 個 clk , 所以最後特別將 output 在敲一級delay 1 個clk,這樣Mealy FSM就會完全與 Moore FSM 一樣。 使用 2 個 alway
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO/IEC TS 17027:2014 RU Conformity assessment - Vocabulary related to competence of persons used for certification of persons
- 【正版授權(quán)】 ISO 7718-1:2025 EN Aircraft - Passenger doors interface requirements for connection of passenger boarding bridge or passenger transfer vehicle - Part 1: Main deck doors
- 【正版授權(quán)】 IEC 62288:2021+AMD1:2024 CSV EN Maritime navigation and radiocommunication equipment and systems - Presentation of navigation-related information on shipborne navigational d
- 【正版授權(quán)】 IEC 60076-7:2005 EN-D Power transformers - Part 7: Loading guide for oil-immersed power transformers
- 單位新聞培訓(xùn)課件
- 社會保障與教育
- 2025年國慶節(jié)主題晚會活動方案演講稿
- 酒類基礎(chǔ)知識培訓(xùn)課件
- 2025年端午節(jié)賽龍舟活動方案
- 幼師個人工作方案2025年支配
- 神經(jīng)內(nèi)科臨床路徑
- 酒店歷史文化主題客房設(shè)計
- 混凝土拌合站計量系統(tǒng)自檢校準記錄
- 護理實習生崗前培訓(xùn)課件
- 患者發(fā)生嗆咳應(yīng)急預(yù)案
- 艾賓浩斯記憶表格遺忘曲線
- 第6章-非線性有限元法(幾何非線性)課件
- 初中物理-流體壓強與流速的關(guān)系教學設(shè)計學情分析教材分析課后反思
- 電力設(shè)備預(yù)防性試驗規(guī)程
- 差額定率分檔累進法計算
- 第5章全程導(dǎo)游服務(wù)程序與服務(wù)質(zhì)量(課件)《導(dǎo)游業(yè)務(wù)》(第五版)
評論
0/150
提交評論