Altifigence Academy

6 / 24 · 개념

FSM으로 자원 사용을 예약하기

하나의 가산기로 네 값을 누산하고 상태 전이와 입력 보관을 설계합니다.

제어 상태는 연산 순서를 표현한다

자원이 하나뿐이면 여러 연산을 시간에 나누어 배치합니다. 네 값 x0,x1,x2,x3의 합을 구하는 장치에서 가산기 하나와 10비트 acc를 사용한다고 합시다. 입력은 요청을 수락할 때 네 개 모두 내부 레지스터에 저장합니다. 외부 입력이 이후 바뀌어도 계산은 수락한 값으로 이어져야 합니다. 제어부는 어느 입력을 가산기로 보낼지 선택하고, 합을 저장할지, 결과를 유효하게 보일지를 결정합니다.

상태는 IDLE, ADD0, ADD1, ADD2, ADD3, DONE으로 잡겠습니다. IDLE에서 요청을 수락하는 에지는 피연산자 보관과 acc=0만 수행합니다. 다음 네 에지에서 각 입력을 차례로 누산합니다. ADD3 에지 직후 최종 합이 저장되고 상태가 DONE이 되므로 결과 valid가 올라갑니다. DONE에서 소비자가 준비되지 않았으면 결과와 상태를 보존합니다. 소비자가 결과를 받은 에지에 IDLE로 돌아가며 이 단순 버전은 같은 에지에 새 요청을 수락하지 않습니다.

에지에지 전 상태이번 동작에지 후 acc
0IDLE3,5,7,9 저장, acc 초기화0
1ADD0acc+33
2ADD1acc+58
3ADD2acc+715
4ADD3acc+9, DONE 진입24
5DONE소비자가 결과 수락24

최종값이 에지 4 뒤에 나타나는 것과 실제 전달이 에지 5에서 일어나는 것을 구분합니다. 결과가 준비되어도 상대가 멈추면 DONE 기간은 길어집니다. 이 설계는 하드웨어를 적게 쓰지만 다음 요청을 시작할 때까지 기다리므로 한 사이클마다 입력을 받는 파이프라인과 처리량이 다릅니다. 동작을 이해한 다음에 DONE에서 새 입력도 받도록 바꾸려면 기존 결과 전달과 새 계산 초기화의 우선순위를 명확히 해야 합니다.

네 값 누산기
  1. IDLE: 네 값을 모두 수락하고 저장
  2. ADD0..ADD3: 네 에지에 걸쳐 한 가산기 재사용
  3. DONE: 소비할 때까지 결과 보존

제어 신호는 상태에서 도출하되 연산 코드와 값을 섞어 쓰지 않습니다. acc_enable은 ADD 상태에서 1, operand_select는 해당 인덱스, result_valid는 DONE에서 1입니다. 조합 제어 로직은 모든 신호에 기본값을 주어 비활성 경로가 의도치 않게 이전 선택을 기억하지 않게 합니다. 상태 레지스터와 datapath 레지스터는 같은 에지의 이전 값을 읽는다는 원칙을 유지합니다.

한 번 수락한 요청을 외부 start가 계속 높다는 이유로 반복 수락하지 않도록 ready와 수락 이벤트를 정의하세요. reset은 모든 상태에서 IDLE로 돌아가고 outstanding 요청을 폐기합니다. count 기반 FSM으로 줄이더라도 count가 가리키는 입력과 acc 업데이트가 같은 사이클인지 표로 확인해야 합니다. 상태 수가 적다는 이유만으로 좋은 제어가 되는 것은 아니며, 명확한 수락·완료·대기 동작이 먼저입니다.

직접 생각해 보기

입력 255 네 개를 같은 순서로 누산하면 ADD0~ADD3 후 acc는 각각 얼마인가요? 에지 5에서 출력 ready=0이면 상태와 acc는 어떻게 되어야 하나요?

해설 보기

acc는 255,510,765,1020입니다. 모두 10비트 안에 있습니다. ready=0이면 결과가 전달되지 않았으므로 DONE,acc=1020,valid=1을 보존해야 합니다.

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