别拉扯那么多,尽量从实现者/掌控者的角度思考问题——多问自己“如果我想做到什么什么,应该怎么办”,不要问“别人是怎么实现的”,更不要问“电子元件怎么知道”。三者一个比一个离答案更远。
对这个问题,如果你问“如果我想和某个寄存器联系、同时又排除其他寄存器的干扰,我该怎么办”,那么问题就好回答了。
还记得逻辑门吗?
假设地址线有二十位,那么对于地址01101010101110011010,问题就转换为:设计一组逻辑门,使得输入只有满足“第一位是0且第二位是1且第三位是1且……第二十位是0”时,这组逻辑门才会输出1;否则输出0。
这很简单,对吧?
只要我们把0对应的那些位先送进一个“非门”,就能完成“逻辑翻转”——输入0非门输出1,输入1非门输出0,对吧?
然后,把这20位信息输入一个有20个输入端的“与”门,那么只要有一位是0,与门就会输出0,对吧?
这就相当于我们完成了“这个地址与我无关,所以我输出0”这个“地址识别”动作。
类似的,当20位信息都是1时,这组与门就会输出1——是的是的,这是我的地址!
这就是“地址识别逻辑电路”。
我们知道,数字集成电路往往有一根特殊的引脚叫做“片选”;只有给片选脚高电平,这个电路才会动作;否则它就不工作甚至不耗电。
实质上,我们同样可以给寄存器一个“片选输入”,只有这个输入得到了高电平,寄存器才在线。
现在,把前面那个“地址识别逻辑电路”的输出接到寄存器“片选”上,会发生什么?
如果把一大堆寄存器通过不同的“地址识别逻辑电路”接到总线上呢?
现在,CPU给地址总线送去一个信号,比如“01101010101110011010”(相当于跑讲台上大喊“李蕾!输出你的值/记住这个数字”);那么一大堆寄存器(或者内存或其他硬件)的“地址识别逻辑电路”就会得到一组高低电平,只有地址为“01101010101110011010”的那个寄存器的“地址识别逻辑”才会输出1,其它都输出0(相当于做了个“我是不是李蕾”的判断)——于是,其它寄存器全都“沉默”了,只有正确的那个才会活跃起来、和地址总线交换数据。
你看,这是不是就达到了“CPU想找谁,就能找到谁”这个目的呢?
这个问题就是这么简单;但前提是,你必须学会以设计者的视角思考问题。
依靠公式、规则,依靠做题套路,你就是永远掌握不了这个——这么简单的都掌握不了,复杂的……
但一旦反过来,你真正理解了、真正学会自己设计了——整本数字电路是不是也没啥东西?
这就是我一直强调的,学东西一定要学根本,一定要理解。
理解了根本,你就能有百倍千倍的学习效率;如果不理解,你看,就这么简单个问题,背上十年能背会吗?