본문으로 건너뛰기
code0.HDL

09구현 문제

레벨 신호를 한 사이클 펄스로 바꾸기

1. 요구 동작

rise_pulse는 1비트 입력 level을 관찰하고 레지스터 출력 pulse를 구동합니다. 상승 에지마다 이번에 샘플링한 level과 직전 에지에서 샘플링한 level을 비교합니다.

직전 샘플이번 샘플다음 한 클록 주기 동안의 pulse
011
그 밖의 경우0

따라서 여러 사이클 동안 1로 유지되는 level은 펄스를 하나만 만듭니다. 리셋은 active-high 동기 리셋이며 pulse를 0으로 만들고, 기억한 직전 level도 0으로 만듭니다.

2. 현재 증상

시작 코드는 컴파일되고 실행되며 파형도 기록합니다. 그러나 pulse는 level을 그대로 복사합니다. 공개 출력에서 level이 1인 모든 줄의 pulse가 1이므로, 사이클 1부터 3까지 이어진 1 구간에서는 한 사이클 펄스 대신 세 사이클 동안 연속으로 1이 출력됩니다.

TODO 아래 줄만 고쳐 pulse가 level의 상승 변화만 표시하게 하세요. prev, 리셋 분기, 포트, 공개 테스트벤치는 그대로 둡니다.

3. starter와 출력 읽기

상승 에지 직전의 prev에는 직전 상승 에지에서 샘플링한 level이 들어 있습니다. nonblocking 갱신이 끝나면 이번 에지에서 샘플링한 값으로 바뀝니다. 테스트벤치는 하강 에지에서 level을 바꾸고 다음 하강 에지에서 출력합니다. 따라서 각 줄은 상승 에지가 샘플링한 level과 같은 에지가 만든 pulse를 보여 줍니다.

수정하기 전에 열두 사이클의 기대 pulse 열을 적어 보세요. 그다음 출력 아래의 파형에서 tb.dut.prev를 찾으세요. 각 상승 에지 직전의 level, prev와 에지 직후의 pulse를 비교하세요. 에지 직전 두 값이 각각 1과 0이면 그 에지에서 펄스가 시작됩니다. 갱신 뒤에는 prev도 1이지만 pulse는 다음 상승 에지까지 1을 유지합니다.

4. 수정과 파형 확인

TODO 아래 우변만 바꾸고 다시 실행해 출력 열을 예측과 비교하세요. 텍스트만이 아니라 파형에서도 다음을 확인합니다.

확인 항목기대
펄스 폭상승 에지에서 다음 상승 에지까지 정확히 한 클록 주기
변화 시점level이 바뀌어도 상승 에지 사이에서는 pulse가 바뀌지 않습니다
하강 변화level이 내려가도 새 펄스는 시작되지 않습니다. 이미 시작된 펄스는 다음 클록 상승 에지까지 유지됩니다

마지막으로 파형 장의 조합 경로와 레지스터 경로 비교를 근거로, pulse가 level의 상승보다 최대 한 사이클 늦게 나타나는 이유를 한 문장으로 설명해 보세요.

5. 완료 조건

  • 교대로 바뀌는 값과 긴 1 구간을 포함해, 상승 에지에서 샘플링한 level이 0→1로 바뀔 때마다 pulse가 정확히 한 사이클 동안 1이 됩니다.
  • pulse는 레지스터 출력이며 상승 에지에서만 바뀝니다.
  • 리셋 뒤에는 직전 값을 0으로 간주하므로, 리셋 후 첫 에지에서 이미 1인 level은 펄스 하나를 만듭니다. 상승 에지에서 리셋이 1이면 pulse는 0이 됩니다. 에지 사이에서 리셋만 올려도 즉시 0이 되는 것은 아닙니다.

6. 단계형 힌트

힌트 1

상승은 샘플 하나의 성질이 아니라 두 샘플 사이의 관계입니다. 설계는 이미 두 샘플을 모두 보관하고 있지만, 출력이 그 가운데 하나를 사용하지 않습니다.

힌트 2

상승을 검출하는 에지에서 이번 샘플은 1이고 기억한 샘플은 0입니다. 두 값을 담은 이름으로 이 조건을 써 보세요.

힌트 3

nonblocking 대입이 중요합니다. prev는 바로 위 줄에서 대입되지만, 이 블록 안에서 pulse를 계산하는 줄은 여전히 직전 사이클의 prev를 읽습니다.

7. 추가 실험

리셋 분기를 포함해 클록 블록의 모든 pulse 대입을 제거하고, 별도의 always @* 블록에서 같은 두 이름으로 pulse를 계산해 보세요. pulse는 이 블록 하나에서만 구동하고, prev는 클록 블록에서 계속 갱신합니다. 먼저 출력 열을 예측합니다. 테스트벤치는 prev가 따라잡은 뒤인 하강 에지에서 샘플링하므로 모든 줄이 0으로 출력될 수 있습니다. 그다음 파형에서 텍스트가 놓친 펄스를 찾아보세요. 그 펄스는 하강 에지에서 시작해 상승 에지에서 끝납니다. 출력이 한 사이클 내내 안정해야 할 때 어느 관찰 결과를 신뢰해야 할지, 그리고 하강 변화를 검출하려면 조건을 어떻게 바꿔야 할지 설명해 보세요.

개념 다시 보기
준비
Main.v