FSM(Finite State Machine)

Moore's FSM

 

 

FSM, 즉 유한상태머신은 지정된 수의 상태 변화에 따라 출력을 조절하는 머신입니다.

input과 현재상태에 따라 output을 출력하는 Next state logic, 현재 상태를 저장하는 State Register, 입력과 현재상태에 따라 출력을 선택하는 Output Logic으로 구성됩니다.

 

저는 Switch와 LED를 통해 입력과 출력의 변화를 확인하도록 코드를 작성할 것입니다.


FSM Code

`timescale 1ns / 1ps

module my_fsm(
    input RST,
    input CLK,
    input [1:0] SWT,
    output reg [1:0] LED,
    output VCC
    //output GND
    );
    
assign  VCC = 1'b1;
//assign GND = 1'b0;

localparam [1:0] idle = 2'b00,
                 state_a = 2'b01,
                 state_b = 2'b10,
                 state_c = 2'b11;
                     
reg [1:0] curr_state, next_state;

always @ (posedge CLK)
begin
    if(RST)
        curr_state <= idle;
     else 
        curr_state <= next_state;
end

always @ (curr_state, SWT)
begin
    case (curr_state)
        idle : begin
            if(SWT == 2'b01)
                next_state = state_a;
            else
                next_state = idle;
            LED = 2'b00;
            end
         state_a : begin
            if(SWT == 2'b10)
                next_state = state_b;
            else
                next_state = state_a;
                LED = 2'b01;
            end
         state_b : begin
            if(SWT == 2'b11)
                next_state = state_c;
            else
                next_state = state_b;
                LED = 2'b10;
            end
         state_c : begin
            if(SWT == 2'b00)
                next_state = idle;
            else
                next_state = state_c;
                LED = 2'b11;
            end
            default : next_state = idle;
      endcase
end
endmodule

 


FSM Testbench

`timescale 1ns / 1ps

module my_fsm_tb();
parameter CLK_PD = 10.0;

reg RST, CLK;
reg [1:0] SWT;
wire [1:0] led;

my_fsm uut(
    .RST    (RST),
    .CLK    (CLK),
    .SWT    (SWT),
    .LED   (led)
    );
    
    initial CLK = 1'b0;
always  #(CLK_PD/2) CLK = ~CLK;
    
initial begin
    CLK = 1'b0;
    RST = 1'b0;
    SWT = 2'b00;
        
    #(CLK_PD*10);         SWT = 2'b00;
    #(CLK_PD*10);         SWT = 2'b01;
    #(CLK_PD*10);         SWT = 2'b10;
    #(CLK_PD*10);         SWT = 2'b11;
    end
    
endmodule

 

Schematic을 확인합니다.

 

사용하는 FPGA 의 Pin에 할당하는 위치를 지정합니다.

'Circuit Design > 🔥HDL' 카테고리의 다른 글

[Verilog] 7. 교통신호기 FSM  (0) 2024.04.29
[Verilog] 6.FSM Security  (0) 2024.04.29
[Verilog] 4. 1 Sec Counter- (Cora-z7)  (0) 2024.04.01
[Verilog] 3. Counter / Testbench- (Cora-z7)  (0) 2024.04.01
[Verilog] 2. 2Bit Adder - (Cora-z7)  (0) 2024.03.29