Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
bowling233 committed May 11, 2024
1 parent 098648d commit 8ceedb7
Show file tree
Hide file tree
Showing 9 changed files with 348 additions and 134 deletions.
124 changes: 0 additions & 124 deletions backup/books/FOCS/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,36 +114,7 @@ UML 是统一建模语言 Unified Modeling Language。它包括:用户视图
- 小数部分:连乘
- 将一个 $n$ 位十进制数转换为其他进制,怎么计算需要的位数?

## Ch.3 数据储存

!!! abstract "本章概要"

简单介绍了数字、文本、音频、图像、视频是如何存储在计算机中的。这些描述都是概念性的,技术细节需要查阅相应数据格式的规范文档。

- 描述以下存储整数的方法:它们能存储哪些数字?存储、还原的步骤是怎样的?主要应用在哪里?溢出情况如何?
- 无符号表示法
- 符号加绝对值表示法(原码)
- 二进制补码表示法
- 反码表示法(本书未介绍)

> CSAPP:理解补码表示的方法:把最高位看作权重为$-2^{w-1}$的位
>
> 尝试给出反码运算的数学表达式,并理解反码的表达式是如何构建的?
>
> 注意**反码操作****整数的反码表示**。反码表示的整数中,只有负数才进行反码操作。
实数的储存:浮点表示法(具有**很大整数部分或很小小数部分的数**):符号、位移量和定点数

- 规范化:定点数小数点左侧只有一个非零数码。二进制数规范化后,左侧的 1 隐含了。
- 十进制称为科学计数法,二进制称为浮点表示法
- 尾数:小数点右边的二进制数定义了该数的精度,作为**无符号整数存储**
- 指数:有符号,使用**余码系统**:偏移量$(2^{m-1}-1)$被加到每个数字中(m 为内存单元大小),统一移到非负的一遍。如 4 位存储单元使用余 7 码系统。这样做的优势是对这些整数进行比较或运算时不需要考虑符号。
- IEEE 标准:单进度为 1,8,23;双精度为 1,11,52
- 储存:确定符号,转二进制,规范化,储存指数和尾数,连接三个部分
- 还原:拆分为三个部分,确定符号,解码位移量,去规范化尾数,还原数字,转十进制,加上符号
- **浮点数的上溢和下溢**:举例单精度浮点数最大负值为$-(1-2^{-24})\times 2^{+128}$,其中,尾数 23 位无符号数,最大绝对值为$2^{24}-1$,指数 8 位余码数,最大为$2^{8-1}=128$。最小负值为$-(1-2^{-1})\times 2^{-127}$
- 零的约定:三个部分都设置为 0
- 什么是**截断错误**

### 存储文本

Expand Down Expand Up @@ -214,102 +185,7 @@ TrueType,PostScript 和 CAD(计算机辅助设计)主要使用矢量图

视频是随空间(单个图像)和时间(一系列图像)变化的信息表现

## Ch4. 数据运算

关键词:算术运算、移位运算、逻辑运算

### 逻辑运算

位层次和模式层次上的逻辑运算

- 非、与、或和异或
- 思考:如何用其他运算符模拟异或?异或的特性
- 位模式的四种应用:求反、使指定的位复位(置 0)、对指定的位置位(置 1)、使指定的位反转
- **掩码**

### 移位(Shift)运算

- 逻辑移位运算
- 不带符号位的数:这些移位运算可能改变数的符号
- 填 0 或循环移位(旋转运算)
- 算数移位运算
- 假定位模式是使用**二进制补码**存储的带符号整数。
- 算数右移对整数除二,算数左移对整数乘二,这些运算本不应该改变符号位
- 算数右移:保留符号位,并复制入右侧位中,因此保存符号
- 算数左移:丢弃符号位,接受左边为符号位。如果新符号位与原先相同,运算**成功**,否则发生溢出

### 算术运算

#### 二进制补码中的加减法

- 遇到减法时,转变为加法,只需为第二个数求二进制的补
- 加法正常

> ### [深入理解原码,反码,补码的原理](https://www.cnblogs.com/zhxmdefj/p/10902322.html)
>
> 花了很长时间理解补码的构造意图。自己理了一遍逻辑如下:
>
> - 计算机只能进行加法,不能进行减法
> - 由于位数的限制,加法相当于在模运算下进行
> - 模运算下的加法可以看作一个闭环
>
> 由上面三条说明,我们的目标是:在模运算的闭环中用加法模拟减法
>
> - 数学定义:
> - 对于长度为 $\omega$ 的位向量,它的模为 $2^{\omega}$ ,这一位向量在长度 $0\sim 2^{\omega}-1$ 的环内
> - 要用加法模拟减法 $a - b = c$ ,目的是找到 $d$ 使得 $ (a + d)mod 2^\omega = c$
> - 画出这样一个环,很容易看出加到 $c$ 和减到 $c$ 合起来绕了一个圈,因此: $d = 2^\omega - b$
> - 通过这一等式可以建立从负数 $-b$ 到 $x_d$ 的映射,这个映射把负整数 $b$ 映射为 $d = 2^\omega - b$ 的位模式, $d$ 的位模式就是 $-b$ 的补码表示
> - 这样的映射就是补码操作:先取反码再+1
>
> 接下来再分析以上过程,以 0110 - 0010 = 0100 即 6-2=4 为例
>
> - $x$ 是一个负数
>
> - 找到 $d=10000-0010=1110$。我们发现:**$d$ 可以通过取反码再+1 的找到**
>
> 原理:$${|x|}_反+|x| = 2^\omega-1$$
>
> - $0110 + 1110 = 10100$ 取模后即为 $0100$
>
> 原理:负数的补码和它的绝对值相加等于模(本质是闭环内绕一圈的两种方法)
>
> $$2^\omega = x_补 + |x| $$
>
> - 由以上两式,我们得到了反码和补码的关系:$x_补={|x|}_反+1$
>
> - 要把 $1110$ 映射为 $-2$ ,就需要把最左侧的权重设置为 $-8$
>
> - 为什么把最左侧位的权重解释为 $-8$ 可以做到呢?**其实就是进行了 $-16$ 的操作,反向转了一圈**。$14-16=-2$
> 遇到一个有趣的题目:对于一个补码表示的系统,表达式`~x`的值是多少?
>
> 写出三个函数(数字到二进制补码,反码操作,二进制到数字),对分段函数分类讨论,容易得到,`~x` = $-1-x$
#### 符号加绝对值(原码)表示的加减法

一共有四种不同的符号组合,需要考虑 8 种不同的情况

- 第一步,检查运算,统一为加法
- 第二步,用异或检查两数的符号一致性
- 第三步:若符号相同,绝对值相加;若符号不同,绝对值相减(减法原理同上,转换为补码加法),符号是绝对值较大的符号
- 此处需要考虑上溢:如果 $A\geq B$ 则有上溢(模运算后舍弃)
- 如果 $A < B$ 则无上溢,结果是一个负数,应当取其二进制补码(可以这样理解:绝对值部分使用了补码式的减法运算,结果仍然是补码表示。现在取补码就是转换为无符号整数模式,结合先前确定的符号位,就变回符号加绝对值表示)

> 值得注意的是,在该加减法中,符号位和绝对值分开计算。绝对值之间的减法运算仍然与补码相同。比如:17-22,
>
> $ 0010001-0010110 = 0010001 + 1101010 = 1111011$,所得结果是补码表示,需要再进行一次补码以还原为无符号整数表示。
#### 实数的加减法

将实数的加减法简化为*小数点对齐后以符号加绝对值格式存储的两整数的加法和减法*

- 统一为加法
- 去规范化
- 使指数相等
- 相加,处理上溢
- 规范化
- 四舍五入,停止

## Ch.5 计算机组成

Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
61 changes: 51 additions & 10 deletions docs/硬件和体系结构/RISC-V.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ CPU 的几个指标:

### 指令

图片均来自 [RISC-V Reference Card](https://riscv.org/wp-content/uploads/2018/05/1-RISC-V-ISA-Foundation-Overview-DAC2018-1.pdf)
细节查阅 [RISC-V Reference Card](https://inst.eecs.berkeley.edu/~cs61c/fa17/img/riscvcard.pdf)[RISC-V 指令集手册](https://riscv.org/wp-content/uploads/2017/05/riscv-spec-v2.2.pdf)

::cards:: cols=2

Expand Down Expand Up @@ -94,7 +94,6 @@ CPU 的几个指标:
"content": "理解 SB 和 UJ 型指令立即数:[StackOverflow](https://stackoverflow.com/questions/58414772/why-are-risc-v-s-b-and-u-j-instruction-types-encoded-in-this-way)<br>符号位保持在最前面用于扩展,其余位尽可能与其他指令保持一致,用走线避免移位运算。",
"image": "RISC-V.assets/image-20240508171657744.png"
},

]

::/cards::
Expand Down Expand Up @@ -255,7 +254,7 @@ ELSE:
v[k] = v[k+1];
v[k+1] = temp;
}

void sort(long long v[], size_t n)
{
for (size_t i = 0; i < n; i++)
Expand All @@ -269,10 +268,17 @@ ELSE:

### 约定

- 时序:寄存器在时钟上升沿更新。
- 从而可以在一个时钟周期读写同一个寄存器:读到现有值,写入值在下一个上升沿才生效。
- 时序:
- 单周期:寄存器在时钟上升沿更新。从而可以在一个时钟周期读写同一个寄存器:读到现有值,写入值在下一个上升沿才生效。
- 流水线:一个周期分成两部分,前半写入,后半读取。

### 单周期数据通路

全貌:

![image-20240510230046092](RISC-V.assets/image-20240510230046092.png)

### 数据通路
分类总结:

<div class="grid cards" markdown>

Expand Down Expand Up @@ -302,15 +308,43 @@ ELSE:
- 0:Data Transfer ↑
- 1:Conditional Branch B-type

- __控制单元__
- __控制信号__

---

ALU control 四位:`Ainvert``Bnegate``Operation`,由 `func7``func3``ALUOp` 产生。
```mermaid
graph LR
opcode --> Branch
ALU --> Zero
Branch --> PCSrc
Zero --> PCSrc
opcode --> Mux["`Mux(4)
----
ALUSrc
Branch
MemtoReg
Jump`"]
opcode --> R/W["`R/W(3)
----
MemRead
MemWrite
RegWrite`"]
opcode["opcode[6:0]"] --> ALUOp["ALUOp[1:0]"]
ALUOp --> ALUControl["`ALUControl[3:0]
----
Ainvert
Bnegate
Operation[1:0]`"]
func7 --> ALUControl
func3 --> ALUControl
```

??? note "具体信号"

![Screenshot 2024-05-10 at 11.25.20 PM](RISC-V.assets/Screenshot 2024-05-10 at 11.25.20 PM.png)

Control 七位:`ALUOp`(2)、`Mux`(ALUSrc、Branch、MemtoReg、Jump)、`R/W`(MemRead、MemWrite、RegWrite)。由 `opcode` 产生。
![Screenshot 2024-05-10 at 11.27.56 PM](RISC-V.assets/Screenshot 2024-05-10 at 11.27.56 PM.png)

`PCSrc``Branch``Zero` 产生。

- :material-scale-balance:{ .lg .middle } __Open Source, MIT__

Expand All @@ -322,11 +356,18 @@ ELSE:

</div>

??? note "具体信号表"


??? note "其他"

- Memory 读写都需要控制信号。读错产生的结果与存储器层次结构有关。

### 五级流水线

![Screenshot 2024-05-10 at 11.19.05 PM](RISC-V.assets/Screenshot 2024-05-10 at 11.19.05 PM.png)

### 异常与中断

![Screenshot 2024-05-10 at 11.20.59 PM](RISC-V.assets/Screenshot 2024-05-10 at 11.20.59 PM.png)
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 8ceedb7

Please sign in to comment.