【从零开始自制CPU之学习篇07】最简单的ALU—全加器
ALU是算术逻辑单元,是CPU中重要的一部分,因为CPU本质上就是不断重复最简单的计算。而我们这一版CPU的ALU部分更为简单,是一个只能做加法的ALU。
理论部分
我们需要一个能帮我们进行数学计算的电路设计。一旦打通了这一关,可以说你已经了解了计算机的全部,因为计算机所做的一切,就只有计算,更绝对一点说,计算的一切,也就只有加法。在这里我做一个大胆的假设,正在阅读这篇文章的你已经知道了二进制的含义,那如何给自己做一个8位二进制数的加法计算器呢?它大概应该是这个样子。

其实这不是一个新知识,我相信给你足够的时间你一定会设计出来,你不妨在此暂停一段时间拿出一张纸试试。我们先从最简单的一位数相加开始,如何设计出一个一位数相加的计算器呢?我们首先应该整理出这样一张清晰的表,它列出了对每一种可能的输入情况所对应的输出结果,即 0+0=00;0+1=01;1+0=01;1+1=10,这种表叫做真值表。这里我们直接将进位也考虑进来。
| 加数A | 加数B | 加和输出S | 进位输出C1 |
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
有了真值表之后,我们就可以通过基本的逻辑运算来得到一个逻辑表达式。运算过程如下:

其中,加号(+)表示“或”运算,而输入项之间省略的乘号则表示“与”运算。我们选出所有能使结果为1的输入项组合,再进行取反操作和与运算,再使每项之间通过或运算相连。对此有疑惑的同学可以自己模拟一遍上面的运算过程,大概就能知道为什么要这么做了。
由运算结果我们得知,和就是异或门,进位就是与门。画出来就是下面这个样子,由于我们只考虑了向后进位,而没有考虑前一个数的进位,因此我们称这种装置为半加器。

如果将前一个进位考虑进来,只需再多一个半加器就可以了,至于为什么进位输出的加和没有用半加器而是用了一个或门,请暂停一分钟思考一下。这回我们已经建立好了一个完美的一位计算器,我们便可以自豪地称之为全加器。

全加器的逻辑实现我们同样可以用上面提到的真值表来完成。下面是全加器的真值表。
| 进位输入C0 | 加数A | 加数B | 进位输出C1 | 加和输出S |
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 1 |
| 0 | 1 | 0 | 0 | 1 |
| 0 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 | 1 |
| 1 | 0 | 1 | 1 | 0 |
| 1 | 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 1 |
对应的逻辑表达式如下:

一位计算器做出来之后,8位计算器就只需将全加器逐个拼起来即可,并且再次抽象整体,我们称之为8位加法器。

OK,大功告成。我不知道你此时的感受如何,不知不觉我们连续进行了3次抽象(即把之前的器件封装起来),有没有深刻体会到之前所说的你必须开始习惯这种抽象。每当一个复杂的构造被装进一个黑盒子里时,你便再也不要考虑里面的构造了,只要你做到了这一点,这三步的抽象便会是so easy。有了加法计算器,减法也就不是问题了,在本博客中将略去这部分内容,如果有兴趣,可以去了解一下计算机是如何用补码表示减法的,之后你会发现,减法就是加法。
实操部分
同8位的寄存器一样,插在我们面包板上的ALU,同样直接用一个集成电路实现,74LS283,以下为针脚图:

- A1-A4:加数A
- B1-B4:加数B
- C0:进位输入
- S1-S4:加和输出
- C4:进位输出
将两个拼一起则就是一个8位的加法器,同之前做的寄存器(两个)接在一起,输出到总线端再接一个三态控制,就完成了整个电路。
这个加法器不像之前的寄存器,有控制是否存入数据的信号,它无论如何都直接将加和计算出并从输出端输出。我们开启clk,手动将寄存器A(红色灯泡)和B(蓝色灯泡)设置几个数,就会看到ALU输出加和结果(黄色的灯泡,挤死了。。。)

参考视频:eater.net
【从零开始自制CPU之学习篇07】最简单的ALU—全加器的更多相关文章
- 【从零开始自制CPU之学习篇06】寄存器
上一篇文章学习了总线的相关知识,途中ABC当时假设为一个个的8位寄存器.这一篇要学习怎么构建这个寄存器. 这分为两个三个部分,数据输入,寄存器,数据输出.首先不管输出,来看数据输入和寄存器这两个部分. ...
- 【从零开始自制CPU之学习篇00】开篇
从今天开始决定用面包板制作一个8位的CPU,实现几个简单的指令.我给自己分两大部分计划,第一部分是学习制作CPU的理论知识,第二部分是实践.并打算实施计划的同时用博客的方式记录下来.理论知识的部分重点 ...
- 【从零开始自制CPU之学习篇03】锁存器与触发器
本篇学习了两种锁存器:SR Latch和D Latch,一种触发器:D flip flop SR Latch:SR—锁存器 初始状态下,S和R都为0,Q和Q‘随机有一个为1另一个 为0(取决于电流速度 ...
- 【从零开始自制CPU之学习篇05】总线
总线定义:总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为数据总线.地址总线和控制总线,分别用来传输数据.数 ...
- 【从零开始自制CPU之学习篇04】电容
电解电容: 多数在1μF以上,直接用数字表示.如:4.7μF.100μF.220μF等等.这种电容的两极有正负之分,长脚是正极. 独石电容: 独石电容器是多层陶瓷电容器的别称, 简称MLCC 读数方法 ...
- 【从零开始自制CPU之学习篇02】555定时器
555定时器是一种集成电路芯片,常被用于定时器.脉冲产生器和震荡电路.在CPU制作中作为pc(程序计数器)的主要组成部分.以下是我购买的NE555实拍图: NE555的针脚示意图: 555定时器各针脚 ...
- 【从零开始自制CPU之学习篇01】识别四色环电阻
制作CPU的好多部分都用到了各种阻值的电阻,由于我选购的是色环电阻,即电阻表面涂上一定颜色的色环,来代表这个电阻的阻值.因此通过色环来快速识别电阻阻值需要作为储备知识,不然一堆电阻插在面包板上很快就乱 ...
- Objective-C学习篇07—NSArray与NSMutableArray
大纲 NSArray NSMutableArray 快速枚举 NSArray NSArray是一个静态数组,也就是一个不可变数组,一旦创建以后,就不能进行添加,删除或者修改其中的元素.NSArray继 ...
- 【SWIFT】从零开始的SWIFT语言学习笔记-2:简单值、数组与字典
1.0.3 简单值.数组与字典 知识点: 使用var创建变量 var myVariable = 65 myVariable = myVariable + 1 使用let创建常量 let myConst ...
随机推荐
- Sublime插件:Terminal
这几天在window环境下用gulp构建前端工程,切来切去浪费了不少时间(右键sublime菜单打开文件所在目录,然后去项目根目录,右键打开cmder).这点webstorm自带的Terminal真的 ...
- SSM项目目录结构
- flink连接hbase方法及遇到的问题
1.继承 RichSinkFunction 类 mvn配置: <dependency> <groupId>org.apache.flink</groupId> &l ...
- [sublime] 利用sublime搭建C/C++编译器
gcc/g++配置 先去下载TDM-GCC安装包,这里附下载地址(可能会有弹出界面,不用管他). 现在c盘中建立文件夹 g++,然后以管理员运行,点击Create傻瓜式安装, 这里要改一下安装路径,保 ...
- Wish-递推DP记数
链接:https://nanti.jisuanke.com/t/35618 题意: 如果一个数大于等于 1010 且任意连续两位都是质数,那么就称之为 Wish 数.当然,第一个 Wish 数是 11 ...
- Y1E001 HDI二阶板、三阶板
简单说一下我的理解: 首先我认为几阶就是几次压合,我习惯用几次压合来形容.. 一阶板我认为就是一次压合,只能打一种机械孔,在表层把 一阶板是最普通的的多层板压合方式. 如下图所示,L2~L3为芯板CO ...
- Scrapy架构概述
Scrapy架构概述 1, 从最初自己编写的spiders,获取到start_url,并且封装成Request对象. 2,通过engine(引擎)调度给SCHEDULER(Requests管理调度器) ...
- HDU-AcmKeHaoWanLe训练实录
菜鸡队训练实录. 现场赛记录:[名称:奖项/排名] 2017: ICPC Shenyang:Gold/3 CCPC Hangzhou:Gold/3 ICPC Beijing:Gold/13 CCPC ...
- Linux 查询服务数据
1. htop 可以时时查看 2. free -m 查看缓存
- Java语法细节 - synchronized和volatile
目录 synchronized关键字 关键字volatile synchronized关键字 synchronized关键字锁住方法和this的不同之处: public synchronized vo ...