저번에 Moore Machine에 대해 알아보았다면 이번 시간에는 Mealy Machine에 대해 알아보겠습니다.
Mealy Machine는 Moore Machine와 다르게 현재 상태와 입력에 의해 출력이 정해지는 FSM 입니다.
그러면 지금부터 간단한 Mealy Machine을 설계해보겠습니다. '0' 또는 '1'이 연속해서 입력되면 '1'을 출력하는 시퀀스 검출기 회로를 Mealy Machine을 사용하여 설계하면 어떻게 될까요?
먼저 상태도를 보면 아래와 같이 '0' 혹은 '1'이 동시에 입력될 때 출력이 1이 나오는 것을 확인할 수 있습니다.
이번 코드는 Mealy FSM 구조로 동작하는 시퀀스 디텍터입니다. 입력 din_bit
으로 들어오는 1비트 스트림에서 "00" 또는 "11" 패턴이 감지되면 출력 dout_bit
을 1로 출력합니다. 감지 조건은 최근 두 비트가 연속된 0 또는 연속된 1일 경우입니다.
입력 포트는 클럭(clk
), 리셋(rst
), 입력 비트(din_bit
)이고, 출력 포트는 시퀀스를 감지했을 때 1이 되는 dout_bit
입니다.
module mealy_fsm(
input clk,
input rst,
input din_bit, // 입력 bit
output dout_bit // 출력 bit
);
현재 상태(state_reg
)와 다음 상태(next_state
)를 저장할 3비트 레지스터를 선언하고 총 5개의 상태를 정의하게 됩니다. 각 상태는 다음과 같습니다.
start
: 초기 상태rd0_once
: 0을 한 번 읽은 상태rd1_once
: 1을 한 번 읽은 상태rd0_twice
: 0을 두 번 연속 읽은 상태rd1_twice
: 1을 두 번 연속 읽은 상태reg [2:0] state_reg, next_state;
parameter start = 3'b000;
parameter rd0_once = 3'b001;
parameter rd1_once = 3'b010;
parameter rd0_twice = 3'b011;
parameter rd1_twice = 3'b100;
입력과 현재 상태에 따라 다음 상태(next_state
)를 조합 논리로 결정합니다. Mealy FSM이기 때문에 출력은 입력과 현재 상태 모두에 반응하게 됩니다.
start
에서 입력이 0이면 rd0_once
, 1이면 rd1_once