Loading... ## HDL介绍 硬件描述语言(Hardware Description Language,HDL)是以编程方式描述芯片的结构的一种手段。通过HDL,设计师们无需再像从前一样不断通过使用物理硬件组合、实验来实现一个特定的功能,只需完成HDL的编写后使用硬件仿真器(HardwareSimulator)进行模拟即可检查与优化芯片的设计,这极大的降低了芯片设计所需的成本。 ## HDL语法规范 HDL作为一门编程语言,遵循一定的语法规范。 ### 文件基础结构 首先,HDL应该以文本的形式编写并存储在以 `<芯片名称>.hdl`命名的文本文件中,并遵循以下基础结构: ``` CHIP <芯片名称> { IN <输入引脚>; OUT <输出引脚>; PARTS: <芯片构成> } ``` 其中,hdl文件名称必须与芯片名称对应,**完全相同**。 基础结构的关键词必须与上方相同(包括大小写) 一个芯片可以有多个输入、输出引脚,每个引脚之间必须使用 `,`分隔 芯片可以在“芯片构成”部分调用其他芯片,不同芯片之间使用 `;`分隔 **注意!HDL语言大小写敏感,即 `And`与 `AND`并不是相等的** 举个例子,And逻辑门可以表示为下面的hdl文件,并存储在 `And.hdl`中 ``` CHIP And { IN a,b; OUT out; PARTS: Nand(a=a,b=b,out=res1); Nand(a=res1,b=res1,out=out); } ``` 上面的例子只是一个语法的参考,而具体芯片的意义会在后续章节中讲述 ### 调用其他芯片 HDL可以在芯片内部调用其他芯片,这些芯片分为两种: 1. 预设芯片(Builtin Chip) 2. 自定义芯片 其中,自定义芯片的优先级高于预设芯片,即如果存在同名的预设芯片和自定义芯片,那么自定义芯片的值将覆盖预设芯片的值 对于预设芯片,通常情况可以在任意芯片内部直接调用,而自定义芯片只在**被调用芯片与调用芯片在同一级目录下时可以使用** 调用芯片的方法: 在PARTS部分按照以下语法调用 ``` <芯片名称>(引脚对应关系) ``` 注意芯片、引脚名称大小写敏感 例如: ``` Nand(a=in1,b=in2,out=out1) ``` 表示Nand的输入引脚a连接至当前芯片的in1引脚,输入引脚b连接至当前芯片的in2引脚,将其输出引脚out作为当前芯片的输出引脚out1 ### 通俗解释HDL语法 “引脚”可以视作变量,“芯片”可以视作函数 “输入引脚”视作函数参数,“输出引脚”视作函数返回值 函数无法直接返回值,但是可以将返回值赋值给一个变量 例如,Nand芯片可以描述为`Nand函数接受a和b两个参数,返回一个out` 则上面的调用举例可以描述为`向Nand函数的参数a设为in1,参数b设为in2,将返回值赋值给out1` 或者使用Python语言近似表示为: ```python in1=1 in2=0 def Nand(a, b): out = not (a and b) #仅做演示,不是真实的逻辑 return out out1=Nand(a=in1, b=in2) ``` 而上面的And芯片其实也可以用Python代码表示为一个函数的定义: ```python def And(a, b): res1=Nand(a=a, b=b) out=Nand(a=res1, b=res1) return out ``` 希望这些解释可以帮助你更快掌握和理解HDL的语法 ## 编写HDL文件 遵循上面的HDL语言规范,即可开始编写HDL文件。可以使用任何文本编辑器编辑hdl文件,下面介绍三种方法: ### 使用记事本编写hdl文件 使用电脑自带的记事本编辑txt文件并另存或重命名为.hdl文件是最简单的方式 **方法1:使用记事本直接创建hdl文件** 1. 打开记事本,输入hdl的内容 ![Snipaste_2024-12-16_10-53-24.png](https://blog.ivan-hanloth.cn/usr/uploads/2024/12/1505934910.png) 2. 选择“文件”->“另存为” ![Snipaste_2024-12-16_10-54-45.png](https://blog.ivan-hanloth.cn/usr/uploads/2024/12/3301464192.png) 3. 选择存储的路径,修改存储的文件类型为“所有文件(*.\*)”,文件名称为“And.hdl”,点击保存即可 ![Snipaste_2024-12-16_10-59-20.png](https://blog.ivan-hanloth.cn/usr/uploads/2024/12/499225943.png) **方法2:创建txt文件并重命名txt文件为hdl文件** 参考Nand2Tetris目录下的/projects/0,将其中的file.txt文件直接重命名为file.hdl即可 **方法3:使用记事本编辑已有hdl文件** 点击hdl文件,右键选择“在记事本中编辑”即可编辑hdl文件 ![Snipaste_2024-12-16_11-07-29.png](https://blog.ivan-hanloth.cn/usr/uploads/2024/12/1096328346.png) ### 使用VSCode编写hdl文件(推荐) 通过“打开文件夹”的方式打开一个文件目录,点击“新建文件”,将文件名字命名为"And.hdl"即可,在右边的编辑器中打开即可编辑文件 ![Snipaste_2024-12-16_11-11-55.png](https://blog.ivan-hanloth.cn/usr/uploads/2024/12/2323147916.png) ### 使用Nand2Tetris在线编辑器(推荐) 打开Nand2Tetris官方在线编辑器https://nand2tetris.github.io/web-ide/chip/ 即可在线编辑 ## 硬件仿真器 硬件仿真器(Hardware Simulator)是用于模拟与测试芯片构建是否正确的软件,通过读入测试脚本、hdl语言文件进行模拟,Nand2Tetris提供了直接的软件进行模拟,参考2.1章节打开HarwareSimulator可以得到下面的页面: ![Snipaste_2024-12-16_11-28-50.png](https://blog.ivan-hanloth.cn/usr/uploads/2024/12/1844469056.png) **常用功能区讲解** 参考上图,硬件仿真器分为5个部分,按照编号分别是: 1. 基础功能区 - 基础功能 2. 芯片基础信息区 - 当前芯片的名称与当前的时刻 3. 芯片引脚信息区 - 当前芯片的输入引脚、输出引脚、内部引脚及其当前对应的值 4. 视图区 - 显示测试代码、比较、输出、屏幕等 5. 通知区 - 各类提示、报错的展示区域 **基础功能区讲解** 基础功能区包含了很多有用的功能 ![Snipaste_2024-12-16_11-35-00.png](https://blog.ivan-hanloth.cn/usr/uploads/2024/12/3622457383.png) 参考上图,常用功能按照编号分别是: 1. 加载芯片 - 用于加载.hdl芯片文件 2. 单步前进 - 用于向前执行一步 3. 继续 - 继续执行剩余代码 4. 暂停 - 暂停执行代码 5. 重新开始 - 从头开始重新执行代码 6. 加载测试文件 - 用于加载.tst测试文件 7. 调整动画速度 - 调整动画的快慢 8. 修改动画设置 - 修改动画选项(可以选择动画演示程序运行过程/程序运行过程和值的传递过程/无东海) 9. 修改数值显示模式 - 修改所有数值的展示方式(可以选择10进制、16进制、2进制) 10. 修改视图显示 - 修改视图区显示的内容(可以选择展示屏幕、测试代码、比较文件、输出文件) ## 使用硬件仿真器 ### 加载芯片 点击“加载芯片”可以加载一个.hdl文件至仿真器中,如下图 ![Snipaste_2024-12-16_11-46-18.png](https://blog.ivan-hanloth.cn/usr/uploads/2024/12/1533192749.png) 文件中的代码将被加载到“HDL”区域 双击“input pins”区域任意行的“value”可以修改其值,回车保存值 修改完成后点击继续可以在“output pins”区域得到输出值,也可以在“internal pins”区域查看过程中用产生的非输入输出引脚的值 ### 加载测试文件 点击“加载测试文件”可以将一个`.tst`文件加载到硬件仿真器中,如下图: ![Snipaste_2024-12-16_13-31-25.png](https://blog.ivan-hanloth.cn/usr/uploads/2024/12/445131640.png) 测试文件可以自动化加载芯片、测试与比较输出来检查芯片是否达成了预定目标 ### 使用测试文件进行测试 加载一个测试文件后,点击“继续”即可开始对特定的芯片进行测试,如下图 ![Snipaste_2024-12-16_13-34-52.png](https://blog.ivan-hanloth.cn/usr/uploads/2024/12/2049075752.png) 默认情况下,程序会通过高亮测试文件代码展示正在测试的部分并自动与预期文件进行比较,如果所有测试都通过,则会显示“End of Script - Comparision ended successfully“表示测试通过,芯片设计符合预期要求。如下图所示 ![Snipaste_2024-12-16_13-37-56.png](https://blog.ivan-hanloth.cn/usr/uploads/2024/12/145707926.png) 如果比较未通过,则会用红字提示比较出错,并指出比较出错行数 ![Snipaste_2024-12-16_13-40-26.png](https://blog.ivan-hanloth.cn/usr/uploads/2024/12/250990799.png) 此时,可以前往.tst同级文件目录查找`.out`文件,查看输出结果,与`.cmp`文件进行比较,进行纠错 ## 关于测试文件 Nand2Tetris的大部分项目都提供了测试文件,因此学习者通常不用自己编写测试文件,直接使用相关的测试文件即可,因此测试文件的编写将在后续的章节中再进行详细讲述。 测试文件并不局限于HDL与Hardware Simulator中,在后续的其他章节中也会使用到。 与测试相关的文件有: `.tst`文件 - 测试脚本文件 `.cmp`文件 - 预期输出结果 - 比较文件 `.out`文件 - 实际输出结果 - 输出文件 在Nand2Tetris提供的项目中,测试相关的文件通常以需要测试的文件的名称命名,例如,默认情况下,测试`And.hdl`的脚本为`And.tst`,比较文件为`And.cmp`,输出文件为`And.out`,测试文件会自动完成**加载文件、比较文件、输出文件**的工作,而使用者通常只需要查看程序的输出提示和`.out`即可 Last modification:December 16, 2024 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 如果觉得我的文章对你有用,请随意赞赏