본문으로 건너뛰기
code0.HDL

01구현 문제

바이트의 두 nibble 교환하기

1. 요구 동작

nibble_swap은 8비트 입력 value의 상위 4비트와 하위 4비트를 맞바꿔 swapped로 출력합니다. 입력 비트 [7:4]는 출력 [3:0]으로, 입력 비트 [3:0]은 출력 [7:4]로 이동합니다. 입력이 8'hA5이면 출력은 8'h5A입니다.

시작 코드의 assign은 value를 그대로 복사합니다. 그래서 공개 테스트벤치가 출력하는 세 줄 모두 value와 swapped의 16진 값이 같습니다. 포트 이름과 폭, marker 아래의 공개 테스트벤치는 바꾸지 말고 TODO 아래 assign의 우변만 고치세요.

2. 실행 전 예측

[7:0]으로 선언한 벡터는 왼쪽 비트가 7번, 오른쪽 비트가 0번입니다. 8비트 값의 16진 숫자 하나는 정확히 4비트를 나타냅니다. 따라서 nibble 교환은 16진 표기에서 두 숫자의 순서를 바꾸는 것과 같습니다.

수정하기 전에 8'hA5, 8'h0F, 8'h3C에 대한 swapped 값을 적어 보세요. 시작 코드를 실행한 뒤, 바뀌지 않은 swapped 값과 예측한 출력을 비교하세요.

3. 수정과 확인

고칠 줄은 TODO 아래의 assign 하나입니다. value의 두 절반으로 우변을 다시 구성하세요. 필요한 연산자는 기본 문법 장의 vectors 예제에 모두 나옵니다. 다시 실행하면 모든 swapped 값이 value의 16진 숫자 두 개를 반대 순서로 보여 줍니다. 수정한 뒤에는 이 회로에 논리 게이트가 하나도 추가되지 않고 같은 wire 여덟 개의 연결만 바뀌는 이유를 설명해 보세요.

4. 완료 조건

  • 출력에 보이는 세 값뿐 아니라 가능한 입력 256개 모두에서 두 nibble이 교환됩니다.
  • 출력의 상위 nibble은 입력의 하위 nibble에만, 출력의 하위 nibble은 입력의 상위 nibble에만 의존합니다. 사라지거나 중복되는 비트는 없습니다.
  • 모듈은 같은 포트를 유지하는 조합 회로로 남습니다.

5. 단계형 힌트

힌트 1

shift 연산은 비트를 한쪽으로 옮기고 반대쪽을 0으로 채웁니다. shift 하나만으로는 두 nibble 가운데 하나만 남습니다.

힌트 2

value[7:4]처럼 벡터 이름 뒤에 범위를 쓰면 해당 비트만 4비트 값으로 선택됩니다. 먼저 두 nibble을 이 방식으로 표현해 보세요.

힌트 3

중괄호는 작은 벡터 여러 개를 하나의 넓은 벡터로 이어 붙입니다. 처음 쓴 항목이 최상위 비트가 됩니다. 4비트 두 개를 이어 붙이면 정확히 8비트가 됩니다.

6. 추가 실험

8'h12와 8'hFF의 결과를 먼저 예측해 보세요. 그리고 16비트 벡터의 두 바이트를 교환하려면 어떤 범위를 이어 붙여야 하는지 적어 보세요. 중괄호 안의 순서가 어느 바이트를 상위에 놓을지 결정합니다.

개념 다시 보기
준비
Main.v