计算机组成原理笔记(一)
一、计算机系统概述
1.冯诺依曼体系结构
由运算器、控制器、存储器、输入设备和输出设备五部分组成
图解如下:
2. 计算机系统的组成
- 硬件系统组成
- 存储器:存放程序和数据(以二进制形式存放),按地址访问;
- 运算器:执行算术运算和逻辑运算;
- 控制器:根据指令的操作码、指令执行过程中的条件状态、时序系统等三方面的因素来产生指令执行过程中所需要的控制信号,控制数据的存取和程序的执行;
- 输入设备:将信息输入到计算机的外部设备,如键盘、鼠标等;
- 输出设备:输出计算机处理结果的外部设备。如显示器、打印机等。
- 软件系统组成
- 应用软件:解决应用问题的程序集合,如数据处理程序、情报检索程序等;
- 系统软件:管理和调度计算机,以方便用户使用计算机并提高计算机使用效率的程序的集合,包括:
- 操作系统
- 程序设计语言处理程序:编译器,汇编器,解释器
- 数据库管理系统
3.计算机的性能指标
(1)基本性能指标
- 字长:$CPU$一次处理的数据位数,一般与计算机内部寄存器、运算器、数据总线的位宽相等,影响计算精确度和数据的表示范围与精度;
- 主存容量:主存能存储的最大信息量,由$\underline{M\times N}$表示,其中$M$表示字容量(存储单元数),$N$表示位容量(每个存储单元的二进制位数)。
(2)与时间有关的性能指标
时钟周期:时钟频率(主频)的导数,是计算机处理操作最基本的时间单位;
$CPI$:执行每条指令所需的平均时钟周期数;
约定$IC$表示所有指令的总条数,$m$表示程序执行所需时钟周期数,$P_{i}$表示某类指令的使用频率,$IC_{i}$表示某类指令的条数,则满足$CPI=\frac{m}{IC}=\sum\limits_{i=1}^{n}(CPI_{i}\times P_{i})=\sum\limits_{i=1}^{n}(CPI_{i}\times \frac{IC_{i}}{IC}).$
$IPC$:每个时钟周期$CPU$能执行的指令条数;
$IPC$满足:$IPC=\frac{1}{CPI}.$
$CPU$时间:程序执行期间真正消耗$CPU$的时间(包括用户$CPU$时间和系统$CPU$时间);
约定$T$表示时钟周期时长,$f$表示$CPU$主频,则某段程序$CPU$时间可表示为$T_{cpu}=m\times T=\frac{m}{f}=CPI\times IC\times T=\frac{CPI\times IC}{f}.$
$MIPS$:每秒钟执行的百万条指令数;
约定$f’=f\times 10^{6}$,则$MIPS=\frac{IC}{T_{cpu}\times 10^{6}}=\frac{f}{CPI\times 10^{6}}=IPC\times f’.$
$MFLOPS$:每秒钟执行的浮点运算次数。
4.计算机系统的层次结构
二、数据信息的表示
1.数值数据的表示
(1)数值与机器码
- 数据格式是指使用二进制编码表示实际数据的结构形式,分类如下:
分类依据 | 具体分类 |
---|---|
是否有符号位 | 无符号数和有符号数 |
小数点位置 | 定点数和浮点数 |
定点数和浮点数比较如下:
- 定点数:包括定点整数和定点小数
- 定点小数:小数点位置在最高数位之前(符号位之后)
- 定点小数:小数点位置在最低数位之后
- 定点整数存在上溢问题(超出表示范围)
- 定点小数存在精度溢出问题(超出表示精度)
- 浮点数
- 表示方法:两个定点数分别表示阶码和尾数
- 溢出问题:存在上溢和下溢问题,也存在精度溢出问题
- 数据分布:浮点数在数轴上的分布并不均匀,越远离原点,浮点数越稀疏
- 浮点运算不满足结合律,小数+大数=大数
- 定点数:包括定点整数和定点小数
真值与机器码比较如下:
表示形式 | 机器零 | 用途 | |
---|---|---|---|
真值 | 用”$+$”和“$-$”表示符号 | 无 | 无 |
原码 | 将符号位加上二进制数的绝对值 | $+0=000$$-0=100$ | 表示浮点数的尾码 |
反码 | 符号位同原码,真值为负数时数值位逐位取反 | $+0=000$$-0=111$ | 无 |
补码 | 真值为负时反码末位加一得到补码 | $0=000$ | 计算机中采用补码进行存储、表示和运算 |
移码 | 与补码的符号位相反,数值位相同 | $0=100$ | 表示浮点数的阶码 |
有关补码:
- 补码又称为模2的补码,定点小数的模值为$2$,定点整数的模值为$2^{n+1}$;
- 补码的机器零唯一,多表示一个绝对值最大的负数,小数为$-1$,整数为$-2^n$;
- 反码法
- 真值为负数时将原码数据位逐位取反后末位加一得到补码;
- 补码符号位为1时将补码数据位逐位取反后末位加一得到原码;
- 扫描法
- 真值为负数时对原码数据位从右向左扫描,右起第一个1及其右边的数据位不变,其余各位取反。
- 补码符号位为1时对原码数据位从右向左扫描,右起第一个1及其右边的数据位不变,其余各位取反。
有关变形补码:
- 又称为双符号补码,指采用两个符号位表示数据的符号,其余位与补码相同;
- 当符号位为$00$时表示正数,为$11$时表示负数;
- 在运算时,即使产生溢出,变形补码的最高位也永远表示正确的符号位;
- 符号位为$01$表示运算出现正溢出,为$10$时表示出现负溢出。
(2)定点数表示
- 数据表示范围
最大正数 | 最小正数 | 最大负数 | 最小负数 | |
---|---|---|---|---|
定点小数 | $1-2^{-n}$ | $2^{-n}$ | $-2^{-n}$ | $-(1-2^{-n})$,补码表示时为$-1$ |
定点整数 | $2^n-1$ | $1$ | $-1$ | $-(2^n-1)$,补码表示时为$-2^n$ |
- 机器码计算公式
机器码 | $-2^n<x\leq0$(定点整数) | $-1<x\leq0$(定点小数) | $0\leq x\leq 2^n-1$或$0\leq x\leq 1-2^{-n}$ |
---|---|---|---|
原码 | $2^n+ | x | $ |
反码 | $2^{n+1}+x-1$ | $2+x-2^{-n}$ | $x$ |
补码 | $2^{n+1}+x$ | $2+x$ | $x$ |
移码 | $2^n+x$ | 无 | $2^n+x$(整数) |
(3)浮点数表示
表示规则
- $N=2^{E}\times M=2^E\times\pm(1.m)$
- $IEEE754$规则下,浮点数由数符$S$、阶码$E$、尾数$M$三部分组成,阶码采用移码表示,尾数采用原码表示;
- 尾数为定点小数,小数点固定在最左侧,且隐藏小数点左边的$1$,运算时还原为$1.M$形式;
- 对于$32$位浮点数($float$)而言:$S$为$1$位,$E$为$8$位,移码偏移为$2^7-1$,$M$为$23$位;
- 对于$64$位浮点数($double$)而言:$S$为$1$位,$E$为$11$位,移码偏移为$2^{10}-1$,$M$为$52$位。
转换方法(以$32$位浮点数$float$为例)
- 将十进制数$N$转换为$(-1)^s\times 2^e\times 1.M$,令$E=e+01111111$,保存$S$、$E$、$M$;
- 从$32$位二进制串分离出$S$、$E$、$M$,令$e=E-01111111$,代入$(-1)^s\times 2^e\times 1.M$,按权展开。
具体形式说明
- 当阶码为$1\sim 254$时,表示规格化数据;
- 当阶码为$255$时,表示非数或者$\infty$;
- 当阶码为$0$时,表示机器零或者非规格化数。
符号位$S$ | 阶码$E$ | 尾数$M$ | 表示 |
---|---|---|---|
$0/1$ | $255$ | 非零 | $NaN$ |
$0$ | $255$ | $0$ | $+\infty$ |
$1$ | $255$ | $0$ | $-\infty$ |
$0/1$ | $1\sim 254$ | $M$ | $(-1)^s\times 2^{E-127}\times 1.M$ |
$0/1$ | 0 | $M$(非零) | $(-1)^s\times 2^{-127}\times 0.M$(非规格化数) |
$0/1$ | $0$ | $0$ | $+0/-0$ |
2.非数值数据的表示
(1)字符表示
$ASCII$码是国际通用的字符码,包含$128$个字符,用一个字节表示,最高位为零。
(2)汉字编码
汉字编码包含输入码、机内码和字形码,分别用于汉字的输入、汉字在计算机内的存储与处理、汉字的显示和打印;
汉字机内码主要包括$GB2312$、$GBK$、$GB18030$、$Unicode$、$B1G5$等标准。
$GB2312$编码
以$2$个字节编码,最高位$MSB$为$1$;
实际用$14$位表示汉字,采用$94\times94$矩阵表示,每一行为区号,每一列为位号,采用区号+位号的方式得到区位码。
$GB2312$机内码$=$区位码$+A0A0H$
3.数据信息的校验
(1)码距
码距:两个编码对应位二进制位不同的个数。
- 编码体系的码距:一个编码体系中所有合法编码的最小码距;
- 码距越大,抗干扰能力、纠错能力越强,数据冗余越大,编码效率越低。
校验码:原始数据$+$校验数据
(2)奇偶校验
- 编码规则:增加一位校验位,使得数据中的$1$的个数保持奇偶性,利用编码中$1$的个数的奇偶性进行校验;
- 检错性能:奇偶校验码距为$2$,只能检测奇数位错误;
- 可采用交叉奇偶校验提高奇偶校验码的检错与纠错能力,交叉奇偶校验可以检测出所有的$3$位以下错误以及大多数$4$位错误。
- 简单奇偶校验公式:
- 偶校验位:$P=D_{1}\oplus D_{2}\cdots\oplus D_{n}$
- 偶校验检错位:$G=D_{1}’\oplus D_{2}’\cdots\oplus D_{n}’\oplus P’$
- 奇校验位:$P=\overline{D_{1}\oplus D_{2}\cdots\oplus D_{n}}$
- 奇校验检错位:$G=\overline{D_{1}’\oplus D_{2}’\cdots\oplus D_{n}’\oplus P’}$
- 交叉奇偶校验
- 交叉奇偶校验将待编码的原始数据构造成行列矩阵式结构,同时进行行和列两个方向上的奇偶校验;
- 使每个数据至少位于两个以上的校验组,当校验码中的某一位发生错误时,能在多个检错位中被指出,使得偶数位错误也可以被检查出。
(3)海明校验
①海明编码概述
- 海明编码又称为$SEC$码;
- $SEC$码的码距为$3$,只能纠一位错;
- 扩展海明码的码距为$4$,可以检测两位错同时纠正一位错;
- 海明校验是本质上是一种多重奇偶校验,既可以检错也可以纠错。
- 将原始数据信息分成若干偶奇偶校验组,所有数据信息位都会参与两个以上的校验组,每组设置一位偶校验位,所有校验组检错位的值构成检错码;
- 检错码为零,表示数据高概率正确,检错码不为零,则检错码值就是一位错的位置,通过检错码的值就可以实现编码的纠错。
②校验位的位数
设海明码$N$位,其中数据位$k$位,校验位$r$位,有$N=k+r$,称为$(n,k)$码;
海明码包含$r$个偶校验组,$r$个偶校验组的$r$检错信息构成一个检错码$G_r\cdots G_2G_1$;
为了使其能指出所有一位错,应有$N=k+r\leq 2^r-1$,这便是常见的$ECC$纠错码。
③编码分组规则
设有海明码$H_n\cdots H_2H_1$,原始数据$D_k\cdots D_2D_1$,校验位$P_r\cdots P_2P_1$;
为满足编码分组要求,校验位$P_i$放在$H_{2^{i-1}}$位置上,剩余位置由数据位依次填充;
$H_i$的数据被编号小于$i$的若干个海明码位号之和等于$i$的校验位所校验;
如对于$(11,7)$码,其编码分组如下:
$H_i$ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|
映射 | $P_1$ | $P_2$ | $D_1$ | $P_3$ | $D_2$ | $D_3$ | $D_4$ | $P_4$ | $D_5$ | $D_6$ | $D_7$ |
分组 | $1$ | $2$ | $1,2$ | $4$ | $1,4$ | $2,4$ | $1,2,4$ | $8$ | $1,8$ | $2,8$ | $1,2,8$ |
由此根据偶校验规则和各个校验位所校验的数据位,可以得到校验位计算公式:
$P_1=D_1\oplus D_2\oplus D_4\oplus D_5\oplus D_7$
$P_2=D_1\oplus D_3\oplus D_4\oplus D_6\oplus D_7$
$P_3=D_2\oplus D_3\oplus D_4$
$P_4=D_5\oplus D_6\oplus D_7$
同样可以得到检错位:
$G_1=D_1’\oplus D_2’\oplus D_4’\oplus D_5’\oplus D_7’\oplus P_1’$
$G_2=D_1’\oplus D_3’\oplus D_4’\oplus D_6’\oplus D_7’\oplus P_2’$
$G_3=D_2’\oplus D_3’\oplus D_4’\oplus P_3’$
$G_4=D_5’\oplus D_6’\oplus D_7’\oplus P_4’$
⑤检错与纠错
- 当检错码$G_r\cdots G_2G_1=0$时,表示海明码大概率正确(当出错位数大于等于最小码距时,检错码也可以为$0$);
- $SEC$码无法区分一位错和两位错;
- 当出现一位错时,检错码的值对应出错的海明码位号,直接取反即可纠错。
⑥扩展海明码
- 又称为$SECDED$码,最小码距为4,可以区分一位错和两位错,并能纠一位错;
- 在$SEC$码的基础上添加总偶校验位$P_{all}=(D_1\oplus D_2\cdots\oplus D_k)\oplus(P_1\oplus P_2\cdots\oplus P_k)$;
- 总偶校验检错码$G_{all}=P_{all}’\oplus(D_1’\oplus D_2’\cdots\oplus D_k’)\oplus(P_1’\oplus P_2’\cdots\oplus P_k’)$;
- 检错方法:
- $G_{all}=0$且$G=0$时,无错误发生;
- $G_{all}=1$时,出现一位错,此时如果$G=0$,说明$P_{all}$发生错误,数据部分正确,如果$G\ne 0$,说明数据部分发生一位错,可以根据检错码进行纠错;
- $G_{all}=0$且$G\ne 0$时,出现两位错。
(4)CRC校验
①编码规则
- 利用模$2$运算增加若干位校验位,使得该编码能够被指定的多项式整除;
模$2$运算 | 运算法则 |
---|---|
加减法 | 没有进位和借位的二进制加法和减法运算 |
乘法 | 根据模$2$加法运算求部分积之和,运算过程中不考虑进位 |
除法 | 根据模$2$减法求部分余数 |
除法运算法则:
- 部分余数首位为$1$时,商上$1$,按模$2$运算减除数;
- 部分余数首位为$0$时,商上$0$,减$0$;
- 部分余数小于除数的位数时,该余数即为最后余数;
②$CRC$校验流程
设有$CRC$码$N$位,原始数据$C_{k-1}\cdots C_1C_0$共$k$位,校验位$P_{r-1}\cdots P_1P_0$共$r$位,则$CRC$码为$C_{k-1}\cdots C_1C_0P_{r-1}\cdots P_1P_0$,称为$(n,k)$码,满足$N=k+r\leq 2^r-1$。
③生成$CRC$编码
假设待发送的$k$位二进制数据用信息多项式$M(x)$表示:$M(x)=C_{k-1}x^{k-1}+C_{k-2}x^{k-2}+\cdots+C_{1}x+C_{0}$;
将$M(x)$左移$r$位,得到$M(x)\cdot 2^r$,右侧空置的$r$位用来放置校验位;
选择一个$r+1$位的生成多项式$G(x)$,其最高次幂为$r$,最低次幂为$0$;
用$M(x)\cdot 2^r$按照模$2$的规则除以$G(x)$,得到的余数$R(x)$即为校验码;
设商为$Q(x)$,则有$M(x)\cdot 2^r+R(x)=Q(x)G(x)+R(x)+R(X)$,根据模$2$运算有$R(x)+R(x)=0$,因此$M(x)\cdot 2^r+R(x)=Q(x)G(x)$,表明$CRC$码一定能被$G(x)$整除,这也是$CRC$码的编码规则。
生成多项式的规则
- 最高位和最低位均为$1$;
- 当$CRC$码任何一位发生错误时,都不能被生成多项式整除;
- 不同位发生错误时,余数不同;
- 对余数继续做模$2$运算,应使余数循环。
④$CRC$编码的循环特性
- $CRC$编码的非$0$余数具有循环特性,即将余数左移一位除以生成多项式,将得到下一个余数,继续重复在新余数基础上左移一位除以生成多项式,多次循环后余数最终能循环为最开始的余数;
- 例如对于$(7,3)$码,设生成多项式为$11101$,数据位为$3$位,校验码为$4$位,则余数表如下所示:
序号 | 编码 | 余数 | 余数值 | 出错位 |
---|---|---|---|---|
1 | $0000000$ | $0000$ | $0$ | 无 |
2 | $000000\pmb{\underline{1}}$ | $0001$ | $1$ | $1$ |
3 | $00000\pmb{\underline{1}}0$ | $0010$ | $2$ | $2$ |
4 | $0000\pmb{\underline{1}}00$ | $0100$ | $\pmb{\underline{4}}$ | $3$ |
5 | $000\pmb{\underline{1}}000$ | $1000$ | $8$ | $4$ |
6 | $00\pmb{\underline{1}}0000$ | $1101$ | $13$ | $5$ |
7 | $0\pmb{\underline{1}}00000$ | $0111$ | $7$ | $6$ |
8 | $\pmb{\underline{1}}000000$ | $1110$ | $14$ | $7$ |
9 | $00000\pmb{\underline{11}}$ | $0011$ | $3$ | $1+2$ |
10 | $\pmb{\underline{111}}0000$ | $0100$ | $\pmb{\underline{4}}$ | $5+6+7$ |
⑤$CRC$串行编解码
- 触发器的初始状态均为$0$;
- 有异或门的位置为生成多项式为$1$的位置,如图例得到$G(x)=x^4+x+1$,对应编码为$10011$;
- 当$Q_4=0$时,不够除,异或门相当于直通,下一个时钟时,数据左移一位;
- 当$Q_4=1$时,够除,商上$1$,进行$Q_4Q_3Q_2Q_1Serial_in\oplus G(x)$,结果左移。
⑥$CRC$并行编解码
模$2$除法余数运算满足结合律:两数的余数异或等于两数异或后的余数
$(M(x)%G(x))\oplus(N(x)%G(x))=(M(x)\oplus N(x))%G(x)$
例如:设生成多项式$G(x)=1011$,原始数据为$M(x)=1101$,传输后的编码为$1101\underline{011}$,试求$CRC$编码和传输后的余数:
- 发送方编码:$1101\underline{000}=\pmb{1}000\underline{000}\oplus0\pmb{1}00\underline{000}\oplus000\pmb{1}\underline{000}$,则余数可以由三个数分别对$G(x)$进行模$2$运算后的余数异或得到;
- 接收方解码:$1101\underline{011}=\pmb{1}000\underline{000}\oplus0\pmb{1}00\underline{000}\oplus000\pmb{1}\underline{000}\oplus0000\underline{011}$,同样可以得到对应的余数,其中$0000\underline{011}$对$G(x)$进行模$2$运算后的余数即为$\underline{011}$;
计算流程
- 先计算$2^6$、$2^5$、$2^4$、$2^3$四个特殊常量的余数,再用余数的组合求解任意编码的余数。
- 在解码时,将计算得到的余数与各个特殊常量的余数比较,若相等,则该特殊常量对应的位出错,纠错即可。