본문으로 건너뛰기
code0.HDL

12구현 문제

계약에서 세 상태 검출기 설계하기

1. 계약

two_ones는 clock의 상승 에지마다 1비트 입력 din을 샘플링합니다. 리셋 뒤 마지막으로 샘플링한 두 값이 모두 1이면 출력 seen은 1이고, 그렇지 않으면 0입니다. 1이 세 번 이상 이어지면 seen은 계속 1이고, 0이 하나라도 들어오면 0으로 내려갑니다.

seen은 Moore 출력입니다. 상태만 읽으므로 상승 에지에서만 바뀌고, 사이클 중간에 din이 바뀌어도 따라 움직이지 않습니다. 리셋은 active-high 동기 리셋입니다. 리셋 에지 뒤에는 아직 1을 하나도 보지 않은 상태이고 seen은 0입니다.

시작 코드에는 포트와 seen을 0으로 구동하는 임시 코드만 있습니다. 상태 이름, 상태 레지스터, 다음 상태 논리, 출력 논리는 모두 직접 작성합니다. 표시선 아래의 공개 테스트벤치는 수정할 수 없습니다.

2. 코드보다 상태표 먼저

이 기계는 1이 연속으로 몇 번 들어왔는지 기억해야 하며, 두 번까지만 세면 됩니다. 개수마다 상태 하나씩, 예를 들어 ZERO, ONE, TWO라고 이름을 붙이고 상태와 입력 값마다 한 행씩 채워 보세요.

현재 상태din다음 상태현재 상태의 seen
ZERO0??
ZERO1??
ONE0??
ONE1??
TWO0??
TWO1??

완성한 표로 공개 실행의 seen 열을 예측합니다. 패턴은 0110_1110_1011이고, 각 줄은 그 줄의 din을 샘플링한 에지 직후에 출력됩니다.

3. 상태표를 코드로 옮기기

장에서 배운 세 부분을 그대로 따릅니다.

부분작성 방법
상태 레지스터always @(posedge clock) 블록 하나에서만 쓰고, 리셋 분기를 먼저 둡니다
다음 상태 논리always @* 안의 case에 상태마다 분기를 두고 default를 넣습니다
출력 논리상태만 읽습니다

상태가 셋이면 상태 비트는 두 개가 필요합니다. 남는 네 번째 코드는 default가 처리합니다.

4. 실행, 비교, 파형 확인

출력된 seen 열을 예측과 한 줄씩 비교합니다. 파형에서는 din이 사이클 중간에 바뀌는 구간에서도 seen이 상승 에지에서만 바뀌는지 확인하세요.

5. 완료 조건

  • 어떤 입력 패턴에서도 각 상승 에지 직후의 seen은 마지막으로 샘플링한 두 값이 모두 1일 때만 1입니다.
  • din이 어떻게 바뀌어도 상승 에지 사이에서는 seen이 바뀌지 않습니다.
  • 1 구간 중간에 리셋이 들어오면 처음부터 다시 셉니다.
  • 상태 인코딩은 자유입니다. 이진, one-hot, 포화 카운터 모두 계약을 지키면 통과합니다. 채점이 실패하면 리셋 뒤 몇 번째 사이클인지, 에지 전후 어느 시점의 검사인지, 기대값과 실제값을 알려 줍니다.

6. 단계형 힌트

힌트 1

어떤 입력 값이 들어오면 모든 상태가 같은 곳으로 돌아갈까요? 그 세 행부터 채워 보세요.

힌트 2

TWO에서 1이 한 번 더 들어와도 "마지막 두 값이 1"이라는 사실은 그대로입니다. 기계는 어디로 가야 할까요?

힌트 3

din을 샘플링하기 전에 두 번째 1로 사용해 seen을 계산하면 Mealy 출력이 되어 필요한 에지보다 먼저 올라갑니다. 채점 메시지의 "before edge"와 "after edge" 검사를 비교해 보세요.

7. 추가 실험

계약을 "1이 세 번 연속"으로 바꿔 보세요. 상태는 몇 개, 상태 비트는 몇 개가 필요하고, 상태표의 어느 행이 바뀌나요? 실행하기 전에 공개 패턴에 대한 새 출력 열을 먼저 예측합니다.

개념 다시 보기
준비
Main.v