为科学计算器构建面向半字节(Nibble-Oriented)的 CPU
追求重现经典的科学计算器体验,促使硬件设计与计算机体系结构产生了一个迷人的交汇点。当目标是构建一个高精度十进制计算器时,传统 CPU(如 Z80 或 6502)的标准面向字节(byte-oriented)架构往往会成为阻碍而非助力。
这个由 gdevic 开发的项目,探索了回归硬件底层以创建一个专门为十进制计算优化的 CPU 的想法。通过使用 Verilog 设计自定义 CPU,该项目展示了将硬件架构与数据表示(特别是二进制编码十进制,即 BCD)对齐,是实现在自定义芯片上进行高精度科学计算的最有效方式。
架构选择:为什么选择半字节(Nibbles)?
该项目的核心在于决定使 CPU “面向半字节”。在标准计算机中,字节(8 位)是最小的可寻址内存单位。然而,对于一个将数字存储为 BCD 的科学计算器来说,每个十进制数字都由一个 4 位半字节(nibble)表示。
如果使用标准的 8 位 CPU,处理器必须不断执行位移和掩码操作来隔离单个数字。通过将 4 位半字节作为自然的数据宽度,并确保内存是半字节可寻址的,设计者消除了这种开销。硬件被构建为以十进制数字进行“思考”,使得 BCD 算术的实现变得更加流线化。
自定义 CPU 的技术规格
该系统基于哈佛架构(Harvard architecture),将指令存储器与数据存储器分离,从而允许更高效地同时进行指令获取和数据获取。关键技术组件包括:
- 12-bit ISA: 为计算器的特定需求设计的自定义指令集架构。
- 8-state Execution FSM: 一个处理指令执行周期的有限状态机。
- Hardware Stack Guard: 一个专门用于防止栈溢出的机制,具有专门用于微代码调试的
FAULT状态。 - CORDIC Algorithm: 为了处理三角函数,该项目利用了
CORDIC(坐标旋转数字计算机)算法,经验证精度可达 14 位有效数字。 - Custom PCB: 最终的硬件实现包括一个使用
EasyEDA/JLCPCB设计的自定义PCB,配备完整的电池和充电电路。
软件栈与工具链
硬件只占方程式的一半。为了让 CPU 像计算器一样工作,该项目包含了一套完整的软件和软件仿真工具链:
Two-pass Assembler: 用
Python编写(约 700 行),该汇编器将自定义ISA转换为机器码。Verilator + Qt Framework: 这允许相同的
Verilog源代码在多种环境中运行:作为仿真、作为桌面GUI调试器、作为WebAssembly,以及在实际的FPGA硬件上。Microcode Scripting: 在微代码之上实现了一种脚本语言,允许在不改变硬件逻辑的情况下为计算器添加新功能。
遗产与影响
该项目是对经典科学计算器时代(特别是 HP 计算器)的致敬。正如一位评论者所指出的,70 年代和 80 年代的传奇 HP 计算器以其坚固的构造和对逆波兰表示法(RPN)的使用而闻名,这消除了复杂表达式中对括号的需求。
"对于拥有
HP计算器的人来说,最好的地方在于其坚固的物理构造……精度,以及当你问你的同学是否知道RPN时,他们听到后会惊恐地退缩。"
通过重现这些早期科学机器的逻辑,该项目弥合了现代 FPGA 设计与定义了个人计算早期时代的经典架构决策之间的鸿沟。