大致認識了有限狀態機後,我們來試試透過 Verilog 實作出來吧!
我們先介紹一個 Verilog 的線上練習平台:HDLBits
這個平台包含了各式各樣的 Verilog 習題,從簡單的組合電路到進階的循序電路都有涵蓋
大家可以試試看喔!
今天,我們所要嘗試的是 HDLBits 中關於有限狀態機(FSM)的題目:

我們就單純從狀態變遷圖來了解狀態間的關係!
A = 0, B = 1。1, 0 ,不同的輸入搭配不同的狀態,可以得到不同輸出狀態B (特別注意使用的是非同步重置)撰寫程式碼時,我們可以將過程分成 3 個步驟:
module top_module(
    input clk, in, areset,    // Asynchronous reset to state B
    output out);
    parameter A=0, B=1; 
    reg state, next_state;
    // State transition logic
    // State flip-flops with asynchronous reset
    // Output logic
endmodule
output out 輸出透過這三個步驟,也許你可以寫出正確的程式碼
module top_module(
    input clk, in, areset,    // Asynchronous reset to state B
    output out);
    parameter A=0, B=1; 
    reg state, next_state;
    always @(*) begin 
        case (state) 
            A: next_state = in ? A : B;
            B: next_state = in ? B : A;
        endcase
    end
    always @(posedge clk, posedge areset) begin 
        if (areset) state <= B;
        else state <= next_state;
    end
    assign out = (state == A) ? A : B;
endmodule

這題的邏輯和第一題一模一樣,唯一不同的地方是「同步重置」(synchronous reset)!
雖然題目長得幾乎一樣,但是程式碼的結構卻是差很多。
我們要非常清楚同步與非同步重置的差異,尤其是觸發時機,如果瞭解了其中的精神,這題可以說是迎刃而解啦~
// Note the Verilog-1995 module declaration syntax here:
module top_module(
    input clk, reset, in, 
    output reg out
);
    parameter A = 0, B = 1;
    reg present_state, next_state;
    always @(posedge clk) begin
        if (reset) 
            present_state <= B;
        else begin
            case (present_state)
                A: next_state = in ? A : B;
                B: next_state = in ? B : A;
            endcase
            present_state = next_state;   
        end
    end
    
    assign out = present_state;
endmodule