nand2tetris 布尔函数和和门逻辑路线图

简介

第一章 布尔函数和和门逻辑路线图

  • 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 造模拟计算机直接就有基础的与或非门,然后再用这些造上层建筑。

造一个

  1. 如何启动硬件模拟器?

前言中已经下载好解压了。运行 tools 中的 HardwareSimulator 脚本即可

bash tools/HardwareSimulator.sh
  1. 运行一个案例看一下?

启动硬件模拟器,载入芯片设计文件(File - Load Chip,选择 projects/01/And.hdl),载入测试脚本(File - Load Script,选择projects/01/And.tst),运行测试脚本(Run - Run),底部状态栏会有执行结果:End of script - Comparison failure at line 5

  1. 如何由 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 ”八通道分线器“ 两个”四通道分线器“可以分出八线,剩下的问题就是用一个前置分线器分出两线来决定走入哪一个后置”四通道分线器“

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值