从零构造一台计算机——硬件模拟器

这里介绍一下Nand2Tetris课程里面用到的硬件模拟器的用法,可以在这里找到下载方式。

HDL语法

假如我们要构建一个非门,这时候我们需要创建一个文件,文件名为:Not.hdl,内容如下:

// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/01/Not.hdl

/**
 * Not gate:
 * out = not in
 */

CHIP Not {
    IN in;
    OUT out;

    PARTS:
    Nand(a=in, b=in, out=out);
}

//开头,或者在/** **/之间的是注释,这个和主流的编程语言一致。上面/** **/之间的是Not的描述。

CHIP关键字定义了组件的名称,IN定义了组件的输入端,OUT定义了组件的输出,PARTS下面是具体的实现。

我们来具体看实现:

Nand(a=in, b=in, out=out);的意思是Nand(与非门,默认提供)的输入端a, b作为Not的输入inNand的输出out作为Not的输出out

当我们构建完Not的时候,我们就可以把他作为组件在后续的代码中使用了。

关于课程中project1的其他组件以及对应的功能描述,可以去参考网站的资料,我已经写完并且上传到github,可以供大家参考。

硬件模拟器

这里的硬件模拟器是java写的,所以我们首先需要安装并配置jre,这里不再赘述。配置完java之后,运行平台的脚本文件即可。例如mac运行HardwareSimulator.sh,windows运行HardwareSimulator.bat即可。

打开后界面如下所示:

这时候我们点击File -> Load Chip或者下面的第一个图标来加载一个组件。这时候我们可以改变Input pins中输入的值,然后点击Run -> Single Step或者下面对应的图标去单步执行,执行完之后我们可以在Output pins中看到输出。

为了验证我们写的程序是否正确,我们可以使用压缩包中提供的测试文件来测试我们的程序:测试文件以.tst结尾,例如Not.hdl对应的测试文件就是Not.tst。然后我们可以点击File -> LoadScript或者对应的图标来加载测试测试脚本文件。

加载完成之后,可以在右侧看到脚本文件的具体内容,同样的,我们也可以点击Run -> Single Step来单步执行测试脚本中的测试代码,或者Run -> Run来执行全部的测试代码。

如果执行成功,我们可以在最下方看到运行成功的提示,否则会给出对应的报错。如下所示:

总结

到这里为止,我们了解了一些基础的逻辑电路,并且用HDL描述了出来。使用硬件模拟器的好处是方便我们调试,验证逻辑是否正确,也不用手动去焊接电路。

课程中用到的硬件模拟器是以学习为目的的,是为了帮助我们了解计算机底层的电路结构。我这里也没有介绍的面面俱到,仅仅是介绍了最基本的用法。关于更详细的使用方式我们可以去查阅网站中的资料。