nand2tetris 第二章 布尔运算

简介

第二章 布尔运算

第二章大纲

这个就有计组那味道了,计算机刚开设设计来计算弹道轨迹的,因此计算机的核心是计算单元,因此加减乘除要有吧,先搞搞加法

HalfAdder 半加器的真值表,carry表示进位,中文教材38页有描述结构

FullAdder 全加器,先用半加器解决两位,再用一个把剩下的一位也加上,最后的进位要合并处理,列出真值表就知道选啥门了,和半加器进位不太一样哦

Add16 两路十六位加法器。就像小学的两位数加法,先加个位,看看有没有进位再加十位数,所以先用半加器算结果的个位数,更高位可能就有进位,所以需要全加器来处理,最后的进位这里不输出就算了。

for i in range(16):
    print("FullAdder(a=a[%d],b=b[%d],c=c%d,sum=out[%d],carry=c%d);"%(i,i,i-1,i,i))

Inc16 自增器(i++),这个专门用来规定顺序的东东比较简单啦,用两路十六位加法器加个1就好啦。困难的在于这个1到底怎么写?0000000000000001 one 0x1 都尝试了发现不太行,最后在在互联网发现了可以分开写,Add16(a=in,b[0]=true,b[1..15]=false,out=out);被英文附录A4整迷糊了,以为只能按照定义的格式去引用,在英文书图A2.2中有Not8,里面有个引脚输入110写成six,我写one却不行,没注意到这个Not8的输入分成了三段输入;在Hardware Simulator Tutorial的slide 8中自定义内部引线的名称为nota,notb,w1,w2,起初以为啥特殊其名,后来发现就是门电路名称加序号

二进制数
有符号二进制数 2-补码 负数:首位为1,其余位取反加一得到负数的绝对值,才过了没几年就把补码给忘了,计算机中补码表示法全一代表负一。

ALU 算术逻辑单元 刚开始造的时候把zx和nx搞成二选一的并行结构了,后面意识到是串行执行的结构,结构写HDL还是写成了并行,调试了好几次才发现这个问题,还有一个问题就是软件缩放问题,我只能通过屏幕放大器来局部放大看结果,而且底部的状态栏长度有限压根没法完全显示。。。

而且输出不能作为信号来判断,导致又堆了几个不需要的门电路,还得把16位线分成两路八位信号,为了单独分离出补码最高位,又多出来一路不需要的十五位通路,输出分成几段写参考了onepisYa / nand2tetris ALU.hdl,也感谢群友姜平的解答

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值