본문으로 건너뛰기
code0.HDL

12구현 문제

점검 과제 B: clear와 enable이 있는 카운터

1. 요구 동작

ClearEnableCounter는 4비트 카운트 q를 보관합니다. 상승 에지마다 두 제어 입력에 따라 다음 값을 정합니다.

clearenable에지 뒤의 q
1무관0
01q + 1, 15 다음에는 0
00유지

q는 모듈의 암묵적 동기 reset 뒤에 0입니다. clear는 이것과 다른 신호입니다. clear는 설계 기능의 일부인 일반 입력으로, 1이면 다음 에지에서 카운트를 0으로 만듭니다. reset은 모듈 전체를 시작 상태로 되돌리고, clear는 주변 논리가 정상 동작 중에 카운트를 다시 시작할 때 사용합니다. 따라서 clear는 reset이 0인 동안에도 동작해야 합니다.

이 계약은 이 장의 다른 문제들과 다릅니다. EdgeCounter는 이벤트를 세고 reset으로만 0이 되었고, ErrorMonitor의 플래그도 reset만 지웠습니다. 여기서는 기능 입력이 레지스터를 0으로 만들고, 그 입력이 카운트보다 우선합니다.

2. 시작 코드의 상태

시작 코드는 레지스터를 선언하고 q 포트에 연결하지만 다음 값을 정하지 않습니다. 따라서 공개 실행의 모든 줄에서 q는 0입니다.

업데이트를 작성하세요. 레지스터 선언 val q = RegInit(0.U(4.W))와 연결 io.q := q는 그대로 두고, 그 사이의 TODO 줄에 다음 값을 정하는 코드를 넣습니다. 포트와 Main은 바꾸지 않습니다.

3. 시작 코드 읽기

RegInit(0.U(4.W))는 계약의 두 부분, 리셋 값과 폭을 이미 정합니다. 4비트 레지스터는 16을 담을 수 없고 대입한 합의 하위 4비트만 저장하므로, 15 다음에는 0으로 돌아갑니다. 표의 세 행은 서로 배타적인 세 경우이며 우선순위가 고정되어 있습니다.

4. 실행 전 예측

공개 실행은 enable을 네 사이클 동안 1로 두고, 두 사이클 동안 유지하고, 한 사이클 동안 clear와 enable을 함께 1로 두고, 다시 두 사이클 동안 셉니다. 각 줄은 그 사이클의 에지 이전 입력과 q를 출력합니다. 시작 코드의 q 열과 올바른 설계의 q 열을 적어 보세요. 올바른 열은 0 1 2 3 4 4 4 0 1이고 마지막 줄은 q=2입니다.

5. 수정과 설명

Learn 장이 RegInit에 쓰는 조건부 연결로 세 경우를 우선순위 순서대로 적습니다. 먼저 해당하는 경우가 이기고, 어느 경우에도 연결되지 않은 레지스터는 값을 유지합니다. 실행해 예측과 비교하고, 두 입력이 모두 1일 때 clear 행이 이기게 하는 줄을 가리켜 보세요.

6. 완료 조건

  • reset이 0인 동안 0에서 시작한 enable 사이클 20번이 15를 지나 0부터 다시 이어지며, 16은 나타나지 않습니다.
  • clear가 1이면 enable 값과 현재 q 값에 관계없이 다음 에지에서 0이 됩니다.
  • reset과 clear가 0이고 enable도 0이면 그 상태가 이어지는 사이클 수만큼 q가 그대로 유지됩니다.
  • reset이 1인 동안에는 enable이 1이어도 모든 에지에서 q가 0입니다.
  • 공개 입력 순서뿐 아니라 clear와 enable의 임의의 조합 순서가 표를 따릅니다.

7. 단계형 힌트

힌트 1

표에는 세 행과 우선순위가 있습니다. 첫 행은 enable 값과 무관하게 적용됩니다. 순차 회로 장은 조건 안에서 :=로 RegInit 레지스터를 갱신합니다. 어느 조건도 레지스터에 연결하지 않는 사이클에 그 레지스터는 어떻게 될까요?

힌트 2

.otherwise가 없는 when과 .elsewhen 연쇄는 "처음 맞는 행이 이기고, 아니면 유지"를 그대로 표현합니다. clear 행을 맨 앞에 두세요.

힌트 3

+로 1.U를 더하면 레지스터의 폭이 유지되므로 15 + 1은 비교 없이 0이 됩니다. Learn 장의 wrapCounter는 최댓값이 2의 거듭제곱에서 1을 뺀 값이 아닐 수도 있으므로 명시적 비교가 필요합니다. 두 경우를 비교해 보세요.

8. 추가 실험

레지스터를 3비트로 바꾸면 공개 입력 순서에서 처음으로 0으로 순환하는 시점에 도달할지 예측해 보세요. 0에서 clear를 0으로 유지할 때 활성 에지가 몇 번 이어져야 그 시점에 도달할까요? 이어서 5비트로 바꾸면 io.q가 카운트의 어느 비트를 보여 주는지, 공개 입력 순서로 절단이 드러나는지 설명해 보세요. 마지막으로 clear의 우선순위를 낮추면 공개 출력에서 바뀌는 줄을 모두 찾아보세요.

개념 다시 보기
준비

CheerpJ로 브라우저에서 실행합니다. 첫 실행에는 Java 약 14.5 MB와 JAR 약 47 MB를 내려받습니다. 컴파일에 1분 정도 걸릴 수 있습니다. 라이선스

Main.scala