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이 더 자주 출력됩니다.