《计算机系统要素》阅读及实现--布尔逻辑和布尔运算

从零开始搭建计算机–学习阶段2–《计算机系统要素》阅读及实现

本系列为阅读《计算机系统要素》之后的总结,如有不准确或者错误的地方,欢迎指正。

个人建议:阅读完《Code–隐匿在计算机软硬件背后的语言》后,再阅读《计算机系统要素》,效果更佳。

《计算机系统要素》书籍中的相关程序可以区GitHub上找–nandtetris

1、布尔类型数值是指true/false、1/0、yes/no这种二进制型的数据(个人理解)
2、布尔函数是指输入输出数值均为布尔类型数值的函数
3、计算机硬件基于二进制数据的表示和处理,这里通过布尔函数来正确的表达和分析布尔函数

1、布尔逻辑

1.1真值表表示法

描述布尔函数最简单的方式就是:枚举出函数所有可能的输入变量组合,然后写出每一种组合所对应的函数输出值,这样就输出了真值表

比如我们想表达一个函数f(x, y, z) = (x + y) · z ‾ \overline{z} z,(x, y, z都是布尔类型,一般为0/1)下面是对应的真值表。
在这里插入图片描述

图1 布尔函数的真值表表示

1.2布尔表达式

上面所说的函数f(x, y, z) = (x + y) · z ‾ \overline{z} z,就是布尔表达式。

基本的布尔算子有“And”,“Or”和“Not”。

1.3规范表达式

规范标表示法中,每个布尔函数采用布尔表达式进行描述

图1的布尔函数真值表,只有第三行、第五行和第七行输出为1

  • 第三行为 x ‾ \overline{x} xy z ‾ \overline{z} z
  • 第五行为 x y ‾ \overline{y} y z ‾ \overline{z} z
  • 第七行为 xy z ‾ \overline{z} z

那么最后f(x, y, z) = x ‾ \overline{x} xy z ‾ \overline{z} z+x y ‾ \overline{y} y z ‾ \overline{z} z+xy z ‾ \overline{z} z

对于三变量的输入来说,三变量共有23 = 8种组合方式;那么f(x, y, z)的取值就

有28(8 表示23)种。

这个结果可以结合图1进行分析,x,y,z的输出有八种组合方式

但是f(x, y, z)的输出可以随便设置,比如图1的f(x, y, z)是0010 1010,该函数的八位,每一位都有两种选择

那么对于三位输入来说,f(x, y, z)的输出有28种选择,可以是0000 0000~1111 1111,能够组成28 = 256种布尔函数

总结:对n个输入变量,布尔函数共有2的2n次方种可能

下面是2输入变量组成的16个布尔函数:
在这里插入图片描述

图2 所有“两变量”的布尔函数

2、硬件语言描述芯片结构

上述布尔函数表中的And/Or/Not算子可以采用Nand函数和Nor函数中的任意一个来构造,那么这意味着:

1、只要实现Nand或者Nor函数的功能,那么就可以搭建任何布尔函数
2、只要能够物理上实现Nand或者Nor功能,就能够通过特定的连接方式构建任意布尔函数的物理实现

布尔函数的硬件实现方法有很多,磁、光等等(生物?、水力?、风力?)。今天大多数采用晶体管来实现,我们不关心晶体管物理构造是如何实现的,反正用晶体管搭建了基本的逻辑门,我们这里用就完了。

本书采用的是软件来模拟各种基本逻辑门(门的概念一般用于简单的芯片)的组合和使用的,用硬件语言(Hardware Description Language)来描述。

采用HDL语言描述芯片的结构,通过硬件仿真器进行仿真,通过**不同输入变量组合的测试脚本·**产生仿真的芯片输出,证明芯片的可行性。芯片的HDL定义包括

header部分parts部分
1、Header部分描述芯片的接口,也就是芯片的名称、输入输出管脚;
2、parts部分描述底层电路的名称和拓扑结构,描述了芯片中各个组成电路的名称及电路之间的连接方式。

这里采用Nand门最为电路中最基本的元件(也就是Nand的内部逻辑不需要再描述了,因为这里以它为基本单元),采用Nand门搭建其它的逻辑门。

逻辑门电路的结构有参考这篇文章

https://www.zhihu.com/question/59720006/answer/168181192

下面将搭建第一章课后工程中的所有门电路

非门(NOT、NOT16)
与门(AND)
或门(OR、XOR)
选择器(MUX2-1)
分解器(DMUX1-2)
多位逻辑门(NOT16、AND16、OR16)

2.1 NOT门

在这里插入图片描述

图3 Not门
CHIP Not {
    IN in;
    OUT out;  
    
    PARTS:
    Nand(a = in, b = in, out = out);
}
‘’‘
CHIP Not16 {
    IN in[16];
    OUT out[16];

    PARTS:
    Not(in = in[0], out = out[0]);
    Not(in = in[1], out = out[1]);
    Not(in = in[2], out = out[2]);
    Not(in = in[3], out = out[3]);
    Not(in = in[4], out = out[4]);
    Not(in = in[5], out = out[5]);
    Not(in = in[6], out = out[6]);
    Not(in = in[7], out = out[7]);
    Not(in = in[8], out = out[8]);
    Not(in = in[9], out = out[9]);
    Not(in = in[10], out = out[10]);
    Not(in = in[11], out = out[11]);
    Not(in = in[12], out = out[12]);
    Not(in = in[13], out = out[13]);
    Not(in = in[14], out = out[14]);
    Not(in = in[15], out = out[15]);
}
’‘’

2.2 AND门

在这里插入图片描述

图4 AND门
硬件描述语言(Hardware Description )
CHIP And {
    IN a, b;
    OUT out;

    PARTS:
    Nand(a = a, b = b, out = o1);
    Nand(a = o1, b = o1, out = out);
}

2.3 OR门

在这里插入图片描述

图5 OR门
CHIP Or {
    IN a, b;
    OUT out;

    PARTS:
    Not(in = a, out = o1);
    Not(in = b, out = o2);
    Nand(a = o1, b = o2, out = out);
}

2.4 XOR门

在这里插入图片描述

图6 XOR门
CHIP Xor {
    IN a, b;
    OUT out;

    PARTS:
	Nand(a = a, b = b, out = out1);
	Nand(a = a, b =out1, out = out2);
	Nand(a = b, b =out1, out = out3);
	Nand(a = out2, b =out3, out = out);
}

2.5 二选一选择器

在这里插入图片描述

图7 二选一选择器
CHIP Mux {
    IN a, b, sel;
    OUT out;

    PARTS:
     Not(in = sel, out = nsel);
    And(a = b, b = sel, out = o1);
    And(a = a, b = nsel, out = o2);
    Or(a = o1, b = o2, out = out);
}

2.6 双路分解器

在这里插入图片描述

图8 多路分解器
CHIP DMux {
    IN in, sel;
    OUT a, b;

    PARTS:
    Not(in = sel, out = n1);
    And(a = in, b = n1, out = a);
    And(a = in, b = sel, out = b);
}

2.7 多位NOT/AND/OR门

在这里插入图片描述

图9 多位NOT/AND/OR门

3 逻辑单元的搭建

3.1半加器:用来实现两位加法

在这里插入图片描述

图10 半加器
CHIP HalfAdder {
    IN a, b; 
    OUT sum,  
    carry; 

    PARTS:
    Xor(a = a, b = b, out = sum);
    And(a = a, b = b, out = carry);
}

3.2全加器:用来实现三位加法

全加器处理加法产生的进位问题
补码用于处理减法运算,实质上还是加法运算,所以全加器一样进行运算
在这里插入图片描述

图11 全加器
CHIP FullAdder {
    IN a, b, c; 
    OUT sum,     
    carry;  

    PARTS:
    HalfAdder(a = a, b = b, sum = s1, carry = c1);
    HalfAdder(a = s1, b = c, sum = sum, carry = c2);
    Xor(a = c1, b = c2, out = carry);
}

3.3 16位加法器

在这里插入图片描述

图12 16位全加器
CHIP Add16 {
    IN a[16], b[16];
    OUT out[16];

    PARTS:
    HalfAdder(a = a[0], b = b[0], sum = out[0], carry = c0);
    FullAdder(a = a[1], b = b[1], c = c0, sum = out[1], carry = c1);
    FullAdder(a = a[2], b = b[2], c = c1, sum = out[2], carry = c2);
    FullAdder(a = a[3], b = b[3], c = c2, sum = out[3], carry = c3);
    FullAdder(a = a[4], b = b[4], c = c3, sum = out[4], carry = c4);
    FullAdder(a = a[5], b = b[5], c = c4, sum = out[5], carry = c5);
    FullAdder(a = a[6], b = b[6], c = c5, sum = out[6], carry = c6);
    FullAdder(a = a[7], b = b[7], c = c6, sum = out[7], carry = c7);
    FullAdder(a = a[8], b = b[8], c = c7, sum = out[8], carry = c8);
    FullAdder(a = a[9], b = b[9], c = c8, sum = out[9], carry = c9);
    FullAdder(a = a[10], b = b[10], c = c9, sum = out[10], carry = c10);
    FullAdder(a = a[11], b = b[11], c = c10, sum = out[11], carry = c11);
    FullAdder(a = a[12], b = b[12], c = c11, sum = out[12], carry = c12);
    FullAdder(a = a[13], b = b[13], c = c12, sum = out[13], carry = c13);
    FullAdder(a = a[14], b = b[14], c = c13, sum = out[14], carry = c14);
    FullAdder(a = a[15], b = b[15], c = c14, sum = out[15], carry = c15);
}

3.4 算数逻辑单元(ALU)

在这里插入图片描述

图13 算数逻辑单元

x和y是16位输入,ALU计算f(x, y)得到输出结果;

控制位:zx, nx, zy, ny, f, no共6个控制位,共有2^6^=64种函数,通过六个控制位,指示ALU采用哪种函数进行计算;
标志位:zr是零标志位,如果输出为零,则zr 等于 1;  ng是负数标志位,如果输出小于零,则ng 等于 1;

书中的ALU要实现以下18种函数,真值表如下,按照真值表设计电路的拓扑结构:

在这里插入图片描述

图14 HACK计算机ALU真值表

在这里插入图片描述

图15 ALU硬件结构

上述ALU结构引自这篇文章

https://blog.csdn.net/qq_17065591/article/details/107052576

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值