본문으로 건너뛰기
code0.HDL

07구현 문제

clear와 enable이 있는 카운터

1. 요구 동작

clear_enable_counter는 상승 에지에서 동작하는 4비트 카운터입니다. 상태 q는 출력으로 관찰되며, 기능 입력 clear와 enable은 에지에서 샘플링됩니다. 에지 직전 상태를 q[n], 에지 직후 상태를 q[n+1]이라고 하면 전이는 다음과 같습니다.

우선순위에지에서 샘플링한 입력q[n+1]
1clear = 10. enable과 무관합니다
2clear = 0, enable = 1(q[n] + 1) mod 16. 15 다음은 0입니다
3clear = 0, enable = 0q[n] 유지

clear는 이 설계의 동기 기능 입력입니다. 별도의 리셋 포트는 없으며, 시뮬레이션 시작 시 q는 정해지지 않은 값(x)입니다. 초기화 순서는 공개 계약의 일부입니다. 테스트벤치는 처음 두 에지 동안 clear = 1을 유지하고, 그 뒤부터 q는 0에서 시작합니다. 비공개 채점도 같은 순서로 시작합니다.

완성 코드는 주어지지 않습니다. 시작 코드의 always 블록은 q를 그대로 두기만 합니다. 포트와 marker 아래의 공개 테스트벤치는 그대로 두고, 블록 안을 설계하세요.

참고. BSV 트랙의 intro-counter 문제는 5에서 멈추는 다른 계약입니다. 이 문제는 멈추지 않고 16을 주기로 계속 셉니다.

2. 공개 테스트벤치 읽기

입력은 하강 에지에서 바뀌므로 상승 에지는 안정된 값을 샘플링합니다. 출력은 상승 에지보다 #1 늦게 실행되므로 각 줄의 q는 그 에지가 만든 값, 곧 q[n+1]입니다. 테스트벤치 장의 counter-trace 예제에서 AFTER 줄에 해당하는 관점입니다.

cycle사건
0, 1clear = 1. 초기화
2clear = 0, enable = 1. 세기 시작
6enable = 0. 유지
8enable = 1. 다시 세기
10clear = 1. 0으로
11clear = 0. 다시 세기

수정하기 전에 cycle 0부터 13까지 q를 적어 보세요. cycle 6의 상승 에지에 앞선 하강 에지에서 enable = 0이 되므로, cycle 6 줄부터 유지된 값이 보입니다.

3. 완료 조건

  • 초기화 뒤 enable = 1이면 0, 1, …, 15, 0, 1로 계속 셉니다. 16이 되지 않습니다.
  • enable = 0이면 몇 사이클이 지나도 값이 변하지 않습니다.
  • clear = 1이면 enable 값과 무관하게 다음 에지에서 0이 되고, clear가 1인 동안 0에 머뭅니다. clear를 내리면 0부터 다시 셉니다.
  • clear가 여러 번 반복되거나 세는 도중에 들어와도 같은 규칙이 유지됩니다.

4. 단계형 힌트

힌트 1

세 경우를 if, else if, else로 나열하면 우선순위가 그대로 코드가 됩니다. 첫 조건이 가장 우선합니다.

힌트 2

q는 4비트이므로 15에 1을 더하면 자연스럽게 0이 됩니다. 비교문을 추가할 필요가 없습니다. 레지스터 갱신은 nonblocking 대입 <=로 씁니다.

힌트 3

유지 경우는 q <= q;로 쓰거나 아예 적지 않아도 됩니다. 클록 에지 블록에서 대입하지 않은 레지스터는 값을 유지합니다. 조합 블록의 래치와 다른 경우입니다.

5. 추가 실험

통과한 뒤 두 가지 변형을 만들어 보세요. 먼저 무엇을 바꿔야 하는지 적고 나서 고칩니다.

  • 3비트 또는 5비트 카운터. 포트 폭과 wrap 지점이 어떻게 달라집니까.
  • 12에서 멈추고 clear로만 다시 시작하는 카운터. 유지 조건이 하나 더 필요합니다.

변형은 공개 테스트벤치로만 확인하고, 제출은 원래 계약으로 되돌린 뒤에 하세요.

개념 다시 보기
준비
Main.v