2021年4月28日 星期三

良好的Verilog FSM代碼風格

良好的Verilog FSM代碼風格 
 
        FSM是電路設計中非常常見的結構,對於這樣常見的結構的正確輸寫非常重要, 良好的代碼風格對於閱讀理解以及後期維護也非常重要。本文總結了目前常見的兩種輸寫FSM的方法
介紹
FSM目前主要有兩種架構
  • Moore FSM
  • Mealy FSM
要讓電路順序地執行計算,最簡單的方法就是生成一個counter, 然後根據counter值去執行相應的操作或計算。但這種方法只能用於非常簡單的控制,且非常不容易維護以及後期功能修改。所以實際上大家都會用標準的FSM來實現複雜控制。
Moore FSM架構

Moore FSM是目前的主流寫法, 它由三塊組成:
  • state register DFF構成,將Next state Logic產生的state存入current register
  • next state logic : 由組合邏輯組成,根據輸入及目前state,產生next state
  • output logic 組合邏輯, 根據目前state產生輸出
假設輸入為w_i, 輸出為z_o, 當輸入連續2cycle為高時,則輸出為1cycle


下麵是state diagram


三段式編碼

/**********************************************
Description : 3 always block for moore fsm (BEST)
 **********************************************/
 
module simple_fsm (
    clk,
    rst_n,
    w_i,
    z_o
    );
 
input  clk;
input  rst_n;
input  w_i;
output z_o;
 
parameter IDLE = 2'b00;
parameter S0   = 2'b01;
parameter S1   = 2'b10
;
 
reg [1:0] curr_state;
reg [1:0] next_state;
reg z_o;
 
// state reg
always@(posedge clk or negedge rst_n)
begin
    if (~rst_n) curr_state <= IDLE;
    else        curr_state <= next_state;
end
 
// next state logic
always@(*)
begin
    case (curr_state)
        IDLE    : if (w_i) next_state = S0;
                  else next_state = IDLE;
        S0      : if (w_i) next_state = S1;
                  else next_state = IDLE;
        S1      : if (w_i) next_state = S1;
                  else next_state = IDLE;
        default :          next_state = IDLE;
    endcase
end
 
// output logic
always@(*)
begin
    case (curr_state)
        IDLE    : z_o = 1'b0;
        S0      : z_o = 1'b0;
        S1      : z_o = 1'b1;
        default : z_o = 1'b0;
    endcase
end
 
endmodule
 


沒有留言:

張貼留言

2024_09 作業3 以Node-Red 為主

 2024_09 作業3  (以Node-Red 為主  Arduino 可能需要配合修改 ) Arduino 可能需要修改的部分 1)mqtt broker  2) 主題Topic (發行 接收) 3) WIFI ssid , password const char br...