18구현 문제
노란불 상태 추가하기
1. 요구 동작
TrafficLight는 빨강, 초록, 노랑 순서로 순환한 뒤 다시 빨강으로 돌아갑니다. 상태는
tick이 1인 클록 에지에서만 한 단계 이동하고, tick이 0이면 유지됩니다. 리셋 직후
상태는 빨강입니다.
| 출력 | 규칙 |
|---|---|
light | 현재 상태를 Light 값으로 출력합니다. 번호는 선언 순서대로 빨강 0, 초록 1, 노랑 2입니다 |
stop | 빨강과 노랑에서 1, 초록에서만 0입니다 |
시작 코드는 상태를 두 개만 선언합니다. 그래서 초록에서 곧바로 빨강으로 돌아가고,
stop은 빨강일 때만 1이며, Light의 폭은 1비트입니다. 노랑 상태를 추가하고 상태
기계가 노랑을 거치도록 고치세요. TrafficLight라는 이름과 포트는 그대로 둡니다.
2. Starter 읽기
object Light의 값 개수를 세고, Chisel이 Light()에 정하는 폭을 계산해 보세요. 이어서
switch 블록의 각 is 분기가 tick에서 어느 상태로 이동하는지 확인하세요. 마지막으로
stop이 state에서 어떻게 계산되는지 읽어 보세요.
3. 실행 결과 예측
공개 실행은 ENCODING 줄을 출력한 뒤 8사이클을 출력합니다. tick은 짝수 사이클에서만
1입니다. 완성된 설계를 기준으로 다음을 먼저 적어 보세요.
ENCODING줄의 폭과 세 이름이 받는 번호- 사이클 0부터 7까지의 상태. 한 사이클에서 본
tick은 다음 사이클의 상태로 나타납니다 stop이 0인 사이클
먼저 시작 코드를 실행해 초록이 너무 일찍 끝나는 사이클을 표시해 보세요.
4. 수정 범위
노랑 상태는 enum 선언, switch의 전이, stop 조건의 세 곳에 나타납니다. 세 곳 모두
의도한 동작을 직접 표현하도록 고치세요. 상태는 Light 값과만 비교하고 숫자와 비교하지
않습니다.
5. 실행 결과 해석
완성한 설계를 실행해 모든 줄을 예측과 비교하세요. 초록을 끝내는 tick 다음 줄에서
노랑이 처음 나타나는 이유를 설명해 보세요. 포트 선언을 고치지 않았는데도 ENCODING
줄의 폭이 바뀐 이유도 설명해 보세요.
6. 완료 조건
Light는 빨강, 초록, 노랑 순서로 0, 1, 2 번호를 받고 폭은 2비트입니다.tick이 0인 동안에는 몇 사이클이 지나도 상태가 유지됩니다.tick한 번에 정확히 한 단계만 이동합니다. 빨강에서 초록, 초록에서 노랑, 노랑에서 빨강으로 갑니다.stop은 출력된 사이클뿐 아니라 모든 사이클에서 상태와 일치합니다.- 어떤 상태에서든 리셋하면 빨강으로 돌아갑니다.
7. 단계형 힌트
힌트 1
새 상태는 enum의 새 Value입니다. 번호는 선언 위치로 정해지므로 이름을 나열하는 순서가
결과에 영향을 줍니다.
힌트 2
초록은 더 이상 빨강으로 가지 않습니다. 노랑에도 is 분기가 필요합니다. 분기가 없으면
노랑에서 아무 대입도 일어나지 않아 레지스터가 노랑에 계속 머뭅니다.
힌트 3
isOneOf는 값 하나를 같은 enum의 여러 값과 한 번에 비교해 Bool을 반환합니다.
개념 설명
ChiselEnum은 상태마다 이름, 번호, 타입을 함께 부여합니다. 값을 추가하면 그 타입을
쓰는 모든 포트와 레지스터의 폭이 바뀔 수 있고, Chisel이 폭을 다시 계산합니다. 비교는
같은 enum의 값끼리만 허용되므로 번호가 바뀌어도 전이와 stop의 의미는 유지됩니다.
8. 추가 실험
점멸 노랑이라는 네 번째 상태를 마지막에 선언한다고 가정해 보세요. Light의 폭과 기존
세 상태의 번호가 바뀌는지 예측해 보세요. 이어서 같은 상태를 맨 앞에 선언하면 출력되는
번호 중 어느 것이 달라지는지 설명해 보세요.