Altifigence Academy

29 / 63 · 개념

상태 개수, 카운터 폭과 사용하지 않는 코드

카운트 범위에서 저장 비트 수를 구하고, 허용 범위를 벗어난 상태에서 어떻게 복구할지 정합니다.

숫자를 세는 회로도 상태 기계입니다

0~9를 반복하는 카운터에는 10개 상태가 필요합니다. 최소 저장 폭은 ⌈log⁡210⌉=4\lceil\log_2 10\rceil=4비트입니다. 하지만 4비트 레지스터레지스터 여러 비트의 상태를 저장하는 회로입니다. 이 과정의 동기식 레지스터는 클록 에지에서 정해진 입력을 저장합니다. 자세히 보기에는 16개 비트 패턴이 있으므로, 필요한 비트 수만 확보해도 modulo-10 카운터가 되는 것은 아닙니다.

N=⌈log⁡2M⌉,unused codes=2N−MN=\left\lceil\log_2 M\right\rceil,\qquad \text{unused codes}=2^N-M

M은 최댓값이 아니라 상태 개수입니다. 0부터 M-1까지 세는 것과 0부터 M까지 세는 것은 다릅니다. 매개변수 M=1을 지원한다면 최소 1비트를 사용하고 항상 0을 유지하도록 처리합니다.

4비트로는 16개 비트 패턴을 저장할 수 있지만, modulo-10 카운터는 그중 10개만 정상 상태로 사용합니다. 비트 폭을 정한 뒤에는 값을 비교하는 방법과 잘못된 상태에서 복구하는 방법도 정해야 합니다.

저장 폭과 순환 조건은 별도 설계
  1. 10개 상태: 정상 count는 0~9
  2. 4비트 저장: 16개 코드, 10~15는 여분
  3. 다음 상태: en=1이고 count≥9면 0

범위 밖 상태도 설계의 일부입니다

4비트 modulo-10 카운터가 어떤 이유로 12가 되면 다음 동작을 어떻게 할까요? 초기화·리셋리셋 상태를 명세한 초기값으로 돌리는 제어입니다. 동기식인지 비동기식인지, 다른 제어보다 우선하는지를 함께 정해야 합니다. 자세히 보기 조건을 근거로 이런 상태가 발생하지 않음을 증명하거나, 9 이상에서 0으로 복구하는 정책을 둘 수 있습니다. 복구 기능이 모든 하드웨어 고장에 대한 내성을 보장하는 것은 아닙니다.

SystemVerilog
always_ff @(posedge clk) begin
  if (rst) count <= 4'd0;
  else if (en) begin
    if (count >= 4'd9) count <= 4'd0;
    else count <= count + 4'd1;
  end
end

이 예제는 잘못된 값 10~15도 en=1인 에지에서 복구합니다. enable이 0이면 그 값도 유지하므로, 즉시 복구해야 한다면 조건 우선순위를 바꿔야 합니다.

폭 검토와 기능 검토는 별개입니다

0~999에는 10비트면 충분하지만, 계속 1씩 더하기만 하면 1023까지 갑니다. 명세에 정한 최댓값에서 0으로 돌아오는 비교·선택 회로가 필요합니다. 메모리 주소, 반복 횟수, 패킷 길이 카운터에서 이 차이를 놓치면 잘못된 접근이나 길이 오류로 이어집니다.

직접 생각해 보기

0~99를 반복하는 카운터의 최소 폭과 사용하지 않는 코드 수를 구하세요. 단순히 그 폭으로 +1만 하면 무엇이 달라지나요?

해설 보기

100개 상태이므로 7비트이고, 사용하지 않는 코드는 128−100=28128-100=28개입니다. 단순 증가 회로는 99에서 돌아오지 않고 127까지 진행하므로 modulo-100이 아니라 modulo-128이 됩니다.

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