@
目录一、引子
在这一小节中,我们要学习主存储器与 CPU 之间的连接。首先我们会回顾之前小节学习过的内容,我们已经知道了单块存储芯片它对外暴露出来的一些接口。
我们首先会探讨单块存储芯片和 CPU 之间的连接如何实现,接下来会介绍多块存储芯片和 CPU 之间的连接,分别是位扩展、字扩展和字位同时扩展。这个小节的最后我们还会补充一些关于译码器的知识。补充的内容可能在考题当中遇到。
这小节的内容可能会比较多,也比较硬核,特别是对于没有学过数字电路的同学,可能理解起来会比较吃力。
二、单块存储芯片与CPU的连接
先来回顾一下之前学过的内容。详情请戳:3.2主存储器的基本组成
我们需要对外暴露出这样的一些接口:
①绿色的线是用来传送数据的,通常会利用数据总线与CPU连接。
②红色的线是用来传送访问地址的,通常会通过地址总线和CPU连接。
③另外,还需要对外暴露片选线、读/写控制线,CPU通过控制总线来发送控制信号。
上面图示是一个8*8
的存储芯片。
因为图示一共有8个字(2^3),每个字的字长是8位。
这里只用了单块的存储芯片来存储数据,并且只能存储8B数据。
<1> 如果想要扩展主存储字数该怎么办呢?那么接下来我们学习字扩展法。
我们可以连接多块存储芯片来扩展主存的字数。
<2> 数据总线的宽度>存储芯片字长,怎么办?这里就需要用到位扩展法。
这里给出的存储芯片,它的字长只有8位,也就是CPU一次只能存或者取8bit数据。但是现在的CPU大多每次可以读或者写64位数据,也就是现代的计算机数据总线的宽度至少也要有64位。
之前说过,应该尽可能保证数据总线的宽度和主存的存储字长一样,只有这样才能尽可能的发挥数据总线的性能。(每次多存或者多取一些数据,可以让数据的读写速度更快)
所以现在问题产生了,我们现在拥有的单块存储芯片,如果它的芯片的字长比数据总线的宽度更小,怎么办?
这个小节要学习的位扩展就是要解决这个问题,通过多块存储芯片的合理连接,我们可以让整个主存的存储字长拓展为和数据总线宽度一致。
所以字扩展和位扩展就是小节要解决的两个主要问题。
三、多块存储芯片与CPU的连接
1.现代计算机
我们之前在讲存储芯片的时候,把 MAR 和MDR都画在了存储芯片里边。
但是现在的计算机通常 MAR、MDR 这两个寄存器都是集成在CPU内部的,所以现在的存储器当中,它里边的寄存器其实并不是 MDR和MAR,只不过是一个普通的寄存器而已。
因此现在大家使用的计算机一般来说是这样的一个结构,如下:
就是CPU里边集成了 MAR和 MDR。 MDR里边存储的数据,也就是要读或者要写的数据,是通过数据总线和主存进行交换的。而 MAR里边存储的地址数据,是通过地址总线送给主存。
另外, CPU 还需要通过控制总线向主存发送、读写这一类的控制信息。而现在的主存中一般会包含很多块的存储芯片,大家可以去淘宝或者京东上随便搜一下。
这是三星的一个 8GB 的内存条,它里边白色贴纸下面,大家注意看一下,总共有四块黑黑的存储芯片。
16GB 的内存条总共有 8 块。
所以多块存储芯片如何与CPU进行连接,这个问题是很有现实意义的,非常值得我们研究和探讨。
2.命名
接下来,为了描述方便,我们给一块存储芯片的各个输入信号和输出信号进行一个命名。
①地址我们通常用A
来表示,我们有可能需要输入多位的地址。A0、A1、A2……(因为地址是address,所以我们用A来表示)
A0 表示的是地址的低位, A7 表示的是地址的高位。当然了,地址也有可能有更多位。
②数据我们通常用D
来表示。(因为数据是data,所以使用D)
同样的, D0表示的是低位, D7表示的是高位。
③片选信号我们通常用CS
(cheap select )来表示。
如果CS上面画了一个横线,就说明这个片选信号是低电平的时候有效。而如果头上没有横线,就说明这个片选信号是高电平的时候有效。
大多数的教材都是把片选信号用CS
这样的英文缩写来表示。当然了,也有的教材会用CE
这样的缩写来表示,考试的时候说不定都可能遇到。
④读写控制线的信号,我们通常用WE
(Write)或者WR
(Read)这样的方式来表示。
上面画了一条横线的意思是当这个信号是低电频信号的时候,我们是在进行写操作,而如果是高电频信号,我们要进行的是读操作。
这两种英文缩写都是很常用的。当然了,也有的地方有可能会把读信号和写信号分开,用两个输入端输入,写信号用 WE表示,读信号用OE表示,都是低电频有效。
总之,这个地方想给大家强调的是存储芯片当中各种输入信号和输出信号常用的一些英文缩写。大家需要注意上面有没有横线,如果有横线说明低电频有效,没有横线说明高电频有效。
3.增加主存的存储字长--位扩展
(1)单块
接下来我们来看一下,如果此时我们已经买到了一块 8K 乘以 1 位
的存储芯片,那么单块的存储芯片应该如何和我们的 CPU 进行连接呢?
①地址线的连接
首先这块存储芯片总共有 8K 个存储单元, 8K 对应二进制应该是 2 的 13 次方,所以我们需要用 13 根地址线来表示这 8K 的地址。
因此这一块存储芯片对外暴露出的地址线的引脚应该是 A0 到A12,总共有 13 条。 CPU 会把它想要访问的地址通过地址总线给送过来,这样我们就完成了地址线的连接。
②WE信号
接下来看 WE
信号。这信号表示的是 writing enable 写使能信号,它的头上没有横杠,就说明当这个信号是一个高电平的时候,此时 CPU 是要往里边写数据。而如果传过来的是一个低电平信号,就表示 CPU 要从中读数据。
CPU 也会有一个金属引脚来发送读写控制信号,这个信号是通过控制总线传给芯片的。
③数据的传送
接下来再看数据的传送。虽然 CPU 可以通过数据总线同时读或者写8比特的数据,然而由于我们存储芯片的限制,我们每一次只能通过数据总线来传送一个比特。也就是数据总线的传输能力是利用的很不充分的。
不管怎么说,我们也已经完成了单块存储芯片和 CPU 的连接。
④CS
这个地方还有一个CS,也就是片选信号,我们还没有接。由于只有这一块芯片工作,所以我们可以简单粗暴地给它直接上一个高电平的信号。
因为 CS 的头上没有画横线,意味着片选信号是高电频有效。
此时我们整个主存只有一块存储芯片,每一次只能读或者写一位的数据,所以此时主存的存储字长就是1比特。数据总线并没有被充分的利用好。
(2)多块
为了解决这个问题,我们可以给主存再加上一块相同型号的存储芯片,同样也是 8K 乘以1位。
同样的 CPU 通过地址总线把它想要访问的地址信息传给这块芯片。
因为左边和右边这两块芯片,它们都有 8K 个存储单元,所以如果把 13 位的地址信息同时送给这两块芯片,地址信息可以选中这两块芯片相同位置的存储单元。
读写控制线也是一样的,我们只需要把CPU发出的这些读写控制信号同时送给两块芯片就可以,要么同时读,要么同时写。如下:
右边这一块芯片,从这儿读出的这一位数据,我们可以作为 CPU 读入的D1这一位的数据。如下:
接下来我们只需要给右边的片选信号,加一个高电频,这样这两块芯片就可以同时工作。如下:
进行了改造之后,我们整个主存储器总共有两块存储芯片。如下:
总体来看,存储器的存储字长拓展为了两位。现在我们可以同时读或者同时写两位的信息。
接下来使用同样的方法,我们还可以继续增加同类型的 6 块芯片。如下:
最终我们就可以得到这样的一个连接。如下:
每一块芯片都有 8K 个存储单元, CPU 发出的A0到 A12这13 位的地址信息会同时送给 8 片存储芯片。
由于每一块芯片的存储单元只有一个比特的数据,所以我们会把这 8 块存储芯片,它的这一位数据分别送到数据总线的不同位上。如下:
接下来,数据总线可以同时把这8位的信息送给CPU。
这样我们就把整个主存的存储字长拓展为了8比特。
这种连接方式,我们把它称为位扩展
的方式。我们把 8 片 8K 乘以 1 位的存储芯片连接组合成了 8K 乘以8位的存储器,总容量应该是8KB。
4.增加主存的存储字数--字扩展
(1)单块
接下来我们再来看第二种连接方式,叫做字扩展
的方式。
假设现在我们买了一片存储芯片,是 8K 乘以8位的。
CPU的结构是这样的:
CPU可以同时读或者写8位的信息。(D0~D7)
现在,由于我们的存储芯片,它的字长已经有8位了。因此这块存储芯片的字长,数据的宽度和 CPU 能够处理的宽度是能够完美匹配上的。
对于这个场景,我们不需要像之前那样进行位扩展,数据总线的传输能力已经被使用到极致了。
由于它有 8K 个存储单元,因此我们需要有 13 位的地址信息(A0~A12)。接下来再给片选信号,加一个高电频,这一块存储芯片就可以正常的工作了。
现在我们会发现 CPU 还有三个地址位的信息没有被利用到。如下:
CPU 的MAR
来是有 16 位,也就是CPU,它拥有 2 的 16 次方这样的一个寻址能力。然而,现在我们只利用了 13 位的地址信息,并没有完全发挥出 CPU 的寻址能力。
那我们如何解决这个问题?
(2)多块
同样的,我们会买一块同型号的芯片,我们试一试按照之前位扩展的那种连线方法,能不能解决问题。
也就是把低位的 13 根地址线也连到这一块新的芯片上。另外,这块芯片的8位数据,我们同样通过数据总线传送给CPU,读写控制信号也把它连起来。
接下来再给这块芯片一个高电平的片选信号。如下:
现在问题来了,当 CPU 给出一个全 0 的地址之后,这个地址是不是会同时传给左边和右边这两块芯片。
而由于此时这两块芯片的片选信号都是1,他们都在工作,因此,这两块芯片的 0 号存储单元的 8 个比特的信息都会顺着数据总线传给CPU。如下:
两边同时传,是不是就会导致数据总线的一个冲突?
(3)线选法
解决这个问题的关键就在于片选信号的使用。我们来改造一下电路。
现在我们把 A13 这一位的地址信息连到左边这块芯片, A14 连到右边这块芯片。
<1> 由于片选信号是高电频有效,因此,当 A13 和 A14分别为 1 和 0 的时候,是不是就意味着左边的这块芯片它的片选信号有效,它是被选中的。而右边这块芯片由于传过来的是一个零,因此它不会工作,它没有被选中。如下:
这种情况下, CPU 提供的低 13 位的地址,其实只会读取出左边这块芯片对应存储单元的8比特的数据。
<2> 现在换种情况,我们让 A13 和 A14 分别为 0 和1。这种情况下,右边这块芯片会被选中,而左边这块芯片输入信号,片选信号是0,它不会工作。此时 CPU 提供的低十三位的地址,其实指明的是右边这块芯片的一个存储单元。
<3> 现在看起来问题已经解决了,但是事情并没有那么简单。如果此时我们给A13、 A14 输入的都是两个1 的信号,那么这两块芯片是不是都会被选中?这样又出现了之前所说的问题,两边会同时读或者同时写数据,再次出现了冲突的情况。
所以如果我们采用这样的连线方式,想要让存储器正常的工作,我们只能允许 A14 和 A13 这两位要么为01,要么为10,不可以是11和00。
当 A14 为0, A13 为 1 的时候(01X XXXX XXXX XXXX),此时我们选中的是左边这块芯片。而 A14 为1, A13 为 0 的时候(10X XXXX XXXX XXXX),我们选中的是右边这块芯片。
我们再结合 A0 到 A12 这些更低位的 13 位,就会发现左边这块芯片,它所对应的地址应该是 010 0000 0000 0000 (最低地址),直到 011 1111 1111 1111(最高地址),这样的一个地址范围。总共有8k个地址。
而右边这块芯片,它所对应的地址应该是100 0000 0000 0000(最低地址)直到101 1111 1111 1111(最高地址),这样的一个范围。同样也是8k个地址。
此时如果把它们看作是一整个存储器,我们会发现在存储器当中, 00 开头的地址我们不能用,11开头的地址我们也不能用,所以这种连线方法是有待改进的。
这种连线方法称为线选法,指我们会用一个专门的地址线作为片选信号,来选中其中的某一块芯片。
如果 CPU 有 n 条多余的地址线,采用这种方法,我们就只能有 n 个片选信号。
(4)1-2译码器
接下来我们对线选法进行一个优化。
给 A13 输出的线路把它分两边接出去。上面这一端我们接了一个非门
。
画非门的核心在于前边这儿要有一个小圆圈。
<1> 假设此时CPU的A13输出信号是1,这条信号输出之后,下面这一条线我们应该接收到的是一个1,因为是一个直接的连接。如下:
而另外一条线, 1 这个信号经过非门的处理之后, 1 会变0,因为非门就是一个取反,所以右边芯片接收到的信号应该是 0 。如下:
由于片选信号是高电频有效,因此这种情况下左边这块芯片正在工作,右边没有工作。
此时 CPU 通过低 13 位的地址指明了要读出的是哪一个存储单元,读出的是左边这块芯片的数据。
<2> 接下来再换一种。如果此时A13 是0,左边这输入的片选信号应该是0,右边这输入的就是1。
因为进行了一个非门的取反,所以此时应该是右边这块芯片工作,左边这块芯片不工作。
因此这个时候 CPU 给出的低13 位数据,其实指明的是右边这块芯片的某一个存储单元,读出的是右边这块芯片的数据。
所以我们增加了这样的一个小电路之后,左边这块芯片,它的合法地址范围就变成了一个 1 后面再跟任意的 13 位地址信息(1X XXXX XXXX XXXX),而右边这块芯片应该是 0 开头后面 13 位任意的地址信息(0X XXXX XXXX XXXX)。
我们再结合 A0 到 A12 这些更低位的 13 位,就会发现左边这块芯片,它所对应的地址应该是 10 0000 0000 0000 (最低地址),直到 11 1111 1111 1111(最高地址),这样的一个地址范围。
而右边这块芯片,它所对应的地址应该是00 0000 0000 0000(最低地址)直到01 1111 1111 1111(最高地址),这样的一个范围。
进行这样的改造之后,我们会发现整个存储器它的地址空间就是从00 0000 0000 0000一直到11 1111 1111 1111 ,整个主存的地址空间是连续的。
我们这儿设计的小电路,可以把它看作是一个1-2译码器
。
什么叫1-2?
我们输入1位的地址信息,这1位的地址信息有可能呈现出 2 的一次方两种不同的状态。这两种不同的状态会被译码器翻译为要么是上面这条线高电平,要么是下面这条线高电平。这是1-2译码器的意思。如下:
(5)译码片选法
之前其实我们接触过更复杂的译码器,因此我们可以顺着这个思路往下优化。我们可以使用一个译码器来处理 CPU 的高位地址部分,这种方法我们把称为译码器片选法。
如果 CPU 能够给出 n 位的地址信息,那么通过译码器的翻译,我们可以得到 2 的 n 次方这么多个片选信号。来看一下:
这是我们之前小结中见过的一种译码器,它的输入端可以输入3个比特的数据,刚好可以和 A13 到 A15 对应上 3 位的地址信息,我们可以把它对应成 2 的 3 次方,也就是 8 种不同的状态。
因此, 译码器的输出端总共有 8 条线,我们可以给这 8 条线进行一个编号,分别是 0、1、2……7。
所以,如果输入端输入的是 3 个0,译码器的 0 号片选线就会被选通。如下:
也就是最上面这条线会发出一个高电频信号,下面这些线都是低电频。如下:
和之前的命名规则类似,我们可以把译码器把它命名为 3-8 译码器
。因为我们输入了 3 个信号,输出的是 8 个信号,所以叫 3-8 译码器,是不是类似的?
当然,也可以有 2-4 译码器,输入 2 个,输出 4 个。
接下来再看个例子,如果输入的是001,与这个二进制数对应的是十进制的1。因此此时译码器编号为1的这一根选通线会被选通,其他的线输出的都是低电平。如下:
又如果是010 ,对应十进制的2,所以译码器编号为2的这一根选通线会被选通,其他的选通线都保持低电平。如下:
我们给译码器的这些输出线的编号也可以是逆过来的。
四、主存容量扩展
1.主存容量扩展--字扩展
现在有了译码器之后,我们再来看一下如何更好地进行字扩展。
这儿,我们给出了一个 2-4译码器
,输入 2 个信号,输出 4 个信号。
在图示当中,我们搞了 4 块 8K乘以8位的存储芯片,每一块芯片我们都会接收 CPU 发过来的低 13 位的地址信息。
这些地址线如果是像刚才那样从上面连过来,这么画,整个图看起来会比较乱,所以我们这次改变了划线的方式。但是大家需要知道,并不是地址信息是从左边这块芯片传过来的。不是这个意思,所有的地址信息都是直接来自于地址总线,都是CPU传过来的。
另一点需要注意的是,我们这给出的图示当中,CS信号上面已经加了一条横线,要低电平才有效。
当我们在表示低电平有效的输入信号的时候,我们通常会在上面画一个小圆。所以大家在看书或者做题的时候, CS 还有 CS 上面一条横线,这两种情况都是有可能遇到的。如下:
既然是低电平有效,那就意味着我们要输入的是 0 这样的一个信号。所以译码器的输出端我们也画了一个小圆圈。如下:
非门的图示最重要的就是小圆圈,小圆可以理解为进行了一个取反。刚才我们不是说译码器的输出,会输出一个1,剩下全部0。现在我们把所有的这些位都取反,是不是就意味着输出的只有一个0,剩下的全是1。
好,这是大家看图的时候会遇到的一些小细节。
现在对于2-4译码器
,我们输入的是A13、 A14 这两位,如果这两位都是0,这个时候 0 号选通线会被选通,其余的这些片选信号都是无效的。如下:
类似的,如果 A13 为1, A14 为0,就是 1 号选通线被选通(二进制01对应的十进制为1)。只有第二片正在工作,其他的芯片都没有被选中。如下:
然后再结合着低13 位的信息,我们不难得出这样的结论。
如果我们要访问的是第一块芯片那么A14、A13 这两个高位必须为全0。这块芯片它所对应的存储地址的范围应该是00 0...0一直到00 1...1,总共 8K 个地址。
而第二块芯片就应该对应的是01,后面再跟上 13 位的地址,即01 0...0到01 1...1;第三块芯片应该是10,后面跟上 13 位的地址,即10 0...0到10 1...1;第四块芯片应该是11,后面跟上13 位的地址,即11 0...0到11 1...1。
所以采用译码片选法之后,我们就可以保证整个主存它合法的地址空间是从全 0 开始,一直到 15 个全 1。这是一个连续的地址范围,也是我们实际应用里边可以采取的一种设计思路。
标签:芯片,存储芯片,CPU,地址,3.5,主存储器,信号,译码器 From: https://www.cnblogs.com/wanjiadenghuo/p/17095056.html