简介
- nand2tetris 主页
- coursera 课程主页:提交作业,视频加载不出来
- B站视频搬运:和 coursera 上视频分章节一直
- 仓库地址 gitee github
第一章 布尔函数和和门逻辑路线图
- Hardware Description Language (HDL) 硬件描述语言
- hardware simulation 硬件模拟器/仿真器
计组有用 logisim 设计门电路到8位计算机的案例(32位的我没学会),计组进阶就在 vivado 上写 HDL 写了。
看视频
读课本
- 第一章
- 附录A(硬件描述语言) coursera 上给出的 HDL Guide 就是附录 A
- Hack Chip Set 英文版附录 Appendix 4 可以复制里面芯片的定义
作业
目的:用 HDL 补充完成 15 个 芯片
有点懵,就开局只有一个 nand,剩下的其它门电路都是 nand 造出来的。软件的使用教程在主页的软件页面有给出教程(PPT版本或者PDF版本,我选择pdf方便划词翻译),当然视频1.5中也有演示如何使用。虽然不太理解这个 nand 是什么,想起数电里的三级管造与非门,估计是三级管级别的东西,计组用 Logism 造模拟计算机直接就有基础的与或非门,然后再用这些造上层建筑。
造一个
- 如何启动硬件模拟器?
前言中已经下载好解压了。运行 tools 中的 HardwareSimulator 脚本即可
bash tools/HardwareSimulator.sh
- 运行一个案例看一下?
启动硬件模拟器,载入芯片设计文件(File - Load Chip,选择 projects/01/And.hdl),载入测试脚本(File - Load Script,选择projects/01/And.tst),运行测试脚本(Run - Run),底部状态栏会有执行结果:End of script - Comparison failure at line 5
- 如何由 nand 建造第一个上层建造?
Project 界面有 12 个项目,每个项目都有三个一样的标志(小人铲土、小人讲学、看书 分别代表 本章的大纲、PPT、英文教程对于章节的PDF。如第一章大纲有背景、目标、15个芯片、资源、提示等。
先造哪一个好呢?肯定先造简单的,第一章大纲里排序第一个是Nand,第二个是Not,中文书里面1.3给出的提示也是有简单到复杂,那就先造Not。非门的真值表很简单,就两行,两输入Nand门的真值表有四行,比较特殊的在两输入都是1的时候输出0,把一个两输入 Nand门的两个输入连到一起成为一个输入就能实现非门的一半真值表了,然后按照这样结构发现输入都是0的时候输出是1,就成为一个非门了。于是乎,只需要把一个两输入的Nand门的的两个输入合并为一个输入就成了非门了。
HDL代码中的 Nand门的写法参考英文版附录 Appendix 4,最后要在一行末尾添加分号,不然导入失败,底部的状态栏目也会提示缺分号,底部状态栏会有执行结果:End of script - Comparison ended successfully. Nand2Tetris - Week 1 iimT 于 2018-11-14 中给出了非门的另一种构造,直接将Nand门的一个输入置为1就可以构造出非门了,我在HDL里面直接令b=1写法不对。。
在查阅英文教程附录的时候在 Figure A2.2 找到了1的写法,写true。与或门的输入引脚没有位置区分,比如用Nand构建非门,把其中一个置为1就行,无论是a或者是bChip Name
接下来是第二个门 And,中文课本26页说很简单,反向思考。写了一下真值表,发现和Nand的真值表差一个反向器,这就好办了,直接用Nand接上刚才写好的非门,测试通过
第三个门 Or 或门,真值表也很容易写出来,但是想了半天楞是没想出来怎么构建,真值表构建表达式不太行,看了一下和Nand的真值表差两,想着用And来选通两个特殊值,用一堆Nand和And选通一个发现电路太复杂了,和我在数电学到的差点有点远了,在【计算机系统要素】使用Nand实现各种基本逻辑门 筹项 于 2020-08-19看了下答案,起初不是很明白,看了答案也不是很理解,再寻思一会就明白了,或门真值表特殊在只有一个0输出,而Nand门也是如此,不过两者的输入不同,那么只要把或门00的输入变成Nand门的11就行了,通过前面搭建出来的非门。
Xor 异或门,这个不太好理解,公式也不太好记忆: a⊕b = (¬a ∧ b) ∨ (a ∧¬b),记成半加运算就好理解多了,按照公式去构建即可,中文课本十六页也有案例。
Mux Multiplexor 选择器,这个比较好理解,根据sel选择信号来决定输出是a还是b,与门有一个特点就是1与啥就是啥,0与啥都是0,或门类似,0或啥就是啥,因此用与或非构建选择器还是比较简单的。
DMux Demultiplexor 这个不知道叫什么,但是功能很好理解,和选择器一样,只不过少了一个合并输出的元件
Not16 16路输入的非门,也很简单,每个输出输出之间串一个非门即可
组合电路循环可以用一些代码来避免手动输入的繁琐
""" # 懒人的组合电路
for i in range(16):# 0-15d[%d]
# print("Not(in=in[%d],out=out[%d]);"%(i,i))
# print("And(a=a[%d],b=b[%d],out=out[%d]);"%(i,i,i))
# print("Or(a=a[%d],b=b[%d],out=out[%d]);"%(i,i,i))
print(" And(a=b[%d],b=sel,out=c%d);\n Not(in=sel,out=d%d);\n And(a=d%d,b=a[%d],out=e%d);\n Or(a=c%d,b=e%d,out=out[%d]);\n"%(i,i,i,i,i,i,i,i,i))
"""
for i in range(4):# 0-3 Or8Way 剩下三个手写
print("Or(a=in[%d],b=in[%d],out=c%d);"%(2*i,2*i+1,i))
Mux4Way16 16位四通道选择器,有了16位双通道选择器之后就很简单了,两两选一,再加一个选最后一个,两个控制信号控制三个门的工作状态,刚开始我以为还有用与或非组一下,结果组了发现不对劲,列出真值表就很好办了。
Mux8Way16 16位八通道选择器,和上面一样,先用4通道筛选,选出两个16位信号,然后这两再选出最后一个16位信号
DMux4Way ”四通道分线器“ DMux可以一分二,那两个就可以分出四线,然后再加一个前置来二分出到底走哪一个
DMux8Way ”八通道分线器“ 两个”四通道分线器“可以分出八线,剩下的问题就是用一个前置分线器分出两线来决定走入哪一个后置”四通道分线器“