

在 1970s 至 1980s,像 Zilog Z80 和 Intel MCS-51(8051) 这样的 8 位处理器广泛用于家用电脑、嵌入式设备和各种单片机系统。

它们设计简单、指令清晰、学习曲线浅,是许多人的入门 CPU。

而现在,随着 FPGA 的普及,我们可以在 FPGA 内核中重新实现这些经典 CPU,并构建真实可运行的单板计算机。

这个项目正是这样的一个尝试:
在一块 Intel MAX 10 FPGA 开发板上实现 Z80 或 8051 单板计算机(SBC),让它能运行原始汇编程序、驱动外围设备、显示输出并与用户交互。
主板采用的是 Intel MAX 10 FPGA:


开发者选用这块板子的原因是:
✔ 成本低
✔ 易于学习 FPGA
✔ 有足够的资源用于模拟 8 位 CPU
✔ 支持丰富引脚扩展

项目实现了两套单板计算机系统:
🧠 1️⃣ Z80 单板电脑
典型架构包括:
整个 CPU 子系统在 FPGA 内部运行,执行传统汇编指令,像真实的 Z80 一样工作。

🕹️ 2️⃣ MCS-51 (8051) 单板电脑
类似地,这部分实现包括:
8051 是最经典的单片机之一,也是微控制器课程教学中的主力架构之一。


对于运行 Microsoft BASIC 4.7b 版本的最小 Z80 单板计算机,需要 8kB 的 ROM 空间和 4kB 的 RAM 空间。此外,还有大量的逻辑元件和存储位可用,这有利于未来的扩展。
SBC 系统使用 Quartus II 18.1 版本编译和测试。只需打开 Quartus II 并恢复归档文件即可。
项目文件夹还包含 SRAM 目标文件 (SOF) 和可编程目标文件 (POF),无需编译即可使用。
将 Micro USB 数据线连接到 MAX10 开发板,并写入 SOF 或 POF 文件。SOF 文件在断电重启后会丢失。POF 文件会存储在 FLASH 闪存中,每次上电后都会被激活。
下面这段 BASIC 代码只是在 Z80 SBC I/O 端口上从 0 计数到 255。
05 REM COUNT 0 To 255 on PORT 145 (Z80)
10 FOR I = 0 TO 255
20 PRINT I,
30 OUT 145, 255-I
35 FOR J = 0 TO 99 : NEXT J
40 NEXT I
45 FOR K = 0 TO 4095 : NEXT K
46 OUT 145,255
50 END
以下代码使用 Microsoft BASIC 4.7b 版本,在 Z80 上实现 ASCIIART 功能,并采用循环方式运行。要退出循环,请按 Ctrl+C。
10 FOR Y=-12 TO 12
20 FOR X=-39 TO 39
30 CA=X*0.0458
40 CB=Y*0.08333
50 A=CA
60 B=CB
70 FOR I=0 TO 15
80 T=A*A-B*B+CA
90 B=2*A*B+CB
100 A=T
110 IF (A*A+B*B)>4 THEN GOTO 200
120 NEXT I
130 PRINT " ";
140 GOTO 210
200 IF I>9 THEN I=I+7
205 PRINT CHR$(48+I);
210 NEXT X
220 PRINT
230 NEXT Y
240 PRINT
250 GOTO 10
有两个项目镜像可供直接使用。英特尔最初将 BASIC-52 Ver 1.1 发布到公共领域。但该代码包含大量漏洞和隐藏的恶意信息。
最后一个版本是 BASIC-52 Ver 1.31,由 Hans-Jürgen Böhling 于 2001 年 2 月发布。Hans-Jürgen Böhling 还发布了 I2C 支持的扩展代码。
8kB ROM 和 32kB RAM,频率 50 MHz:
此镜像仅包含 8kB 代码内存,不支持任何 I2C 扩展。系统包含 32kB RAM 用于用户程序。系统时钟频率为 50MHz,由 MAX10 内部锁相环 (PLL) 从 12MHz 频率转换而来。
16kB ROM 和 16kB RAM,频率为 11.059200 MHz:
此镜像包含 16kB 代码内存,支持 I2C 扩展。系统包含 16kB RAM 用于用户程序。系统时钟频率为 11.059200 MHz。即使在 11.059200 MHz 的频率下,该系统的性能也比传统的 12T 内核快 10 倍。I2C 功能在 11.059200 MHz 的系统时钟频率下运行良好。
以下程序使用 BASIC-52 语言,在 PORT1 端口上将一个 LED 从最低有效位 (LSB) 移到最高有效位 (MSB),并重复执行。PORT1 端口映射到 8 个 LED。
01 REM 8 LED SHIFT
02 REM SHIFT LEFT AND RIGHT
10 LED = 1
20 IF LED <= 80H THEN PORT1 = 0FFH.XOR.LED ELSE GOTO 1000
30 LED = LED * 2
40 FOR J = 0 TO 999 : NEXT J
50 GOTO 20
900 REM RIGHT SHIFT
1000 LED = 080H
1100 IF LED >= 1 THEN PORT1 = 0FFH.XOR.LED ELSE GOTO 10
1120 LED = LED/2
1130 FOR J = 0 TO 999 : NEXT J
1200 GOTO 1100
以下程序是使用 BASIC-52 编写的 ASCIIART 程序。
01 REM ASCII ART SOFT CPU
02 REM ASCII ART FOR MAX10
03 XTAL=50000000
05 TIME=0 : CLOCK 1
10 FOR Y=-12 TO 12
20 FOR X=-39 TO 39
30 CA=X*0.0458
40 CB=Y*0.08333
50 A=CA
60 B=CB
70 I=0
80 T=A*A-B*B+CA
90 B=2*A*B+CB
100 A=T
110 IF (A*A+B*B)>4 THEN GOTO 150
120 I=I+1 : IF I<=15 THEN GOTO 80
130 PRINT " ",
140 GOTO 170
150 IF I>9 THEN I=I+7
160 PRINT CHR(48+I),
170 NEXT X
180 PRINT
190 NEXT Y
200 PRINT TIME
210 GOTO 10
220 END
我们可以注意到上面列出的 Z80 BASIC 和 BASIC-52 之间只有非常细微的差别。如果单板计算机运行在 11.059200 MHz 频率,则需要注释掉第 3 行。上述程序适用于 50 MHz 系统。
否则,我们可以在命令提示符中声明系统频率。
XTAL = 50000000
上述ASCIIART代码计算程序运行所需的时间(以秒为单位)。因此,为了精确计算时间,我们需要设置系统时钟频率。
我们还可以根据需要实现其他功能以及 ROM、RAM 组合。
https://github.com/mit41301/10M08SAM153C8G_Zilog-Z80_Intel-8051
https://www.hackster.io/mit41301/z80-and-mcs-51-sbc-on-a-max-10-fpga-742a9c
🧠 结语
这个项目展示了一个非常有趣且实用的方向:
用 FPGA 重建经典单板计算机,让你从软核 CPU 到外设设计全面理解嵌入式系统。
对于:
✔ FPGA 初学者
✔ 想理解 CPU / 单片机架构
✔ 喜欢复古计算与硬件实现
✔ 想做软硬件协同系统实验
这个项目都有很强的启发意义。