FSM(Finite State Machine)
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 |