본문 바로가기
하만 세미콘 아카데미/Verilog HDL

Verilog HDL 실습 (FSM)

by smileww 2024. 5. 31.

오늘은 FSM을 Verilog HDL로 만들어보겠습니다.

 

 

FSM이란? 

유한 상태 기계(finite-state machine, FSM)는 컴퓨터 프로그램과 전자 논리 회로를 설계하는 데에 쓰이는 수학적 모델이다. 간단히 '상태 기계'라고 부르기도 한다. 많은 디지털 시스템에서 System 및 Data Flow Path의 동작을 제어하는 데 사용되는 Sequential 회로입니다.

 

현재 상태 Current state 와 input에 따라 다음 상태 Next state가 결정이 됩니다. Verilog로 컨트롤러를 설계한다고 했을 때 FSM을 이용하면 비교적 쉽게 설계할 수 있습니다. If else 분기문을 통해서 설계할 수 있으나 HW는 동시성의 개념이 있기 때문에 If else를 여기저기 남발하다가 나도 모르는 사이에 코드가 꼬이는 경험이 될 수 있습니다.

 

하나의 FSM Logic은 하나의 상태만을 가지게 되고 어떠한 사건에 의해 현 상태에서 다른 상태로 변화할 수 있는데. 이를 Transition이라고 부릅니다.

 

 

 

Verilog HDL Code

더보기

FSM Module

`timescale 1ns / 1ps

module my_fsm(
    input RST,
    input CLK,
    input [1:0] SW,
    output reg [1:0] LED,
    output VCC
    );

assign VCC = 1'b1;
    
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, SW)
begin
    case (curr_state)
        idle : begin
            if(SW == 2'b01)
                next_state = state_a;
            else
                next_state = idle;
            LED = 2'b00;
        end
       
       state_a : begin
            if(SW == 2'b10)
                next_state = state_b;
            else
                next_state = state_a;
            LED = 2'b01;
       end
       
       state_b : begin
            if(SW == 2'b11)
                next_state = state_c;
            else
                next_state = state_b;
            LED = 2'b10;
       end
       
       state_c : begin
            if(SW == 2'b00)
                next_state = idle;
            else
                next_state = state_c;
            LED = 2'b11;
       end
       
       default : next_state = idle;
     endcase
end
    
endmodule

 

Testbench

`timescale 1ns / 1ps

module my_fsm_tb();
parameter CLK_PD = 10.0;

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

my_fsm uut(
    .RST    (RST),
    .CLK    (CLK),
    .SW     (SW),
    .LED    (led)
    );
    
initial begin
    RST = 1'b1;
    #(CLK_PD*20);
    RST = 1'b0;
end

initial CLK = 1'b0;
always #(CLK_PD/2) CLK = ~CLK;

initial begin
    SW = 2'b00;
    wait (RST <= 1'b0);
    #(CLK_PD*10);
    SW = 2'b01;
    #(CLK_PD*10);
    SW = 2'b10;
    #(CLK_PD*10);
    SW = 2'b11;
    #(CLK_PD*10);
    SW = 2'b00;

end
    
    
endmodule

 

이번 실습은 버튼을 누르면 다음 상태로 전환되는 기능을 만들어보려고 합니다. 버튼의 입력에 따라 상태가 넘어가고 상태마다 각각 LED가 켜짐으로써 FSM이 잘 동작하는지 확인합니다. 보드 테스트 전에 Simulation으로 먼저 이상이 없는지부터 감지합니다.

 

 

Simulation에서 스위치의 2진수 값에 따라 상태 변화가 잘 바뀌는 것을 볼 수 있습니다. 그에따라 LED도 안정적으로 변화하고 있습니다. Simulation까지 마치면 Synthesis를 진행하여 핀 배치를 해줍니다. 핀 배치를 해줄때는 각 보드의 schematic을 확인하여 해줍니다.

 

 

Bitstream까지 진행후 보드와 연결하여 FPGA에서 테스트 합니다.

 

 

'하만 세미콘 아카데미 > Verilog HDL' 카테고리의 다른 글

Verilog HDL 실습 (Traffic)  (0) 2024.05.31
Verilog HDL 실습 (Security)  (0) 2024.05.31
Verilog HDL 실습 (Counter)  (0) 2024.05.31
Verilog HDL 실습 (1sec_LED)  (0) 2024.05.31
Verilog HDL 실습 (Parity_bit)  (0) 2024.05.31