基于Intel MAX 10 FPGA实现Z80与8051单板计算机

科创闲谈 2026-03-20 趣味人生 52820

以下文章来源于OpenFPGA,作者碎碎思

项目背景

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

919e0f54-232e-11f1-90a1-92fbcf53809c.png

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

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

92596510-232e-11f1-90a1-92fbcf53809c.png

这个项目正是这样的一个尝试:

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

项目使用的硬件平台

主板采用的是 Intel MAX 10 FPGA:

是一款基于 Intel 14nm 工艺的低功耗 FPGA

IDE 支持 Quartus Prime

支持配置 Flash、SD 卡、GPIO 等外设

9313347c-232e-11f1-90a1-92fbcf53809c.png

开发者选用这块板子的原因是:

成本低

易于学习 FPGA

有足够的资源用于模拟 8 位 CPU

支持丰富引脚扩展

93720bb4-232e-11f1-90a1-92fbcf53809c.png

SBC 核心架构

项目实现了两套单板计算机系统:

Z80 单板电脑

典型架构包括:

Zilog Z80 CPU 软核

内存(RAM / ROM

串口 UART

视频输出控制器

键盘输入模块

整个 CPU 子系统在 FPGA 内部运行,执行传统汇编指令,像真实的 Z80 一样工作。

93cdf0e6-232e-11f1-90a1-92fbcf53809c.png

MCS-51 (8051) 单板电脑

类似地,这部分实现包括:

8051 CPU 软核

程序 ROM

I/O 模块

串口 / UART

计时器和控制逻辑

8051 是最经典的单片机之一,也是微控制器课程教学中的主力架构之一。

942c998e-232e-11f1-90a1-92fbcf53809c.png

9489a340-232e-11f1-90a1-92fbcf53809c.png

Zilog Z80 SBC 基于 MAX10 FPGA

对于运行 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

基于 MAX10 FPGA 的 Intel MCS-51 单板计算机

有两个项目镜像可供直接使用。英特尔最初将 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 / 单片机架构

喜欢复古计算与硬件实现

想做软硬件协同系统实验

这个项目都有很强的启发意义。