一个CPU光有”计算能力“是不够的,它也需要能够”记住“一些东西。寄存器就是负责”记忆“的。
我们之前通过改造SR触发器,得到了D触发器,并且当时就介绍到,D触发器可以存一位数据,我们后续会用到这个来制作寄存器。这一章我们将了解到如何通过D触发器制作一个8位的寄存器。
1位寄存器
我们从1位寄存器开始介绍,先来看下寄存器的原理图:
kalinote·2023-02-17·82 次阅读
一个CPU光有”计算能力“是不够的,它也需要能够”记住“一些东西。寄存器就是负责”记忆“的。
我们之前通过改造SR触发器,得到了D触发器,并且当时就介绍到,D触发器可以存一位数据,我们后续会用到这个来制作寄存器。这一章我们将了解到如何通过D触发器制作一个8位的寄存器。
我们从1位寄存器开始介绍,先来看下寄存器的原理图:
在上面的原理图中,用到了1个D触发器,可以看到一共有三个输入引脚,从左上角开始,最左上角的输入引脚是Load线,Load线下面的是Data线,最右边的是CLK。该电路一共由1个NOT门、两个AND门和一个OR门组成。
当Data线输入高电平时,如果Load线没有输入高电平,则AND门输出低电平,OR门输出由上方的AND门的输出决定,而上方的AND门与Load引脚间还有一个NOT门,因为Load线为低电平,则NOT门输出高电平,则上方的AND门由另一引脚决定,也就是由原来的D触发器的值决定。
如果Load输入高电平,则NOT门输出低电平,上方的AND门一定输出低电平。下方的AND门输出由Data线决定,由于上方的AND门为低电平,则OR门输出由下方的AND门决定,最后拉通就是D触发器的D引脚由Data线决定。此时如果时钟引脚拉高电平,则D触发器的值将变成Data线的输入值。
该电路会用到74LS04(NOT)芯片、74LS08(AND)芯片、74LS32(OR)芯片、74LS74(D触发器)芯片,这些芯片的相关资料可以在文章最底部找到。
在上面的动图中,黄色的线是Load线,棕色的线是Data线,并且我们将寄存器的CLK引脚连接到了从零开始的手搓CPU(5)——单步脉冲及脉冲模式切换一章所搭建的CPU时钟中,可以结合上方的描述,查看GIF中红色灯(寄存器值)的状态变化。
由8个上面的寄存器拼到一起,就能组成一个8位寄存器,由于我购买的仿真软件(玩具级的)可搭建面积太小,所以只做了一个4位的,如下:
在这里顺便推荐另一个仿真软件(iOS和iPadOS端):iCircuit,这个软件可以仿真许多电子电路和模拟电路,并且支持多种Arduino和51等嵌入式芯片,并且支持编写C语言代码运行,App Store售价88,不过在购买后还有付费服务,有更多的芯片和更强大的功能。不过我认为普通版已经足够强大了。有iPad,并且有这方面需求,或是对电路设计感兴趣的可以考虑入手。
我现在使用的是(包括在文章中使用)EveryCircuit,这个软件元件比较少,画布也比较小,但是仿真功能还不错,而且一次性买断,没有额外服务。并且支持跨平台,苹果、安卓、桌面平台都可以使用,授权证书跟着账号走,并且有网页版,也就是说,任何可以访问网页的地方都可以使用。同时创建的电路也会保存在云端服务器。不过EveryCircuit比较贵,而且不好购买,我是以前用Android机的时候在Google Play上买的,具体多少钱记不清了,好像是130还是180,性价比不太高。不过这个软件最大的缺点是登录账号需要使用代理网络,而且使用软件必须登录账号。
回到寄存器,如上上图所示,我们可以使用多个1位D触发器,将Load引脚和CLK引脚分别连接到一起,其操作方式与1位寄存器的操作方式相同。不过如果我们真的搭建8个D触发器,那么一个寄存器的体积将变得特别大,所以我们可以使用74LS173(4位寄存器)芯片,其资料也可以在本文最下方找到。
在上一章,也是从零开始的手搓CPU(8)——总线与三态门中,我们大概介绍了一下总线和寄存器的布局,当时我们有提到过:
引用自该系列文章第8章
正如我上方所说,不管是输入输出两组引脚分别连接到总线,还是只有一组引脚连接到总线,寄存器都是和总线直接相连的。但实际上,我们并不希望在任何时候,寄存器都把值放到总线上,也不希望在任何时候,总线都把值存到寄存器内。所以我们需要一个开关,用于控制数据的流动,开关关掉时,不让数据从总线存到寄存器,或不让寄存器把数据放到总线上。
这个开关,叫三态门。
当时有介绍到74LS245芯片,该芯片正好有8个三态门,我们使用1个74LS245芯片即可控制一个8位寄存器的数据流动。
将上面提到的电路整合搭建即可,原理图如下: