计算机系统要素-第一章 布尔逻辑

1 前言
    1) What I hear, I forget; What I see,I remember; What I do, I underStand.
    2) 理解硬件、软件、编译器、操作系统之间如何交互,透彻理解计算机的内部工作原理。
    3) 本书需要的工具和资源下载地址:http://www.nand2tetris.org/software.php
    4) 本书涵盖内容
       
2 基本逻辑门实现
    1) Not
        /**
         * Not gate:
         * out = not in
         */
        CHIP Not {
            IN in;
            OUT out;
       
            PARTS:
            Nand(a=in,b=in,out=out);
        }
    2) And
        /**
         * And gate:
         * out = 1 if (a == 1 and b == 1)
         *       0 otherwise
         */
       
        CHIP And {
            IN a, b;
            OUT out;
       
            PARTS:
            Nand(a=a,b=b,out=tp1);
            Nand(a=tp1,b=tp1,out=out);
        }
    3) Or
         /**
         * Or gate:
         * out = 1 if (a == 1 or b == 1)
         *       0 otherwise
         */
       
        CHIP Or {
            IN a, b;
            OUT out;
       
            PARTS:
            Nand(a=a,b=a,out=tp1);
            Nand(a=b,b=b,out=tp2);
            Nand(a=tp1,b=tp2,out=out);
        }
    4) Xor
        /**
         * Exclusive-or gate:
         * out = not (a == b)
         */
       
        CHIP Xor {
            IN a, b;
            OUT out;
       
            PARTS:
            Not(in=a,out=na);
            Not(in=b,out=nb);
            And(a=a,b=nb,out=tp1);
            And(a=na,b=b,out=tp2);
            Or(a=tp1,b=tp2,out=out);
        }
    5) Mux
        /**
         * Multiplexor:
         * out = a if sel == 0
         *       b otherwise
         */
       
        CHIP Mux {
            IN a, b, sel;
            OUT out;
       
            PARTS:
            Not(in=sel,out=nsel);
            And(a=a,b=nsel,out=tp1);
            And(a=b,b=sel,out=tp2);
            Or(a=tp1,b=tp2,out=out);
        }
    6) Dmux
        /**
         * Demultiplexor:
         * {a, b} = {in, 0} if sel == 0
         *          {0, in} if sel == 1
         */
       
        CHIP DMux {
            IN in, sel;
            OUT a, b;
       
            PARTS:
            Not(in=sel,out=nsel);
            And(a=in,b=nsel,out=a);
            And(a=in,b=sel,out=b);
        }
3 多位基本门
    1) Not16
        /**
         * 16-bit Not:
         * for i=0..15: out[i] = not in[i]
         */
       
        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) And16
        /**
         * 16-bit bitwise And:
         * for i = 0..15: out[i] = (a[i] and b[i])
         */
       
        CHIP And16 {
            IN a[16], b[16];
            OUT out[16];
       
            PARTS:
            And(a=a[0],b=b[0],out=out[0]);
            And(a=a[1],b=b[1],out=out[1]);
            And(a=a[2],b=b[2],out=out[2]);
            And(a=a[3],b=b[3],out=out[3]);
            And(a=a[4],b=b[4],out=out[4]);
            And(a=a[5],b=b[5],out=out[5]);
            And(a=a[6],b=b[6],out=out[6]);
            And(a=a[7],b=b[7],out=out[7]);
            And(a=a[8],b=b[8],out=out[8]);
            And(a=a[9],b=b[9],out=out[9]);
            And(a=a[10],b=b[10],out=out[10]);
            And(a=a[11],b=b[11],out=out[11]);
            And(a=a[12],b=b[12],out=out[12]);
            And(a=a[13],b=b[13],out=out[13]);
            And(a=a[14],b=b[14],out=out[14]);
            And(a=a[15],b=b[15],out=out[15]);
        }
    3) Or16
        /**
         * 16-bit bitwise Or:
         * for i = 0..15 out[i] = (a[i] or b[i])
         */
       
        CHIP Or16 {
            IN a[16], b[16];
            OUT out[16];
       
            PARTS:
            Or(a=a[0],b=b[0],out=out[0]);
            Or(a=a[1],b=b[1],out=out[1]);
            Or(a=a[2],b=b[2],out=out[2]);
            Or(a=a[3],b=b[3],out=out[3]);
            Or(a=a[4],b=b[4],out=out[4]);
            Or(a=a[5],b=b[5],out=out[5]);
            Or(a=a[6],b=b[6],out=out[6]);
            Or(a=a[7],b=b[7],out=out[7]);
            Or(a=a[8],b=b[8],out=out[8]);
            Or(a=a[9],b=b[9],out=out[9]);
            Or(a=a[10],b=b[10],out=out[10]);
            Or(a=a[11],b=b[11],out=out[11]);
            Or(a=a[12],b=b[12],out=out[12]);
            Or(a=a[13],b=b[13],out=out[13]);
            Or(a=a[14],b=b[14],out=out[14]);
            Or(a=a[15],b=b[15],out=out[15]);
        }
    4) Mux16
        /**
         * 16-bit multiplexor:
         * for i = 0..15 out[i] = a[i] if sel == 0
         *                        b[i] if sel == 1
         */
       
        CHIP Mux16 {
            IN a[16], b[16], sel;
            OUT out[16];
       
            PARTS:
            Mux(a=a[0],b=b[0],sel=sel,out=out[0]);
            Mux(a=a[1],b=b[1],sel=sel,out=out[1]);
            Mux(a=a[2],b=b[2],sel=sel,out=out[2]);
            Mux(a=a[3],b=b[3],sel=sel,out=out[3]);
            Mux(a=a[4],b=b[4],sel=sel,out=out[4]);
            Mux(a=a[5],b=b[5],sel=sel,out=out[5]);
            Mux(a=a[6],b=b[6],sel=sel,out=out[6]);
            Mux(a=a[7],b=b[7],sel=sel,out=out[7]);
            Mux(a=a[8],b=b[8],sel=sel,out=out[8]);
            Mux(a=a[9],b=b[9],sel=sel,out=out[9]);
            Mux(a=a[10],b=b[10],sel=sel,out=out[10]);
            Mux(a=a[11],b=b[11],sel=sel,out=out[11]);
            Mux(a=a[12],b=b[12],sel=sel,out=out[12]);
            Mux(a=a[13],b=b[13],sel=sel,out=out[13]);
            Mux(a=a[14],b=b[14],sel=sel,out=out[14]);
            Mux(a=a[15],b=b[15],sel=sel,out=out[15]);
        }
4 多通道逻辑门
    1) Or8Way
        /**
         * 8-way Or:
         * out = (in[0] or in[1] or ... or in[7])
         */
       
        CHIP Or8Way {
            IN in[8];
            OUT out;
       
            PARTS:
            Or(a=in[0],b=in[1],out=tp1);
            Or(a=in[2],b=in[3],out=tp2);
            Or(a=in[4],b=in[5],out=tp3);
            Or(a=in[6],b=in[7],out=tp4);
            Or(a=tp1,b=tp2,out=tp5);
            Or(a=tp3,b=tp4,out=tp6);
            Or(a=tp5,b=tp6,out=out);
        }
    2) Mux4Way16
        /**
         * 4-way 16-bit multiplexor:
         * out = a if sel == 00
         *       b if sel == 01
         *       c if sel == 10
         *       d if sel == 11
         */
       
        CHIP Mux4Way16 {
            IN a[16], b[16], c[16], d[16], sel[2];
            OUT out[16];
       
            PARTS:   
            Mux16(a=a,b=b,sel=sel[0],out=tp1);
            Mux16(a=c,b=d,sel=sel[0],out=tp2);
            Mux16(a=tp1,b=tp2,sel=sel[1],out=out);
        }
    3) Mux8Way16
        /**
         * 8-way 16-bit multiplexor:
         * out = a if sel == 000
         *       b if sel == 001
         *       etc.
         *       h if sel == 111
         */
       
        CHIP Mux8Way16 {
            IN a[16], b[16], c[16], d[16],
               e[16], f[16], g[16], h[16],
               sel[3];
            OUT out[16];
       
            PARTS:
            Mux4Way16(a=a,b=b,c=c,d=d,sel=sel[0..1],out=tp1);
            Mux4Way16(a=e,b=f,c=g,d=h,sel=sel[0..1],out=tp2);
            Mux16(a=tp1,b=tp2,sel=sel[2],out=out);
        }
    4) DMux4Way
        /**
         * 4-way demultiplexor:
         * {a, b, c, d} = {in, 0, 0, 0} if sel == 00
         *                {0, in, 0, 0} if sel == 01
         *                {0, 0, in, 0} if sel == 10
         *                {0, 0, 0, in} if sel == 11
         */
       
        CHIP DMux4Way {
            IN in, sel[2];
            OUT a, b, c, d;
       
            PARTS:
            Not(in=sel[0],out=nsel0);
            Not(in=sel[1],out=nsel1);
           
            And(a=in,b=nsel0,out=a1);
            And(a=a1,b=nsel1,out=a);
           
            And(a=in,b=sel[0],out=b1);
            And(a=b1,b=nsel1,out=b);
           
            And(a=in,b=nsel0,out=c1);
            And(a=c1,b=sel[1],out=c);
           
            And(a=in,b=sel[0],out=d1);
            And(a=d1,b=sel[1],out=d);
        }
    5) DMux8Way
        /**
         * 8-way demultiplexor:
         * {a, b, c, d, e, f, g, h} = {in, 0, 0, 0, 0, 0, 0, 0} if sel == 000
         *                            {0, in, 0, 0, 0, 0, 0, 0} if sel == 001
         *                            etc.
         *                            {0, 0, 0, 0, 0, 0, 0, in} if sel == 111
         */
       
        CHIP DMux8Way {
            IN in, sel[3];
            OUT a, b, c, d, e, f, g, h;
       
            PARTS:
            DMux4Way(in=in,sel=sel[0..1],a=a1,b=b1,c=c1,d=d1);
            DMux4Way(in=in,sel=sel[0..1],a=e1,b=f1,c=g1,d=h1);
            Not(in=sel[2],out=nsel2);
            And(a=a1,b=nsel2,out=a);
            And(a=b1,b=nsel2,out=b);
            And(a=c1,b=nsel2,out=c);
            And(a=d1,b=nsel2,out=d);
            And(a=e1,b=sel[2],out=e);
            And(a=f1,b=sel[2],out=f);
            And(a=g1,b=sel[2],out=g);
            And(a=h1,b=sel[2],out=h);
        }

时间: 2024-08-25 21:06:43

计算机系统要素-第一章 布尔逻辑的相关文章

2018-2019-1 20189215 《深入理解计算机系统》第一章

第一章 计算机系统漫游 主要内容 全面精炼的概括了本书的内容,也就是"计算机系统概述",包括: 1.解释计算机系统中"信息"的概念:就是二进制位: 2.解释源程序(以C源程序为例)到可执行程序的过程:预处理 → 编译 → 汇编 → 链接 3.通过可执行程序被shell加载执行流程,讲解了计算机的硬件组成: 总线.I/O设备.主存.处理器. 4.高级缓存的作用以及计算机存储设备的体系结构--金字塔层次结构. 5.解释了操作系统.应用进程.计算机硬件三者之间的关系:操作

《深入理解计算机系统》第一章计算机系统漫游

信息就是位+上下文 系统中所有信息都是由一串位表示的.区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文. 程序被其他程序翻译成不同的格式     范例代码 1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 printf("hello world\n"); 10 11 } 每条C语言都必须被其他程序转化为机器指令,以可执行目标程序的格式打包好,以二进制文件形式存放 转化过程分为: 预处理阶段:读取系统头文件stdio

深入理解计算机系统,第一章:漫游

计算机系统漫游 1.1 信息就是位+上下文 先看一个简单的Hello World C程序. 1 #include <stdio.h> 2 3 void main() 4 { 5 printf("Hello World!\n"); 6 } 这个程序的源文件是文本格式,以字节序列的方式存储在文件中,由一种叫ASCII码的方式编码.除了文本文件之外的其它文件都是二进制文件. 由HelloWorld程序的存储方式可以猜测,信息,包括磁盘文件.内存中运行的程序.内存中储存的用户数据以

计算机系统要素-第二章 布尔运算

1 本章构建完整的算术逻辑单元ALU.2 有符号的二进制数    1) 补码:x的补码=2的n次方-x,即反码+1    2) 减法可以看成x-y=x+(-y)3 加法器    1) HalfAdder 半加器        /**         * Computes the sum of two bits.         */                CHIP HalfAdder {            IN a, b;    // 1-bit inputs           

《深入理解计算机系统》 第一章读书笔记

最近开始啃CSAPP,买了英文版,看得比较慢.只有先理解系统才能在更多方面学的更明其实质 Chapter1: * 一份hello.c代码的编译分为四个阶段:1.Pre-processor:编译预处理,就是把#include后面的库代码加入到程序中,生成hello.i的文件. 2.Complier:用编译器把hello.i的C代码翻译成汇编语言,并生成:hello.s文件.(汇编语言是高级语言转为机器码的一个中间过程) 3.Assembler:汇编机把汇编语言翻译成机器二进制代码,生成hello.

《深入理解计算机系统》第一章学习笔记

信息就是位+上下文 源程序:就是一个由0和1组合的位(bit)序列,8位组成一字(byte),每个字节表示某个文本字符. 系统中所有的信息--包括磁盘文件.存储器中的程序.存储器中存放的用户数据以及网络上传送的数据,都是由一串位表示的.区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文. C语言的起源: 由Dennis Ritchie在1969年~1973年创建的. 美国国家标准学会(American National Standards Institute,ANSI)在1989年颁布了

读书笔记_深入理解计算机系统_第一章_计算机系统漫游

hello.c #incude <stdio.h> int main() { printf("Hello,world\n"); } 1.1信息就是位+上下文 系统所有的信息,都是由一串位表示的. 在不同的上下文中(可以理解为程序,或者运算),一个同样的字节序列可能表示一个整数,浮点数,字符串或者机器指令. 2.2程序被其他程序翻译成不同的格式 如Hello程序,从源文件hello.c中的每条C语句,需被其他程序转换为一系列低级语言(汇编)指令,然后将这些指令按照一种称为可执

第一章 数字逻辑基础 (西交)

计算机组成原理_第一章:计算机系统概论

第一章:计算机系统概论 1.1 计算机系统简介 问题1:现代计算机系统由那两部分组成? 现代计算机的多态性 CPS:信息物理系统 HPC:高速计算机,天河2号,Titan(Cray公司的,科磊公司) TF:TFlop/s:TF是千万亿次单位,每秒多少千万亿次计算. 顶层的抽象,然后再一步一步的细化. 基本结构都具有共性特征 两部分:硬件和软件(物理和逻辑?) 一般分为9层 1.2 计算机系统的层次结构 (程序员视角) (从最低到最高) 微指令系统--微程序机器M0,向下发展的语言.-- 由硬件直