48 / 63 · 개념
상태 기계: 상태·전이·출력의 분리
상태 전이표를 바탕으로 FSM을 작성하고, Moore·Mealy 출력의 차이와 불법 상태·새 요청의 처리 방식을 비교합니다.
내용은 무료로 볼 수 있습니다. 수강 신청하면 학습 기록을 저장할 수 있어요.
상태는 과거 입력 중 필요한 정보만 요약합니다
현재 입력만으로 출력이 결정되지 않을 때 저장할 상태를 정의합니다. 모든 입력 이력을 저장하는 대신, 미래 동작을 결정하는 데 필요한 차이만 구분합니다.
작업 시작과 완료를 관리하는 제어기를 생각합시다. IDLE은 요청 대기, BUSY는 처리 중, DONE은 한 사이클의 완료 표시 상태입니다.
| 현재 상태 | 조건 | 다음 상태 | busy | done |
|---|---|---|---|---|
| IDLE | start=0 | IDLE | 0 | 0 |
| IDLE | start=1 | BUSY | 0 | 0 |
| BUSY | work_done=0 | BUSY | 1 | 0 |
| BUSY | work_done=1 | DONE | 1 | 0 |
| DONE | 항상 | IDLE | 0 | 1 |
busy와 done은 현재 상태의 출력입니다. 예를 들어 BUSY에서 완료를 관찰한 에지 이후 DONE으로 바뀌어 done이 1이 됩니다. 이처럼 현재 상태만으로 정해지는 출력을 Moore 출력이라고 합니다.
각 열은 한 상승 에지상승 에지 클록이 0에서 1로 바뀌는 순간입니다. CLK=1인 구간 전체를 뜻하는 레벨과 구별합니다. 자세히 보기에서 관찰한 값을 보여 줍니다. 입력은 에지 직전의 값이고, 이름에 after가 붙은 상태는 갱신 직후의 값입니다. 열은 샘플링 순서대로 놓았으며, 실제 전파 지연전파 지연 입력이 바뀐 뒤 출력이 올바른 값으로 안정되기까지 걸리는 시간입니다. 논리식의 등가성과 시간 특성은 별개입니다. 자세히 보기을 나타내지는 않습니다. 초기 IDLE입니다. work_done을 수락한 에지 뒤에 상태가 DONE으로 바뀌고 done이 1이 됩니다. DONE 다음은 start와 무관하게 IDLE입니다.
파형 데이터 보기
| 신호 | 파형 | 버스 값 |
|---|---|---|
| edge | 2345 | E0 → E1 → E2 → E3 |
| start | 10.1 | |
| work_done | 0.10 | |
| state after | 2.34 | BUSY → DONE → IDLE |
| busy after | 1.0. | |
| done after | 0.10 |
전이와 저장을 분리한 RTL
typedef enum logic [1:0] {IDLE, BUSY, DONE} state_t;
state_t state, next_state;
always_comb begin
next_state = state;
case (state)
IDLE: if (start) next_state = BUSY;
BUSY: if (work_done) next_state = DONE;
DONE: next_state = IDLE;
default: next_state = IDLE;
endcase
end
always_ff @(posedge clk)
if (rst) state <= IDLE;
else state <= next_state;
assign busy = (state == BUSY);
assign done = (state == DONE);이는 제어 구조를 설명하는 SystemVerilog 예시입니다. 연결된 처리기의 work_done 생성과 입력 동기화는 별도로 구현해야 합니다.
명세에서 빠지기 쉬운 질문
위 회로는 BUSY나 DONE에서 start를 무시합니다. 완료와 동시에 새 요청을 받아야 한다면 전이표부터 바꿔야 합니다. Mealy 출력은 상태와 현재 입력을 함께 사용하여 빠르게 반응할 수 있지만, 조합 출력 경로의 타이밍과 glitch도 검토해야 합니다. 상태를 binary로 표현할지 one-hot원핫 여러 비트 중 정확히 하나만 1인 표현입니다. 모두 0도 허용하는 조건은 one-hot-or-zero로 구별합니다. 자세히 보기으로 표현할지 정하는 일과, Moore/Mealy 중 어떤 출력을 사용할지 정하는 일은 별개입니다.
직접 생각해 보기
DONE 상태에서 start=1이 한 사이클 들어왔습니다. 위 FSM이 바로 새 작업을 시작하나요? 연속 작업을 허용하려면 무엇을 바꿔야 하나요?
해설 보기
위 전이표에서는 DONE→IDLE이므로 그 요청을 받지 않습니다. DONE에서 start이면 BUSY로 가도록 바꾸거나 요청을 저장하는 프로토콜을 설계해야 합니다. 이때 done 출력 폭과 요청 수락 시점을 새 명세에 맞춰 검증해야 합니다.