28 / 37 · 개념
상태 기계: 상태·전이·출력의 분리
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 출력 폭과 요청 수락 시점을 새 명세에 맞춰 검증해야 합니다.