본문으로 건너뛰기
code0.HDL

01구현 문제

생성기 루프로 상수 곱셈기 만들기

1. 요구 동작

Scalers는 8비트 입력 in에서 8비트 출력 두 개를 만듭니다. x10은 in * 10을, x7은 in * 7을 256으로 나눈 나머지입니다.

두 출력은 Scala method scale(in, factor) 하나에서 나옵니다. scale은 곱셈 연산자 없이 덧셈기만으로 곱을 구성합니다.

이름종류의미
factor, bitScala Intelaboration 중에 값이 정해집니다
term8비트 하드웨어 노드in * 2^bit를 256으로 나눈 나머지. in에서 시작해 반복마다 두 배가 됩니다
total하드웨어 노드지금까지 더한 합

factor에서 1인 비트마다 그 비트의 term을 total에 더합니다. 10은 2진수로 1010이므로 비트 1과 비트 3의 term, 곧 in*2 + in*8을 더합니다.

2. 관찰되는 증상

시작 코드는 컴파일되고 실행도 되지만 루프가 total에 아무것도 더하지 않습니다. 그래서 모든 입력에서 두 출력이 0입니다.

루프 안의 TODO 줄을 바꿔, factor가 0부터 255 사이의 어느 값이든 올바른 덧셈기를 만들게 하세요. 포트, term을 두 배로 만드는 줄, scale 호출 두 개는 그대로 둡니다.

3. 실행 전 예측

scale은 회로를 만드는 동안 호출마다 한 번 실행되는 Scala 코드입니다. 시뮬레이션 중에 반복하는 하드웨어가 아닙니다. factor와 bit의 값은 elaboration 중에 알 수 있습니다. in, term, total은 하드웨어 노드를 가리키며, 그 신호 값은 시뮬레이션이나 실제 회로 동작 중에 바뀔 수 있습니다.

실행하기 전에 다음을 적어 보세요.

  • ELABORATE 줄의 개수, 그리고 그 줄이 SIMULATE 줄 사이에 끼는지 여부
  • 입력 3일 때 x10과 x7
  • 입력 30일 때 결과가 8비트로 잘린 뒤의 x10과 x7

그다음 시작 코드를 실행해 SIMULATE 줄을 예측과 비교해 보세요.

4. 덧셈기를 만드는 조건

term을 더할지는 factor만으로 정해집니다. factor는 시뮬레이션 전에 고정되는 Scala 값이므로 Scala if로 판단할 수 있습니다. Scala if는 mux를 만들지 않고, 생성할 하드웨어를 고릅니다.

Scala Int의 비트 하나를 검사하는 일은 평범한 정수 연산입니다. 비트가 1이면 total이 이전 total과 현재 term을 더하는 새 덧셈기 노드를 가리키게 하세요. 비트가 0이면 아무것도 생성하지 않습니다.

주의. 비트 bit를 판단할 때는 두 배로 만드는 줄이 실행되기 전의 term을 써야 합니다.

5. 완료 조건

  • 공개 실행이 넣는 다섯 값뿐 아니라 모든 8비트 입력에서 x10은 in * 10을, x7은 in * 7을 256으로 나눈 나머지와 같습니다.
  • 두 출력은 계속 같은 scale method에서 나옵니다. 한 factor에서만 맞는 수정은 완료가 아닙니다.
  • ELABORATE 줄은 호출마다 정확히 한 번, 모든 SIMULATE 줄보다 먼저 출력됩니다.

6. 힌트

힌트 1

덧셈기의 존재 여부를 정하는 값이 회로를 만드는 동안 알려진 값인지, 시뮬레이션 중에 wire가 전달하는 값인지 구분해 보세요. Scala if의 조건에는 앞의 값만 쓸 수 있습니다.

힌트 2

Scala 정수 연산으로 factor를 bit만큼 오른쪽으로 shift한 뒤 가장 낮은 비트를 검사하세요. if 본문에서는 이 장의 Doubler가 x를 다시 대입하는 방식대로 var total을 다시 대입합니다.

개념 설명

생성기는 Scala 값으로 회로의 모양을 정합니다. 같은 scale 코드에서 factor 10은 term 두 개를, factor 7은 term 세 개를 더하는 서로 다른 덧셈기 회로가 나옵니다. elaboration이 끝난 하드웨어에는 if가 남지 않고, if가 고른 덧셈기만 남습니다.

7. 추가 실험

scale(io.in, 255)로 구동하는 세 번째 출력 x255를 추가해 보세요. 이 factor에서 루프가 더하는 term의 개수와 입력 1, 2일 때의 출력을 예측한 뒤, in * 255를 256으로 나눈 나머지와 비교해 보세요.

개념 다시 보기
준비

CheerpJ로 브라우저에서 실행합니다. 첫 실행에는 Java 약 14.5 MB와 JAR 약 47 MB를 내려받습니다. 컴파일에 1분 정도 걸릴 수 있습니다. 라이선스

Main.scala