Altifigence Academy

28 / 37 · 개념

상태 기계: 상태·전이·출력의 분리

FSM을 명세 표에서 작성하고 Moore·Mealy 출력, 불법 상태와 요청 정책을 비교합니다.

상태는 과거 입력 중 필요한 정보만 요약합니다

현재 입력만으로 출력이 결정되지 않을 때 저장할 상태를 정의합니다. 모든 입력 이력을 저장하는 대신, 미래 동작을 결정하는 데 필요한 차이만 구분합니다.

Sk+1=F(Sk,Xk)S_{k+1}=F(S_k,X_k)

작업 시작과 완료를 관리하는 제어기를 생각합시다. IDLE은 요청 대기, BUSY는 처리 중, DONE은 한 사이클의 완료 표시 상태입니다.

현재 상태조건다음 상태busydone
IDLEstart=0IDLE00
IDLEstart=1BUSY00
BUSYwork_done=0BUSY10
BUSYwork_done=1DONE10
DONE항상IDLE01

busy와 done은 현재 상태의 출력입니다. 예를 들어 BUSY에서 완료를 관찰한 에지 이후 DONE으로 바뀌어 done이 1이 됩니다. 이 정의는 Moore 출력입니다.

각 열은 한 상승 에지상승 에지 클록이 0에서 1로 바뀌는 순간입니다. CLK=1인 구간 전체를 뜻하는 레벨과 구별합니다. 자세히 보기의 관찰 기록입니다. 입력은 에지 직전, 이름에 after가 붙은 상태는 갱신 직후 값입니다. 열의 정렬은 샘플 순서를 나타내며 물리적인 전파 지연전파 지연 입력이 바뀐 뒤 출력이 올바른 값으로 안정되기까지 걸리는 시간입니다. 논리식의 등가성과 시간 특성은 별개입니다. 자세히 보기을 그린 것이 아닙니다. 초기 IDLE입니다. work_done을 수락한 에지 뒤에 상태가 DONE으로 바뀌고 done이 1이 됩니다. DONE 다음은 start와 무관하게 IDLE입니다.

Moore 출력은 현재 상태를 따라갑니다
파형 데이터 보기
파형 데이터: 각 문자는 한 구간, 점은 이전 상태 유지, p는 클록 한 주기입니다.
신호파형버스 값
edge2345E0 → E1 → E2 → E3
start10.1
work_done0.10
state after2.34BUSY → DONE → IDLE
busy after1.0.
done after0.10

전이와 저장을 분리한 RTL

SystemVerilog
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 출력 폭과 요청 수락 시점을 새 명세에 맞춰 검증해야 합니다.

선택은 이 브라우저에만 적용됩니다. 언제든 푸터에서 변경할 수 있습니다.