nand2tetris_基础逻辑门

布尔函数

基础布尔运算

And Or Not,基本数学运算。在电路中低电压(断电)表示0,高电压(通电)表示1,再通过串并联,或借助已有电子元器件(触发器、三极管…)实现。在计算机世界里,我想最重要的设计思路是抽象和分层,下层为上层提供接口,而上层不用关心下层具体是如何实现的。在这里也是一样,我们不去关心电路如何去实现,这是硬件工程师的工作范畴,请选择相信他们。若有兴趣,请参考<编码>一书

布尔函数


布尔函数类比数学里的方程,可以认为自变量的取值只有0和1两种,也就是说,布尔函数是可以枚举的,即真值表。布尔函数(可能需要化简)可以认为是等价于真值表。更多时候,往往需要从真值表(结果,或者说需求)推导出布尔函数,再化简设计出最优电路

函数推导


思路是,找到真值表中结果为1的进行组合。因为子项是与的关系,所以只会有这一条满足需求;又因为不同子项是或的关系,保证了只有这几条是1,其余都是0

化简公式


这里更多是一些基本运算规则,我想若真正实现化简,还是需要有对真值表足够的观察,排除掉一些干扰项(下面复用器例子里可以看到)。这里贴一下课堂上老师给的例子,至写文的现在,我还没有看懂,当然 我也不准备看懂了

基础逻辑门

这节课需要实现的逻辑门有点多,选三个有趣的聊聊

选择器

这很像我们的if else分支判断。想不到吧,程序开发里的if else,使用电路是这样实现的

如果根据上文推导方法,我们很容易得出一个较长的函数

(a And Not(b) And Not(sel)) Or (a And b) Or (Not(a) And b And sel)

标准实现是这样的,优雅√

(a And Not(sel)) Or (b And sel)

恕我愚钝,我实在是不知道怎么能化简成这样的。也许有方法,但是这里如果认真观察真值表,out依赖sel的值,sel的值决定选择a还是b。那么sel=0的时候考虑a就好 a And Not(sel);同理sel=1的时候考虑b就好;然后两种情况相加,也就是Or

分配器

这是选择器的逆向,也很有趣。实现就很简单了,因为输出是分为了a和b两个变量

a = in And Not(sel)
b = in And sel

选择器与分配器在网络通信中的应用


这张图理解老师想表达的意思就好,大概是信道的复用与解复用。我感觉这里画的并不好,很容易迷惑sel状态的影响,贴一下论坛里用户的咨询

16位Andder

前两个输入和输出都是1位的,如果有多个位呢,要如何去实现

想实现这个,需要引入总线的概念,我们的计算机之前还有32位,现在基本都是64位的,这里位数就表示同时传输的数据量,也很容易想到,一位一位处理,那也太慢了吧。这里需要实现的逻辑门是两个16位进行And操作,输出自然也是16位的。我们的处理思路保持不变,仍然对单一位进行And操作

out[i] = a[i] And b[i]
i: 0-15

至于这里的i是如何对应的,尝试用排插理解吧。这个16位Andder有32个人口,分别连接输入的2个16位数,还有16个出口,用来输出1个16位数,这里的i并没有先后关系,而是类似串联电路,同时进行0-15的And操作。下一篇尝试介绍一下HDL脚本语言吧,可能就会好理解一点了

总结

周五听说了这门课,周六就迫不及待听了前两个章节,这里必须要夸一下Coursera可以旁听课程!课程给我的期望值很高,从零实现一个电脑啊,这哪个程序员能抵抗住!!布尔函数这章已经有了基本的逻辑门,加油 加油。

Coursera课程页
作者网站

posted @ 2024-03-10 19:37  柠檬水请加冰  阅读(52)  评论(0编辑  收藏  举报