1
0
mirror of https://github.com/Didnelpsun/CS408.git synced 2026-02-11 14:45:57 +08:00

更新存储管理

This commit is contained in:
Didnelpsun
2021-09-04 23:21:23 +08:00
parent 15eef0854f
commit 003c3158a7
4 changed files with 244 additions and 164 deletions

File diff suppressed because one or more lines are too long

View File

@@ -586,6 +586,13 @@ long double|临时浮点数|1|15|64|80|3FFFH|16383
+ 当阶码$E$为全$1$,即应该为$-128D$,而尾数$M$全为$0$时,表示无穷大$\pm\infty$,正负看数符。
+ 当阶码$E$为全$1$,即应该为$-128D$,而尾数$M$不全为$0$时,表示非数值$NaN$$Not\,a\,Number$)。如果非法操作如$0\div0$等就会使用到。
#### 尾数运算
由于阶码由原码转换为移码,尾数加减都需要进行原码运算,所以需要两种实现方式。
+ 转换为补码进行加减,再转回原码。
+ 直接用原码加减,符号和数值分开。
### 浮点数运算
#### 科学计数法加减运算
@@ -663,52 +670,53 @@ $int$与$float$转换
#### ALU结构
+ 输入信号有一个操作数的输入口输出信号有一个运算结果输出口旁边还有一个控制单元CU发出的控制信号接口会输入指令译码。
+ 机器字长就是指ALU可以同时处理多长的数据。为了保存结果寄存器的字长与机器字长相等。
+ 输入信号有一个操作数的输入口,输出信号有一个运算结果输出口,旁边还有一个控制单元$CU$发出的控制信号接口,会输入指令译码。
+ 机器字长就是指$ALU$可以同时处理多长的数据。为了保存结果,寄存器的字长与机器字长相等。
#### 逻辑运算
+ 与可以用*表示如A\*B。
+ 或可以用+表示如A+B。
+ 与可以用\*表示,如$A*B$
+ 或可以用+表示,如$A+B$
+ 优先级上类比乘法加法,与优先于或。
+ 具有类似的分配律结合律。
+ 与非:先与后非。
+ 或非:先或后非。
+ 异或:相异为1,相同为0
+ 同或:相同为0,相异为1
+ 异或:相异为$1$,相同为$0$
+ 同或:相同为$1$,相异为$0$
### 加法器实现
#### 一位全加器
+ 一位全加器FA中令被加数为$A$,被加数从低到高的位数为$A_i$,令加数为$B$,被加数从低到高的位数为$B_i$,令来自低位$i-1$的进位为$C_{i-1}$,本位的和为$S_i$。$S_i=A_i+B_i+C_{i-1}$。
+ 一位全加器$FA$中,令被加数为$A$,被加数从低到高的位数为$A_i$,令加数为$B$,被加数从低到高的位数为$B_i$,令来自低位$i-1$的进位为$C_{i-1}$,本位的和为$S_i$。$S_i=A_i+B_i+C_{i-1}$。
+ 输入$A_i$、$B_i$、$C_{i-1}$,输出$S_i$、$C_i$。
+ 输入中有奇数个1时为1(异或):$S_i=A_i\oplus B_i\oplus C_{i-1}$。
+ 输入中至少两个1才会高位进1,一种情况是两个本位都是1,另一种情况是有一个是1且来自低位的进位是1$C_i=A_iB_i+(A_i\oplus B_i)C_{i-1}$。
+ 输入中有奇数个$1$时为$1$(异或):$S_i=A_i\oplus B_i\oplus C_{i-1}$。
+ 输入中至少两个$1$才会高位进$1$,一种情况是两个本位都是$1$,另一种情况是有一个是$1$且来自低位的进位是$1$$C_i=A_iB_i+(A_i\oplus B_i)C_{i-1}$。
#### 串行加法器
+ 基于一个一位全加器,一位一位串行进入加法器运算。对比一位全加器,需要保存一个进位触发器用来保存进位位,进位触发器初始化值为0
+ 如果操作数长n位加法就要务n次进行,每次产生一位和,并且串行逐位地送回存器。
+ 基于一个一位全加器,一位一位串行进入加法器运算。对比一位全加器,需要保存一个进位触发器用来保存进位位,进位触发器初始化值为$0$
+ 如果操作数长$n$位加法就要分$n$次进行,每次产生一位和,并且串行逐位地送回存器。
#### 串行进位并行加法器
+ 把n个全加器串接起来,就可进行两个n位数的相加。前一个全加器的进位输出将作为下一个全加器的输入。
+ 把$n$个全加器串接起来,就可进行两个$n$位数的相加。前一个全加器的进位输出将作为下一个全加器的输入。
+ 串行进位又称为行波进位,每一级进位直接依赖于前一级的进位,即进位信号是逐级形成的。所以不可能比单纯的串行全加器快很多。
+ 加快进产生和提高传递速度是关键。
#### 并行进位并行加法器
+ 由于$S_i=A_i\oplus B_i\oplus C_{i-1}$,所以计算的重点是计算$C_i$,而$C_i=A_iB_i+(A_i\oplus B_i)C_{i-1}$,通过递归可以不断展开:$C_i=A_iB_i+(A_i\oplus B_i)(A_{i-1}B_{i-1}+(A_{i-1}\oplus B_{i-1})C_{i-2})$一直可以递归到$C_0$,而$A_i$、$B_i$、$C_0$都是一开始可以知道的,所以第$i$位向更高位的进位$C_i$可根据被加数、加数的第1到$i$位,再结合$C_0$即可确定。
+ 由于$S_i=A_i\oplus B_i\oplus C_{i-1}$,所以计算的重点是计算$C_i$,而$C_i=A_iB_i+(A_i\oplus B_i)C_{i-1}$,通过递归可以不断展开:$C_i=A_iB_i+(A_i\oplus B_i)(A_{i-1}B_{i-1}+(A_{i-1}\oplus B_{i-1})C_{i-2})$一直可以递归到$C_0$,而$A_i$、$B_i$、$C_0$都是一开始可以知道的,所以第$i$位向更高位的进位$C_i$可根据被加数、加数的第$1$到$i$位,再结合$C_0$即可确定。
+ 将$G_i=A_iB_i$$P_i=A_i\oplus B_i$,所以式子得到化简:$C_i=A_iB_i+(A_i\oplus B_i)C_{i-1}=G_i+P_iC_{i-1}$。
+ 所以$C_1=G_1+P_1C_0$$C_2=G_2+P_2C_1=G_2+P_2G_1+P_2P_1C_0$$C_3=G_3+P_3C_2=G_3+P_3G_2+P_3P_2G_1+P_3P_2P_1C_0$……所以一直到最后面每个$C_i$都可以用对应的$G_i$和$P_i$计算,这时候$C_i$可以不用递归来计算,可以用一开始就知道的$P_i$、$G_i$和$C_0$计算得到,从而这时候每一位的计算都可以一开始就同时进行了而不用依赖前面的计算。
+ 各级进位信号同时形成,又称为先行进位、同时进位。
+ $G_i$称为进位产生函数,因为$G_i$是通过$A_i$和$B_i$相与,只有同时为1才会产生1
+ $P_i$称为进位传递函数,$P_i$是通过$A_i$和$B_i$异或,实际上$P_i$为1时,只有此时$C_{i-1}$才能为1,否则为0
+ $G_i$称为进位产生函数,因为$G_i$是通过$A_i$和$B_i$相与,只有同时为$1$才会产生$1$
+ $P_i$称为进位传递函数,$P_i$是通过$A_i$和$B_i$异或,实际上$P_i$为$1$时,只有此时$C_{i-1}$才能为$1$,否则为$0$
#### 单级先行进位加法器
+ 称为组内并行、组间串行进位方式。
+ 由于逻辑表达式越长就代表电路实现越复杂,所以一般会最多用4个FA和一些新的线路、运算逻辑组成一个运算单元进行串联进位计算。
+ 由于逻辑表达式越长就代表电路实现越复杂,所以一般会最多用$4$个$FA$和一些新的线路、运算逻辑组成一个运算单元进行串联进位计算。
+ 组内的信息可以并行同时得到,但是组件信息需要串行进位。这时虽然实现简单,但是效率对比并行进位并行加法器还是下降了。
#### 多级先行进位加法器
@@ -717,4 +725,4 @@ $int$与$float$转换
+ 为了解决这个问题按照并行进位并行加法器的思路继续对每一组的数据进行计算。
+ 令$G_1^*=G_4+P_4G_3+P_4P_3G_2+P_4P_3P_2G_1$为组进位产生函数,$P_1^*=P_4P_3P_2P_1$为组进位传递函数。一开始输入就能确定,所以这些都是一开始就能确定的。
+ 所以$C_4=G_1^*+P_1^*C_0$$C_8=G_2^*+P_2^*C_4=G_2^*+P_2^*G_1^*+P_2^*P_1^*C_0$$C_{12}=G_3^*+P_3^*C_8=G_3^*+P_3^*G_2^*+P_3^*P_2^*G_1^*+P_3^*P_2^*P_1^*C_0$……
+ 所以4位BCLA只要输出$G_i$和$P_i$就可以在计算机中计算得到$C_{4i}$了。
+ 所以$4$位$BCLA$(成组先行进位电路)只要输出$G_i$和$P_i$就可以在计算机中计算得到$C_{4i}$了。

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long