如何在真正的 FPGA 上实现 nand2tetris 处理器?
How to implement nand2tetris processor on a real FPGA?
我学习了 nand2tetris 课程 (https://www.nand2tetris.org/course),主要目的是学习如何在真正的 FPGA 上构建软处理器。
虽然课程很简单,但现在我从FPGA实现开始,我觉得有点迷茫。
我买了一个 Intel de10 nano FPGA(http://de10-nano.terasic.com/),并且从 Uni 获得了一些 Verilog 知识,我能够下载“Quartus Prime Lite”和 bootstrap 以及像 led 这样的简单东西闪烁等...
但是,在实现处理器时,有几件事我不清楚:
- 如何实现数据存储?我看到有一个 DDR3 模块连接到 FPGA 的 HPS。这是我需要直接使用的东西吗?我可以简单地在 HDL 中使用一个大的 16 位寄存器向量吗?
- 如何从读取程序的地方实现ROM?我如何存储我组装的二进制文件然后 bootstrap 获取解码执行循环?
- 如何实现屏幕和键盘?确实,板上还有一个HDMI控制器:我必须自己实现所有逻辑吗?
这些是我目前正在努力解决的主要问题。您能指出对新手有用的任何资源吗?
谢谢,
对于像来自 nand2tetris 的 CPU 这样简单的东西,您可以使用块 RAM,DE10Nano 上有很多,可能足以满足您的所有需求。加上更多的分布式内存。
如果您仍想访问 DDR,DE10Nano 是一个 SoC,具有由处理器子系统管理的硬 DDR 控制器。通过 Avalon 总线与它连接非常容易(除非您确实需要最大可能的性能,否则不要理会 AXI)。
对于ROM,只需使用LUT。 Verilog 中的一个简单静态案例将被转换为一个高效的基于 LUT 的 ROM。
在DE10Nano上接入HDMI,可以看这个例子:
https://github.com/combinatorylogic/soc/blob/a1d282d793548030cba940496bed90ff3a29c0ba/backends/c2/hw/de10nano/vga1080p.v(同项目的DDR访问也可以看看)。在使用 HDMI 之前,您需要通过 i2c 设置 ADV7513 芯片,请参阅同一项目下 Terasic 的库副本。
对于单色 800x600 视频,您可以使用块 RAM。对于更高的分辨率,如上例所示,您必须使用 DDR。
我在小型 fpga (ice40HX8K) 上完成了 nand2tetris 硬件的实现,以下是我的建议:
一个。记忆
原始nand2tetris使用两个内存部分:
- 指令码ROM
- 用于数据存储器的 RAM
两者都可以使用 fpga 的 BRAM 单元来实现。他们有很好的 属性,BRAM 可以在启动时预加载数据。这对于用您的指令代码预加载 ROM 很有用。
如果您有足够的 BRAM,就可以了。
我的开发板(Olimex 的 ice40HX8K-EVB)只有 8K x 16 位 BRAM。所以我做了以下事情:
- 我使用 512 x 16 位 BRAM 作为 ROM,预加载了引导加载程序(用 Hack-Assembler 编写)
- BRAM 的其余部分用作 RAM(7680 x 16 位)
- 我的主板有一个外部 SRAM 芯片(256 k x 16 位)。我用它作为指令存储器。启动时,引导加载程序用应用程序代码填充 SRAM,然后将 SRAM“切换”为指令存储器。
您的主板有一个独立的 DRAM 芯片。您也可以将其用作内存,但请注意:使用 DRAM 比使用 SRAM 更棘手。
乙。 input/output
nand2tetris 有一个屏幕和一个键盘。
一个易于实施的替代方案如下:
实现一个小型 UART,以便您可以通过终端(例如 screen /devttyACM0)连接您的 PC。现在您可以在运行时与您的 Hack-CPU(fpga 中的运行)对话。
我还使用 UART 在启动时上传 Hack-Application。
我学习了 nand2tetris 课程 (https://www.nand2tetris.org/course),主要目的是学习如何在真正的 FPGA 上构建软处理器。
虽然课程很简单,但现在我从FPGA实现开始,我觉得有点迷茫。
我买了一个 Intel de10 nano FPGA(http://de10-nano.terasic.com/),并且从 Uni 获得了一些 Verilog 知识,我能够下载“Quartus Prime Lite”和 bootstrap 以及像 led 这样的简单东西闪烁等...
但是,在实现处理器时,有几件事我不清楚:
- 如何实现数据存储?我看到有一个 DDR3 模块连接到 FPGA 的 HPS。这是我需要直接使用的东西吗?我可以简单地在 HDL 中使用一个大的 16 位寄存器向量吗?
- 如何从读取程序的地方实现ROM?我如何存储我组装的二进制文件然后 bootstrap 获取解码执行循环?
- 如何实现屏幕和键盘?确实,板上还有一个HDMI控制器:我必须自己实现所有逻辑吗?
这些是我目前正在努力解决的主要问题。您能指出对新手有用的任何资源吗?
谢谢,
对于像来自 nand2tetris 的 CPU 这样简单的东西,您可以使用块 RAM,DE10Nano 上有很多,可能足以满足您的所有需求。加上更多的分布式内存。
如果您仍想访问 DDR,DE10Nano 是一个 SoC,具有由处理器子系统管理的硬 DDR 控制器。通过 Avalon 总线与它连接非常容易(除非您确实需要最大可能的性能,否则不要理会 AXI)。
对于ROM,只需使用LUT。 Verilog 中的一个简单静态案例将被转换为一个高效的基于 LUT 的 ROM。
在DE10Nano上接入HDMI,可以看这个例子: https://github.com/combinatorylogic/soc/blob/a1d282d793548030cba940496bed90ff3a29c0ba/backends/c2/hw/de10nano/vga1080p.v(同项目的DDR访问也可以看看)。在使用 HDMI 之前,您需要通过 i2c 设置 ADV7513 芯片,请参阅同一项目下 Terasic 的库副本。
对于单色 800x600 视频,您可以使用块 RAM。对于更高的分辨率,如上例所示,您必须使用 DDR。
我在小型 fpga (ice40HX8K) 上完成了 nand2tetris 硬件的实现,以下是我的建议:
一个。记忆 原始nand2tetris使用两个内存部分:
- 指令码ROM
- 用于数据存储器的 RAM
两者都可以使用 fpga 的 BRAM 单元来实现。他们有很好的 属性,BRAM 可以在启动时预加载数据。这对于用您的指令代码预加载 ROM 很有用。 如果您有足够的 BRAM,就可以了。 我的开发板(Olimex 的 ice40HX8K-EVB)只有 8K x 16 位 BRAM。所以我做了以下事情:
- 我使用 512 x 16 位 BRAM 作为 ROM,预加载了引导加载程序(用 Hack-Assembler 编写)
- BRAM 的其余部分用作 RAM(7680 x 16 位)
- 我的主板有一个外部 SRAM 芯片(256 k x 16 位)。我用它作为指令存储器。启动时,引导加载程序用应用程序代码填充 SRAM,然后将 SRAM“切换”为指令存储器。
您的主板有一个独立的 DRAM 芯片。您也可以将其用作内存,但请注意:使用 DRAM 比使用 SRAM 更棘手。
乙。 input/output nand2tetris 有一个屏幕和一个键盘。
一个易于实施的替代方案如下: 实现一个小型 UART,以便您可以通过终端(例如 screen /devttyACM0)连接您的 PC。现在您可以在运行时与您的 Hack-CPU(fpga 中的运行)对话。 我还使用 UART 在启动时上传 Hack-Application。