笔记 数字电路与计算机组成
数字逻辑
进制转换
二进制转换
将二进制数从最小位开始每 &\log_2 N& 位为一组,不足左侧补零。每组直接转换成对应的N进制数字。
二进制转换成十进制,使用权重求和法,根据二进制位的进制,将每一位的值乘以 &2^{位次}& ,然后求和。
十进制转换成其他进制
用相对进制数反复除原数字,记录每次的余数,直到商为0为止。
83
/
8
=
10
83
m
o
d
8
=
3
10
/
8
=
1
10
m
o
d
8
=
2
1
/
8
=
0
1
m
o
d
8
=
1
\begin{align} 83/8 = 10 \quad& 83 \mod 8 = 3 \\ 10/8 = 1 \quad& 10 \mod 8 = 2 \\ 1/8 = 0 \quad& 1 \mod 8 = 1 \end{align}
83/8=1010/8=11/8=083mod8=310mod8=21mod8=1
倒序数字得 123
,即 83 = 123O
示例
将62.375转换成二进制数是111110.011
0.375
=
3
8
=
0.011
B
62
=
111110
B
0.375 = \frac{3}{8} = 0.011B \\ 62 = 111110B
0.375=83=0.011B62=111110B
122 = 01111010 B = 172 O = 7 A H 122 = 01111010B = 172O = 7AH 122=01111010B=172O=7AH
7 D . 8 H = 1111101.1 B = 175.4 O = 125.5 7D.8\text H = 1111101.1\text B = 175.4\text O = 125.5 7D.8H=1111101.1B=175.4O=125.5
逻辑门基础电路
逻辑门
执行逻辑门函数
非(NOT),与(AND),或(OR),与非(NAND),或非(NOR),等。
单输入逻辑门
NOT gate, buffer
二输入逻辑门
AND,OR,XOR,NAND,NOR,XNOR
XOR: F = A ⊕ B F = A \oplus B F=A⊕B
XNOR: F = A ⊕ B ‾ F = \overline{A \oplus B} F=A⊕B
多输入逻辑门
逻辑电平
规定信号的发送端为驱动器Driver,信号的接收端为接收器Receiver。
高电平噪声容限 N M H = V O H − V I H 低电平噪声容限 N M I = V O L − V I L 高电平噪声容限NM_H = V_{OH} - V_{IH} \\ 低电平噪声容限NM_I = V_{OL} - V_{IL} 高电平噪声容限NMH=VOH−VIH低电平噪声容限NMI=VOL−VIL
逻辑家族 | VDD | VIL | VIH | VOL | VOH |
---|---|---|---|---|---|
TTL | 5 (4.75 -5.25) | 0.8 | 2.0 | 0.4 | 2.4 |
CMOS | 5 (4.5 -6) | 1.35 | 3.15 | 0.33 | 3.84 |
三极管*
pMOS与nMOS
nMOS,门控端=0时,源极和漏极不导通,为1时导通。pMOS刚好相反。
CMOS
常见的有非门,与非门等。
功耗*
动态功耗:三极管门控端电容器充电得到能耗,电容C充电到电压
V
D
D
V_{DD}
VDD 所需要的能量
C
V
D
D
2
C{V_{DD}}^2
CVDD2 。假定电路的工作频率是
f
f
f ,假定所有的三极管同时切换,电容每秒充电 f/2 次。则整个动态功耗是
P
d
y
n
a
m
i
c
=
1
2
C
V
D
D
2
f
P_{dynamic} = \frac{1}{2}C{V_{DD}}^2f
Pdynamic=21CVDD2f
静态功耗:没有逻辑门切换时的能耗,静电供电电流引起,也被称为泄露电流
I
D
D
I_{DD}
IDD,因此整个静态功耗是
P
s
t
a
t
i
c
=
I
D
D
V
D
D
P_{static} = I_{DD}V_{DD}
Pstatic=IDDVDD
功耗举例
- V D D = 1.2 V V_{DD} = 1.2V VDD=1.2V
- C = 5 n F C = 5nF C=5nF
- f = 1 G H z f = 1GHz f=1GHz
- I D D = 20 m A I_{DD} = 20mA IDD=20mA
P = 1 2 C V D D 2 f + I D D V D D = 1 2 ( 5 nF ) ( 1.2 V ) 2 ( 1 GHz ) + ( 20 mA ) ( 1.2 V ) = 3.6 W \begin{align} P & = \frac{1}{2}C{V_{DD}}^2f + I_{DD}V_{DD}\\ & = \frac{1}{2}(5\text{nF}) (1.2\text{V})^2 (1\text{GHz}) + (20\text{mA})(1.2\text{V}) \\ & = 3.6\text{W} \end{align} P=21CVDD2f+IDDVDD=21(5nF)(1.2V)2(1GHz)+(20mA)(1.2V)=3.6W
逻辑代数和逻辑函数
逻辑代数基本定律
公式名称 | 公式 | |
---|---|---|
交换律 | ||
结合律 | ||
分配律 | ||
吸收率 | A ( A + B ) = A A(A + B) = A A(A+B)=A | A + AB = A |
A ( A ‾ + B ) = A B A(\overline{A} + B) = AB A(A+B)=AB | A + A ‾ B = A + B A + \overline{A}B = A + B A+AB=A+B | |
包含律 | ||
互补律 | A ⋅ A ‾ = 0 A \cdot \overline{A} = 0 A⋅A=0 | A + A ‾ = 1 A + \overline{A} = 1 A+A=1 |
0-1律 | 0 ⋅ A = 0 0 \cdot A = 0 0⋅A=0 | 0 + A = A 0 + A = A 0+A=A |
对合律 | A ‾ ‾ = A \overline{\overline{A}} = A A=A | |
重叠率 | A ⋅ A = A A \cdot A = A A⋅A=A | A + A = A A + A = A A+A=A |
反演律(德摩根) | A + B ‾ = A ‾ ⋅ B ‾ \overline{A + B} = \overline{A} \cdot \overline{B} A+B=A⋅B | A B ‾ = A ‾ + B ‾ \overline{AB} = \overline{A} + \overline{B} AB=A+B |
逻辑函数代数化简
吸收项
F
=
A
(
B
+
C
)
+
B
‾
C
‾
=
A
B
‾
C
‾
‾
+
B
‾
C
‾
=
A
+
B
‾
C
‾
\begin{align} F &= A(B+C) + \overline{B}\overline{C}\\ &= A\overline{\overline{B}\overline{C}} + \overline{B}\overline{C}\\ &= A + \overline{B}\overline{C} \end{align}
F=A(B+C)+BC=ABC+BC=A+BC
将 F(A, B, C) = AB + BC 化简成最小项之和与最大项之积,根据算式列出真值表。F = 1对应最小项,F = 0对应最大项。得到
F
=
∑
m
(
3
,
5
,
6
,
7
)
=
∏
M
(
0
,
1
,
2
,
4
)
F = \sum m(3, 5, 6, 7) = \prod M(0, 1, 2, 4)
F=∑m(3,5,6,7)=∏M(0,1,2,4)
卡诺图
逻辑函数表达式两种形式
与或表达式(积之和SOP)
由若干“与项”进行或运算构成的表达式
最小项之和
n变量的逻辑函数中,如果一个与项包含了所有n个的变量,而且每个变量都是一原变量或是反变量的形式作为一个银子仅出现一次,那么这样的与项就成为该逻辑函数的一个最小项。n个变量的全部最小项共有 2^n 个
m
0
=
A
‾
B
‾
C
‾
m
1
=
A
‾
B
‾
C
.
.
.
.
.
.
m
7
=
A
B
C
m_0 = \overline{A}\overline{B}\overline{C} \\ m_1 = \overline{A}\overline{B}C \\ ......\\ m_7 = ABC
m0=ABCm1=ABC......m7=ABC
任意一个最小项,有且仅有一组变量取值使其为1,而且与各种变量的取值均使它为0。
∑
i
=
0
2
n
−
1
m
i
=
1
\sum_{i = 0}^{2^n - 1}m_i = 1
i=0∑2n−1mi=1
最小项之和的标准形式:最小项的逻辑或形式所构成的逻辑函数表达式
F
(
A
,
B
,
C
)
=
A
B
C
‾
+
A
B
‾
C
‾
+
A
‾
B
C
=
m
6
+
m
4
+
m
3
=
∑
m
(
3
,
4
,
6
)
\begin{align} F(A,B,C) &= AB\overline{C} + A\overline{B}\overline{C} + \overline{A}BC \\ &= m_6 + m_4 + m_3 \\ &= \sum m(3,4,6) \end{align}
F(A,B,C)=ABC+ABC+ABC=m6+m4+m3=∑m(3,4,6)
或与表达式(和之积POS)
由若干“或项”进行与运算构成的表达式
最大项之积
∏
i
=
0
2
n
−
1
M
i
=
0
\prod_{i = 0}^{2^n - 1}M_i = 0
i=0∏2n−1Mi=0
F ( A , B , C ) = ( A + B + C ‾ ) ( A + B ‾ + C ‾ ) ( A ‾ + B + C ) = M 1 M 3 M 4 = ∏ M ( 1 , 3 , 4 ) \begin{align} F(A,B,C) &= (A+B+\overline{C})(A+\overline{B}+\overline{C})(\overline{A}+B+C) \\ &= M_1M_3M_4 \\ &= \prod M(1,3,4) \end{align} F(A,B,C)=(A+B+C)(A+B+C)(A+B+C)=M1M3M4=∏M(1,3,4)
两种基本形式的转换规则
- 最小项之和表示
F
=
∑
m
(
i
1
,
i
2
,
…
)
F = \sum m(i_1, i_2, \dots)
F=∑m(i1,i2,…):
- 最小项 m(i) 是当输入变量取特定二进制值组合 iii 时,函数 F 输出为1的表达式。
- 表达形式:逻辑表达式中包含所有使 F = 1 的条件,以「或」的形式列出。
- 最大项之积表示
F
=
∏
M
(
j
1
,
j
2
,
…
)
F = \prod M(j_1, j_2, \dots)
F=∏M(j1,j2,…):
- 最大项 M(j) 是当输入变量取特定二进制值组合 j 时,函数 FFF 输出为0的表达式。
- 表达形式:逻辑表达式中包含所有使 F = 0 的条件,以「与」的形式列出。
- 转换关系:
- F = ∑ m ( i ) F = \sum m(i) F=∑m(i) 的最大项之积形式 F = ∏ M ( j ) F = \prod M(j) F=∏M(j),其中 i ∪ j = 全集 i \cup j = \text{全集} i∪j=全集。
- 具体来说:全集表示所有可能的二进制组合,最小项和最大项的索引互补。
逻辑函数 F ( A , B , C ) = ∑ m ( 1 , 3 , 7 ) F(A, B, C) = \sum m(1, 3, 7) F(A,B,C)=∑m(1,3,7) 的最大项之积形式是 F ( A , B , C ) = ∏ M ( 0 , 2 , 4 , 5 , 6 ) F(A, B, C) = \prod M(0, 2, 4, 5, 6) F(A,B,C)=∏M(0,2,4,5,6)。
卡诺图化简
将逻辑函数 F ( A , B , C , D ) = ∑ m ( 0 , 1 , 2 , 3 , 8 , 9 ) F(A, B, C, D) = \sum m(0, 1, 2, 3, 8, 9) F(A,B,C,D)=∑m(0,1,2,3,8,9) 化简为最简与或表达式,并使用 Verilog HDL 的 assign 语句描述该逻辑函数。
AB\CD | 00 | 01 | 11 | 10 |
---|---|---|---|---|
00 | 1 | 1 | 0 | 0 |
01 | 1 | 1 | 0 | 0 |
11 | 0 | 0 | 0 | 0 |
10 | 1 | 1 | 0 | 0 |
根据卡诺图化简得 F ( A , B , C , D ) = A ‾ C ‾ + B ‾ C ‾ F(A, B, C, D) = \overline A \overline C + \overline B \overline C F(A,B,C,D)=AC+BC 。
对应的Verilog语句为
assign F = (~A & ~B) | (~B & ~C)
组合逻辑电路
三态门
三态门的输出存在高阻态。
多路选择器
半加器
S
=
A
⊕
B
C
o
u
t
=
A
B
S = A \oplus B \\ C_{out} = AB
S=A⊕BCout=AB
全加器
S
=
A
⊕
B
⊕
C
i
n
C
o
u
t
=
A
B
+
A
C
i
n
+
B
C
i
n
=
A
B
+
(
A
+
B
)
C
i
n
=
A
B
+
C
i
n
(
A
⊕
B
)
S = A \oplus B \oplus C_{in} \\ \begin{align} C_{out} &= AB + AC_{in} + BC_{in} \\ &= AB + (A + B)C_{in} \\ &= A B + C_{in}(A \oplus B) \end{align}
S=A⊕B⊕CinCout=AB+ACin+BCin=AB+(A+B)Cin=AB+Cin(A⊕B)
全加器FA的输入为
A
i
A_i
Ai、
B
i
B_i
Bi 和
C
i
−
1
C_{i-1}
Ci−1,输出分别是
S
i
S_i
Si 和进位
C
i
C_i
Ci,则输出的逻辑表达式
S
i
=
A
i
⊕
B
i
⊕
C
i
−
1
S_i = A_i\oplus B_i \oplus C_{i - 1}
Si=Ai⊕Bi⊕Ci−1 ,
C
i
=
A
i
B
i
+
(
A
i
⊕
B
i
)
C
i
−
1
C_i = A_i B_i + (A_i \oplus B_i) C_{i - 1}
Ci=AiBi+(Ai⊕Bi)Ci−1。
N位加法器
锁存器和触发器
时序逻辑电路的输出依赖于当前的输入和之前的输入。状态是能够解释电路行为的信息,其中现态用符号 Q Q Q 或者 Q n Q^n Qn 表示,次态用符号 Q ′ Q' Q′ 或者 Q n + 1 Q^{n+1} Qn+1 表示
锁存器Latch是在适中的电平触发状态更新的存储元件,触发器Flip-Flop是在时钟正负边沿触发状态更新的存储元件。
时序逻辑电路分为同步时序逻辑电路,和异步时序逻辑电路。同步时序逻辑电路中电路的状态转换与时钟信号同步,异步时序逻辑电路中电路的状态转换仅有输入信号确定。
时序逻辑电路
时序逻辑电路的描述工具有四种,分别是逻辑方程组,状态转换真值表,状态图和时序图。
Moore型电路输出仅是电路状态的函数,与当前的输入无关。
Mealy型电路输出是当前输入和电路状态的函数。
硬件描述语言
两种描述方法:
- 行为建模:描述模块的行为
- 结构建模:描述模块的结构(内部如何连接)
例如实现以下逻辑功能,可以首先设计两个模块,最后组合。
y
=
a
+
b
+
c
‾
y = \overline{a + b + c}
y=a+b+c
module and3(input a, b, c, output y);
assign y = a & b & c;
endmodule
module inv(input a, output y);
assign y = ~a;
endmodule
module nand3(input a, b, c, output y);
wire n1; // 内部信号
and3 andgate(a, b, c, n1); // and3模块实例
inv inverter(n1, y); // inv非门实例
endmodule
计算机组成
计算机的基本原理与结构
中央处理器
-
运算器的核心是算术逻辑运算部件ALU。内部有若干寄存器(如累加寄存器、暂存器)。
-
控制器主要包括时序控制信号形成部件和专用的寄存器。
存储器
存储器有三级存储系统
- 高速缓冲存储器(Cache),CPU直接访问,存放正在执行程序的活跃部分(副本),以便快速向CPU提供指令和数据。
- 主存储器,CPU直接访问,存放当前正在执行的程序和数据。
- 辅助存储器,主机外部,CPU不能直接访问,存放暂时不参与运算的程序和数据,需要时再传送到主存。
输入输出设备I/O
- 输入设备
- 输出设备
计算机的主要性能指标
机器字长,计算机进行一次整数运算所能处理的二进制数数据的位数,即运算器进行定点数运算的字长,通常也是CPU内部数据通路的宽度,与主存储器字长可以是相同的,也可以不相同,此时一般主存储器子长小于机器字长,会降低CPU工作效率。
**FLOPS(Floationg-point Operations Per Second)**每秒执行多少次浮点运算
F
L
O
P
S
=
程序中的浮点操作次数
执行时间
FLOPS = \frac{程序中的浮点操作次数}{执行时间}
FLOPS=执行时间程序中的浮点操作次数
还有其他表示数量级的前缀,MFLOPS,GHFLOPS……
**CPI(Cycles Per Instruction)**执行每条指令所需的平均时钟周期数
C
P
I
=
执行程序所需时钟周期数
程序中的指令条数
CPI = \frac{执行程序所需时钟周期数}{程序中的指令条数}
CPI=程序中的指令条数执行程序所需时钟周期数
**MIPS(Million Instruction Per Second)**单位时间内执行指令的平均条数(以百万为单位)
M
I
P
S
=
程序中的指令条数
程序执行时间
×
1
0
6
MIPS = \frac{程序中的指令条数}{程序执行时间\times10^6}
MIPS=程序执行时间×106程序中的指令条数
平均指令周期是指完成一条指令的时间,不同指令的指令周期不同使用平均指令周期反应执行速度。
例题
某计算机的CPU主频为100MHz,CPI为4。假定某外设的数据传输率为100KB/s,采用中断方式与主机进行数据传送,以32位为传输单位,对应的中断服务程 序包含22条指令,中断服务的其他开销相当于3条指令的执行时间。
- 某计算机的CPU主频为f = 100MHz,CPI为4,那么时钟周期 T 时钟 = 1 / f = 0.01 us T_{时钟} = 1/f = 0.01 \text{us} T时钟=1/f=0.01us 。因为 CPI = 4,所以指令周期是 T 指令 = C P I × T 时钟 = 0.04 us T_{指令} = CPI \times T_{时钟} = 0.04\text{us} T指令=CPI×T时钟=0.04us 。
- 因为外设的数据传输率为 100KB每秒,则外设要完成数据传送,采用中断方式与主机进行数据传送以32位为单位,也就是4B,每秒钟要产生 100 KB / 4 B = 25 × 2 10 100\text{KB} / 4\text B = 25 \times 2^{10} 100KB/4B=25×210 次中断。
- 在中断方式下,CPU用于该外设I/O的时间占整个CPU的时间百分比。每次中断为22+3 = 25次指令的开销。 t 中断时间 = 25000 × 25 × T 指令 = 1 us × 25000 = 25 ms t_{中断时间} = 25000 \times 25 \times T_{指令} = 1\text{us} \times 25000 = 25 \text{ms} t中断时间=25000×25×T指令=1us×25000=25ms。则设备A的I/O时间占整个CPU时间的百分比为 25ms / 1s = 2.5%。
编码和信息的表示
数据的基本宽度
- bit(比特)是计算机信息的最小单位,用来表示0或1
- Byte(字节)是二进制信息的计量单位,8个二进制位整体
- 现代主流计算机存储器按字节编址
- 字节是最小可寻址单位
- word(字),机器字长宽度的位组
- 字长指数据通路的宽度
- 字用来表示被处理信息的单位
在如下16位字长的计算机中,32位二进制数据0100_1100_0011_0001_1000_0101_1011
表示一个双字4C31285BH
**最高有效位(MSB)**指数据的最高权重位,**最低有效位(LSB)**指数据的最低权重位。
数值数据的表示*
无符号数与带符号数
所谓无符号数就是整个机器字长的全部二进制均表示数值位(没有符号位)。对于字长n+1位的无符号数的表示范围位 0 ( 2 n + 1 − 1 ) 0 ~ (2^{n + 1} - 1) 0 (2n+1−1) ,例如字长为8位,无符号数表示范围是0~255。
带符号数包含正负数和零,用符号与绝对值来表示数值大小,这种形式表示的数值称为真值,约定以二进制形式的最高位作为符号位,0代表正数或0,1代表负号。这种在计算机中使用的形式称为机器数。
原码
纯小数 | 原码 |
---|---|
0.0110 | 00110 |
-0.0110 | 10110 |
纯整数 | 原码 |
---|---|
1101 | 01101 |
-1101 | 11101 |
纯整数0有两种不同的原码表示 [ + 0 ] 原 = 00000 , [ − 0 ] 原 = 10000 [+0]_原 = 00000,[-0]_原 = 10000 [+0]原=00000,[−0]原=10000。
反码
最高位表示符号位,数值部分,正数的数值部分与真值形式相反,负数的数值部分为真值按位取反。
纯小数 | 反码 |
---|---|
0.0110 | 00110 |
-0.0110 | 11001 |
纯整数 | 反码 |
---|---|
1101 | 01101 |
-1101 | 10010 |
补码
正数数值部分真值相同,负数数值部分真值按位取反然后加一。
纯小数 | 补码 |
---|---|
0.0110 | 00110 |
-0.0110 | 11010 |
纯整数 | 补码 |
---|---|
1101 | 01101 |
-1101 | 10011 |
此时纯小数和纯整数中0的补码都是唯一。
正数的原码、反码和补码的形式都相同。
已知 [ − X ] 补码 = 9 A H [-X]_{补码} = \mathrm{9AH} [−X]补码=9AH,则 [ X ] 补码 = 66 H [X]_{补码} = \mathrm{66H} [X]补码=66H , [ X ] 原码 = 66 H [X]_{原码} = \mathrm{66H} [X]原码=66H。
IEEE浮点数*
IEEE浮点数表示:| 符号位 m s m_s ms | 阶码 E | 尾数 m |
类型 | 数符ms | 阶码E | 尾数m | 总位数 | 偏置值 | 十进制偏置值 |
---|---|---|---|---|---|---|
短浮点数 | 1 | 8 | 23 | 32 | 7FH | 127 |
长浮点数 | 1 | 11 | 52 | 64 | 3FFH | 1023 |
临时浮点数 | 1 | 15 | 64 | 80 | 3FFFH | 16383 |
例:将100.25转换成短浮点数
100.25 = 1100100.01B
1100100.01B = 1.10010001 \times 2^6,得到尾数和阶数。
阶码 = 偏置值 + 阶码真值 = 1111111 + 110 = 10000101
符号位:0,阶码:10000101,尾数:110010001000000000000000
短浮点数表示为:0100_0010_1110_0100_0100_0000_0000_0000B
十六进制代码为:42C88000H
运算方法与运算器
加法器
一位全加器
S i = A i ⊕ B i ⊕ C i − 1 C i = A i ⋅ B i + ( A i ⊕ B i ) ⋅ C i − 1 S_i = A_i \oplus B_i \oplus C_{i-1} \\ C_i = A_i \cdot B_i +(A_i \oplus B_i) \cdot C_{i - 1} Si=Ai⊕Bi⊕Ci−1Ci=Ai⋅Bi+(Ai⊕Bi)⋅Ci−1
先行进位加法器加法器
先行进位的并行加法器也成为并行进位或者超前进位。基本思想是不用全加器,重新设计并行加法电路,使高位运算不等待低位进位,而是从低位的运算数直接运算得到。先行进位加法器的进位生成函数G和进位传递函数P可以由当前参加运算的输入数据A和B生成,此时
C
i
=
G
i
+
P
i
C
i
−
1
Ci = G_i + P_iC_{i - 1}
Ci=Gi+PiCi−1。
KaTeX parse error: Expected 'EOF', got '&' at position 16: \text{进位生成函数} &̲ G_i = A_i B_i …
其中,进位传递函数函数的逐位定义 P i = A i ⊕ B i P_i = A_i \oplus B_i Pi=Ai⊕Bi,组定义为 P = A + B P = A + B P=A+B 。
先行进位加法器加法器的进位生成函数G和进位传递函数P可以由当前参加运算的输入数据A和B生成,如果 A = 96H,B = 87H,则相应的进位生成函数 G = 86H,P = 11H 或者 P = 96H
程序状态字
标志寄存器PSW(Program Status Word)是一个专用寄存器,存放运算结果的特征标志。
-
CF(Carry Flag)进位标志
1表示有进位,0表示没有进位
逻辑方程: C F = S n CF = S_n CF=Sn
无符号数加法运算溢出,即最终结果超出了当前可以表示的范围。
-
SF(Sign Flag)符号标志
1表示结果为负数,0表示结果为正数
逻辑方程: S F = S n − 1 SF = S_{n - 1} SF=Sn−1
-
ZF(Zero Flag)为零标志
1表示结果为零,0表示结果非零
逻辑方程: Z F = S n − 1 + ⋯ + S 0 ‾ ZF = \overline{S_{n - 1} + \cdots + S_0} ZF=Sn−1+⋯+S0
-
OF(Overflow Flag)溢出标志
1表示补码运算结果溢出,0表示补码运算结果不溢出。当有符号数运算由于进位,导致符号位被更改,则说明出现溢出。
例题
采用如图1所示的8位二进制加减运算电路,同时产生运算结果的特 征标志,其中包括进位(借位)标志CF和溢出标志OF,当有进位或者借位时CF=1,否则 为CF=0;当运算溢出时OF=1,否则OF=0。试回答下列问题。
- 若 X = 86H,Y = F6H,mode = 0,运算结果X + Y = 1000_0110B + 1111_0110B = 1_0111_1100B,结果F = 01111100B = 7CH,结果产生进位,进位标志CF和溢出标志OF都为1。
- 如果上述运算数是无符号数,应该根据溢出标志CF判断运算结果是否超出范围。上述运算结果超出范围,因为此时X = 134,Y = 246,正确的运算结果是 380,而结果是124,因为超出了表示范围所以溢出标志为1。
- 如果上述运算数是有符号数,应该根据进位标志OF标志判断运算结果是否超出范围。
运算器的组织
算数逻辑单元ALU
运算器有单周期与多周期。多周期数据通路是将复杂运算分解为若干个简单运算,从而使用更少的硬件资源。
流水线,将一个重复性的过程分解为若干个子过程,每个子过程由一个特定的功能部件来完成,每个子过程的处理时间大致相等,多个子过程同时在不同的部件中完成。
运算器的数据通路
寄存器组/寄存器文件:运算器内部通常包含若干个通用寄存器,以暂时参加运算的数据和中间结果。这些寄存器的低集合就成为寄存器组或寄存器文件,也叫做寄存器堆。
双端口寄存器组读写端口分开,有一套读端口和一套写端口,WriteEnable线作为地址译码器的使能信号。
单端口寄存器组读写共用一套地址和数据端口
多周期运算器数据通路实例
ALU为算术逻辑单元,是执行算术和逻辑运行的核心模块。RX是一个临时存储器,通常用于存储参与当前运算的数据,或是ALU计算中间结果的寄存器。RF(Register File)是处理器中一组通用寄存器的集合,用于存储操作数和运算结果。PSW程序状态字,用于存储程序执行得到状态信息,包括标志为,如零标志Z、进位标志C、溢出标志O、符号标志S等。GRS(General Register Set)通用寄存器组,是处理器中的一组通用寄存器,通常与RF类似,用于存储中间计算值和局部变量。
其中三态门的XXoe
表示允许输出(Output Enable),寄存器的 XXce
表示Clock Enable,表示允许写入,所有寄存器共用一个时钟信号,由始终使能XXce决定是否对XX寄存器有效。
(
R1
)
+
(
R2
)
→
(
R3
)
(\text{R1}) + (\text{R2}) \rarr (\text{R3})
(R1)+(R2)→(R3)
-
(R1) \rarr RX
Index = 1
GRSoe = 1
RXce = 1
-
(RX) + (R2) \rarr RF
R2 \rarr ALU.Y
Index = 2
GRSoe = 1
ALUop = ADD
ALU.F \rarr RF
RFce = 1
FALGE \rarr PSW
PSWce = 1
-
RF \rarr R3
RFoe = 1
Index = 3
GRSce = 1
存储器
非易失性存储器
按在系统中的作用分类
-
高速缓冲存储器
高速缓冲存储器(Cache)位于主存储器和CPU之间,用来存放主存储器中当前最活跃的程序和数据的副本,以减少对主存储器的访问次数。
-
主存储器
主存储器(Main Memory)又称内存,用来存放计算机运行期间要执行的程序和数据,是CPU可以直接访问的主要存储器
-
辅助存储器
辅助存储器(Axuiliary Memory)又称外存,用来存储当前不参与运行的程序和数据,及一些长期保存的信息。
-
控制存储器
只在微程序控制的CPU中出现,用来存放控制信息(微程序)。
按存期方式分类
-
随机存储器
随机存储器(Random Access Memory)读写方便,目前被广泛应用在主存储器、高速缓冲存储器中。半导体RAM在端点后内容消失。
-
非易失性存储器
非易失性存储器(Non-Volatile Memory)是指掉电后所存储的数据不会消失的存储器,包括只读存储器、Flash存储器
-
顺序存储器
只能按照某种顺序读写存储单元的存储器称为顺序存取存储器(Seiral Access Memory)
-
直接存取存储器
直接存取存储器(Direct Access Memory)最典型的例子就是磁盘,它的工作工程不同于RAM和SAM,它的寻道过程是直接定位到某一个磁道,训导之后的一圈磁道则是按顺序方式存取。
主存储组织
扩展方式有位扩展(存储单元字长的扩充),字扩展(存储单元字数的扩充)和字位同时扩展。
计算存储芯片数量的方法
芯片数
=
存储要求容量
存储芯片的单片容量
芯片数 = \frac{存储要求容量}{存储芯片的单片容量}
芯片数=存储芯片的单片容量存储要求容量
例如存储器容量是
256
M
×
8
256M \times 8
256M×8,如果现有的芯片容量为
16
M
×
4
16M \times 4
16M×4,则需要的芯片数量为
256
M
×
/
16
M
×
4
=
32
256M \times / 16M \times 4 = 32
256M×/16M×4=32 片。
位扩展,即每个存储单元二进制位数的扩展,例如用 16 K × 1 16K \times 1 16K×1 的芯片组成 16 K × 8 16K \times 8 16K×8 的存储器。芯片的地址线全部并联并与地址总线相应连接,片选信号线并联,连接到地址译码器的输出端,读写控制信号并联,连接到控制总线的存储器读写控制线上,不同芯片的数据线连接到数据总线不同位置上。
字扩展,即存储单元数的扩展,例如用 16 K × 8 16K \times 8 16K×8 的芯片组成 64 K × 8 64K \times 8 64K×8 的存储器。各芯片的数据线并联,连接至相应的系统数据总线,芯片的地址线并联到地址总线对应位上,地址总线高位接译码器,译码器输出用作各芯片的片选信号。读写控制信号并联,连接到控制总线的存储器读写控制线上。
字位同时扩展,用 16K \times 1bit 的存储芯片扩充为 64K \times 8bits 的存储器。
64KB \times 8位,需要 \log_2(64 \times 2^10) = 16 根地址线和 8 根数据线。
指令系统
指令格式
基本格式:操作码|地址码
操作码指明操作的性质及功能,地址码指明操作数的地址,特殊情况下也可能直接给出操作数本身。
指令长度指指令的二进制编码的位数,指令应尽可能短,减小存储器占用,等于字节的整数倍以保持规整。定长指令子结构的长度都是相等的,变长指令字结构中,指令的长度随指令功能而异。
双操作指令除了操作码,还应包含第一操作数地址,第二操作数地址,操作结果存放地址和下调将要执行指令的地址。
不同地址指令
四地址指令:|OP|
A
1
A_1
A1|
A
2
A_2
A2|
A
3
A_3
A3|
A
4
A_4
A4|
(
A
1
)
O
P
(
A
2
)
→
A
3
A
4
是下条将要执行的指令
(A_1) OP (A_2) \rarr A_3 \\ A_4\text{是下条将要执行的指令}
(A1)OP(A2)→A3A4是下条将要执行的指令
三地址指令:|OP|
A
1
A_1
A1|
A
2
A_2
A2|
A
3
A_3
A3|
(
A
1
)
O
P
(
A
2
)
→
A
3
(
P
C
)
+
1
是下条将要执行的指令
(A_1) OP (A_2) \rarr A_3 \\ (PC) + 1 \text{是下条将要执行的指令}
(A1)OP(A2)→A3(PC)+1是下条将要执行的指令
二地址指令
(
A
1
)
O
P
(
A
2
)
→
A
1
(
P
C
)
+
1
是下条将要执行的指令
(A_1) OP (A_2) \rarr A_1 \\ (PC) + 1 \text{是下条将要执行的指令}
(A1)OP(A2)→A1(PC)+1是下条将要执行的指令
其中A_2称为源操作数地址,
A
1
A_1
A1 称为目的操作数地址。A_1中原存内容在指令执行后被破坏。
一地址指令
A
c
c
O
P
(
A
1
)
→
A
c
c
(
P
C
)
+
1
是下条将要执行的指令
A_{cc} OP (A_1) \rarr A_{cc} \\ (PC) + 1 \text{是下条将要执行的指令}
AccOP(A1)→Acc(PC)+1是下条将要执行的指令
其中,
A
c
c
A_{cc}
Acc 为累加寄存器。
指令字长
设某机器的指令长度为16位,操作码字段为4位,有三个4位的地址码字段。
寻址技术
根据指令的地址码字段寻找真实操作数的方式
立即寻找:OP|立即数
寄存器寻址:指定的寄存器存放着操作数
E
A
=
R
i
EA = R_i
EA=Ri
直接寻址:指令中直接给出操作数的地址
E
A
=
A
EA = A
EA=A
间接寻址:指令中给出操作数地址的存放的地址
E
A
=
(
A
)
EA = (A)
EA=(A)
寄存器间接寻址:指令中给出的寄存器,存放了操作数的地址
E
A
=
(
R
i
)
EA = (R_i)
EA=(Ri)
变址寻址:指令给出的地址与变址寄存器R_X的内容相加,才是操作数的地址。其中R_X的内容为变址值。
E
A
=
A
+
(
R
X
)
EA = A + (R_X)
EA=A+(RX)
基址寻址:基址寄存器R_b的内容与位移量D相加,才是操作数地址
E
A
=
(
R
b
)
+
D
EA = (R_b) + D
EA=(Rb)+D
相对寻址:相对寻址是由程序计数器PC提供基准地址
E
A
=
(
P
C
)
+
D
EA = (PC) + D
EA=(PC)+D
操作数得到三个来源:立即数,寄存器操作数(存储在寄存器中),存储器操作数(存储在内存中)
指令类型
运算类指令
-
算术运算指令:ADD、SUB、INC、DEC
-
逻辑运算指令:AND、OR、XOR、NOT
-
位移指令:SHL、SHR、SAL、SAR
位移分为算数位移、逻辑位移和循环位移三种,也分左移和右移。算数位移的对象是带符号数,算数位移过程中必须保持操作数的符号不变,左移一位数值乘二,右移一位数值除二。
程序控制类指令
-
转移指令:JMP、Jxx
-
子程序调用和返回指令
子程序可以共用的指令序列,只要知道子程序的入口地址就能调用它。从主程序转向子程序的指令称为子程序调用指令(CALL),而从子程序专项主程序的指令称为返回指令(RET)
输入输出类指令
输入输出类指令用来实现主机与外部设备之间的信息交换。通常由两种方式,独立编址方式和统一编址方式。
RISC-V
例题
计算机指令格式如图3所示,指令系统采用16位定长指令格式,其中,OP是定长指令的操作 码;Md、Ms1和Ms2分别是目的操作数、源操作数1和源操作数2的寻址方式位,支持寄 存器直接寻址和寄存器间接寻址两种寻址方式,寻址方式为分别是0和1;Rd、Rs1、Rs2是 寄存器编号,通用寄存器 R0~R7 的编号分别是 0~7 。
-
Md、Ms1和Ms2分别占一位,Rd、Rs1和Rs2分别需要编制八个寄存器地址,也就是占三位。所以操作码字段长度为 16 − 3 × ( 1 + 3 ) = 4 16 - 3 \times (1 + 3) = 4 16−3×(1+3)=4,所以计算机的指令系统最多可以定义 2^4 = 16 条指令。
-
假定ADD、OR和SUB指令的操作码分别是2、5和3,则如下3条指令构成的 程序,对应的机器码(用16进制表示)各是什么?请给出分析计算的过程。
ADD R3, R1, R2; (R1) + (R2) -> R3
0010_0_011_0_001_0_010
OR R6, R3, R2
0101_0_110_0_011_0_010
SUB R5, R4, R3
0011_0_101_0_100_0_011
-
如果该计算机采用“按序发射、按序完成”的5级流水线:IF(取指)、ID(译码及 读取寄存器值)、EXE(执行)、MEM(访存)和WB(写回寄存器),并且硬件上不采用任何转发 措施。上述三条指令中,第二条指令的数据与第一条指令数据有关,所以会发生阻塞。
控制器与中央处理器
控制器内的主要组成部件
CPU控制器的寄存器
CPU控制器的寄存器用于暂存中间结果、最终结果以及控制、状态信息。
通用寄存器可以存放原始数据和运算结果。
专用寄存器
- 程序计数器 (Program Counter, PC),存放即将执行的指令的地址。每次取指令后,PC 的值会自动增加(顺序执行)或更新为跳转地址(分支跳转)。
- 指令寄存器 (Instruction Register, IR),存放当前正在执行的指令。从内存取出的指令被加载到 IR 中以供译码和执行。
- 存储器地址寄存器 (Memory Address Register, MAR),存放当前访问的内存单元地址。无论是读数据还是写数据,操作的地址都由 MAR 指定。
- 存储器数据寄存器 (Memory Data Register, MDR),存放从内存读取的数据或写入内存的数据。即数据在 CPU 和内存之间的临时缓冲区。MAR和MDR配合实现CPU和主存进行信息交换。
- 程序状态字寄存器 (Program Status Word Register, PSWR),存放程序的状态信息,例如条件标志(如零标志、进位标志)、中断标志、模式控制位等。用于反映 CPU 当前的状态和控制程序运行。
控制器的主要实现方法
指令的执行流程
例题
某字长是16位的计算机,主存按字编址,存取单位为16位;指令系 统采用16位定长指令格式;CPU采用单总线结构,数据通路如图2所示,图中R0~R7是通 用寄存器;T是暂存器;SR是移位寄存器,可实现直送(mov)、左移一位(left)、右移一位(right) 三种操作,控制信号位SRop,SR的输出由信号SRout控制;ALU可以实现直送A(move)、 A加B(add)、A减B(sub)、A与B(and)、A或B(or)、A取非(not)、A加1(inc)七种操作,控制信号是ALUop。
-
上图中的三个寄存器分别是 MAR寄存器,MDR寄存器和IR寄存器。
-
因为该计算机采用单总线的数据通路,ALU执行双操作数的运算时,一个操作数可以来自于内部总线,另外一个操作数需要暂时存放在暂存器TR中。
-
ALU可以执行七种操作,所以ALUop的位数至少是 [ log 2 7 ] = 3 [\log_2 7] = 3 [log27]=3 位。
SR可以执行三种操作,所以SRop的位数至少是 [ log 2 3 ] = 2 [\log_2 3] = 2 [log23]=2 位。
-
SRout控制一个三态门来控制是否写入总线。除此之外,通用寄存器和四个专用寄存器MAR、MDR、PC和IR都需要三态门控制来确定是否向CPU总线操作数据。
-
六个端点,1、2、3和5需要连接IR控制的控制部件。
-
为了完善单总线数据通路,需要将4和6添加连线。6传输数据给4。
-
程序计数器PC每次递增的数值是1,如果没有专门的PC递增控制信号,可以使用ALU实现PC自增。
存储体系
高速缓存
程序局部性原理,在较短时间间隔内,程序产生的地址往往集中在一个小范围内,这种现象称为程序访问的局部性;时间局部性指刚被访问过的单元很有可能很快被再次访问,空间局部性指刚被访问过的的单元其邻近单元很有可能被很快访问。
高速缓冲存储器是在CPU和主存之间引入的高速、小容量存储器,存放主存当前最活跃的程序和数据副本。
CPU与Cache和MM传输数据的单位是字,Cache与MM传输数据的单位是块。一块由若干字组成,是定长的。储存地址包含块地址(块号)和块内偏移(offset),高速缓存Cache则每一行保存了有效位V,Tag和Cache数据区。
Cache地址映射
-
直接映射:每个主存块映像到Cache的固定行
-
全相联:每个主存块映像到Cache的任一行
全相联映射中,需要的硬件比较器与行数相同,得以通过一次比较得出结果。
-
组相联:每个主存块映像到Cache固定组任一行
平均读写周期 = 命中率 × c a c h e 读写周期 + ( 1 − 命中率 ) × ( M M 读写周期 + c a c h e 访问周期 ) 平均读写周期 = 命中率 \times cache读写周期 + (1 - 命中率) \times (MM读写周期 + cache访问周期) 平均读写周期=命中率×cache读写周期+(1−命中率)×(MM读写周期+cache访问周期)
直接映射
Cache按数据块大小 2 b 2^b 2b 进行分行(快),总共划分 2 c 2^c 2c 行(块)。在内存上按数据大小 2 b 2^b 2b 进行分块,划分出 2 m 2^m 2m 块,再将内存快分区,每个区的块数是 2 c 2^c 2c 个,总共划分为 2 m − c 2^{m - c} 2m−c 个区。
将主存地址划分为 |区号(Cache的Tag)|块号(Cache的行地址)|块内偏移|
对应到Cache表内,寻找块号,区号,并查看1有效位。
映像规则是内存每个区的第Y块只能映像到Cache的第Y行。
直接映像示例
假定某系统驻村和高速缓存之间采用直接映像方式,数据块大小为 4B ,字节编址,主存为 128B,Cache数据区容量为 32B ,CPU 7次访问主存进行读操作的主存单元地址依次为 1011000
1101010
1011010
1101011
1000000
0011001
1011011
。
分析每次访问时,Cache的命中和替换情况。
例题
主存-高速缓冲存储器采用直接映射得到方式,按字节编址,块大小为512字节,高速缓存容量是4K字节,主存容量是64K字节。某时刻的Cache部分内容如表所示。
-
高速缓存Cache分成 4KB / 512B = 8块(行),块(行)地址有 log 2 8 = 3 \log_2 8 = 3 log28=3 位,块内地址 log 2 512 = 9 \log_2 512 = 9 log2512=9 位。
-
主存分成 64K / 4K = 16区,区号有 log 2 16 = 4 \log_2 16 = 4 log216=4 位,每个区分为8块,块号占 log 2 8 = 3 \log_2 8 = 3 log28=3 位,块内地址有 log 2 512 = 9 \log_2 512 = 9 log2512=9 位。
-
根据下表Cache的信息分析,访问主存地址 7163H 和 5BCFH是否命中。
7163H = 0111_0001_0110_0011B
,得区号为0111 = 7H
,块号为000 = 0
。有效位为0则此Cache行是无效的,访问没有命中Cache。5BCFH = 0101_1011_1100_1111B
,区号为0101 = 5H
,块号为101 = 5
。即命中,对应的Cache地址就是内存地址的低12位,即1011_1100_11111B
,十六进制是BCFH。 -
假设CPU依次访问主存地址 7191H、5BD8H、60EDH和5A03H的四个单元,Cache的命中率在连续的四次访问中命中次数是两次,所以命中率为 50%。四次访问中,两次未命中发生了Cache行的替换。
页式虚拟存储器中,TLB有16行,并使用全相联映射,TLB需要的硬件比较器个数是16个。
输入输出系统
I/O端口的编址方式
程序查询方式
中断工作方式*
CPU在执行程序的过程当中,随机地出现某些事件要求处 理,CPU暂停当前的程序,转去执行该事件的处理程序,处 理完毕后又返回原来程序被中断的地方继续执行。
某计算机的CPU主频为500MHz,CPI为5。假定某外设的数据传输率为500KB/s, 采用中断方式与主机进行数据传送,以32位为传输单位,对应的中断服务程序包含 18 条指令,中断服务的其他开销相当于 2 条指令的执行时间。
- 该外设每隔多长时间 产生一次中断请求?外设的数据传输率为 500KB/s,每次中断传输 32 位(4B),则每隔 ( 4 / 0.5 M ) = 8 us (4 / 0.5M) = 8 \text{us} (4/0.5M)=8us 产生一次中断请求。
- 在中断方式下,CPU用于该外设I/O的时间占整个CPU时间 的百分比是多少?CPU主频为 500MHz,CPI - 5,则平均指令周期 = 5 / 500M = 0.01us,每次中断占用CPU时间 = (18 + 2) \times 0.01 = 0.2us。所以CPU用于该外设I/O的时间占整个CPU时间得到百分比是 0.2/8 = 0.025 = 2.5%
中断屏蔽
由接口中的状态寄存器的Ready位我表示,此时也称作中断请求触发器。CPU响应信号INTA清除中断请求。
中断响应的优先次序从高到低为 1 → 2 → 3 → 4 → 5 1 \rarr 2 \rarr 3 \rarr 4 \rarr 5 1→2→3→4→5,每一个中断源对应一个屏蔽字。屏蔽字为1代表屏蔽来自于哪个程序级别的中断请求。
将中断处理次序修改为 1 → 4 → 3 → 2 → 5 1\rarr4\rarr3\rarr2\rarr5 1→4→3→2→5
在一个8级中断系统中,硬件中断响应从高到低优先顺序是1->2->3->4->5->6->7->8,设置中断屏蔽寄存器后,中断服务的优先顺序变为1->5->8->3->2->4->6->7。
-
应该如何设置中断屏蔽字?
-
如果CPU在执行一个应用程序时有5、6、7级3个中断同时达到,又有一个8级中断在6级中断没有处理完毕之前达到,在处理8级中断时一个2级中断又达到CPU,请画出CPU响应这些中断的顺序示意图。
DMA方式
DMA(Direct Memory Access)直接存储器访问。依靠硬件在主存储器和外设之间直接进行数据交换,不需要CPU的程序干预。适用于高速外设,外设的数据传输速度接近或超过一条指令的处理速度。
当DMA要求访问主存时,如果CPU也要访问主存,则CPU暂时停顿一个存储周期,一个数据结束后,CPU立即继续运行。也称单字传送方式。适用于存储周期工作速度高于 I/O 设备较多时。可以调高主存的时间利用率,对CPU程序执行的影响较小。
下面处理器和外设交换数据的工作方式中,外部辅助存储器最适合采用的是DMA方式。