Verilog_RTL 설계

[Verilog_RTL]_FSM_mealy

juniha 2025. 6. 20. 19:02

 

유한 상태 머신 (Finite State Machine, FSM)

  • 지털 논리 설계, 컴퓨터 제어 시스템의 동작을 상태와 상태 간의 전이로 표현하는 개념적 모델이다. 
  • 입력에 따라 일정한 상태(state)를 가지며, 현재 상태와 입력 값에 의해 다음 상태(next state) 와 출력이 결정된다.
  • 시스템이 가질 수 있는 상태의 수가 유한하므로 Finte(유한) 상태 머신이라 부른다.
  • 동작 방식에는 Mealy model  Moore model 이 있다.

Mealy Machine 특징

  • 입력이 변할 때 마다 상태(state) 변화가 가능하다.
  • 상태(state) 변화와 함께 출력이 생성된다.
  • 입력이 변하면 상태가 같더라도 출력이 바로 변할 수 있다.
  • 출력이 입력과 상태에 의존하므로 Moore FSM과 상대적으로 복잡하다.
  • 신호처리, 통신 프로토콜, 데이터 압축 등 실시간 처리 시스템에서 사용된다.
  • 빠른 응답 시간이 필요한 시스템에 적합하다.

Mealy Model FSM의 상태도

 

사용 코드

module fsm_mealy(
    iCLK,      // 1MHz 기준 클록
    iRESETn,   // Active-Low reset 
    iIN,       // Mealy FSM의 입력
    oOUT,      // Mealy FSM의 출력
    oSTATE);   // Mealy FSM의 현재 상태

    localparam A = 2'b00, B = 2'b01, C = 2'b10, D = 2'b11;

    input          iCLK, iRESETn;     
    input          iIN;
    output         oOUT;
    output   [1:0] oSTATE;

    reg out;
    reg [1:0] curr_state, next_state;

 // Combinational block with next state and output of Mealy FSM  
    always @ (curr_state or iIN) begin
        case(curr_state)  
            A : 
                if (iIN) begin
                    next_state= B;
                    out  = 1;
                end
                else begin
                    next_state= A;
                    out  = 0;
                end

            B : 
                if (iIN) begin
                    next_state= D;
                    out  = 1; 
                end
                else begin
                    next_state= C;
                    out  = 0;
                end

            C : 
                if (iIN) begin
                    next_state= D;
                    out  = 1;
                end
                else begin
                    next_state= C;
                    out  = 0;
                end

            D : 
                if (iIN) begin
                    next_state= A;
                    out  = 1;
                end
                else begin
                    next_state= D;
                    out  = 1;
                end
            default : 
                begin
                    next_state= next_state;
                    out = out;
                end 
            endcase
        end

// Sequential block
    always @(posedge iCLK or negedge iRESETn)
        if (!iRESETn)
            curr_state<= A;
        else
            curr_state<= next_state;

    assign   oOUT = out;
    assign   oSTATE= curr_state;
    
endmodule

 

Testbench

`timescale  1ns/10ps

module tb_fsm_mealy;
  reg          iCLK, iRESETn;
  reg          iIN;
  wire         oOUT;
  wire   [1:0] oSTATE;

  localparam TCLK = 60;

  fsm_mealy UFSM_ML (
    .iCLK (iCLK),
    .iRESETn (iRESETn),
    .iIN (iIN),
    .oOUT (oOUT),
    .oSTATE (oSTATE));

  initial   begin
    iCLK = 0; iRESETn = 1; #(TCLK/2);
    iRESETn = 0; #30;          
    iRESETn = 1; iIN = 0; #(TCLK*20);
    $stop;
  end
  
  always    #(TCLK/2)  iCLK = ~iCLK;

  always    #(TCLK)  iIN = ~iIN;

endmodule

 

Simulation

'Verilog_RTL 설계' 카테고리의 다른 글

[Verilog_RTL]_Module Instantiation  (0) 2025.06.26
[Verilog_RTL]_모듈 분할  (0) 2025.06.26
[Verilog_RTL]_FSM_moore  (0) 2025.06.20
[Verilog_RTL]_7-Seg_DECODER  (0) 2025.06.20
[Verilog_RTL]_2-to-10_DECODER  (0) 2025.06.16