SM 로직 설계를 할 때 일반적으로 상태 선언, 상태 전이, 다음 상태 결정 로직, 출력 로직으로 나누어 설계합니다. 아래에서 각 부분을 설명하고, Verilog로 구현한 코드를 예시로 보여드리겠습니다.

1. 상태 선언 (State Declaration)

FSM에서 사용할 상태를 정의합니다. 상태는 보통 localparam으로 선언하여, 가독성과 유지보수성을 높입니다. 각 상태는 고유한 값을 가집니다.

localparam S0 = 2'b00, S1 = 2'b01, S2 = 2'b10;

2. 상태 전이 (State Transition)

현재 상태에서 다음 상태로의 전이를 클럭 신호에 맞추어 업데이트하는 부분입니다. 플립플롭(flip-flop)을 사용하여 현재 상태를 저장합니다.

 
always @(posedge clk or posedge reset) begin
if (reset) begin present_state <= S0; // 리셋 시 초기 상태로 설정
end else begin present_state <= next_state; // 다음 상태로 전이
end
end

3. 다음 상태 결정 로직 (Next State Logic)

현재 상태와 입력에 따라 다음 상태를 결정하는 조합 논리입니다. always @(*) 블록을 사용하여 현재 상태와 입력 신호에 따라 다음 상태를 계산합니다.

 
always @(*) begin
case (present_state)
S0: if (in) next_state = S1; else next_state = S0;
S1: if (in) next_state = S2; else next_state = S0;
S2: if (in) next_state = S0; else next_state = S1;
default: next_state = S0; // 기본 상태
endcase
end

4. 출력 로직 (Output Logic)

출력 로직은 Moore FSM과 Mealy FSM에 따라 달라집니다. 여기서는 Moore FSM을 기준으로, 출력은 현재 상태에만 의존합니다.

 
always @(*) begin
case (present_state)
S0: out = 0;
S1: out = 1;
S2: out = 0;
default: out = 0;
endcase
end
 
  • 상태 선언: S0, S1, S2 세 가지 상태가 localparam으로 선언되었습니다.
  • 상태 전이: 현재 상태는 클럭 신호에 맞추어 업데이트됩니다. 리셋 신호가 들어오면 FSM은 기본 상태(S0)로 돌아갑니다.
  • 다음 상태 결정 로직: 현재 상태와 입력 신호 in에 따라 다음 상태를 결정합니다.
  • 출력 로직: 출력은 현재 상태에 따라 결정됩니다. Moore FSM에서는 출력이 상태에만 의존하므로, 상태에 따른 출력값을 정의합니다.

+ Recent posts