计算机组成原理笔记-第4章 存储器

第4章 存储器

笔记PDF版本已上传至Github个人仓库:CourseNotes,欢迎fork和star,拥抱开源,一起完善。

该笔记是最初是没打算发网上的,所以很多地方都为了自我阅读方便,我理解了的地方就少有解释;我不理解的地方理解后加上的解释便很多。

因此,若读者在阅读过程中遇到错误或理解问题,请评论区留言或者私信,我们一起讨论:看到会及时回复。

4.1 概述

4.1.1 存储器分类
  • 按存储介质分类

    • 半导体存储器:TTL,集成度低,功耗高,速度快,MOS反之
    • 磁表面存储器:磁头、载磁体(磁盘,磁带)
    • 磁芯储存器:硬磁材料、环状元件
    • 光盘存储器:激光、磁光材料·
  • 按存取方式分类

    随机储存器(Random Access Memory,RAM)

    RAM是一种可读/写 存储器,其特点:①随机存取 性;②存取时间与存储单元的物理位置无关:访问存储器的任一物理单元的时间均相等。③易失性

    根据存储信息原理的不同分类:RAM又分为静态RAM (以触发器 原理寄存信息)和动态RAM (以电容充放电原理寄存信息)。
    *

    只读储存器(Read Only Memory,ROM)

    特点:①存储内容只能读 不能重新写;②非易失

    应用:存放固定不变的程序、常数和汉字字库,甚至用于操作系统的固化;它与随机存储器可共同作为主存的一部分,统一构成主存的++地址域++

    后来发展的ROM存储器:

    • 掩模型只读存储器(MaskedROM,MROM)
    • 可编程只读存储器(Programmable ROM,PROM)
    • 可擦除可编程只读存储器(Erasable Programmable ROM,EPROM)
    • 电擦除可编程只读存储器(Electrically-ErasableProgrammableROM,EEPROM)
    • 闪速存储器FlashMemory
    串行访问存储器(存储时间与物理地址有关)

    对存储单元进行读/写操作时,需按其物理位置的先后顺序寻找地址,存取时间与物理位置有关,则这种存储器称为串行访问存储器。

    • 顺序存取存储器:磁带
    • 直接(半顺序)存取存储器:磁盘
  • 按在计算机中的作用分类

    按在计算机系统中的作用不同,存储器主要分为主存储器辅助存储器缓冲存储器

    按照这种方法分类,其直观分类可从下图得知:

4.1.2 存储器的层次结构
  • 存储器速度、容量和 位价的关系图
  • 缓存-主存层次和主存-辅存层次图

    • 主存和缓存 之间匹配的是速度,它们之间的数据调动是由硬件自动完成的
    • 主存和辅存 之间匹配的是容量,它们之间的数据调动是 由硬件和操作系统共同完成的。

4.2 主存储器

4.2.1 概述
  • 现代计算机的主存都由半导体集成电路构成,,MARMDR制作在CPU芯片内,如下图所示。下图中虽然MAR和MDR是在CPU内部,但是这并不代表内存的MAR和MDR在CPU中。下图的MDR和MAR为CPU的器件,主存有但未画出来。
  • 寻址范围计算

    • 按字节寻址范围计算为【 2 地址线位数 2^\text{地址线位数} 2地址线位数】Byte
    • 按字寻址范围计算为【 2 地址线范围 × 8 字长 \frac{2^\text{地址线范围}\times8}{字长} 字长2地址线范围×8】bit
  • 主存的技术指标

    • 存储容量:指主存能存放二进制代码的总位数

      ①存储容量=存储单元个数x存储字长 (以位数表示)

      ②存储容量=存储单元个数x存储字长/8 (以字节表示)

    • 存储速度

      存储速度是由存取时间和存取周期来表示

      • 存取时间

        存取时间又称为存储器的访问时间(Memory Access Time),是指启动一次存储器操作(读或写)到完成该操作所需的全部时间。

        存取时间分读出时间和写人时间两种。读出时间是从存储器接收到有效地址开始,到产生有效输出所需的全部时间。写人时间是从存储器接收到有效地址开始,到数据写人被选中单元为止所需的全部时间。

      • 存取周期

        存取周期(Memory Cycle Time)是指存储器进行++连续两次++ 独立的存储器操作(如连续两次读操作)所需的++最小间隔++时间

    • 存储器带宽

      表示单位时间内存储器存取的信息量,如下例:

      存取周期为500ns,每个存取周期可访问16位,则它的带宽为32M位/秒,计算如下
      32 Mbit/s = 16 b i t 500 × 1 0 − 9 s 32\text{Mbit/s}=\frac{16bit}{500\times10^{-9}s} 32Mbit/s=500×10−9s16bit

      为了提高存储器的带宽,可以采用以下措施:

      ① 缩短存取周期。

      ②)增加存储字长,使每个存取周期可读/写更多的二进制位数。

      ③增加存储体

4.2.2 半导体存储芯片简介
  • 半导体存储芯片的译码驱动方式有两种:线选法和重合法

  • 控制线

    • 片选线:用来选择存储芯片

      • CS ‾ \overline{\text{CS}} CS:片选线,低电平有效

      • CE ‾ \overline{\text{CE}} CE:使能线,低电平有效

    • 读/写控制线:决定芯片进行读/写操作

      • WE ‾ \overline{\text{WE}} WE:低电平写 高电平读
4.2.3 随机存储器
静态 RAM(Static RAM, SRAM)

由千静态 RAM是用触发器 工作原理存储信息的,因此即使信息读出后,它仍保持其原状 态,不需要再生。但电源掉电时,原存信息丢失,故它属易失性半导体存储器。
*

复制代码
###### 静态 RAM 基本单元电路

读出时, V C C V_{CC} VCC家电, T 3 T_3 T3和 T 4 T_4 T4开关都闭合电路连通;接着A'和A同时加电, T 1 T_1 T1和 T 2 T_2 T2闭合,数据从存储芯片内流向A与A'(两侧数据是一致的); T 5 T_5 T5和 T 6 T_6 T6从行地址选择线上获取行地址, T 7 T_7 T7和 T 8 T_8 T8从列地址选择线上获取列地址,此时两侧数据流通;左侧数据流通至左侧写放大器后反向,无法通过;右侧数据不经过放大器直接送到 D OUT \text{D}_\text{OUT} DOUT中。

写入时,数据经过左侧放大器将取反,右侧正常通过;我们选择好行地址与列地址,打开两侧通路。当数据到达A'与A的时候有两种情况:

  • ① D IN \text{D}_\text{IN} DIN为1,则A'为0,A为1,此时 T 2 T_2 T2断开, T 1 T_1 T1连接,正常写入1;
  • ② D IN \text{D}_\text{IN} DIN为0,则A'为1,A为0,此时 T 1 T_1 T1断开, T 2 T_2 T2连接,正常写入0.
复制代码
###### 静态 RMA 芯片举例(Intel 2114)

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e910753d555f446a80f7c4f046440001.png)

当 C S ‾ \\overline{\\mathrm {CS}} CS 和 W E ‾ \\overline{\\mathrm {WE}} WE **均为低电平** 时,输入(**写** )三 态门打开, I / O 4 ∼ I / O 1 \\mathrm{I/O}_{4}\\sim\\mathrm{I/O}_{1} I/O4∼I/O1上的数据即写入指定地址单元中。**当 C S ‾ \\overline{\\mathrm {CS}} CS为低电平、 W E ‾ \\overline{\\mathrm {WE}} WE 为高电平** 时, 输出(**读** )三态门打开,列 I/0 电路的输出经片内总线输出至数据线 I / O 4 ∼ I / O 1 \\mathrm{I/O}_{4}\\sim\\mathrm{I/O}_{1} I/O4∼I/O1 上。

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c5bc1c48438d4764ae93c5449218bd5c.png)
* **存储矩阵结构**:

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/83594306037a43849cebbd119a2dd134.png)
* **读周期时序**:

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/fcdb2c7437ff4cecb3b2d9ba9f1fed8e.png)
* **写周期时序**

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a6d26277cfb5431e8b8fa27c3dd551a1.png)

地址有效后,先发出写命令开始片选,片选完成了后,等待上一个读周期的数据滞后完成我们便开始写。由于写始终要知道内存单元的地址,所以地址失效一定在 D I N \\mathrm {D_{IN}} DIN之后
动态 RAM(Dynamic RAM, DRAM)

常见的动态RAM基本单元电路有三管式单管式 两种,它们的共同特点都是靠电容存储 电荷的原理来寄存信息,若电容上存有足够多的电荷表示存"1",电容上无电荷表示存"0"。

电 容上的电荷一般只能维持 1~ 2 ms,因此即使电源不掉电,信息也会自动消失 ;为此,必须在 2 ms内对其所有存储单元恢复一次原状态,这个过程称为再生刷新

由千它与静态 RAM 相 比,具有集成度更高功耗更低等特点,目前被各类计算机广泛应用。
*

复制代码
###### 动态 RAM 的基本单元电路
复制代码
###### 三管 MOS 动态 RAM 基本单元电路
  1. 读操作 :当读选择线被选中时,晶体管T2导通,若存储在 C g \text{C}\text{g} Cg上的电荷足够则T1导通,那么T1和T2接地,使读数据线降为低电平,读出0;若 C g \text{C}\text{g} Cg的电荷不足以导通T1,则读数据线保持高电平不变。

    因此我可以发现读出的信息与原存入的信息是反相的,若要恢复真正的数据,需要将读出的数据进行取反。

  2. 写操作 :在写操作期间,写选择线被选中,晶体管T3导通,允许电流通过写数据线流向电容Cg。写入数据是正相的。

复制代码
###### 三管 MOS 动态 RAM 结构示意图


*

复制代码
###### 单管 MOS 动态 RAM 基本单元电路


*

复制代码
###### 16 Kx 1 位 4116 动态 RAM 存储矩阵示意图

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/573ea7c575a245458b8a366f1f745267.png)
复制代码
###### 动态RAM读时序

![](https://img-blog.csdnimg.cn/direct/94cc0701c93f474e9dd8f872f3c345e9.png)

先用 R A S ‾ \\overline{\\mathrm{RAS}} RAS将行地址送入行地址缓冲器,再由 C A S ‾ \\overline{\\mathrm{CAS}} CAS送入列地址缓冲器。地址确定才能读,因此 D O U T \\mathrm{D}_\\mathrm{OUT} DOUT有效在行列地址选通之后;读信号结束后,数据还存在一定时间在线路上的传输,因此 D O U T \\mathrm{D}_\\mathrm{OUT} DOUT必须滞后。
复制代码
###### 动态RAM写时序

![enter =80%x80%)](https://img-blog.csdnimg.cn/direct/1103cb6589ed4d108f9a31285981b820.png)

同样的,先用 R A S ‾ \\overline{\\mathrm{RAS}} RAS将行地址送入行地址缓冲器,再由 C A S ‾ \\overline{\\mathrm{CAS}} CAS送入列地址缓冲器。但是在 W E ‾ \\overline{\\mathrm{WE}} WE低电平写信号生效后,就要开始准备数据了,因此即使 C A S ‾ \\overline{\\mathrm{CAS}} CAS还没有有效, D I N \\mathrm{D_IN} DIN也得开始了。

等到 C A S ‾ \\overline{\\mathrm{CAS}} CAS有效了,那么 D I N \\mathrm{D_IN} DIN也稳定了。
动态 RAM 的刷新

刷新的过程实质上是先将原存信息读出,再由刷新放大器形成原信息并重新写入的再生过程。由于存储单元被访问是随机的,有可能某些存储单元长期得不到访问,不进行存储器的 读/写操作,其存储单元内的原信息将会慢慢消失。

为此,必须采用定时刷新的方法,它规定在一 定的时间内,对动态 RAM 的全部基本单元电路必作一次刷新,一般取2 ms,这个时间称为刷新周期,又称再生周期。

刷新是一行行进行的,必须在刷新周期内,由专用的刷新电路来完成对基 本单元电路的逐行刷新,才能保证动态 RAM 内的信息不丢失。通常有三种方式刷新:集中刷新分散刷新异步刷新

  • 集中刷新:集中刷新是在规定的一个刷新周期内,对全部存储单元集中一段时间逐行进行刷新,此刻必 须停止读/写操作。

    例如,对 128x128 矩阵的存储芯片进行刷新时,若存取周期为 0.5 µs,刷新周 期为2 ms(占 4 000 个存取周期),则对 128 行集中刷新共需 64 µs(占 128 个存取周期),其余的 1 936 µ,s (共 3 872 个存取周期)用来读/写或维持信息,如下图所示。由于在这 64 µs 时间内不能进行读/写操作,故称为"死时间",又称访存"死区",所占比率为 128/4000x 100% = 3.2%, 称为死时间率

    🈲刷新一行占一个存储周期

  • 分散刷新:分散刷新是指对每行存储单元的刷新分散到每个存取周期内完成。

    该模式中,所有的行刷新被分配到了各存取周期,即完成一次读/写就做一行的刷新;存取周期由0.5µs扩充到了1µs,这是因为前0.5µs用来进行读/写;后0.5µs用来刷新;这样做的好处是不存在读写停止读写的死区时间了,坏处是存储周期变长了,降低系统效率。

  • 异步刷新

    结合分散刷新与集中刷新,每隔若干秒刷新一行。此般,经过一个刷新周期后所有行都得到了刷,即克服了集中刷新的长时死区效应又解决了


*

动态 RAM 和静态 RAM 的比较
4.2.4 只读存储器(ROM)

半导体ROM基本器件为两种:MOS 型和 TTL 型。

掩模 ROM
  • 有耦合元件 MOS 管的节点,若导通将使列线输出为低电平
  • 列线的输出经过放大器将反相


*

PROM
  • 熔丝未断和断可区别其所存信息是 " 1" 或"0" 。
  • 已断的熔丝是无 法再恢复的,故这种 ROM往往只能实现一次编程,不得再修改。


*

EPROM
复制代码
###### N 型沟道浮动栅 MOS 电路

在**漏端 D 加上正电压**会形成一个浮动栅,源 S 与漏 D 之间不导通,MOS管处于"0"状态。D 端不加正电压,则不能形成浮动栅,MOS管正常导通,呈"1"状态。

用户需重 新改变其状态,可用**紫外线照射**,驱散浮动栅

![](https://img-blog.csdnimg.cn/direct/c5458f50068a48d4a4223475f97e6c15.png)
复制代码
###### 2716 型 EPROM 逻辑图及引脚图

![](https://img-blog.csdnimg.cn/direct/a3248673a22b4c59829b0d9cb7db0906.png)
* V s s V_{ss} Vss为地, V c c V_{cc} Vcc进而 V p p V_{pp} Vpp为两个电源头; C S ‾ \\overline{\\mathrm{CS}} CS为片选端,读出时为低电平,编程写入时为高电平。 P D ‾ / P r o g r \\overline{\\mathrm{PD}}/\\mathrm{Progr} PD/Progr为功率下降/编程输入端,在读出时为低电平。
* EPROM 的改写可用两种方法:一种用紫外线照射(该方法不能对个别单元进行单独擦除或重写),另一种方法用电气方法将存储内容擦除,再重写。
4.2.5 存储器容量的扩展
位扩展 (增加存储单元长度(即字长))

注意各芯片的数据线连接方式。
*

字扩展(增加存储字的数量),用高位地址线充当片选线

对于字扩展,片选逻辑是非常重要的。
*

字、位扩展
4.2.6 存储器与CPU的连接
存储器与 CPU 的连接步骤:
复制代码
###### (1) 写出对应的二进制地址码
复制代码
###### (2) 确定芯片的数量及类型
复制代码
###### (3) 分配地址线
复制代码
###### (4) 确定片选信号和片选逻辑以及接线
复制代码
###### (5) 画图
存储器于CPU连接实例1
复制代码
###### 问题描述

> 例 4.1 设 CPU 有 16 根地址线、8 根数据 线,并用 M R E Q ‾ \\overline{\\mathrm{MREQ}} MREQ 作为访存控制信号(低电平有 效),用 W R ‾ \\overline{\\mathrm{WR}} WR作为读/写控制信号(高电平为读,低 电平为写)。现有下列存储芯片:1 Kx4 位 RAM、 4 Kx8 位 RAM、8 Kx8 位 RAM、2 Kx8 位 ROM、 4 Kx8 位 ROM、8 Kx 8 位 ROM 及 74138 译码器 和各种门电路,如图 4.36 所示。画出 CPU 与存 储器的连接图,要求如下:
> * 主存地址空间分配: 6000H \~ 67FFH 为系统程序区。;6800H \~ 6BFFH 为用户程序区。
> * 合理选用上述存储芯片,说明各选几片。
> * 详细画出存储芯片的片选逻辑图。

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/742bf2457dbc4aeba973f2c1a6977403.png)
复制代码
###### 问题解答

*

  ###### 写出对应的二进制地址码

  ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/361babd3c28a47198a6e6c4fa2949c2b.png)
*

  ###### 确定芯片的数量及类型

  根据6000H\~ 67FFH 为系统程序区的范围,应选择 1 片 2 Kx8 位的 ROM

  根据6800H\~ 6BFFH 为用户程序区的范围,选 2 片 1 Kx4 位的 RAM 芯片正好满足 1 Kx8 位 的用户程序区要求。
*

  ###### 分配地址线

  将 CPU 的低 11 位地址 A 10 ∼ A 0 \\mathrm {A_{10}}\\sim \\mathrm{A_0} A10∼A0。与 2 Kx 8 位的 ROM 地址线相连;将 CPU 的低 10 位地址 A 9 ∼ A 0 \\mathrm {A_{9}}\\sim \\mathrm{A_0} A9∼A0。与 2 片 1 Kx4 位的 RAM 地址线相连。
*

  ###### 确定片选信号和片选逻辑以及接线

  由74138 译码器输入逻辑关系可知,必须保证控制端 G 1 \\mathrm G_1 G1为高电平, G ‾ 2 A \\mathrm{\\overline{G}_{2A}} G2A与 G ‾ 2 B \\mathrm{\\overline{G}_{2B}} G2B为低电平,才能使译码器正常工作。

  根据第一步写出的存储器地址范围得出, A 15 \\mathrm {A_{15}} A15始终为低电平,, A 14 \\mathrm {A_{14}} A14始终为高电平,它们正好可分别与译码器的 G ‾ 2 A \\mathrm{\\overline{G}_{2A}} G2A(低)和 G 1 \\mathrm G_1 G1(高)对应。

  而访存控制信号 M R E Q ‾ \\overline{\\mathrm{MREQ}} MREQ (低电平有效)又正好可与 G ‾ 2 B \\mathrm{\\overline{G}_{2B}} G2B(低)对应。剩下的 A 13 、 A 12 、 A 11 \\mathrm{A}_{13}\\mathrm{\~、A}_{12}\\mathrm{\~、A}_{11} A13 、A12 、A11可分别接到译码器的 C、B、A 输入 端。

  其输出 Y 4 ‾ {\\overline{\\mathrm{Y_4}}} Y4 有效时,选中 1 片 ROM; Y 5 ‾ {\\overline{\\mathrm{Y_5}}} Y5 与 A 10 {\\mathrm{A_{10}}} A10 同时有效均为低电平时,与门输出选中 2 片 RAM,如图 4.37 所示。

  图中 ROM 芯片的 P D / P r o g {\\mathrm{PD/Prog}} PD/Prog 端接地,以确保在读出时低电平有效。RAM 芯片的读写控制端与 CPU 的读写命令端 W R ‾ {\\overline{\\mathrm{WR}}} WR 相连。

  ROM 的 8 根数据线直接与 CPU 的 8 根数据线相连,2 片 RAM 的数据线分别与 CPU 数据总线的高 4 位和低 4 位相连。
*

  ###### 画图

  ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/80ebf4d001cf4bb089b0552e8a5bdd1e.png)
4.2.7 存储器的校验(汉明码)
简介

汉明码是由 Richard Hanming 于 1950 年提出的,它具有一位纠错能力。

新增的汉明码校验位数应满足如下关系: 2 k ⩾ n + k + 1 2^{k}\geqslant n+k+1 2k⩾n+k+1,其中k为校验位位数,n位数据位数。

同时,我要强调的是汉明校验码的生成和校验都都两种原则,希望读者要对概念进行清晰地把握,不可一知半解:
汉明校验 { 按配偶原则的校验 按配奇原则的校验 \text{汉明校验}\begin{cases} \text{按配偶原则的校验}\\ \text{按配奇原则的校验} \end{cases} 汉明校验{按配偶原则的校验按配奇原则的校验

这里直接阐述配偶和配奇的原则会比较抽象,我们放到具体的例子中来看,会更加易懂。

汉明码生成
确定校验位的个数

使用公式【 2 k ⩾ n + k + 1 2^{k}\geqslant n+k+1 2k⩾n+k+1】计算需要的k,其中 k 是检验位的数量,n 是数据位的数量;

举个逆子:原欲发送数据为:0101,此时我们可得n=4,则欲使 2 k ≥ 4 + k + 1 2^k\geq4+k+1 2k≥4+k+1,k最小为3,即校验位个数为3。

安置校验位

我们规定:所有的校验位均放置在第 2 n 2^n 2n位,也就是第1、2、4、8...位置等都是校验位,n从0开始,到k-1结束。

上例中k=3,则校验位的位置为:① 2 0 = 1 2^0=1 20=1;② 2 1 = 2 2^1=2 21=2;③ 2 2 2^2 22=4;即3位校验位放在最后要发送数据的第1,第2,第4个位置。
3.

填充数据位:

在非校验位的其他位置上填写真正的数据,填充后汉明码应如如下形式才对:

c 1 c_1 c1 c 2 c_2 c2 0 c 3 c_3 c3 1 0 1

其中 c 1 c_1 c1, c 2 c_2 c2, c 3 c_3 c3为待确定值的校验位。
4.

画表计算校验位的值

我们的原则是,位置代表的二进制写好后,每一行值为1的二进制位分为一组 ;然后,你会发现,每一行校验位的位置是互斥的,只有一个校验位值为1。也就是说,一个校验位会和若干数值位搭配,组成一组。

然后我们可以引出配奇和配偶原则了:

  • 配奇原则 :通过配置校验位 C j C_j Cj,使得该组1的个数为奇数 个,那么该组的各位进行异或操作必为1
  • 配奇原则 :通过配置校验位 C j C_j Cj,使得该组1的个数为偶数 个,那么该组的各位进行异或操作必为0

基于这样的发现,我们让同一组各数据位进行异或 (两个二进制位异或,相同结果为0,不同为1)运算,按照配偶原则 ,可得结果如下计算所示:
配偶原则 { C 1 ⊕ 0 ⊕ 1 ⊕ 1 ⟹ C 1 = 0 C 2 ⊕ 0 ⊕ 0 ⊕ 1 ⟹ C 2 = 1 C 3 ⊕ 1 ⊕ 0 ⊕ 1 ⟹ C 3 = 0 \text{配偶原则}\begin{cases}C_1\oplus0\oplus1\oplus1\Longrightarrow C_1=0\\ C_2\oplus0\oplus0\oplus1\Longrightarrow C_2=1\\ C_3\oplus1\oplus0\oplus1\Longrightarrow C_3=0 \end{cases} 配偶原则⎩ ⎨ ⎧C1⊕0⊕1⊕1⟹C1=0C2⊕0⊕0⊕1⟹C2=1C3⊕1⊕0⊕1⟹C3=0

我们怎么理解上面的 C 1 C 2 C 3 C_1 C_2C_3 C1C2C3的取值?

【 C 1 C_1 C1=0】,是因为和它一组的数据位为011中有偶数个1,按照配偶 原则,已经有偶数个1了,那我就不用管了;反之看第二组,【 C 2 C_2 C2=1】,这是因为第二组的数据位为001,只有奇数个1,按照配偶原则, C 2 C_2 C2要置1才能保证第二组的1为偶数个。第三组同理。

刚好在这里把配奇的原则也讲一下,上面的 C 1 C 2 C 3 C_1 C_2C_3 C1C2C3如果按照配奇原则会是多少呢?如下(如果你理解了配偶原则,配奇也很简单):
配奇原则 { C 1 = 0 ⊕ 1 ⊕ 1 ‾ ⟹ C 1 = 1 C 2 = 0 ⊕ 0 ⊕ 1 ‾ ⟹ C 2 = 0 C 3 = 1 ⊕ 0 ⊕ 1 ‾ ⟹ C 3 = 1 \text{配奇原则}\begin{cases}C_1=\overline{0\oplus1\oplus1}\Longrightarrow C_1=1\\ C_2=\overline{0\oplus0\oplus1}\Longrightarrow C_2=0\\ C_3=\overline{1\oplus0\oplus1}\Longrightarrow C_3=1 \end{cases} 配奇原则⎩ ⎨ ⎧C1=0⊕1⊕1⟹C1=1C2=0⊕0⊕1⟹C2=0C3=1⊕0⊕1⟹C3=1

可见,配奇的结果和配偶的结果刚好相反,这是因为异或操作的原理使得如果同一组中的数据位有偶数个1那么异或必为0,那么取反得校验位为1,那么组合起来(数据位有偶数个1,校验位有1个1,相加肯定是奇数咯)1的个数就是奇数个咯,完成奇配置。

书写完整的汉明码(配偶原则)

如第四步所计算,得到三个校验位的值后,将其值填充到校验位所对应的位置,将校验位的值填充进行,写出完整的汉明码,上例的汉明码为

1 2 3 4 5 6 7
C 1 C_1 C1 C 2 C_2 C2 P 1 P_1 P1 C 3 C_3 C3 P 2 P_2 P2 P 3 P_3 P3 P 4 P_4 P4
0 1 0 0 1 0 1
书写完整的汉明码(配奇原则)
1 2 3 4 5 6 7
C 1 C_1 C1 C 2 C_2 C2 P 1 P_1 P1 C 3 C_3 C3 P 2 P_2 P2 P 3 P_3 P3 P 4 P_4 P4
1 0 0 1 1 0 1
汉明码校4验

按照配偶原则,假设我们收到了0110101,已知这是一个传输出错的汉明码

按照配偶原则,假设我们收到了1001100,已知这是一个传输出错的汉明码

提取小组(配偶原则)

0110101总位数为7,则易推得校验位为3位;再根据分组规则,我们可得到三组数据如下:

  • 组1(1357)=0111
  • 组2(2367)=1101
  • 组3(4567)=0101
提取小组(配奇原则)

1001100总位数为7,则易推得校验位为3位;再根据分组规则,我们可得到三组数据如下:

  • 组1(1357)=1010
  • 组2(2367)=0000
  • 组3(4567)=1100
校验(配偶原则)

我们按照配偶 原则,将原来的分组的各组各位异或 运算,若为0则表示该位没出错,否则表示出错。

上述汉明码,我们进行如下计算:
g 1 = 0 ⊕ 1 ⊕ 1 ⊕ 1 = 1 g 2 = 1 ⊕ 1 ⊕ 0 ⊕ 1 = 1 g 3 = 0 ⊕ 1 ⊕ 0 ⊕ 1 = 0 g1=0\oplus1\oplus1\oplus1=1\\ g2=1\oplus1\oplus0\oplus1=1\\ g3=0\oplus1\oplus0\oplus1=0 g1=0⊕1⊕1⊕1=1g2=1⊕1⊕0⊕1=1g3=0⊕1⊕0⊕1=0

欸,汉明码只能纠错1位,那到底是哪一位出错了呢?其实呀,这里并不能只管看出来,但是汉明码的神奇之处就在于,校验后的k位数值的二进制逆序组合转化为十进制表示的数值就是出错的位置。

如上例,计算完得到 g 1 g 2 g 3 g_1g_2g_3 g1g2g3=110,我们逆序得到011,其十进制表示3,那么就是第三位出错了,瞅瞅是不是😁发的是0100101接收到的是0110101,确实是第3位出错了。
4.

校验(配奇原则)

我们按照配奇 原则,将原来的分组的各组各位异或后取反 运算,若为0则表示该位没出错,否则表示出错。

上述汉明码,我们进行如下计算:
g 1 = 1 ⊕ 0 ⊕ 1 ⊕ 0 ‾ = 1 g 2 = 0 ⊕ 0 ⊕ 0 ⊕ 0 ‾ = 1 g 3 = 1 ⊕ 1 ⊕ 0 ⊕ 0 ‾ = 1 g1=\overline{1\oplus0\oplus1\oplus0}=1\\ g2=\overline{0\oplus0\oplus0\oplus0}=1\\ g3=\overline{1\oplus1\oplus0\oplus0}=1 g1=1⊕0⊕1⊕0=1g2=0⊕0⊕0⊕0=1g3=1⊕1⊕0⊕0=1

此时得到 g 1 g 2 g 3 g_1g_2g_3 g1g2g3=111,逆序得到111111十进制表示7,那么第七位出错了;检查一下呗,发的是1001101接收到的是1001100,确实是第7位出错了。

4.2.8 提高访存速度的措施(多位交叉)
  • 多体并行系统:高位交叉可以用于容量的扩展,低位交叉可以提高带宽和访问速度

    高位交叉,顺序编址(提升容量)


    *

    低位交叉,各个体轮流编址(提升带宽)
    • 四体低位交叉存储器,存取周期为T,总线传输周期(地址信号通过总线传输的时延)为 τ \tau τ ,为实现流水线方式存取,应满足 T = 4 τ \tau τ

    • 对于低位交叉的存储器,连续读取n个字所需的时间 t i t_i ti 为
      t 1 = T + ( n − 1 ) τ t_{1}=T+(n-1)\tau t1=T+(n−1)τ

    • 若采用高位交叉编址,则连续读取 n个字所需的 时间 t 2 t_2 t2为
      t 2 = n T t_2=nT t2=nT

4.3 高速缓冲存储器

4.3.1 概述
程序局部性原理
  • 时间局部性:被引用过一次的存储器位置在未来会被多次引用(通常在循环中)。
  • 空间局部性 :如果一个存储器的位置被引用,那么将来他相邻的位置也会被引用。
存储墙

存储器提供数据的速度远远落后处理器处理数据的速度,存储器速度成为各类计算体系的最大瓶颈。
*

Cache------主存的基本结构图

在图中,主存与缓存之间块的数量是有着巨大差异的,因此必须有一种方案,使得缓存的块能对应到主存的块上;这种方式是做标记,比如上图Cache字块0的标记是0,因此字块0存储的信息来自于主存的信号0。
*

命中与未命中
  • 命中:【主存块】 调入 缓存,【主存块】与【缓存块】建立 了对应关系,
  • 未命中:主存块 未调入 缓存,主存块与缓存块 未建立 对应关系
Cache的命中率、Cache-主存平均访问时间、访问效率
复制代码
###### 命中率

h = N c N c + N m h=\\frac{N_c}{N_c+N_m} h=Nc+NmNc  

其中 N c N_c Nc 为访问 Cache 的总命中次数, N m N_m Nm为访问主存的总次数, h h h为命中率
复制代码
###### Cache-主存平均访问时间

t a = h t c + ( 1 − h ) t m t_{_a}=ht_{_c}+\\left(\\begin{array}{c}1-h\\end{array}\\right)t_{_m} ta=htc+(1−h)tm  

其中 t c t_{c} tc为命中时的 Cache 访问时间, t m t_{m} tm为未命中时的主存访问时间, 1 − h 1-h 1−h 表示未命中率, t a t_{a} ta为Cache-主存平均访问时间
复制代码
###### 访问效率

e = t c t a × 100 % = t c h t c + ( 1 − h ) t m × 100 % e=\\frac{t_c}{t_a}\\times100\\%=\\frac{t_c}{ht_c+(\\begin{array}{c}1-h\\end{array})t_m}\\times100\\% e=tatc×100%=htc+(1−h)tmtc×100%
Cache的基本结构
  • 主存块调入Cache的任务全部由硬件自动完成

复制代码
###### Cache的读数操作流程图

![](https://img-blog.csdnimg.cn/direct/d8991b23f38742419dae698acaab3e87.png)
复制代码
###### Cache的写操作方法

* **写直达法**

  > 写操作时数据既写入 Cache 又写入主存。它能随时保证主存和 Cache 的数据始终一致,但增加了访存次数;这种方法由于需要和内存进行容量匹配,因此数据范围较小。
* **写回法**

  > 写操作时只把数据写入 Cache 而不 写入主存,仅当 Cache 数据被替换出去时才写回主存。
复制代码
###### 统一缓存与分立缓存:

* 统一缓存是指指令和数据都存放在同一缓存内的 Cache
* 分立缓存是指指令和数据分别存 放在两个缓存中,一个称为**指令 Cache** ,另一个称为**数据 Cache**
* 如果计算机的主存是统一的(指令、数据存储在同一主存内),则 相应的 Cache 采用统一缓存;如果主存采用指令、数据分开存储的方案,则相应的 Cache 采用分 立缓存。
* 当采用**超前控制或流水线控制方式时,一般都 采用分立缓存**。
4.3.2 Cache-主存地址映射
直接映射


*

全相联映射
  • 优点:方式灵活,命中率也更高, 缩小了块冲突率
  • 缺点:访问 Cache 时主存字块标记需要和 Cache 的全部"标记"位进行比较,才能 判断出所访问主存地址的内容是否已在 Cache 内
组相联映射

当r=0时是直接映射,当r=c时是全相联映射。

4.4 循环冗余校验码

  • 编码步骤

    • 给定【信息码 】,给定【生成多项式
    • 根据【生成多项式 】确定确定校验位的长度【k 】,以及【模2除的除数
    • 确定被除数,【被除数=信息码+k个0
    • 使用模2除方法确定余数,【余数作为校验位
    • 用【校验位 】替换刚才添加到信息码后面的0后面组成【CRC】码
举例

已知有效信息为 1100,试用生成多项式 G(x)= 1011 将其编成 CRC 码。

复制代码
###### 确定校验位长度k-1,以及除数

将生成多项式还原成代数形式为:  
G ( x ) = x 3 + x + 1 \\mathrm{G(x)=x\^3+x+1} G(x)=x3+x+1  

那么有  
k = m a x ( i G ( x ) ) = 3 \\mathrm{k=max(i_{G(x)})}=3 k=max(iG(x))=3  

其含义为【**k=生成多项式的最高次=3**】。

且我们有【**除数=生成多项式的数值形式** 】,所以题目已经给出了除数就是【**1011**】
复制代码
###### 确定被除数

有效信息为【**1100** 】,【**k=3** 】,那么【**被除数=有效信息+0\*k=1100 000**】
复制代码
###### 确定校验位(余数)

| 除 | 数 |   |   |         |   |   | 商 | 1 | 1 | 1 | 0 |        |   |   |   |   |   |   |   |   |   |   |
|---|---|---|---|---------|---|---|---|---|---|---|---|--------|---|---|---|---|---|---|---|---|---|---|
| 1 | 0 | 1 | 1 | **被除数** | 1 | 1 | 0 | 0 | 0 | 0 | 0 |        |   |   |   |   |   |   |   |   |   |   |
|   |   |   |   |         | 1 | 0 | 1 | 1 |   |   |   |        |   |   |   |   |   |   |   |   |   |   |
|   |   |   |   |         |   | 1 | 1 | 1 | 0 |   |   |        |   |   |   |   |   |   |   |   |   |   |
|   |   |   |   |         |   | 1 | 0 | 1 | 1 |   |   |        |   |   |   |   |   |   |   |   |   |   |
|   |   |   |   |         |   |   | 1 | 0 | 1 | 0 |   |        |   |   |   |   |   |   |   |   |   |   |
|   |   |   |   |         |   |   | 1 | 0 | 1 | 1 |   |        |   |   |   |   |   |   |   |   |   |   |
|   |   |   |   |         |   |   |   |   | 0 | 1 | 0 | **余数** |   |   |   |   |   |   |   |   |   |   |
复制代码
###### 书写CRC码制

1100 010
校验步骤

校验直接用收到的CRC码模2除我们当初确定的除数,如果余数为0则信息未出错,否则出错。

假设使用上例生成的CRC码,且我们收到的是1100 011,除数为1011

则经如下校验,发现出错,因为余数不为0(余1):

1 1 1 0
1 0 1 1 被除数 1 1 0 0 0 1 1
1 0 1 1
1 1 1 0
1 0 1 1
1 0 1 1
1 0 1 1
0 0 1
1 余数
相关推荐
聪明的笨猪猪1 小时前
Java Spring “IOC + DI”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
im_AMBER2 小时前
Web 开发 24
前端·笔记·git·学习
烧冻鸡翅QAQ3 小时前
考研408笔记
笔记·考研
StarPrayers.3 小时前
卷积层(Convolutional Layer)学习笔记
人工智能·笔记·深度学习·学习·机器学习
能不能别报错3 小时前
K8s学习笔记(十五) pause容器与init容器
笔记·学习·kubernetes
无言以对,沉默不语,随你随你。4 小时前
【解决办法】GitBash不能在任意文件夹打开
经验分享·笔记·git
牛马大师兄4 小时前
STM32独立看门狗IWDG与窗口看门狗WWDG知识梳理笔记
笔记·stm32·单片机·嵌入式硬件·嵌入式·看门狗
wan5555cn5 小时前
Windows 11系统鼠标键盘被禁用问题的全面解决方案
windows·笔记·深度学习·计算机外设
zhangrelay5 小时前
ROS云课三分钟-使用动态参数重配置调试Teb导航案例-251008
笔记·学习
BingeBlog5 小时前
[01] Qt的UI框架选择和对比
开发语言·c++·笔记·qt·ui·开源软件