The Elements of Computing Systems阅读笔记(3)

接着上一篇博客。
HDL定义的芯片(这里的“芯片”与市场上常见的复杂芯片无关,主要指各种门搭起来的电路)包含了两个部分,header和parts部分。header定义了芯片的接口(interface,我理解成输入输出),包括芯片名称、输入接口和输出接口。parts部分描述了芯片内部的更低一层次的元件(例如更低层次的芯片或门),记录了这些元件名字和各个部分的连接状况。每个元件都会有一个声明(statement)来描述它自己的名字和与其他元件的连接情况。要注意的是,在写元件的声明之前要先定义好这个元件的接口(例如输入接口和输出接口等,就好像C语言里的调用变量之前必须声明这个变量一样)。
元件之间的连接要用HDL来声明内部引脚,并通过声明的内部引脚进行连接。例如Not(…, out=nota)和And(a=nota,…),就是创建了一个名为nota的内部引脚,并将非门的输出接口连到这个nota上,最后将nota连接到与门的a输入接口上(Not和And括号内左边是输入,右边是输出)。注意数据可以同时输出到多个引脚上(脑补成硬件,HDL只是描述硬件用的,不像其他软件编程语言)。例如下面的输入a和b就被同时输入到两个门的输入引脚。
异或门例子
上面的图的左边是HDL程序,中间是测试代码,右边的是输出结果(其实不用管这些,自己试试敲敲运行下就知道怎么用了)。
需要用到的软件都可以在官网(http://www.nand2tetris.org/)下载到。
现在新建一个文本文件,内容就是上面的程序,保存的文件名应该是“Xor.hdl”(注意后缀名),最后在官网下载要用的文件(提供的是压缩包),解压在你想要解压的地方之后,在解压出的nand2tetris文件夹的tools文件夹里面找到HardwareSimulator,如果是windows系统就运行HardwareSimulator.bat,Unix就运行HardwareSimulator.sh。最后会弹出这个窗口(如果已经安装了Java运行环境的话,没安装的话是不会出现这个窗口的)
窗口
然后File>Load Chip,选择你写好的Xor.hdl文件就可以开始模拟了,可以试下在Input pins那里改下输入的数据(默认是0),看看Output pin的变化,那里就是输出结果。
但是要一个个输入所有可能的输入来进行测试太麻烦了,所以通常会有一个测试用的程序。这里测试用的程序代码如下(版权信息看前面的注释,反正不是我写的就对了):

// 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/Xor.tst

load Xor.hdl,//载入Xor.hdl文件
output-file Xor.out,//输出Xor.out文件
compare-to Xor.cmp,//与Xor.cmp文件比较
output-list a%B3.1.3 b%B3.1.3 out%B3.1.3;//输出列表

set a 0,//设置a引脚输入0
set b 0,//设置b引脚输入0
eval,//貌似是生效的意思
output;//输出,记得有分号

set a 0,
set b 1,
eval,
output;

set a 1,
set b 0,
eval,
output;

set a 1,
set b 1,
eval,
output;

这个文件要保存为.tst格式,要测试的时候打开上面那个HardwareSimulator.bat然后在右边找View:选项,默认是Screen,改成Script。
改成Script
然后按这个按钮,会弹出一个弹窗让你选择要载入的测试程序。
按钮
建议把上面文件放在同一个文件夹下面,最后将一个比较用的文件Xor.cmp也放在这个文件夹下,内容:

|   a   |   b   |  out  |
|   0   |   0   |   0   |
|   0   |   1   |   1   |
|   1   |   0   |   1   |
|   1   |   1   |   0   |

最后按>>按钮就可以运行了。
如果输出结果和目录下的Xor.cmp里面的结果一样的话,HardwareSimulator左下角会出现“End of script - Comparison ended successfully”。(注意:Xor.cmp里面的比较顺序要和Xor.tst里面的比较顺序一样,不然会报错)

猜你喜欢

转载自blog.csdn.net/geek_of_csdn/article/details/78425649