大家好我是科岩。
查了上次文章更新时间竟然是4月底,足足一个月没有发文,五一假期后一直拖更到现在,虽然还没多少关注,但还是比较自责,毕竟其他公众号可都是日更啊,连个周更我都做不到么?
不过这个月我也一直没闲着,文章结尾告诉大家最近在弄啥。
在文章「嵌入式工程师的自我修养」中,我引入过一个技术问题:
有2个设备A、B,通过网络连通可交互数据,其中A有外接按键,B有小显示屏。
2个设备实现这样的程序:A键盘上按下某个按键,B显示屏将按键值显示出来。
请问:从A按下按键那一刻起,到B显示屏看到按键值,”按键值“这个数据是怎么从A的按键传输到B的显示屏的?
科岩写了一个系列的文章,尝试回答下这个问题。
半导体原理,看这篇:「一沙一世界」之半导体与MOS管
逻辑运算与门电路的关系,看这篇:「一沙一世界」之门电路是个啥?
编码和进制的作用,这篇:「一沙一世界」之编码与进制
如何用硬件电路算加法,这篇:「一沙一世界」之硬件加法器
上篇文章《「一沙一世界」之触发器是个啥?》我们聊到了计算机记忆的基本单元,「触发器」的电路实现,最后画出了一个R-S触发器的框图,它有2个输入端,2个输出端:
R-S触发器最大特点就是它能记住2个输入端的状态。想要记住上一次的状态时,把2个输入端都置0就可以了。
还记得上篇文章中我们提出的那个需求吗,做一个什么器件连在加法器的输出上,这个器件能够保存加法器输出的8位数的和,并将算好的和再作为一个参数输入传递给加法器,从而实现一个累加器。
R-S触发器只能记住1位数据的状态,怎样能记住8位呢,这篇就来讲讲。
1个R-S触发器能存1位数据,所以需要8个R-S触发器;1个R-S触发器,有2个输入端2个输出端,8个就是16个输入端,16个输出端。
而我们需要的是一个8输入、8输出的器件,我们得想办法简化R-S触发器。
观察一下R-S触发器,虽然有2个数据输入端和2个数据输出端,但实际上它只能保存1种状态,即保存1个bit数据位,因为Q和Q`的状态一定是相反的。
要保存数据时,需要把2个数据输入端都置成低电平。
这有点麻烦,因为要同时控制两个端;又有点浪费,明明只能存一位数据却用了2根线;还有点耦合,因为数据输入端也有控制作用,同时也是控制端,没区分开。
能不能把数据和控制分开,并且输入和输出只用一个数据端?
我们试着增加一个具有控制功能的「保持位」,它能决定电路当前的状态是否被「记住」。
当「保持位」为1时,数据输入的值就会被电路记住,当保持位为0时,数据输入位的任何值都不会影响电路的状态。
先画一下这个理想电路的真值表:
试着用R-S触发器搭建和这个表对应的电路:
这个电路实现了我们要的保持位的效果,保持为为1时,电路状态与R-S触发器相同;保持位置0时,相当于S和R为0,电路保存当前状态。
可这样又增加了一条线,能不能用一根线替换掉S和R这两根输入端呢?可以注意到,R与S的状态是相反的,所以很简单,用一个非门就可以了。
如上图,当保持位为1时,输出Q端与数据端相同;当保持位为0时,数据端怎么改变都不会影响电路状态,即电路会记住保持位最后一次置1时数据端的值,是不是很简洁很舒服。
上面这个电路被称为电平触发的D(Data)型触发器。
通常,保持位需要不断的在0和1之间有规律的按一定频率变化,这就像钟表一样,滴答滴答,永不知疲倦。所以我们给保持位换一个称呼:时钟(clock)。
这样用时钟控制的D触发器也称作「锁存器」,因为存储进去的数据就好像被锁住了一样。
把8个锁存器的时钟端接在一起,引出输入端D和输出端Q,就构成了一个8位的锁存器:
这个锁存器可以一次保存一个字节(8位数),把这个框图封装一下:
这个8位锁存器就是我们需要的那个新器件啦,把它和8位加法器相连,就能得到一个累加器:
来模拟一下它的运转过程。
最开始,输入A为0,锁存器中8个输出端数据也均为0,即输入B为0。
把输入A设为1,由于输入B为0,此时加法器输出与A相同。
这时把锁存器的时钟置1,锁存器电路状态改变,输出的值和加法器相同;再把时钟置0,锁存器保存加法器的结果,此时加法器的输出不会影响锁存器。
锁存器同时会把加和作为加法器的输入B传递给加法器,把A的值换成2,加法器会计算A和B的加和,锁存器时钟置1后置0,再保存加和,如此循环,就可以计算输入A的累加和了。
到此我们解决了记忆8位数据的问题,计算一系列数据的累加和时,只要改变输入A的值,不用再记录每次相加的结果了。
到此我有了一个更大胆的想法,是否能够把我们要计算的一系列数据全部保存起来,由系统自动计算他们的累加和呢?毕竟每算一次加和就要改变A的值既麻烦又容易出错。
但现在我们还只有一个能存储8位数据的存储单元,要保存一系列数据(比如100个数),就需要能存储更多数据的存储器来实现,下一篇跟大家聊聊内存的组成和原理。
知其然,知其所以然,我是科岩,我们下期见。
技术文结束啦,跟大家聊聊最近我在干啥。
我在学习怎么录视频,上周录了一期讲嵌入式工程师技术认知和等级划分的,其实就是这个公众号的第一篇文章《嵌入式工程师的自我修养》的视频版。
录视频的时候没感觉,剪辑时发现自己的缺点在镜头前暴露无遗,任何一个小毛病都会被放大,抖肩、抿嘴、舔嘴唇、磕磕巴巴。
剪完又觉得内容不够聚焦,过程也不吸引人。
不过还是发出去了,因为我觉得完成比完美重要,第一次不够好,后面的才更有空间嘛。
这些是我发视频的地址啦,不知你们偏爱哪个平台,欢迎大家关注起来,点赞评论啥的,支持一下啦:
B站:
知乎:没找到小程序分享页面,可以知乎搜「科岩」。
视频号:
---------------END---------------
文章到这里就结束了。
欢迎扫描下方二维码关注「科岩成果」~~~O(∩_∩)O~
你好,我是科岩。我做嵌入式工程师9年多了,目前在物联网创业公司任联合创始人。
我将持续分享个人的成长收获,帮助你提升技术能力与认知视野。另外我还听说,关注我的人个个都是人才,一起加油吧,人才们 :)