7-1. Verilog의 유한 상태 기계(FSM) 설계

1. 유한 상태 기계(FSM)의 기본 개념

유한 상태 기계(Finite State Machine, FSM)는 시스템의 동작을 _유한_한 수의 상태와 상태 간의 전이(transition)로 모델링하는 강력한 개념입니다. 마치 레고 블록처럼, FSM은 복잡한 디지털 시스템을 구축하기 위한 기본적인 빌딩 블록 역할을 합니다. 디지털 회로 설계, 특히 Verilog와 같은 하드웨어 기술 언어(HDL)를 사용할 때 FSM은 매우 중요한 설계 기법입니다.

FSM은 주어진 _입력_에 따라 현재 _상태_를 변경하고, 그 결과로 _출력_을 생성합니다. 이러한 동작은 마치 사람이 어떤 상황에 따라 특정 행동을 하는 것과 유사합니다. 예를 들어, 신호등을 생각해 봅시다. 신호등은 빨간색, 노란색, 녹색과 같은 여러 상태를 가집니다. 특정 시간 간격, 또는 차량 감지 센서의 신호에 따라 상태가 변경되며, 각 상태에 따라 해당 색상의 신호를 출력합니다.

FSM의 핵심 요소는 다음과 같습니다.

  • 상태 (States): 시스템이 존재할 수 있는 특정 시점의 조건을 나타냅니다.
  • 입력 (Inputs): 시스템에 주어지는 외부 신호입니다.
  • 출력 (Outputs): 시스템이 외부로 내보내는 신호입니다.
  • 전이 (Transitions): 현재 상태에서 다른 상태로의 변화를 정의합니다.
  • 전이 조건 (Transition Conditions): 상태 전이가 발생하는 조건을 정의합니다.

FSM은 상태 다이어그램 (State Diagram)을 사용하여 시각적으로 표현할 수 있습니다. 상태 다이어그램은 각 상태를 노드(원 또는 사각형)로, 상태 간의 전이를 화살표로 나타냅니다. 화살표에는 전이 조건과 출력 신호가 표시됩니다.

Moore와 Mealy 머신 설명 전, FSM 전체 구조 설명

2. Moore 머신과 Mealy 머신

FSM은 출력 생성 방식에 따라 두 가지 주요 유형으로 나뉩니다. 바로 Moore 머신Mealy 머신입니다. 두 머신의 주요 차이점은 출력 신호가 생성되는 방식에 있습니다.

1) Moore 머신

Moore 머신은 출력 신호가 현재 상태에만 의존합니다. 즉, 입력에 관계없이 각 상태에 특정 출력이 고정적으로 할당됩니다. Moore 머신은 설계가 단순하고 안정적인 출력을 보장하지만, 상태의 수가 증가할 수 있습니다.

  • 장점: 안정적인 출력, 설계 단순성
  • 단점: 반응 속도가 느릴 수 있음, 상태 수가 증가할 수 있음

2) Mealy 머신

Mealy 머신은 출력 신호가 현재 상태와 입력 모두에 의존합니다. 즉, 입력의 변화가 즉시 출력에 반영될 수 있습니다. Mealy 머신은 Moore 머신보다 반응 속도가 빠르지만, 출력의 불안정성이 발생할 수 있습니다.

  • 장점: 빠른 반응 속도, 상태 수 감소 가능성
  • 단점: 출력의 불안정성, 설계 복잡성 증가

두 머신의 차이점을 이해하는 것은 FSM 설계를 효과적으로 수행하는 데 매우 중요합니다. 프로젝트의 요구 사항에 따라 적절한 유형을 선택해야 합니다.

3. Verilog를 이용한 FSM 설계

Verilog는 디지털 시스템을 모델링하고 시뮬레이션하기 위한 하드웨어 기술 언어(HDL)입니다. Verilog를 사용하여 FSM을 설계하는 것은 매우 일반적인 방법이며, 다음과 같은 세 단계를 따릅니다.

  1. 상태 정의 (State Definition): 시스템의 상태를 정의합니다. 보통 parameter 또는 enum 타입을 사용하여 각 상태에 고유한 이름을 할당합니다.
  2. 상태 전이 로직 (State Transition Logic): 현재 상태와 입력에 따라 다음 상태를 결정하는 로직을 구현합니다. always @(posedge clk) 블록 내에서 case 문을 사용하여 각 상태에 대한 전이를 정의합니다.
  3. 출력 로직 (Output Logic): 현재 상태에 따라 출력 신호를 생성하는 로직을 구현합니다. Moore 머신의 경우 현재 상태에 따라 출력을 결정하고, Mealy 머신의 경우 현재 상태와 입력에 따라 출력을 결정합니다. always @(*) 또는 always @(state, input) 블록을 사용하여 구현합니다.

1) Verilog 코드 예제: Moore 머신 - 간단한 2진 카운터

다음은 간단한 2진 카운터를 구현하는 Moore 머신의 Verilog 코드 예제입니다. 이 카운터는 0, 1, 2, 3의 순서로 카운트하며, 각 상태에 해당하는 출력을 생성합니다.

module moore_counter (
    input clk,
    input rst,
    output reg [1:0] count
);

    // 상태 정의
    parameter S0 = 2'b00;
    parameter S1 = 2'b01;
    parameter S2 = 2'b10;
    parameter S3 = 2'b11;

    reg [1:0] state, next_state;

    // 상태 전이 로직
    always @(posedge clk or posedge rst) begin
        if (rst)
            state <= S0;
        else
            state <= next_state;
    end

    always @(*) begin
        case (state)
            S0: next_state = S1;
            S1: next_state = S2;
            S2: next_state = S3;
            S3: next_state = S0;
            default: next_state = S0;
        endcase
    end

    // 출력 로직 (Moore 머신)
    always @(*) begin
        case (state)
            S0: count = 2'b00;
            S1: count = 2'b01;
            S2: count = 2'b10;
            S3: count = 2'b11;
            default: count = 2'b00;
        endcase
    end
endmodule

위 코드에서 state는 현재 상태를 저장하는 레지스터이고, next_state는 다음 상태를 계산하는 변수입니다. count는 출력 신호이며, 각 상태에 따라 다른 값을 가집니다.

2) Verilog 코드 예제: Mealy 머신 - 101 시퀀스 감지기

다음은 Mealy 머신을 사용하여 "101" 시퀀스를 감지하는 간단한 Verilog 코드 예제입니다.

module mealy_sequence_detector (
    input clk,
    input rst,
    input data_in,
    output reg detect
);

    // 상태 정의
    parameter S0 = 2'b00; // 초기 상태
    parameter S1 = 2'b01; // "1" 감지
    parameter S2 = 2'b10; // "10" 감지

    reg [1:0] state, next_state;

    // 상태 전이 로직
    always @(posedge clk or posedge rst) begin
        if (rst)
            state <= S0;
        else
            state <= next_state;
    end

    always @(*) begin
        case (state)
            S0: begin
                if (data_in)
                    next_state = S1;
                else
                    next_state = S0;
            end
            S1: begin
                if (data_in)
                    next_state = S1;
                else
                    next_state = S2;
            end
            S2: begin
                if (data_in)
                    next_state = S1;
                else
                    next_state = S0;
            end
            default: next_state = S0;
        endcase
    end

    // 출력 로직 (Mealy 머신)
    always @(*) begin
        case (state)
            S0: detect = 1'b0;
            S1: detect = 1'b0;
            S2: detect = data_in; // "10" 상태에서 입력이 1이면 detect = 1
            default: detect = 1'b0;
        endcase
    end

endmodule

이 예제에서 state는 현재 상태를 나타내며, data_in은 입력 데이터입니다. detect는 출력 신호로, "101" 시퀀스가 감지되면 1이 됩니다. Mealy 머신이므로 출력 detect는 현재 상태뿐만 아니라 data_in의 값에도 의존합니다.

4. FSM 설계 시 고려 사항

FSM을 설계할 때는 몇 가지 중요한 사항을 고려해야 합니다.

1) 상태 코딩 (State Encoding)

상태를 표현하는 데 사용되는 비트 수를 결정하는 것이 중요합니다. 이진 코딩, 원-핫 코딩, 그레이 코드 등 다양한 코딩 기법이 존재합니다. 이진 코딩은 가장 적은 수의 비트를 사용하지만, 전이 과정에서 글리치(glitch)가 발생할 수 있습니다. 원-핫 코딩은 각 상태를 하나의 비트로 표현하여 빠르고 안전하지만, 하드웨어 리소스를 많이 사용합니다. 그레이 코드는 인접한 상태 간에 한 비트만 변경되도록 설계되어 글리치 문제를 완화합니다.

2) 동기화 (Synchronization)

FSM이 클럭 신호에 동기화되도록 설계하는 것이 중요합니다. always @(posedge clk) 블록을 사용하여 클럭의 상승 에지에서 상태를 업데이트합니다. 비동기 입력 신호는 동기화 회로를 통해 처리하여 안정성을 확보해야 합니다.

3) 리셋 (Reset)

FSM을 초기 상태로 되돌리는 리셋 신호를 설계에 포함해야 합니다. 리셋 신호는 always @(posedge clk or posedge rst) 블록에서 사용되며, 시스템의 예상치 못한 동작을 방지하는 데 도움이 됩니다.

4) 테스트 (Testing)

설계가 완료되면 시뮬레이션을 통해 FSM의 동작을 테스트해야 합니다. 테스트 벤치(testbench)를 작성하여 다양한 입력 조건에서 FSM의 출력을 검증합니다.

5. FSM 설계의 장점 및 단점

FSM은 복잡한 디지털 시스템을 설계하는 데 매우 유용한 도구이지만, 몇 가지 장점과 단점이 있습니다.

1) 장점

  • 구조화된 설계: FSM은 시스템을 상태와 전이로 구조화하여 설계를 체계적으로 관리할 수 있게 해줍니다.
  • 쉬운 이해와 유지보수: 상태 다이어그램을 통해 시스템의 동작을 쉽게 이해하고, 유지보수할 수 있습니다.
  • 재사용성: FSM은 모듈화된 설계를 가능하게 하여, 다른 프로젝트에서 재사용할 수 있습니다.
  • 자동화된 합성: Verilog와 같은 HDL을 사용하면 FSM을 하드웨어로 자동 합성할 수 있습니다.

2) 단점

  • 상태 수의 증가: 복잡한 시스템의 경우, 상태 수가 증가하여 설계가 복잡해질 수 있습니다.
  • 설계의 어려움: 복잡한 FSM은 설계하고 디버깅하는 데 시간이 오래 걸릴 수 있습니다.
  • 하드웨어 리소스 사용: 상태 코딩 방식에 따라 하드웨어 리소스 사용량이 증가할 수 있습니다.

6. 결론

FSM은 디지털 시스템 설계의 핵심적인 개념이며, Verilog를 사용하여 이를 효과적으로 구현할 수 있습니다. Moore 머신과 Mealy 머신의 차이점을 이해하고, 적절한 상태 코딩과 동기화 기법을 적용하여 안정적이고 효율적인 FSM을 설계해야 합니다. FSM 설계는 디지털 회로 설계의 기본이며, 이를 숙달하면 보다 복잡한 시스템을 이해하고 구축하는 데 도움이 될 것입니다.

비슷한 글 추천

Comments (0)

No comments yet. Be the first to comment!