iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Software Development

數位 IC 設計起手式系列 第 19

Day 19: 有限狀態機 下

  • 分享至 

  • xImage
  •  

大致認識了有限狀態機後,我們來試試透過 Verilog 實作出來吧!

我們先介紹一個 Verilog 的線上練習平台:HDLBits
這個平台包含了各式各樣的 Verilog 習題,從簡單的組合電路到進階的循序電路都有涵蓋
大家可以試試看喔!

今天,我們所要嘗試的是 HDLBits 中關於有限狀態機(FSM)的題目:

Problem 01

https://ithelp.ithome.com.tw/upload/images/20230929/20150982KwUSIbwc9n.png

我們就單純從狀態變遷圖來了解狀態間的關係!

  1. 這個狀態機共包含兩個狀態,分別是 A = 0, B = 1
  2. 輸入共有兩種可能,1, 0 ,不同的輸入搭配不同的狀態,可以得到不同輸出狀態
  3. 當接收到 reset 時,將狀態重置為 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
  1. 找到輸出狀態,我們可以透過「狀態變遷圖」搭配「條件式」找到對應的關係
  2. 狀態轉移,藉由 areset 的訊號,我們可以確認下一個狀態是要被重置還是改為我們找到的結果
  3. 透過 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

Problem 02

https://ithelp.ithome.com.tw/upload/images/20230929/20150982qnvK85zItp.png

這題的邏輯和第一題一模一樣,唯一不同的地方是「同步重置」(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

上一篇
Day 18: 有限狀態機 上
下一篇
Day 20: Initial & Always 運作模式
系列文
數位 IC 設計起手式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言