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

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
            OUT sum,    // Right bit of a + b
                carry;  // Left bit of a + b
       
            PARTS:
            Xor(a=a,b=b,out=sum);
            And(a=a,b=b,out=carry);
        }
       
    2) FullAdder 全加器
        /**
         * Computes the sum of three bits.
         */
       
        CHIP FullAdder {
            IN a, b, c;  // 1-bit inputs
            OUT sum,     // Right bit of a + b + c
                carry;   // Left bit of a + b + c
       
            PARTS:
            HalfAdder(a=a,b=b,sum=s1,carry=c1);
            HalfAdder(a=s1,b=c,sum=sum,carry=c2);
            Or(a=c1,b=c2,out=carry);
        }
   
    3) Add16 加法器
        /**
         * Adds two 16-bit values.
         * The most significant carry bit is ignored.
         */
       
        CHIP Add16 {
            IN a[16], b[16];
            OUT out[16];
       
            PARTS:
            HalfAdder(a=a[0],b=b[0],sum=out[0],carry=c1);
            FullAdder(a=a[1],b=b[1],c=c1,sum=out[1],carry=c2);
            FullAdder(a=a[2],b=b[2],c=c2,sum=out[2],carry=c3);
            FullAdder(a=a[3],b=b[3],c=c3,sum=out[3],carry=c4);
            FullAdder(a=a[4],b=b[4],c=c4,sum=out[4],carry=c5);
            FullAdder(a=a[5],b=b[5],c=c5,sum=out[5],carry=c6);
            FullAdder(a=a[6],b=b[6],c=c6,sum=out[6],carry=c7);
            FullAdder(a=a[7],b=b[7],c=c7,sum=out[7],carry=c8);
            FullAdder(a=a[8],b=b[8],c=c8,sum=out[8],carry=c9);
            FullAdder(a=a[9],b=b[9],c=c9,sum=out[9],carry=c10);
            FullAdder(a=a[10],b=b[10],c=c10,sum=out[10],carry=c11);
            FullAdder(a=a[11],b=b[11],c=c11,sum=out[11],carry=c12);
            FullAdder(a=a[12],b=b[12],c=c12,sum=out[12],carry=c13);
            FullAdder(a=a[13],b=b[13],c=c13,sum=out[13],carry=c14);
            FullAdder(a=a[14],b=b[14],c=c14,sum=out[14],carry=c15);
            FullAdder(a=a[15],b=b[15],c=c15,sum=out[15],carry=c16);
       
        }
    4) Inc16 增量器
        /**
         * 16-bit incrementer:
         * out = in + 1 (arithmetic addition)
         */
       
        CHIP Inc16 {
            IN in[16];
            OUT out[16];
       
            PARTS:
            Add16(a=in,b[1..15]=false,b[0]=true,out=out);
        }
       
4 算术逻辑单元ALU
    1) ALU
        /**
         * The ALU (Arithmetic Logic Unit).
         * Computes one of the following functions:
         * x+y, x-y, y-x, 0, 1, -1, x, y, -x, -y, !x, !y,
         * x+1, y+1, x-1, y-1, x&y, x|y on two 16-bit inputs,
         * according to 6 input bits denoted zx,nx,zy,ny,f,no.
         * In addition, the ALU computes two 1-bit outputs:
         * if the ALU output == 0, zr is set to 1; otherwise zr is set to 0;
         * if the ALU output < 0, ng is set to 1; otherwise ng is set to 0.
         */
       
        // Implementation: the ALU logic manipulates the x and y inputs
        // and operates on the resulting values, as follows:
        // if (zx == 1) set x = 0        // 16-bit constant
        // if (nx == 1) set x = !x       // bitwise not
        // if (zy == 1) set y = 0        // 16-bit constant
        // if (ny == 1) set y = !y       // bitwise not
        // if (f == 1)  set out = x + y  // integer 2‘s complement addition
        // if (f == 0)  set out = x & y  // bitwise and
        // if (no == 1) set out = !out   // bitwise not
        // if (out == 0) set zr = 1
        // if (out < 0) set ng = 1
       
        CHIP ALU {
            IN 
                x[16], y[16],  // 16-bit inputs       
                zx, // zero the x input?
                nx, // negate the x input?
                zy, // zero the y input?
                ny, // negate the y input?
                f,  // compute out = x + y (if 1) or x & y (if 0)
                no; // negate the out output?
       
            OUT
                out[16], // 16-bit output
                zr, // 1 if (out == 0), 0 otherwise
                ng; // 1 if (out < 0),  0 otherwise
       
            PARTS:
            Mux16(a=x,b[0..15]=false,sel=zx,out=x1);   
            Not16(in=x1,out=nx1);
            Mux16(a=x1,b=nx1,sel=nx,out=x2);
           
            Mux16(a=y,b[0..15]=false,sel=zy,out=y1);   
            Not16(in=y1,out=ny1);
            Mux16(a=y1,b=ny1,sel=ny,out=y2);
               
            Add16(a=x2,b=y2,out=o1);
            And16(a=x2,b=y2,out=o2);
           
            Mux16(a=o2,b=o1,sel=f,out=o3);
           
            Not16(in=o3,out=no3);
            Mux16(a=o3,b=no3,sel=no,out=o4);        
           
            And16(a[0..15]=true,b=o4,out=out);
            Or16Way(in=o4,out=o5);
            Not(in=o5,out=zr);
            And16(a=o4,b[0..14]=false,b[15]=true,out=ng1);   
            Or16Way(in=ng1,out=ng);   
        }

时间: 2024-12-19 22:32:00

计算机系统要素-第二章 布尔运算的相关文章

计算机系统基础 第二章(计算机系统概述) Fundament of Computer System ——公式记忆2

计算机系统基础 第二章(计算机系统概述)  Fundament of Computer System ——公式记忆2 2019-10-22 Tue. ♦ 1.浮点表示  任意实数X = (-1)S × M × RE S:Sign 符号位  (S取值0或1:决定 数X的符号) M:尾数 (尾数M的位数  反映 X的有效位数:决定 数X的表示精度:有效位数越多,表示精度就越高) R:基数  () E:Exponent 阶数 (阶E的位数决定数X的表示范围:阶E的值 确定 小数点的位置) 未完待续..

《深入理解计算机系统》第二章习题2_66

最近打算把<深入理解计算机系统>再读一遍,说实话这本书读多少遍都不嫌多,每读一遍都会有收获.这次决心把书中的习题整个过一遍,并把其中我认为比较典型的.有意思的写城博文记录一下,恩,这就是这篇博文的由来.恳请各路大神拍砖. 一. 问题描述(鉴于我这不忍直视的翻译水平,我就直接贴书中的问题描述了): Generate mask indicating leftmost 1 in x. Assume w = 32. For example 0xFF00 -> 0x8000, and 0x6600

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

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         /**         *

CSAPP深入理解计算机系统第二章荟萃

1.可以利用数字的算数右移,然后利用0XFF这样的数字做掩码运算,可以获取到一个数字的符号位.计算机的移位运算有一种很重要的作用就是利用掩码运算去提取一个位模式的一段信息. 2.在C语言中的条件语句,以及三目的条件运算符,都可以用移位的方式来做. 3.在进行位扩展操作的时候,比较讲一个32位的有符号数扩展到64位,那么在保证原来的值不变的情况下,把31个低位扩展到64位的低位上,而最高的符号位扩展到高33位上. 4.利用位模式仅仅只能表示一些2的n次幂的一些浮点数,其他的比较特殊的有理数,会近似

《深入理解计算机系统(第三版)》第二章 信息的表示和处理

<深入理解计算机系统(第三版)>第二章 信息的表示和处理 ??计算机本身是由处理器和存储器子通过系统组成.在核心部分,我们需要方法来表示基本数据类型,比如整数和实数运算的近似值.然后,我们考虑机器级指令如何操作这样的数据,以及编译器又如何将C程序翻译成这样的指令.接下来,研究几种实现处理器的方法,帮助我们更好的了解硬件资源如何被用来执行指令.理解了编译器和机器级代码,我们就能了解如何通过编写C程序以及编译它们来最大化程序的性能.本章主要使我了解了如何表示和执行应用程序,通过一些技巧,来写出安全

深入理解计算机系统 第二章 信息的表示和处理

欣哥划重点: @所有人, 第二章比较难,我建议至少掌握下面几个知识点: 1. 字节顺序 : 大端和小端 2. 运行 图2-24, 图2-25程序 show-bytes.c 观察结果,看看有什么问题 3. 理解布尔运算,位运算 4. 理解无符号数和有符号数, 给一个数,能计算出补码 5. 理解浮点数的表示法,给一个十进制小数,能转换成二进制的浮点数表示 原文地址:https://www.cnblogs.com/stone94/p/9824395.html

第二章 Android系统与嵌入式开发

第二章 Android系统与嵌入式开发 第二章首先要先了解Android和嵌入式Lnux系统有什么区别和联系,嵌入式Linux系统是在嵌入式设备中运行Linux系统:Android系统是在嵌入式设备中运行Android系统. 其区别就是Android系统和Linux系统的区别.Android系统的底层是Linux的内核,上面跑的是Android的java虚拟机.Android系统的UI做的比Lnux好很多. 首先我们应该先了解一下什么是嵌入式,对于嵌入式来说,它是一种“完全嵌入受控器件内部,为特

读《大道至简》-第二章之感想

很多时候,很多同学和老师都要讲,都要强调,人必须要勤奋,要学会坚持.但是,我看了<大道至简>第二章之后,觉得有些时候,往往不是勤奋就能够解决问题的,懒人往往就是造就天才的温床.      很简单,因为懒人往往不会想在一个方面去默默耕耘,明明知道这样子下去,事情不会有什么起色,倒不如去找找捷径.我不一定是这类懒人的典型,但是某些时候自己真的发觉再努力于某件毫无起色的事情,倒不如我去想想有没有什么其他更省事的方法去解决.懒人就是这样子,不希望自己做白费力气的事情.天才也是这样子造就的,通过对内里的

第二章 变量和数据类型

课时6:数据和数据类型 1.数据及数据类型 数据:指有用的信息 数据类型:对数据的分类 2.C#语言中的数据类型 Char字符类型 单个文字 (汉字,字母,数字,标点符号) 成对英文单引号表示 'A' string字符串类型 不限数量文字 (汉字,字母,数字,标点符号) 成对英文单引号示 "A" int整数类型 (简称整型) 表示一个整数 直接书写 100 double小数类型 表示包含小数点的数字 直接书写 1.1 课时7:认识变量 1.认识变量:一块存储数据的内存空间,并且该内存区