《Code--隐匿在计算机软硬件背后的语言》——2、锁存器的硬件实现

本文内容为作者阅读书籍后的相关总结,仅供参考。
在《Code

1、减法器的实现

1.1 减法的实现

上一篇文章《Code–隐匿在计算机软硬件背后的语言》——1、采用继电器搭建计算机逻辑元件中的全加器解决了二进制加法中的进位问题。
图 1 无符号数相加

图 1 无符号数相加

我们处理减法运算时,需要借位这个操作,借位这个操作机制在计算机中实现比较麻烦,那就设计一种不涉及借位的减法;

比如我要两个数相减253-176 = 77;
计算机中哪有什么正负号,不管你正数负数,都是一串0和1。
原码
为了表示负数,那我现在把最高位做符号位,那八位二进制数1111 1111(-127) -> 1000 0000(-0) -> 0111 1111(127) -> 0000 0000 (0)
但是很显然,按照原码的方式计算会出错,-127和1加起来(1111 1111 + 0000 0001 )会等于0;
以下部分借鉴了这篇博客的第四部分

https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

同余 --> 补码
将钟表想象成是一个12进制数。如果当前时间是6点, 我希望将时间设置成4点, 需要怎么做呢?我们可以:

  1. 往回拨2个小时: 6 - 2 = 4
  2. 往前拨10个小时: (6 + 10) mod 12 = 4
  3. 往前拨10+12=22个小时: (6+22) mod 12 =4
  4. 2,3方法中的mod是指取模操作, 16 mod 12 =4 即用16除以12后的余数是4.
    所以钟表往回拨(减法)的结果可以用往前拨(加法)替代!

图2这里,我们做一个有1000个刻度的时钟圆盘,那么按照上述的同余方法,
如果我现在刻度是1,我想减去1,即1 - 1的操作,我可以指针向后拨1个刻度回到0,也可以指针向前拨999个刻度【(-1) mod 1000 = 999】,往前拨动999个刻度之后,刻度指到了刻度0,相当于数值0;
同理我要实现1 - 2,指针向前拨998个刻度【(-2)mod 1000 = 998】,刻度指到了999,相当于数值-1;
同理我要实现1 - 500,指针向前拨500个刻度【(-500)mod 1000 = 500】,刻度指到了501,相当于数值-499;
这里我们有一个操作是:把0 -> 999拆分成了0 -> 499和500 -> 999两部分;表现形式分别为0 -> 499和-500 ->-1,这种方式使得我们仍然用加法的操作实现了减法,只需将取出一部分正数当做表现形式上的负数即可,这样也没有借位的问题。
在这里插入图片描述

图2 同余实现减法操作

那么按照这种方式,处理我们之前的减法例子
253 - 176
= (253 mod 1000)+(-176 mod 1000)
= 253 + 824
= 1077
= 1077 mod 1000
= 77
而且小数减大数也可以计算
176 - 253
= (176 mod 1000)+ (-253 mod 1000)
= 176 + 747
= 923
= -77 mod 1000

那么同样的方法应用到二进制中,
图3 同余实现减法操作

图3 同余实现二进制减法

在八位二进制中,那就是取 1 0000 0000的模
回到最开始的例子
24-14
= 0001 1000 + (-14 mod 1 0000 0000)
= 0001 1000 + (-14 + 1111 1111 + 0000 0001)
= 0001 1000 + 1111 0010
= 1 0000 1010 mod 1 0000 0000
= 0000 1010
= 10(十进制)

图4 有符号数的二进制定义

图4 有符号数的二进制定义

同样我们只需定义一些数据为负数就行了。以上的说法如果从数学的角度分析的话,应该会更加清晰且有理有据,这里有点从结果推过程了,不过这种说法我还挺能理解的。

1.2 减法器的硬件实现

上述取mod的过程,
比如说-14,就是
-14 mod 1 0000 0000 =
1 0000 0000 -14 =
1 + 1111 1111 - 0000 1110 = (这里的1111 1111 - 0000 1110相当于把14取反 )
1 + 1111 0001 =
1111 0010

所以-14的mod的求解就是先把14取反再加1。

那么我们可以这么修改我们的加法器将其可以实现减法运算:
SUB引脚用于表示输入B是否为负数,SUB为1,表示输入的B为负数;SUB为0,表示输入的B为正数。
如果SUB为1,输入的B是负数,求补器将B取反,8位加法器的CI端输入值为1,相当于负数求mod后的加1操作。如果A + B < 0,CO为 0, 异或门的两个输入(此时SUB =1、CO = 0),此时上溢/下溢灯会被点亮,表示结果是一个负数。
如果SUB为0,输入的B是正数,求补器不取反,CI端加0。如果A+ B > 255,那么CO为1,异或门的两个输入(SUB = 0、CO = 1),此时上溢/下溢灯会被点亮,表示结果溢出255。
图4减法器的构造

图5 减法器的构造

2、反馈与触发器

2.1 振荡器的实现

在计算机系统中,我们会用到时钟信号以同步整个计算机系统的时间,用以同步处理各项任务。

下面采用继电器和反馈系统实现时钟信号的输出:

只要开关k1闭合,当k2打到上边,电路导通,继电器吸引k2打到下边;
然后电路断路,k2回弹至上边,电路再次导通,如此循环往复,继电器的动作是有时间的,所以继电器输出端的变化不会马上带来输入端的变化。

在这里插入图片描述

图6 振荡器

引一根输出线,继电器的输出如图所示:
在这里插入图片描述

图7 振荡器的输出

2.2 搭建触发器电路实现记忆功能(R-S触发器)

利用反馈机制,搭建了如下的触发器,触发器电路具有“记忆”的特点,通过特殊的结构可以使电路达到稳态。

S(Set)表示置位,R(Reset)表示复位。
当S为1,R为0时,S连接的或非门一定输出0,那么Q’为0,R连接的或非门输入全为0,那么Q为1;
当S为0,R为1时,R连接的或非门一定输出0,那么Q为0,S连接的或非门输入全为0,那么Q’为1;
S和R都为0时,Q和Q‘不变。比如Q为0,Q’相反为1,S连接的与非门输出为1,和Q’原状态一致,R连接的与非门输出为1,与Q原状态一致;当Q为0,Q’为1时同理。
S和R都为1时,Q和Q’全是0,但是设计的Q和Q’互为倒置关系,所以这种情况禁止。
在这里插入图片描述

图8 R-S触发器

在这里插入图片描述

图9 R-S触发器真值表

可以看到,R-S触发器的特点是,它会记录哪个输入端的最终状态是1。

2.3 电平触发的D型触发器

上述的R-S触发器,我们可以再次将其优化,希望可以记住在某个特定的时间点上信号是0还是1。

R-S触发器简单来说有三个功能:
1、置位,S = 1、R = 0时,将Q设置为1;
2、复位,S = 0、R = 1时,将Q设置为0;
3、保持,无论S和R如何变化,Q和Q’的输出不变。

在设置Q输出变化时,S和R相反,可以这样化简,只采用一个数据输入,然后采用一个反相器,即可满足S和R相反的情况,这时的数据输入叫做数据端;
保持的功能可以采用两个与门和一个保持位,需要保持数据时,保持位置零,图8中的保持位连接的两个与门,输出都为0;这样就对应R-S触发器的S和R输入都为0的情况了,输出保持。

当需要修改数据时,保持位为1,数据段输入数据即可修改数据。
在这里插入图片描述

图10 电平触发的D型触发器

保持位一般为时钟,在实际的计算机系统中,肯定是在时钟高电平期间进行数据的修改,不需要单独的指定一个保持位来进行操作,不然的话,需要大量的保持位对寄存器进行操作。
在这里插入图片描述

图11 电平触发的D型触发器真值表

2.4 8位锁存器

我们把八个电平触发的D型锁存器连在一起,就构建了一个8位锁存器。
当CLK为0时,即保持位为0,此时Q的值不变;当CLK为1时,即保持位为1,此时,D端的输入信号被送到Q端输出。

在这里插入图片描述

图13 8位锁存器

下面是结合加法器和锁存器搭建的连续加法器,八位锁存器保存八位加法器的加法结果,二选一选择器选择是采用上一次的加法结果还是采用新的数值,然后八位加法器进行运算,运算结果看情况保存至锁存器中。

下图是个连续加法器
1、第一次使用时,先不用锁存器的数据,锁存器不处于保持阶段,加法器计算两个加数的结果,计算完成之后,保存到锁存器中;
2、二选一选择器选择锁存器的数据进行加法计算,计算完成后的数据再保存到锁存器中,以此类推,进行连续加法。
在这里插入图片描述

图14 连续加法器

二选一选择器的结构很简单,如下图
在这里插入图片描述
在这里插入图片描述

2.5 边沿触发的D型触发器

相较于电平触发式的D触发器,边沿触发器只有在时钟从0到1变化的一瞬间,输出才会改变。
红色框线是第一个电平D触发器,蓝色框线是第二个电平D触发器。
当时钟为0时,第一个触发器可以修改数据,第二个触发器处于保持状态,输出保持不变,相当于整个结构不管输入如何变化,输出都不变;
当时钟变为1时,第一个触发器处于保持状态,第二个触发器读取第一个触发器的输出值,相当于第二个触发器只有在时钟从0到1这个阶段,才会获取到输入端的数据,第一个触发器处于保持状态,不管输入数据如何变化,输出端都不会改变。相当于整个结构只有在时钟从0到1的那一刻,才会读取到输入端的数据并且更新到输出,直到下一次时钟从0到1,输出都不会改变。
在这里插入图片描述

2.5 分频器

将振荡器的输出连接到边沿触发的D型触发器的时钟输入端,Q端的输出频率只有时钟频率的一半。
在这里插入图片描述
在这里插入图片描述

将多个分频器级联,不断级联,会越来越慢。
在这里插入图片描述
仔细观察 Q 1 Q_1 Q1 Q 2 0 Q_20 Q20 Q 3 Q_3 Q3的组合,会发现, Q 3 Q 2 Q 1 Q_3Q_2Q_1 Q3Q2Q1在逐渐加一,多个分频器级联组成了一个计数器。
在这里插入图片描述

我们将8个分频器级联后,就可以构成一个8位计数器:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值