처음부터 과학 계산기 만들기: FPGA 여정
과학 계산기의 제작은 스마트폰이 보편화되고 강력한 마이크로컨트롤러가 넘쳐나는 시대에 이미 해결된 문제로 여겨지는 경우가 많습니다. 그러나 하드웨어 애호가에게는 장치의 유용성보다 구현의 아키텍처 순수성이 도전 과제입니다. zdw가 문서화한 한 프로젝트는 이 도전을 극단으로 밀어붙이며, 필드 프로그래머블 게이트 어레이(FPGA)를 사용해 처음부터 과학 계산기를 설계합니다.
이 프로젝트는 단순히 부품을 조립하는 것이 아니라, 고전 HP 계산기에 사용된 이진 코드화 십진수(BCD) 아키텍처와 같은 빈티지 컴퓨팅의 정신을 재현하는 것입니다. 표준 부동소수점 유닛을 포기하고 모든 십진수를 4비트 닙블로 표현하는 시스템을 채택함으로써, 프로젝트는 완벽한 십진 정확성을 보장하고 이진 부동소수점 연산에서 흔히 발생하는 변환 오류를 없앱니다.
구현 경로
모든 복잡한 하드웨어 프로젝트는 “경로 탐색” 단계에서 시작됩니다. 저자는 이것이 최종 아키텍처가 확정되기 전에 설계가 프로토타입으로 제작되고 폐기되는, 흔히 문서화되지 않는 시행착오 단계라고 언급합니다. 이 계산기의 경우, 경로 탐색을 통해 tan, ln, exp, sqrt와 같은 복잡한 함수도 적절한 수치 트릭을 적용하면 기본적인 덧셈, 뺄셈, 곱셈만으로 구현할 수 있다는 사실을 깨달았습니다.
하드웨어의 신뢰성을 보장하기 위해 C++로 검증된 레퍼런스 구현을 만들었습니다. 이를 통해 저자는 수천 개의 검증된 벡터로 하드웨어를 테스트하여 최종 장치가 최대 16자리 십진수까지 정확성을 유지하도록 했습니다.
통합 테스트 프레임워크
FPGA 개발에서 가장 큰 난관 중 하나는 아직 물리적으로 존재하지 않는 하드웨어를 테스트하는 것입니다. 이를 해결하기 위해 단일 Verilog 소스를 네 가지 서로 다른 환경에서 실행할 수 있는 포괄적인 프레임워크를 개발했습니다.
- ModelSim: 신호 수준 시뮬레이션에 사용됩니다.
- Verilator: 사이클 정확도 C++ 모델링에 사용됩니다.
- Qt: 디버거 콘솔이 포함된 데스크톱 프로토타입을 제공했습니다.
- WebAssembly: RTL(Register Transfer Level) 코드를 변경하지 않고도 브라우저에서 애플리케이션을 실행할 수 있게 했습니다.
이 다단계 접근 방식은 고수준 소프트웨어 시뮬레이션에서 사이클 정확도 하드웨어 모델링으로 빠르게 전환할 수 있게 해 주었으며, PCB를 한 번도 주문하기 전에 반복 작업을 신속히 진행할 수 있었습니다.
BCD용 맞춤 CPU 설계
범용 CPU는 닙블 주소 지정 메모리나 16자리 BCD 가수와 같은 특정 요구사항을 위해 설계되지 않았기 때문에, 프로젝트는 맞춤형 CPU 설계를 필요로 했습니다. 결과적인 아키텍처는 다음과 같은 특징을 가집니다:
- 12비트 고정 길이 명령어.
- 하버드 메모리 모델.
- 14개의 ALU 연산, 이를 포함하며 Intel 8086에서 영감을 받은 BCD 조정 명령어도 포함됩니다.
이 맞춤형 ISA(Instruction Set Architecture)는 반복적으로 다듬어졌습니다. 마이크로코드를 작성하고 Verilator에서 테스트함으로써 저자는 ISA의 결함을 식별하고 하드웨어 로직을 그에 맞게 조정할 수 있었습니다.
마이크로코드에서 물리적 하드웨어로
CPU 아키텍처가 확정되면 초점은 마이크로코드—CPU 동작을 제어하는 저수준 명령어—로 이동했습니다. 여기에는 숫자 입력, 디스플레이 포맷팅, 연산 기능 구현이 포함되었습니다. 복잡한 연산(예: $y^x$)을 단순화하기 위해 마이크로코드 위에 작은 스크립트 인터프리터를 겹쳐 놓아 복잡한 함수를 몇 줄의 토큰으로 압축할 수 있게 했습니다.
물리적 하드웨어로의 전환은 단계적으로 이루어졌습니다. 처음에는 $5 EP2C5 개발 보드에 리본 케이블을 통해 키패드와 OLED 디스플레이를 연결했습니다. 최종 단계에서는 FPGA가 직접 납땜된 맞춤형 PCB, 3D 프린트 인클로저, 그리고 고전 HP의 노란색-빨간색 키캡 규칙을 따르는 색상 구분 키캡으로 진화했습니다.
정밀도 추구와 최종 고찰
프로젝트 초기 버전은 대략 12자리 정도의 정확도를 달성했지만, 16자리 BCD 기계는 절대적인 정밀도를 요구합니다. 2025년에 연산 엔진을 재작성하면서 다음과 같은 기능을 도입했습니다:
- 가드 디지트와 스티키 비트 추적을 통해 반올림 오류를 방지합니다.
- 은행가 반올림을 적용해 통계적 정확성을 향상시킵니다.
- 전체 삼각함수 모음과 10개의 STO/RCL 메모리 레지스터를 제공합니다.
- **하드웨어 LFSR(Linear Feedback Shift Register)**을 이용한 난수 생성 기능을 포함합니다.
결국 전체 시스템—CPU, 연산 엔진, 주변 장치—은 1,593개의 로직 셀만 차지했으며, 저가형 소형 FPGA의 약 35%만을 사용했습니다. 저자는 키패드의 물리적 촉감이 빈티지 HP 원본과 완전히 일치하지는 않았다고 인정하지만, 이 프로젝트는 논리 게이트에서 수학 원시 연산까지 전 과정을 아우르는 마스터클래스로 평가됩니다.