构造一个加法机

二进制加法


  任何一个二进制数都是由一个以上的比特组成,是一个比特串。为了突出组成它的每个比特,一个二进制数可以表示成(如果它包含了6比特的话):

  在这里,a0...a5都是单个的比特,是这个二进制数的每一位。所以,如果a5a4a3a2a1a0=110101,那么它们的对应关系就如图所示。

  如果两个二进制数相加时,先把它们右对齐,叠在一起:

  因为最先相加的是最右边那一列,即a0和b0,所以这里没有从其他列来进位,属于单纯的两个比特相加。不考虑其他列的进位时,两个比特相加有4种可能,如下图:

  倒数第二列不是单纯的a1和b1相加,还可能会收到最右边那列的进位,这样一列实际上就是三个比特相加。如果存在其他列的进位时,两个比特相加有下面4种可能。

全加器

  二进制做加法时,不管哪一列相加,情况都和刚才讨论的一样,每一列都有可能需要加上前一列的进位,相加的结果可能是0,也有可能是1,并且它自己也可能会把一个进位1给到下一位。

  既然加法都是按列进行的,而且每一列的计算过程都一样,那么完全可以设计一个电路(内部实现忽略)来完成每一列的相加过程。下面是全加器示意图:

  在图中,A和B分别是来自被加数和加数的一个比特,它们正好在同一列上;C1是来自右边一列的进位;C0是本列产生的进数;S是本列的“和”。为了表明这个电路的用途,我们在图的中间加了一个求和符号。

加法机

  有了全加器,解决了二进制加法过程中每一列的计算问题,那么,我们可以搞一大堆全加器,根据被加数和加数的比特数,把它们串联起来组成一个完整的加法电路。

  图中,两个二进制数a2a1a0和b2b1b0分别是被加数和加数,组成它们的每一个比特都可以用开关的闭合与断开来得到,而S3S2S1S0则是加法的结果。当然,它只能计算3位二进制的加法,要是你觉得少,想要计算更大的,更多比特的二进制数,就要使用更过的全加器。

  当把所有的全加器连接在一起,封装到一起的时候,我们就会看到一个完整的加法机。要想使他真正工作起来,需要用一些开关从电源取电,为它输入两个二进制数。同时,还可以将所有的输出和灯泡连接起来,这样就能直观地看到相加的结果。

  下面,把加法机画成了两边高中间凹的桶形,这很形象地表明它要接收两路输入,相加后形成一路输出。使用两排开关分别给出被加数和加数,加法机就会算出结果。

使用总线

  下图中的RA和TB是临时寄存器,其中的GA和GB用来同时控制控制总线上面多条线路的通断。上面电路图中的加数、被加数是两个输入,这里被放到一了起。

  在工作之前,KGA、KGB、KRA、KTR都是断开的。我们采用的例子是计算:10+5+7+2+6

  1.我们首先要做的是用左边那排开关扳出第一个数“10”,接下来,按住KGA不要松,使GA打开,于是数据达到寄存器RA;接着,再按一下KRA,引发一个上升沿,架构数据锁进RA,最后,松开KGA。装载过程已经结束,第一个数“10”已经位于寄存器RA中了。

  2.现在,我们要用第二个数与他相加。这需要再次扳动那排开关,得到第二个数字“5”。然后,按住KGA不要松开,使“5”进入加法器下面的输入端(上面操作也会到达这个输入端)。由于RA中保留着数字“10”,加法器是自动即时相加的,它会立即计算出相加的结果“15”。此时,按一下KTR,引发一个上升沿,将运算结果保存到临时寄存器TB中,然后松开KGA

  3.直接按住不要KGB松手,使计算结果从寄存器TR通过GB流向RA;接着,按一下KRA将数据锁存,最后将KGB松开。

  在这到加法题中,除了第一个数字“10”需要预先保存到寄存器RA之外,从第二个数字“5”开始,一直到最后的数字“6”,所有数字在相加的操作过程都是一样的,都要经历用开关扳数、相加并保存到寄存器TR,然后从TR移动到RA的过程,这个过程可以简单地称为“相加”。当最后一个数完成之后,最终的结果仍然在寄存器RA中。

控制器

  下面对加法器进行优化,引入循环移位寄存器RR,它有两个输出t0和t1,并且可以设置一个初始状态,然后t0和t1的状态会交替变换。

  现在分析一下这个新的设计是如何运作的。在开始之前,应该先设置循环移位寄存器RR的初始状态,使它的两个输出t0和t1分别为1和0。

  装载1.装载第一个数字到寄存器RA,这需要用左边那排开关来扳出这个数字。接着,闭合K装载,断开K相加,下面是装载数据的电路状态。

  IGA=1,现在数据已经送到寄存器RA的嘴边了(可以参考“使用总线”一节的电路),但是它还是吃不了,因为IRA=0。如果想让数据保存到RA中去,必须按下K。

  装载2.现在,我们按下开关K。随着K的接通,将同时产生两个脉冲,第一路通过非门到达循环移位寄存器RR。遗憾的是,这是一个由高到低的下降沿,RR不会理睬。这也意味着,“我们得新电路”仍然保持原来的输出纹丝不动。

  与此同时,另一路脉冲被直接送到与IRA相连的与门,使得IRA从0变到1。在它的上升沿,寄存器RA将数据锁存。

  装载3.因为是按键开关,当我们一撒手,K马上又松开了。按键松开的瞬间,它产生的是“0”经过非门后变成“1”。这个变化对于循环移位寄存器RR来说是个不折不扣的上升沿。于是,循环移位一次,t0=0而t1=1,下面电路状态中的所有输出都是0。

  现在数据装载完毕,你有两个选择:第一,要是你觉得刚才装载的数据不对,想重新装载一次,可以直接再按一次K;第二,如果你准备开始做加法,干“相加”的活,就断开K装载,合上K相加

  相加1.我们再用那排开关准备好第二个要相加的数,并断开K装载,合上K相加

  

  相加2.现在按下K执行第一个动作,和前面一样,先是ITR‘和K来的上升沿脉冲一起,使得ITR从0翻转到1,临时寄存器TR锁存相加的结果。

  相加3.当K松开时,RR再次循环移动一次,t0=0、t1=1,IGB状态打开。

  相加4.现在相加的结果已经来到了寄存器RA的眼皮底下,只要再按一下K,使得IRA和从K来的上升沿脉冲一起,把IRA从0翻转到1即可。在这个上升沿,寄存器RA锁存相加结果。

  

  松开K时,循环移位寄存器从非门哪里得到一个从0到1的上升沿脉冲,故在此循环移位,使得t0=1、t1=0,于是整个电路又回到了“相加”过程的最开始。

  这意味着,要做一连串的加法,除了最开始要将第一个数装载到寄存器RA之外,其他都是单纯的相加。所以,这意味着,从现在开始,你可以按照“用开关扳数——按两次K——用开关扳数——按两次K——......”这样的模式将所有的数都加完,最终的结果就在寄存器RA中。

  经常的,我们听别人说每台计算机里都有一个控制器,它可以使整个计算器按照规定的步骤有条不紊地计算。事实上,我们现在讲的这个电路就是一个控制器。

构造一个加法机,码迷,mamicode.com

时间: 2024-10-10 05:36:49

构造一个加法机的相关文章

linux内核分析 第三周 构造一个简单的Linux系统MenuOS

一.计算机的三个法宝 存储程序计算机,函数调用堆栈,中断二.操作系统的两把剑:1.中断上下文的切换,保存现场和恢复现场2.进程上下文的切换. 三.linux内核源代码的分析: ·arch/目录保存支持多种CPU类型的源代码,重点是x86·init目录:含有main.c,内核启动相关的代码基本都在init目录下·ipc目录:进程间的通信·kernel目录:有Linux内核的核心代码.四.构造一个简单的Linux系统 使用实验楼的虚拟机打开shell 1.cd LinuxKernel/2.qemu

作业3:构造一个简单的Linux系统MenuOS 20135115臧文君

构造一个简单的Linux系统MenuOS 注:作者:臧文君,原创作品转载请注明出处,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内核源代码介绍 1.根目录 arch/x86目录下的代码是我们重点关注的,arch中包括支持不同CPU的源代码. init目录下包含内核启动相关的代码,如main.c(start_kernel函数相当于普通C程序的main函数,是Linux内核初始化的起点). ipc

Linux内核设计第三周——构造一个简单的Linux系统

Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核源代码分析 arch/目录保存支持多种CPU类型的源代码 其中的关键目录包括:Documentation.drivers.firewall.fs(文件系统).include init目录:含有main.c,内核启动相关的代码基本都在init目录下 start_kernal()函数为启动函数,初始化内

构造一个随机发生器

http://m.blog.csdn.net/blog/u012605629/40406577 构造一个随机发生器 2014-10-23阅读83 评论0 2.已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,使得它构造0和1的概率均为 1/2:构造一个发生器,使得它构造1.2.3 的概率均为 1/3: ...,构造一个发生器,使得它构造 1.2.3....n 的概率均为1/n,要求复杂度最低. /* 2.已知一随机发生器,产生0的概率是p,产生1的概率是1-p,

20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS

Linux内核分析第三周  构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 进程上下文的切换 第一讲  Linux内核源代码介绍 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录.PC机一般都基于此目录. init目录包含核心的初始化代码(不是系统的引导代

《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS

构造一个简单的Linux系统MenuOS 一.linux内核源代码简介 三大法宝(存储程序计算机.函数调用堆栈.中断)和两把宝剑(中断上下文的切换:保存现场和恢复现场.进程上下文的切换) 1.在linux内核源码里面arch占有的代码量相当庞大.arch/x86目录下的代码是我们重点关注的. 2.内核启动相关的代码基本都在init目录下(main.c). start_kernel是初始化linux内核的起点. start_kernel相当于c程序中的main函数 3.linux内核的核心代码在k

构造一个简单的Linux内核的MenuOS

---恢复内容开始--- 一.Linux内核源代码简介 arch/x86目录下的代码是我们最重点关注的 fs/文件系统 init/内核启动相关的代码 start_kernel函数相当于C语言的main函数 kernel/Linux内核的核心代码 mm/内存管理代码 二.构造一个简单的Linux系统 使用实验楼构造的实验截图: 自己搭建实验楼的过程:    三.使用gdb跟踪调试Linux内核的方法 一.使用gdb跟踪调试Linux内核的方法 (1)使用gdb跟踪调试内核,冻结起来 (2)使用水平

[daily][dpdk] 网卡offload识别包类型;如何模拟环境构造一个vlan包

第一部分 硬件识别包类型 网卡,是可以识别包类型的.在dpdk的API中.识别完之后,存在这个结构里: struct rte_mbuf { ...... union { uint32_t packet_type; /**< L2/L3/L4 and tunnel information. */ struct { uint32_t l2_type:4; /**< (Outer) L2 type. */ uint32_t l3_type:4; /**< (Outer) L3 type. */

Linux内核分析 笔记三 构造一个简单的Linux系统MenuOS ——by王玥

一.知识点总结 (一)Linux源代码简介 arch/x86目录下的代码是我们重点关注的 内核启动相关代码都在init目录下 start_kernel函数相当于普通C程序的main函数 linux的核心代码都在kernel目录中 arch/ 支持不同cpu的源代码 Documentations/ 文档存储 init/ 内核启动相关代码 kenerl/ 进程调度相关代码 ipc/ 进程间通信 lib/ 公共库文件 mm/ 内存管理相关的代码 (二)构造一个简单的Linux系统 启动MenuOS系统