본문으로 건너뛰기
code0.HDL

03구현 문제

네 가지 연산 가운데 하나 고르기

1. 요구 동작

select_op는 클록이 없는 조합 블록입니다. 2비트 입력 sel이 고른 연산을 4비트 입력 a와 b에 적용한 결과가 4비트 출력 y에 나타납니다. 입력이 바뀌면 y는 에지를 기다리지 않고 바로 따라 바뀌어야 합니다.

sely
0a & b
1a | b
2a ^ b
3~(a | b)

연산은 비트마다 독립적으로 적용됩니다. a = 1100, b = 1010, sel = 2이면 y = 0110입니다. 네 선택값 모두 정의되어야 합니다. 완성 코드는 주어지지 않습니다. 시작 코드에는 포트 선언과 모든 경우에 y를 0으로 두는 case 뼈대만 있고, 그 뼈대를 네 연산으로 채우는 것이 과제입니다. 포트와 marker 아래의 공개 테스트벤치는 그대로 둡니다.

2. 공개 테스트벤치 읽기

테스트벤치는 a = 1100, b = 1010으로 sel을 0부터 3까지 바꾸며 네 줄을 출력하고, 이어서 a = b = 0101로 다시 네 줄을 출력합니다. 클록은 없습니다. 입력을 바꾸고 #1 뒤에 y를 출력하므로 각 줄은 그 입력에 대한 조합 출력입니다.

수정하기 전에 여덟 줄의 y를 표의 규칙으로 직접 적어 보세요. 같은 입력 0101, 0101에서 XOR은 0000, NOR는 1010입니다.

3. 완료 조건

  • sel, a, b의 1,024가지 조합 전부에서 y가 표와 같습니다.
  • 어느 조합에서 다른 조합으로 넘어가도 y는 새 입력만으로 정해집니다. 직전 조합의 값을 유지하는 저장 소자가 있으면 조건을 만족하지 못합니다.
  • a와 b를 고정한 채 sel만 바꾸면 해당 연산이 선택됩니다. 입력에 따라 서로 다른 연산의 y가 같을 수도 있습니다.

4. 단계형 힌트

힌트 1

always @* 블록 안에서는 sel의 값에 따라 분기합니다. 분기문 하나가 네 경우를 모두 나열할 수 있습니다. 기본 문법 장의 절차 대입 절을 보세요.

힌트 2

네 경우 가운데 하나라도 y에 값을 주지 않으면 그 경우에 y는 직전 값을 유지하는 래치가 됩니다. 모든 경우에서 y에 대입하거나, 마지막 경우를 default로 두세요.

힌트 3

NOR는 OR의 반전입니다. ~는 비트마다 반전하므로 ~(a | b)처럼 괄호로 묶어야 OR의 결과가 반전됩니다.

5. 추가 실험

always @* 블록 대신 assign과 조건 연산자 ? :로 같은 동작을 써 보세요. output reg를 output으로 바꿔야 합니다. 채점은 동작만 비교하므로 두 형태 모두 통과합니다. 폭을 8비트로 바꾼 변형을 만들면 어디를 고쳐야 하는지 먼저 적어 본 뒤 공개 테스트벤치의 출력이 어떻게 달라질지 예측해 보세요.

개념 다시 보기
준비
Main.v