3.6主存与CPU的连接

一、引子

在这里插入图片描述
由于单片存储芯片的容量总是有限的,很难满足实际的需要,因此必须将存储芯片连在一起才能组成足够的容量。这个过程简称主存扩容。常见的扩容方式有:字扩展,位扩展,字位同时扩展

主存与CPU的连接通过数据总线,地址总线,控制总线与CPU相连接
在这一小节中,我们要学习主存储器与 CPU 之间的连接。首先我们会回顾之前小节学习过的内容,我们已经知道了单块存储芯片对外暴露出来的一些接口。我们首先会探讨单块存储芯片和 CPU 之间的连接如何实现,接下来会介绍多块存储芯片和 CPU 之间的连接,分别是位扩展、字扩展和字位同时扩展。这个小节的最后我们还会补充一些关于译码器的知识。补充的内容可能在考题当中遇到。

这小节的内容可能会比较多,也比较硬核,特别是对于没有学过数字电路的同学,可能理解起来会比较吃力。

二、单块存储芯片与CPU的连接

先来回顾一下之前学过的单块存储芯片的结构。
在这里插入图片描述
我们需要对外暴露出这样的一些接口:

①绿色的线是用来传送数据的,通常会利用数据总线与CPU连接。
在这里插入图片描述
②红色的线是用来传送访问地址的,通常会通过地址总线和CPU连接。
在这里插入图片描述
③另外,还需要对外暴露片选线、读/写控制线,CPU通过控制总线来发送控制信号。

上面图示是一个8*8的存储芯片。因为图示一共有8个字(2^3),每个字的字长是8位。

这里只用了单块的存储芯片来存储数据,并且只能存储8B数据。

<1> 如果想要扩展主存储字数该怎么办呢?那么接下来我们学习字扩展法。

我们可以连接多块存储芯片来扩展主存的字数。
这种方式仅仅增加了存储单元数,各单元存储的位数不变。
如下题:
利用1K×8位的DRAM芯片,设计2K×8位的DRAM存储器(字扩展),问需要芯片,地址线,数据线的数量各为多少?
解析:显然从1K X 8 位 ——>2k X 8位,字数变长,位数不变,应该选字扩展。
(1)需要几片芯片?
d=(2K×8)/(1K×8)=2(片)
(2)需要多少地址线?
2K个存储单元对应11根地址线
(3)需要多少数据线?
8位,即8条

<2> CPU数据总线的宽度大于存储芯片字长,怎么办?这里就需要用到位扩展法。

这里给出的存储芯片,它的字长只有8位,也就是CPU一次只能存或者取8bit数据。但是现在的CPU大多每次可以读或者写64位数据,也就是现代的计算机数据总线的宽度至少也要有64位。

之前说过,应该尽可能保证数据总线的宽度和主存的存储字长一样,只有这样才能尽可能的发挥数据总线的性能。(每次多存或者多取一些数据,可以让数据的读写速度更快)

所以现在问题产生了,我们现在拥有的单块存储芯片,如果它的芯片的字长比数据总线的宽度更小,怎么办?这个小节要学习的位扩展就是要解决这个问题,通过多块存储芯片的合理连接,我们可以让整个主存的存储字长拓展为和数据总线宽度一致。

位扩展是指增加存储器的存储字长(宏观上看整个存储器由许多存储芯片构成),例如,2片1K X4位的芯片,可以组成1K X 8位的存储器。满足下列条件时,采用位扩展的方式:

①只加长每个存储单元的字长,而不增加存储单元的数量
②芯片数=设计要求的存储器容量/选择芯片存储器容量
③芯片之间采用并联的方式
例如下题:

利用1K×4位的SRAM芯片,设计一个存储容量为1K×8位的SRAM存储器,问:需要多少芯片,地址线,数据线的数量各为多少?

分析:显然从1K X 4 位 ——>1k X 8位,字长1K不变,只是位长发生了变化。所以使用位扩展。所以,有:
(1)需要芯片数为:
(1K×8)/(1K×4)=2片
(2)需要地址线数为:
1k表明存储单元个数,1k = 2^10,说明有10根地址线。
(3)需要多少根数据线?
需要组成8位的存储器,8代表数据线的位数,每片芯片占4根线即可实现位扩展。

所以字扩展和位扩展就是小节要解决的两个主要问题。

三、多块存储芯片与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.增加主存的存储字长–位扩展

当存储芯片的位与CPU的位数不一致时,可以采取位扩展的方式使其匹配。

(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 个存储单元(对应地址线13根), CPU 发出的A0到 A12这13 位的地址信息会同时送给 8 片存储芯片。由于每一块芯片的存储单元只有一个比特的数据,所以我们会把这 8 块存储芯片,它的这一位数据分别送到数据总线的不同位上。如下:

在这里插入图片描述
接下来,数据总线可以同时把这8位的信息送给CPU。这样我们就把整个主存的存储字长拓展为了8比特。

这种连接方式,我们把它称为位扩展的方式。我们把 8 片 8K 乘以 1 位(8K X 1bit)的存储芯片连接组合成了 8K 乘以8位(8K X 8bit)的存储器,总容量应该是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的这一根选通线会被选通,其他的选通线都保持低电平。如下:
在这里插入图片描述
我们给译码器的这些输出线的编号也可以是逆过来的。即可以逆过来编号,从下往上是0,1,2,3,。。。7

四、主存容量扩展

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。这是一个连续的地址范围,也是我们实际应用里边可以采取的一种设计思路。

在考试的时候,为了考察大家的理解程度,它有可能是这么接的。给 A13 和 A15 作为译码器的输入信号。这样无论A14 这一位,它到底是取 0 还是取1,它都影响不到我们选片操作。
在这里插入图片描述

当 A15 和 A13 都为 0 的时候,无论我们的 A14 取什么值,此时选中的都是第一块芯片。 A15 和 A13 分别为 0 和 1 的时候,选中的是第二块,剩下的都是类似。

我们会发现,对于第一块芯片来说,当 A14 为 0 的时候,我们有可能取得 8K 个地址。当 A14 为 1 的时候,这儿又有 8K 个合法的地址。所以本来这样的一块芯片,它只有 8K 个存储单元。然而会有 16K 个合法的地址对应到这 8K 个存储单元,这对于其他这几块芯片也是类似的。

所以在实际应用当中,这种设计是不可能采用的,只可能在考试当中遇到。

回到之前正常的设计。

我们是不是还有 A15 这一位没有使用?想要再使用这一位很简单,我们只需要换一个3-8译码器,然后再增加 4 片 8K乘以8位的存储芯片就可以了(2^3=8,需要8个芯片)。 这儿就不再赘述了。

回顾

我们来快速回顾一下。字扩展法可以有线选法和片选法这样的两种线选法。
在这里插入图片描述

线选法就是用 n 条多余的地址线把它们作为 n 个片选信号,这种电路会比较简单,但是缺点就是地址空间不连续。

而译码器片选法可以把 n 位的地址信息映射为 2 的 n 次方个选片信号,设计电路会更复杂,但是地址空间是连续的,所以实际应用中都是采用片选法。

2.主存容量扩展–字位同时扩展

目前为止,我们学习了什么叫位扩展,什么是字扩展。

位扩展可以使存储器的字长变得更长,从而更好地发挥数据总线的数据传输能力;而字扩展可以增加存储器的存储字数,可以更好地利用 CPU 的寻址能力。

这两种方法可以在不同维度上扩展主存的总容量。好,既然有位扩展,也有字扩展,我们是不是还可以把这两种方法进行一个结合?二者的结合就是字位同时扩展法,其实原理都是类似的。

字位扩展就是指既加长存储单元的数量又增加各单元的位数,字位同时扩展的时候,先进行位扩展再在进行字扩展。
例如下题:

利用1K×4位的存储芯片,组成4K×8位的存储器。问需要芯片,地址线,数据线的数量各为多少?扩展过程如何?
解析:
(1)共需几块芯片:
(4K×8)/(1K×4)= 4×2=8
(2)需要几根地址线:
4K地址空间(存储单元的个数),需要12根地址线
(3)需要几根数据线:
8根。
(4)扩展过程:先进行位扩展,这个过程相当于分组,将2片1K×4位构成一组,利用位扩展,构成1K X 8位的完整存储单元(如何构成,继续往下看)。这样一共可以分成四组。再将这些分组视为一个完整的存储单元,进行字扩展。

(1)位扩展

我们这图里面总共画出了 8 块芯片,其中每两块芯片为一组,实现了位扩展。

因为每一块芯片它是 16K 乘以4位的,而 CPU 可以同时读写8位,所以我们可以让两块芯片为一组。如下:
在这里插入图片描述
上面这块芯片①,我们可以把它连接上,比如 D0 到 D3 这四根数据线;而后面这块芯片②,我们可以把它连接上D4一直到D7这四根数据线。
这画的空心箭头,指的是数据总线。数据总线总共有8位,其中低4位可以由上面这块芯片①传出,高4位由下面这块芯片②传出。好,这是位扩展,两块芯片为一组。

(2)字扩展

再来看字扩展。

每一块芯片,它的字数是16K, 16K对应 2 的14 次方,所以芯片内的地址总共需要用 14 位来表示。我们可以把 CPU 的 A0 到 A13 这 14 位的地址信息,作为片内地址。CPU 还有两个高位地址A4、A15没有使用,我们可以给它接上一个 2-4 译码器,总共有 4 个片选信号,所以我们可以接上这样的 4 组。
在这里插入图片描述
每一组的存储芯片总共有16K这么多个存储单元,每一个单元可以存8位的数据,总共有 4 组,所以我们就可以得到一个 64K 乘以8位的存储器。
在这里插入图片描述

(3)地址

再来看一下每一组芯片它们所对应的合法的地址。

第一组芯片显然是 00 开头,第二组是 01 开头,第三组是 10 开头,第四组是 11 开头。整个主存的地址空间是从全 0 到全1,并且中间是连续不间断的。同时主存的字长也能够完美地匹配 CPU 对数据的读写能力。如下:
在这里插入图片描述
这就是字位同时扩展的好处。

五、译码器

接下来我们还需要补充关于译码器的一些小的知识点、考点。

1.第一种译码器

之前我们给出的3-8 译码器有3个输入端, 8 个输出端。如下:
在这里插入图片描述
给定一个输入信号之后,我们的输出端只有一条信号线会输出高电平,其他都会保持低电平。这个译码器就可以和高电平有效的这种存储芯片配合着使用,因为它输出的有效信号刚好是高电平,把它接上就可以。

在这里插入图片描述

2.第二种译码器

接下来,再看译码器的另一种画法。

其实我们之前说到过,如果译码器的右边输出端这画了一个小圆,采用这种示意图表示的是我们输出的有效信号是0,其他的无效信号都是1,也就是在上边译码器的基础上取了一个反。这种译码器就比较适合和低电平有效的芯片配合着使用。因为输出的有效信号是一个低电瓶,我们直接把它接上就可以。
在这里插入图片描述
所以在画图的时候,这芯片和译码器应该是配套的。本质上还是那个问题,要注意到底是低电平有效还是高电平有效。

3.使能端

现实中的译码器,除了输入的地址,还有输出的选通信号之外,其实还会有这样的一个接口,叫做使能端。 en 指的是enable,这个地方没有画小圆,意思就是它是高电平有效。这个使能端就是使译码器能够工作的意思,就有点类似于存储芯片的片选信号。
在这里插入图片描述
这个使能端有什么作用,我们一会再来解释。

还有一种大家有可能遇到的更复杂的译码器,会有多个使能端,如下:

在这里插入图片描述
注意观察下面这两个输入信号,画了小圆,意思就是下面这两个使能信号必须是低电平才有效,而上面使能信号必须是高电平才有效。只有这样译码器才可以开始工作。

这个译码器就是《数字电路》那门课里边很喜欢考察的74LS138,大家可以去淘宝搜一下。

现在注意观察。我们输入的这三个使能信号100(1蓝色的部分),刚好可以让译码器开始工作。

此时我们输入的地址信号101(CBA),把它转成十进制就是5,所以译码器的输出端只有 Y5 这条线输出了一个0,而其他都是无效的1。如下:
在这里插入图片描述

现在我们让使能信号变得无效,比如输入三个0,由于最上面使能信号无效,所以此时译码器的所有的输出端输出的都是1。如下:
在这里插入图片描述
类似的,如果使能信号是其他的一些非法的状态,译码器输出的也都是全1。如下:
在这里插入图片描述
☕️ 这个特性有什么作用?

CPU 可以使用译码器的使能端来控制片选信号的生效时间。

来看一下什么意思。其实,CPU 里边除了地址的输出和数据的输入输出之外,还会有一个很重要的输出信号,叫MREQ 就是 memory request 主存储器请求的一个信号。

当 CPU 想要正式的访问主存的时候,就会使这个信号有效。由于它上面画了一横,所以就意味着输出的有效信号是一个低电平信号。
在这里插入图片描述

现在我们把刚才的译码器,它的 G1 还有 G2A 这两个使能端都给它们一个合法的值(1 0)。把最下面的 G2B 给它接上 CPU 的输出端MREQ。当 CPU 没有发出主存请求信号的时候, G2B 输入的就是一个1,也就是译码器不工作,所有的片选信号都是1,没有任何一个存储芯片会被选通。

而只有 CPU 发出请求信号之后, G2B 接收到 0 这个信号,译码器才会把输入的这节地址信号(CBA)映射为其中某一位的选通信号。

🍸CPU与主存配合工作过程

实际当中 CPU 和主存是这么配合工作的。 CPU 首先会通过地址线送出地址信号,包括更低的 13 位(A0、A1、A2…A12),还有更高的这 3 位(C、B、A)。
在这里插入图片描述
地址信息是通过电信号来输出的。所以当 CPU 刚开始输出这些电信号的时候,电信号有可能不稳定。

因此 CPU 送出这些地址信息之后,它需要等一下,等电流稳定之后,再发出主存请求信号。也就是让译码器的某一个选通线有效。

这样我们就可以保证,当一块存储芯片它被选通的时候,这块存储芯片所接收到的地址信号,这些电信号一定是稳定的。这就是译码器使能端的一个作用。

4.RAM的读写周期

讲到这儿,大家可以再回去看一下 3. 3之前的某小节,其中有一个部分讲的是 RAM 的读写周期,这个部分其实不太重要,所以我们之前把它给跳了。

我们结合刚才分析的过程,才可以更好地理解时序图的含义。

好,来看一下。上面这一溜表示的是 CPU 送出了地址信息。
在这里插入图片描述

从这个时刻开始, CPU 送出了地址信息。但是刚才我们说 CPU 会稍微等一段时间,等地址信号稳定之后才开始发出读或者写的请求。
在这里插入图片描述
所以一直等到这个时刻(上图),CPU 才会发出存储器请求信号。这会导致译码器的某一个输出端输出一个有效的片选信号,使得某一片存储芯片被选通。所以这个地方第二行表示的是片选信号的有效时间。
在这里插入图片描述
在这个时刻(上图),地址信号稳定了,同时某一片芯片被选通。
经过一小段时间之后,芯片里的某一个存储单元的数据就可以通过数据总线给传出。
在这里插入图片描述
所以这写的是 dout,把数据传出的意思。

等数据传出了一小段时间之后, CPU 就可以撤销存储请求信号,也就是撤销片选信号。
在这里插入图片描述
刚才输出的这些数据也需要经过一小段时间才可以传给CPU。如下:
在这里插入图片描述
CPU 确定接收到这些数据之后,它才会撤销刚才发出的这些地址信号。好,这是之前跳过的一小部分内容,结合我们刚才的讲解,会更好理解。

时序图里面地址信号,它是不是会往上也会往下?意思就是我们传过去的地址有可能是0,也有可能是1。很多0101,所以它是用这样的图来画。如下:
在这里插入图片描述
而对于CS片选信号,当它无效的时候是高电平,这被它涂成了黑色。当它有效的时候是低电频,所以会有一个斜坡。斜坡后这一段表示的就是低电平时期。如下:
在这里插入图片描述
另外,对于数据的输出,这个部分也是灰色的,表示没有数据输出。在中间白色这一阶段,它同样是用了既有往上又有往下这样的画法。这也是表示输出的数据有可能为0,也有可能为1,有很多0101。如下:
在这里插入图片描述
这就是我们之前没有提到的时序图。

六、总结

这一小节当中,我们学习了主存与 CPU 的连接,主要分为字扩展、位扩展、字位同时扩展。
在这里插入图片描述
首先我们需要理解每一块单独的存储芯片,它对外暴露出的这些接口分别有什么用,分别需要多少根,特别是地址线,还有数据线。

对于片选信号CS,我们在画图的时候也需要注意,它到底是高电平有效还是低电平有效。如果是低电平有效,那我们在画图的时候需要在芯片的头上画一个小圆圈。

考试当中比较容易考察的我们画红框的部分。首先是译码器的使用,大家需要根据译码器的输入和输出的连线来分析每一块存储芯片,它的地址空间是多少。

对于字位同时扩展法,通常考察的是存储芯片的选择。

不管是数电还是计算机组成原理的某些学校的期末考试都有可能会考察74LS138 型号的译码器芯片。当题目当中告诉你 74LS138 的时候,你需要知道这个译码器的结构是什么样的,它有几个输入端,有几个输出端。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以按照以下步骤安装TensorFlow CPU版本: 1. 确保您的Python版本为3.5-3.8,并且已经安装了pip。 2. 打开命令行窗口,并输入以下命令: pip install tensorflow 如果您想要安装特定版本的TensorFlow,请使用以下命令: pip install tensorflow==版本号 3. 等待安装完成,您就可以开始使用TensorFlow了。 请注意,TensorFlow CPU版本不支持GPU加速,如果您需要使用GPU加速,请安装TensorFlow GPU版本。 ### 回答2: 首先,要安装python3.6版本,可以到python官网(https://www.python.org/downloads/)下载对应的版本进行安装。安装完成后,可以通过在命令行输入python -V命令来确认版本是否正确。 其次,要安装tensorflow cpu库,可以通过pip install tensorflow命令来进行安装。在安装时,可以指定特定版本的tensorflow进行安装,例如pip install tensorflow==2.0。 安装完成后,可以在python中使用tensorflow库进行开发。引入tensorflow库后,通常需要对tensorflow进行配置,例如设置运行设备等。 值得注意的是,tensorflow cpu版本只能在CPU上运行,无法利用GPU进行加速。如需利用GPU进行加速,需要安装tensorflow gpu版本并进行相应的配置。 总而言之,安装tensorflow cpu版本需要先安装python3.6版本,然后通过pip install tensorflow命令进行安装。安装完成后,可在python中进行开发。 ### 回答3: 安装 TensorFlow 不仅能够提高 python 的机器学习和深度学习能力,还可以拓宽大家的计算机视觉等技能,下面是 python3.6 安装 TensorFlow cpu 的教程: 1. 安装 Anaconda: 在安装 TensorFlow 的过程中,Anaconda 是必须的。Anaconda 是一个可用于科学计算的 Python 发行版,它已经包含了所需的几乎所有包。 2. 创建虚拟环境: 在 Anaconda 中安装 TensorFlow 时,推荐创建虚拟环境,以方便切换到不同的Python 版本并避免与其他项目的依赖产生冲突。在环境中可以激活 Tensor-Flow:conda activate Tensor-Flow。 3. 安装 TensorFlow:在 Anaconda 中,通过以下命令安装 TensorFlow: conda install tensorflow 4. 验证 TensorFlow 的安装:在安装完成后,可以使用以下代码片段来检查安装是否成功: import tensorflow as tf print(tf.__version__) 如果您是第一次安装 TensorFlow,那么上面的操作可能会长时间处理,可能需要一些时间来下载并安装所需的依赖项。但是,安装一次后,后续的安装就要快得多,这要归功于 Anaconda,它处理了多种依赖项,所以不需要单独安装。 最后,当使用 TensorFlow 时,可以轻松地通过 Anaconda 虚拟环境来激活和停用 TensorFlow。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值