verilog實(shí)現(xiàn)多種有限狀態(tài)機(jī)FSM_第1頁(yè)
verilog實(shí)現(xiàn)多種有限狀態(tài)機(jī)FSM_第2頁(yè)
verilog實(shí)現(xiàn)多種有限狀態(tài)機(jī)FSM_第3頁(yè)
verilog實(shí)現(xiàn)多種有限狀態(tài)機(jī)FSM_第4頁(yè)
verilog實(shí)現(xiàn)多種有限狀態(tài)機(jī)FSM_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Abstract FSM 在數(shù)位電路中非常重要,藉由 FSM ,可以讓數(shù)位電路也能循序地執(zhí)行起演算法。本文將詳 細(xì)討論各種 FSM coding style的優(yōu)缺點(diǎn),並歸納出推薦的 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. 實(shí)務(wù)上推薦的 coding

2、style 6. Conclusion 若要讓數(shù)位電路也能循序地執(zhí)行演算法,最簡(jiǎn)單的方式可以使用 D-FF 產(chǎn)生 counter ,根據(jù) counter 的值去決定要執(zhí)行不同的程式碼,如此也能達(dá)到使數(shù)位電路循序執(zhí)行演算法的目的, 不過(guò)這種方式僅適用於很簡(jiǎn)單的演算法,在一般規(guī)模的演算法若使用 counter 方式,程式碼將 不容易維護(hù),所以實(shí)務(wù)上會(huì)使用 FSM 方式來(lái)實(shí)現(xiàn)演算法。 其實(shí) FSM 方式也是利用 counter 來(lái)實(shí)現(xiàn), 所謂的 counter ,並不是只有 counter = counter + 1 才算是 counter , FSM 的 state register 就是廣義的

3、counter ,只是這種 counter 不是一直 加1 而已,而是有自己的遞增規(guī)則。 FSM 只是提供了一種較為高階與較容易維護(hù)的方式來(lái)實(shí)現(xiàn) 演算法。 Moore FSM 架構(gòu) input c lock 一般在寫(xiě)FSM時(shí),會(huì)以 Moore FSM 為主,所以先討論 Moore。由上圖可知,Moore FSM 內(nèi) 部由 3 個(gè) block 所構(gòu)成:Next state logic , State register 與 Output logic 。 Next state logic:純粹的組合邏輯,以整個(gè) module 的in put與目前的state為輸入,目 的在產(chǎn)生下一個(gè)state 值存

4、入state register 。 State register :由 D-FF 所構(gòu)成,將 Next state logic所產(chǎn)生的 state 存入 register 。 Output logic:純粹的組合邏輯,根據(jù)目前的state 產(chǎn)生整個(gè)module 的output。 所以可以發(fā)現(xiàn),整個(gè) Moore FSM事實(shí)上是由2塊的組合邏輯與1塊D-FF所構(gòu)成,我們常聽(tīng) 到所謂的一段式、二段式與三段式FSM,事實(shí)上就是由這3個(gè)block排列組合而成。 為了要實(shí)際比較各種codi ng style,在此舉一個(gè)簡(jiǎn)單的例子,若in put w_i 為連續(xù)2個(gè)clk為 high,貝U output 會(huì)

5、在下1個(gè)clk產(chǎn)生周期為 1 T的high pulse , timing diagram 如上圖所 示。 因此設(shè)計(jì)了 Moore FSM , state diagram 如上圖所示,接下來(lái)要做的就是用各種coding style 來(lái)實(shí)現(xiàn)這個(gè)Moore FSM 。 1.使用3個(gè)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個(gè)always 描述next state

10、logic,因?yàn)槭羌兇饨M合邏輯,所以使用blocking 。 根據(jù)Moore FSM 架構(gòu)圖所示,next state logic 的結(jié)果與in put與目前state 有關(guān),所以先 用case對(duì)目前state做一次大分類,然後每個(gè)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個(gè)always ( 二段式) 由於要使用2個(gè)always去描述3個(gè)block,根據(jù)排列組合原理,C3取2,共有3種可能,我 們一個(gè)一個(gè)討論。 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合起來(lái)用 1 個(gè) always 去描述,雖然 next state logic 是純粹的組合邏輯,為了遷就於帶clk的state register ,且要用一個(gè) always 描述

18、,就必須改 用 non blocking 。 由於 state register 與next state logic合一,所以可以少宣告next state reg,不過(guò)這並 不會(huì)影響合成結(jié)果,只是可以少打幾個(gè)字而已 因?yàn)?next state logic 由in put與state所構(gòu)成,所以先用case對(duì)state做一次大分類,然後 每個(gè)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個(gè)always 描述output logic,因?yàn)槭羌兇饨M合邏輯,所以使用blocking 。 根據(jù)Moore FSM 架構(gòu)圖所示,output logic的結(jié)果只與目前 state有關(guān),所以只需用 case 對(duì)state做一次分類即可。 使用 2 個(gè) always (state register 與 next state logic 合一)寫(xiě)法有幾個(gè)優(yōu)點(diǎn): 1. 程式碼較3個(gè)always寫(xiě)法精簡(jiǎn) 2. 可輕易地將state diagram 改用Verilog 表示 3. 因?yàn)閟tate register原本程式碼就不多,將 next state

20、logic與st ate register合一後,next state logic仍與 output logic 分開(kāi),因 此不會(huì)增加code的複雜度,便於日後維護(hù) 2 個(gè) always (state register 與 next state logic 合一)也是一個(gè)推薦的寫(xiě)法 與 output logic 合一 input 匸 lock 接下來(lái)要討論的都是不推薦的寫(xiě)法,主要目的是了解為什麼不推薦的原因 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合起來(lái)用1個(gè)always 去描述,雖然 output logic 是純粹 的組合邏輯,為了遷就於帶elk的state register,且要用一個(gè) always 描述,就必須改用 non block ing。 因?yàn)閛utput logic 只與state有關(guān),所以只用ease對(duì)state 做一次分類即可。 這種寫(xiě)法最大的問(wèn)題是:output logic 必須用

26、next_state 去判斷! 依照Moore FSM 的架構(gòu)圖得知,output logic只與目前state 有關(guān),之前的幾種 FSM寫(xiě)法, output logic 也是由目前state去判斷,為什麼這種寫(xiě)法要靠next_state去判斷呢? 主要原因是根據(jù) Moore FSM的定義,output logic只與目前state有關(guān),且是個(gè)純粹的組合 邏輯,但目前強(qiáng)迫將state register 與output logic放在同一個(gè) always,迫使output logic 必須使用nonblocking的方式呈現(xiàn),也就是若output logic仍然使用目前 state去做判斷, 則

27、output logic 會(huì)多delay 1 個(gè)clk,為了讓output logic結(jié)果正常,只好提前1個(gè)clk 做判斷,也就是提前到next_state去做判斷。 所以當(dāng)我們從 state diagram 換成 Verilog 表示時(shí),若使用2個(gè)always ,且是state register 與output logic合一時(shí),必須很小心要使用next_state去做output logic 判斷,因?yàn)檫@個(gè)地 方很不直覺(jué),很容易出錯(cuò),所以不推薦這種寫(xiě)法。 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個(gè)always 描述next state logic,因?yàn)槭羌兇饨M合邏輯,所以使用blocking 。 根據(jù) Moore FSM 架構(gòu)圖所示,next state logic的結(jié)果與in put與目前state有關(guān),所以先 用

29、case對(duì)目前state做一次大分類,然後每個(gè)state再根據(jù)in put做if判斷。 使用 2 個(gè) always (state register 與 output logic 合一)寫(xiě)法的缺點(diǎn): 當(dāng)使用 1 個(gè) always 去描述 state register 與 output logic 時(shí),outpu t logic必須使用next_state做判斷,而非用目前state判斷,由於寫(xiě)法 不直覺(jué),一不小心很容易弄錯(cuò) 不推薦 2 個(gè) always (state register與 output logic 合一)寫(xiě)法。 或許你會(huì)說(shuō),在實(shí)務(wù)上卻常看到state register 與outpu

30、t logic合一的寫(xiě)法,為什麼不會(huì)岀問(wèn) 題?那是因?yàn)閮嵐苁怯肕oore FSM ,我們?yōu)榱?timing 更好,常會(huì)在output時(shí)多敲一個(gè) D-FF , 讓 Output Logic 的組合邏輯不要與其他module 的in put的組合邏輯合併,而造成critical path,假如是這種需求,state register 與output logic合一後,可以直接判斷curr_state 不用提早一個(gè)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個(gè)always

35、描述state register ,因?yàn)槭荄-FF且含clk,所以使用 由於state register區(qū)塊並不包含任何邏輯,所以不會(huì)因?yàn)椴煌現(xiàn)SM而有不同寫(xiě)法,不同F(xiàn)SM 只會(huì)改變 next state logic 與 output logic 的寫(xiě)法。 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使用同一個(gè)always 去描述,由於 next state logic output lo

37、gic都是純粹的組合邏輯,所以使用block ing 描述沒(méi)有問(wèn)題。 由於next state logic 與in put與目前state有關(guān),但output logic卻只與目前 state 有關(guān), 因?yàn)槎际窍扔媚壳皊tate做case判斷,然後再對(duì)in put做if判斷,所以會(huì)岀現(xiàn) output兩次都 岀現(xiàn)1的情形,起因於 output logic只與目前state有關(guān),與in put無(wú)關(guān),固任何in put都會(huì) 岀現(xiàn)1。 使用 2 個(gè) always (next state logic與 output logic 合一)寫(xiě)法的缺點(diǎn): 1. 將next state logic與output

38、logic 合一只會(huì)增加 code的複雜度, 日後維護(hù)會(huì)更加困難 2. 很類似Mealy FSM 寫(xiě)法,容易讓人誤以為是Mealy FSM 不推薦 2 個(gè) always (next state logic與 output logic 合一)寫(xiě)法。 3.使用1個(gè)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 個(gè) always 同時(shí)描述 next state logic 、stat

43、e register 與 output logic ,雖然 next state logic與output logic 是純粹的組合邏輯,但為了遷就於帶clk的state register ,所以必須使 用 non blocking 。 根據(jù)之前的經(jīng)驗(yàn),由於Moore FSM 的output logic 只與目前state state有關(guān),且是純粹的 組合邏輯,若硬要與 state register 用同一個(gè)always去描述,判斷上會(huì)岀現(xiàn)一些問(wèn)題,需提 早 1 個(gè) clk 用 next state 判斷(在 state register 與 output logic合一時(shí)曾經(jīng)遇過(guò))。 在1個(gè)

44、always 內(nèi),連 next_state也省了,所以在 35行 50 :if (w_i) curr_state, z_o = S1,1 b1; 當(dāng)目前state 為S0且輸入為1b1時(shí),output 必須提前為1,因?yàn)檫@是在 nonblocking內(nèi)! 37行 51 :if (w_i) curr_state, z_o = S1,1 b1; 同理,在目前 state為S1且輸入為1b1時(shí),output也必須提前為1,也因?yàn)檫@是在 non block ing內(nèi)! 使用1個(gè)always寫(xiě)法的缺點(diǎn): 1.因?yàn)槭褂胣on block ing 去描述output logic,所以要提早1個(gè)clk判斷,

45、要特別小心處理,一不小心很容易弄錯(cuò) 2.1 個(gè) always 內(nèi)同時(shí)包含 next state logic與 output logic,會(huì)增加 code的複雜度,日後維護(hù)更加困難 不推薦1個(gè)always 寫(xiě)法。 Mealy FSM 架構(gòu) input clock output 談完了 Moore FSM ,接下來(lái)談 Mealy FSM ,與Moore FSM 的差別只在於 Moore FSM 的 output logic 只由目前 state 決定,但是 Mealy FSM 可由目前 state 與in put 共同決定。 將之前的例子用 Mealy FSM 重新改寫(xiě),原本在 Moore FSM

46、 下,若in put w_i 為連續(xù)2個(gè)clk 為high,則output 會(huì)在下1個(gè)clk產(chǎn)生週期為1 T的high pulse ,若改用 Mealy FSM ,則 output會(huì)提早1個(gè)clk岀現(xiàn),如上圖所示 原本 Moore FSM 需要3個(gè)state,若改用 Mealy FSM 後,會(huì)只剩下 2個(gè)state,接下來(lái)要用 各種 coding style 來(lái)實(shí)現(xiàn) Mealy FSM 1. 使用3個(gè)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 個(gè) 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 個(gè) 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個(gè)always 描述 output logic o 以上3個(gè)always 寫(xiě)法與Moore FSM 的3個(gè)always 並無(wú)差異,基本上只要state diagram 畫(huà)的岀來(lái),就能等效地用Verilog 描述岀來(lái)。 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 會(huì)少 Moore FSM 1 個(gè) state,且 output 會(huì)早 Moore FSM 1 個(gè) clk , 所以最後特別將 output 在敲一級(jí)delay 1 個(gè)clk,這樣Mealy FSM 就會(huì)完全與 Moore FSM 一樣。 使用3個(gè)always寫(xiě)法有幾個(gè)優(yōu)點(diǎn): 1. 可忠實(shí)地反映出原本的Mealy FSM硬體架構(gòu) 2. 可輕易地將state diagram 改用Verilog 表示 3. 將Next state logic 與output logic 分開(kāi),可降低code的複雜度, 便於日後維護(hù) 3個(gè)always是一個(gè)推薦的寫(xiě)法。 2. 使用2個(gè)always ( 兩段式)

54、 由於要使用2個(gè)always去描述3個(gè)block,根據(jù)排列組合原理,C3取2,共有3種可能,我 們一個(gè)一個(gè)討論。 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 個(gè) always 同時(shí)描述 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 個(gè) always 描述 output logic 以上 2 個(gè) always 寫(xiě)法(state register 與 next state logic 合一)與 Moore FSM 的 2 個(gè) always 寫(xiě)法(state register與next state logic合一)並無(wú)差異,基本上只要 state

60、 diagram 畫(huà)的岀 來(lái),就能等效地用 Verilog描述岀來(lái)。 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 會(huì)少 Moore FSM 1 個(gè) state,且 output 會(huì)早 Moore FSM 1 個(gè) clk , 所以最後特別將 output 在敲一級(jí)delay 1 個(gè)clk,這樣Mealy FSM就會(huì)完全與 Moore FSM 一樣。 使用 2 個(gè) alway

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論