본문으로 건너뛰기
code0.HDL

06구현 문제

9 다음에 0으로 돌아가는 카운터

1. 요구 동작

decade_counter는 동기 리셋을 가진 클록 카운터입니다. reset은 active-high입니다. 상승 에지에서 reset이 1이면 count는 0이 됩니다. reset이 0이면 0, 1, …, 9 순서로 한 단계씩 증가하고, 9 다음에는 0으로 돌아갑니다.

시작 코드는 Testbench 장의 4비트 카운터와 같습니다. 컴파일과 리셋은 정상이지만 9 다음에도 10, 11, 12로 계속 증가합니다. 공개 출력에서는 cycle 10부터 이 증상이 나타납니다. 포트, 리셋 동작, 공개 테스트벤치는 그대로 두고 TODO 위치의 always 블록만 수정하세요.

2. 공개 테스트벤치 읽기

marker 아래의 테스트벤치는 다음 순서로 동작합니다.

구성동작
always #5 clock = ~clock주기 10의 클록 생성
initial #12 reset = 0시간 12에 리셋 해제
always @(posedge clock)리셋 해제 뒤 상승 에지마다 count 출력

출력은 상승 에지에서 실행됩니다. 그래서 각 줄은 해당 에지가 레지스터를 갱신하기 직전의 값을 보여 줍니다. 테스트벤치 장의 counter-trace 예제에서 EDGE 줄이 보여 준 것과 같은 관점입니다. 수정하기 전에 올바른 카운터의 cycle 0부터 12까지 값을 적고, 처음으로 0으로 돌아가는 cycle을 표시해 보세요.

TODO 위치를 수정해 실행한 뒤 출력을 예측과 한 줄씩 비교하세요. 마지막으로, 0으로 돌아가는 동작을 수행한 에지보다 한 줄 뒤에 0이 출력되는 이유를 설명해 보세요.

3. 완료 조건

  • 리셋 뒤 0부터 9까지 진행하고 다시 0이 됩니다. 클록이 계속되는 동안 이 주기가 반복됩니다.
  • count는 10 이상이 되지 않습니다.
  • 주기 중간에 reset을 올리면 다음 상승 에지에서 0이 되며, 그보다 먼저 바뀌지 않습니다. 리셋을 해제하면 0부터 다시 셉니다.

4. 단계형 힌트

힌트 1

4비트 레지스터는 15 다음에 자연스럽게 0으로 돌아갑니다. 9에서 0으로 돌아가는 동작은 현재 값이 9인 에지에서 설계가 직접 결정해야 합니다.

힌트 2

if/else 연쇄는 이미 리셋과 증가 가운데 하나를 고릅니다. 세 번째 선택지는 두 경우 사이에 넣으세요. 리셋은 첫 번째 조건으로 유지합니다.

힌트 3

count를 피하려는 첫 값이 아니라, 마지막으로 보여야 할 값과 비교하세요. 10과 비교하면 10이 한 cycle 동안 출력됩니다.

5. 추가 실험

되돌아가는 지점이 9가 아니라 5라면 공개 출력이 어떻게 될지 예측해 보세요. 13줄 가운데 0이 출력되는 cycle을 모두 적어 보세요. 되돌아가는 지점이 작을수록 0이 더 자주 출력됩니다.

개념 다시 보기
준비
Main.v