본문 바로가기

[Harman] 반도체 설계/Vivado

[Vivado] 05. Finite State Machine LED

Moore Machine

 

current nextState
reset input state output state
1 - - 0 OFF
0 0 OFF  0   OFF 
0 1 OFF  1   ON 
0 0 ON  0   OFF 
0 1 ON  1   ON 

 

reset 값은 OFF 에서 시작.  

output 은 input 과 서로 독립적이며 state 값을 따른다. 

 

`timescale 1ns / 1ps // moore machine

module LED_FSM(
    input clk,
    input reset,
    input i_ledswitch,
    output reg o_led
    );
    parameter S_OFF = 1'b0, S_ON = 1'b1;
    reg state = S_OFF, nextState;
    
    // state register
    always@(posedge clk, posedge reset) begin
        if(reset) state <= S_OFF;
        else state <= nextState;
    end
    
    // nextState logic
    always@(i_ledswitch, state) begin
        case(state)
            S_OFF   : begin if(i_ledswitch == 1'b1) nextState = S_ON;  else nextState = S_OFF; end
            S_ON    : begin if(i_ledswitch == 1'b0) nextState = S_OFF; else nextState = S_ON;  end
            default : nextState = S_OFF; 
        endcase
    end
    //output logic
    always@(state) begin
        case(state)
            S_OFF   : begin o_led = 1'b0; end
            S_ON    : begin o_led = 1'b1; end
            default : o_led = 1'b0;
        endcase
    end
endmodule

 

 

Mealy Machine

 

current nextState
reset input state output state
1 - - - OFF
0  1  OFF  1   ON 
0 0 OFF 0 OFF
0  0  ON  0   OFF 
0 1 ON 1 ON

 

reset 값은 OFF 에서 시작.

output 은 input 의 영향을 받는다. 

 

`timescale 1ns / 1ps // mealy machine

module LED_FSM(
    input clk,
    input reset,
    input i_ledswitch,
    output reg o_led
    );
    parameter S_OFF = 1'b0, S_ON = 1'b1;
    reg state = S_OFF, nextState;
    
    // state register
    always@(posedge clk, posedge reset) begin
        if(reset) state <= S_OFF;
        else state <= nextState;
    end
    
    // nextState logic
    always@(i_ledswitch, state) begin
        case(state)
            S_OFF   : begin if(i_ledswitch == 1'b1) nextState = S_ON;  else nextState = S_OFF; end
            S_ON    : begin if(i_ledswitch == 1'b0) nextState = S_OFF; else nextState = S_ON;  end
            default : nextState = S_OFF; 
        endcase
    end
    //output logic
    always@(i_ledswitch, state) begin
        case(state)
            S_OFF   : begin if(i_ledswitch == 1'b1) o_led = 1'b1; else o_led = 1'b0; end
            S_ON    : begin if(i_ledswitch == 1'b0) o_led = 1'b0; else o_led = 1'b1; end
            default : o_led = 1'b0;
        endcase
    end
endmodule