From 1147321b42694ff38bef4c432733ccd83ce96a42 Mon Sep 17 00:00:00 2001 From: BossWangST Date: Thu, 30 Jun 2022 17:11:20 +0800 Subject: [PATCH 1/5] First CPU Design Article uploaded. Introduce some basic Digital Electrnic knowledge and RISC-V ISA (RV32I in particular). --- ...l-electronic-and-riscv-isa-introduction.md | 273 ++++++++++++++++++ 1 file changed, 273 insertions(+) create mode 100644 articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md diff --git a/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md b/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md new file mode 100644 index 0000000..78cadd4 --- /dev/null +++ b/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md @@ -0,0 +1,273 @@ +> Author: Fajie.WangNiXi YuHaoW1226@163.com
+> Date: 2022/06/30
+> Revisor:
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux) + +#数字逻辑电路基础 + +## 逻辑门电路 + +学习一个逻辑门电路,关键在于了解其**真值表**,逻辑门是一切数字电路元件的基础! + +* 与门 + * 符号:![image-20220629203455143](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/image-20220629203455143.png) + * 真值表:![image-20220629203515292](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/image-20220629203515292.png) +* 或门 + * 符号:![image-20220629203653232](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292036290.png) + * 真值表:![image-20220629203702613](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292037659.png) +* 非门 + * 符号:![image-20220629203752403](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292037473.png) + * 真值表:![image-20220629203816366](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292038409.png) +* 异或 + * 符号:![image-20220629203840149](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292038202.png) + * 真值表:![image-20220629204040222](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292040276.png) + * 技巧:任何二值异或 1,就是取反;任何二值异或 0,就是不变 + +## 组合逻辑电路 + +### 定义 + +* 结构上:输入、输出单元之间没有反馈延迟通路;不含有记忆单元;是上述各个逻辑门的组合 +* 工作状态:在任何时刻,组合逻辑电路的输出**只和**当前时刻的输入有关,**与电路原来状态无关** + +### 作用 + +* 在CPU的设计中,每一个模块的设计其本身都是一个组合逻辑电路,即模块的输出都是由当时的输入决定;将每个模块相互组合而不加入触发器等时序逻辑电路的CPU,就是单周期CPU + +### 典型模块 + +下面介绍数电中经典的组合逻辑电路模块,这些模块未来也将嵌入到我们的 CPU 设计中。 + +#### 多路选择器 + +* 定义:能实现数据选择功能的逻辑电路。它的作用相当于多个输入的单刀多掷开关,又称“多路开关” + +* 功能:在通道选择信号的作用下,将多个通道的数据分时传送到公共的数据通道上去 +* 示意图:![image-20220630152614581](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206301526678.png) +* 元件组成:以 2 选1 数据选择器为例,可以使用上面的逻辑门组合而得到,如图所示:![image-20220630154111467](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206301541544.png) + + + +有了 2 选 1 数据选择器,我们就可以以此为基本单元得到任意的 n 选 1 数据选择器了。在 CPU 的设计中,由于是硬件 Verilog 编程,所以对于数据的选择,就会更多的采用数据选择器的方式,而非 if-else 来选取某一数据通路。 + +#####Verilog 实现 + +```verilog +module mux#(parameter k = 32) + (input select, + input [k-1:0]a, b, + output [k-1:0] res); + + assign res = (select == 1) ? a : b; + +endmodule +``` + + + +#### 译码器 + +* 定义及功能:译码是编码的逆过程,它能将二进制码翻译成代表某一特定含义的信号(即电路的某种状态)。 +* 结构:根据输入输出的变量个数决定 + +##### Verilog 实现 + +```verilog +module decode#(parameter k = 32) + (input [k-1:0]inst, // k-bit Risc-V instruction, k is set default to 32 + output reg Jump, + output reg RegDst, + // ... More Control Signals + ); + // R-type instruction + wire[6:0] funct7; + wire[4:0] rs2; + wire[4:0] rs1; + wire[2:0] funct3; + wire[4:0] rd; + wire[6:0] op_code; + + assign funct7 = inst[31:25]; + assign rs2 = inst[24:20]; + assign rs1 = inst[19:15]; + assign funct3 = inst[14:12]; + assign rd = inst[11:7]; + assign op_code = inst[6:0]; + + always @ (*) + begin + // using case()...endcase to get control signals + end + +endmodule +``` + + + +## 时序逻辑电路 + +### 定义 + +* 结构上:时序逻辑电路由组合逻辑电路和存储电路共同组成;电路中存在反馈单元 +* 工作状态:在一个时钟信号的控制下,电路的输入在时钟信号跳变时反馈到输出,输出在更新前保留原来的信号状态 + +### 典型模块 + +####寄存器 + +* 结构:存储单元,能够对信号进行保持;可以即时进行信号更新 +* Verilog中可以使用 `reg` 定义 + +####触发器 + +* 结构:存储单元,能够对信号进行保持;在时钟信号的控制下,只有产生对应信号跳变时才根据输入更新输出状态,否则保持原有信号状态 + +##### Verilog 实现 + +```verilog +module D_Trigger#(parameter WIDTH = 32) + (input clk, + input rst, + input clear, + input en, + input[WIDTH-1:0] d, + output reg[WIDTH-1:0] q); + + always@(posedge clk,posedge rst) + begin + if (rst) + begin + q <= {WIDTH{1'b0}}; + end + else if (clear) + begin + q <= {WIDTH{1'b0}}; + end + else if (en) + begin + q <= d; + end + else + begin + q <= q; + end + end +endmodule +``` + +## 数电部分小结 + +以上给出了基本的数字逻辑电路知识以及 Verilog 语言的实现,在 CPU 设计过程中我们需要灵活组合组合逻辑电路和时序逻辑电路,来完成单周期 CPU 以及流水线 CPU 的设计与 Verilog 实现。 + +# RISC-V 指令集 + +为了设计出一款基于 RISC-V 指令集的 CPU ,我们必须先对 RISC-V 指令集本身进行一定的了解。 + +##指令集概述 + +RISC-V 指令集是一款诞生于最近十年的,完全开源的指令集架构(ISA)。与几乎所有的旧架构不同,它的未来不受任何单一公司的浮沉或一时兴起的决定的影响(这一点让许多过去的指令集架构都遭了殃)。它属于一个开放的,非盈利性质的基金会。RISC-V 基金会的目标是保持 RISC-V 的稳定性。 + +## 模块化的 ISA + +计算机体系结构的传统方法是增量 ISA,新的处理器不仅必须实现心的 ISA 扩展,还必须实现过去的所有扩展来保持向后的二进制兼容性。 + +RISC-V 的**不同寻常之处**,除了在于它是最近诞生的和开源的以外,还在于:和几乎所有以往的 ISA 不同,他是**模块化**的。它的核心是一个名为 **RV32I** 的基础 ISA ,运行着一个完整的软件栈。RV32I 是固定的,永远不会改变,而模块化则来源于*可选的*标准扩展,例如 RV32I**MFD** 就表示在基础的 RV32I 模块下,扩展出了 RV32**M **乘法,RV32**F **单精度浮点和 RV32**D **双精度浮点。 + +## RV32I — RISC-V 指令集的心脏 + +RV32I 的指令数量不多,但是却覆盖了大多数 32 位系统中所需要的基本指令。且 RISC-V 的其他扩展模块都需要建立在 RV32I 模块的基础上才能得以扩展。 + +### RISC-V 指令分类 + +RISC-V 指令集是一个精简指令集,也就意味着其所有的指令都是**定长**的 32 位(这里暂不考虑 RV32C 中压缩的 16 位指令模块)。其分为以下 6 种类型: + +* **R 型**:寄存器的取数计算(**R**egister)![image-20220629213411147](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292134225.png) +* **I 型**:带有短立即数的取数计算或访存计算(**I**mmediate)![image-20220629213535844](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292135903.png) +* **S 型**:访问存储器的计算(**S**tore)![image-20220629213840867](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292138925.png) +* **B 型**:分支条件跳转(**B**ranch)![image-20220629214609665](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292146730.png) +* **U 型**:带有长立即数的取数计算(**U**pper)![image-20220629214804540](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292148598.png) +* **J 型**:直接跳转(**J**ump)![image-20220629214927196](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292149254.png) + +可以看到: + +1. RISC-V 的指令格式设计中在 R 型提供了3个寄存器操作数,且保证了其他所有类型的格式中,寄存器操作数的**位置**都与 R 型一致,即对于 RISC-V 的所有指令,要读写的寄存器标识符总是在同一个位置,这可以便利我们的译码与取数工作:在**译码之前就可以先开始访问寄存器**。 +2. RISC-V 中的所有立即数,都采用了**符号扩展**,这意味着可能成为关键路径的扩展立即数可以在**译码之前就计算完毕**。 +3. 本质上 RISC-V 的指令格式只有 4 种,其中 B 型指令的立即数字段是在 S 类型的基础上旋转了 1 位; J 型指令的直接跳转字段是在 U 型的基础上旋转了 12 位。 + +### RV32I 的寄存器 + +在 RV32I 模块中,共 32 个 32 位通用寄存器,外加一个 32 位的PC寄存器存储着**下一条指令的地址**。命名上,可以将 32 个通用寄存器称为 **`x0~x31`**,但是我们也可根据不同寄存器的作用,对其重命名,如下图所示: + +![image-20220630135835766](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206301358899.png) + +### RV32I 的整数计算 + +简单的算术指令(`add`,`sub`)、逻辑指令(`and`,`or`,`xor`),以及移位指令(`sll`,`srl`,`sra`)和其他 ISA 差不多。他们从**寄存器**读取两个 32 位的值,并将 32 位结果写入目标寄存器。RV32I 还提供了这些指令的立即数版本。和 ARM-32 不同,立即数**总是进行符号扩展**,这样子如果需要,我们就可以使用立即数表示负数,正因为如此,我们并不需要一个立即数版本的 `sub`。 + +程序可以根据比较结果生成布尔值。为了应对这种场景,RV32I 提供了一个**当小于时置位**的指令。如果第一个操作数小于第二个操作数,它将目标寄存器设置为 1,否则为0。同样这个指令有一个有符号版本(`slt`)和无符号版本(`sltu`),分别用于处理有符号和无符号整数比较。 + +为了构造大的常量数值和链接,RV32I 提供了 `lui` 指令:加载立即数到高位。`lui` 将 20 位常量加载到寄存器的高 20 位,接着便可以使用标准的立即指令来创建 32 位常量。这样我们就可以仅使用 2 条 32 位的 RV32I 指令,构造出一个32位常量。 + +###RV32I 的 Store 和 Load + +存储和加载在 RISC-V 中只有**唯一的寻址模式**,即符号扩展 12 位立即数,将之送到基地址寄存器。与 MIPS-32 不同,RISC-V **不支持**指令延迟槽,也就是 `load` 指令获取的数据不一定需要等待两个指令之后才可用;对于后来出现的更长的流水线,延迟加载带来的收益会逐渐消失,因此 RISC-V 不支持延迟加载。 + +### RV32I 条件分支跳转 + +在 RISC-V 中,分支跳转指令去掉了 MIPS-32,Oracle SPARC 等指令集中被广为诟病的延迟分支特性等;对于条件分支,它还没有像 ARM-32 和 x86_32 那样使用条件码。条件码的存在使得大多数指令都需要隐式的设置一些额外状态,这使乱序执行的依赖计算复杂化。最后,RISC-V 还省略了 x86_32 中的循环指令:loop,loope,loopz,loopne,loopnz。 + +RV32I 可以比较**两个寄存器**中保存的值并根据比较结果进行分支跳转,这里的比较可以是: + +* 相等:b**eq**(equal) +* 不相等:b**ne**(not equal) +* 大于等于:b**ge**(greater or equal) +* 小于:b**lt**(less than) + +上面的 bge 和 blt 都是进行**有符号**比较,RV32I 也提供了相应的无符号版本 **bgeu** 和 **bltu**。剩下的两个比较关系(大于和小于等于)则可以通过简单的交换两个操作数完成比较(x < y 表示 y > x 且 x >= y 表示 y <= x)。 + +由于 RISC-V 指令长度必须是两个字节的倍数(RV32C 模块中含有 16 位的短指令),所以分支跳转**唯一的寻址模式**就是: + +* 将指令中 12 位的立即数左移 1 位后符号扩展,得到的值**加**到当前 PC 中,作为下一条指令的取指地址。 + +这也称为 PC 相对寻址,可用于位置无关的代码,简化了链接器和加载器的工作。 + +#### 补充说明:PC 的获取 + +当前的 PC 可以通过 auipc(Add upper immediate to PC)指令获取,方法是将 U 立即数字段设置为 0,得到的结果就是 PC+0,即 PC 本身的值。对于 x86_32,想要读取 PC,则需要先进行函数调用(让 PC 进栈)。因此,获取当前 PC 值在 x86_32 中至少需要 1 个 store,2 个 load 和 2 个跳转指令;而 RISC-V 只需要 1 条 auipc 指令! + +### RV32I 无条件跳转 + +在 J 型指令中,RV32I 提供了 jal,jalr 两个无条件跳转指令。 + +* jal:跳转并链接指令,具有双重功能。它可以将下一条指令(PC + 4)的地址保存在目标寄存器中(通常是返回地址寄存器 ra),实现过程调用的功能;同时如果使用零寄存器(x0)替换掉返回地址寄存器(ra)作为目标寄存器,就可以实现无条件跳转,因为零寄存器是硬连线至低电平无法更改的。和分支跳转一样,jal 的跳转目标地址同样是: + * 将指令中 20 位的分支地址左移 1 位后符号扩展,得到的值**加**到 PC 上,作为下一条指令的取指地址。 + +* jalr:跳转和链接指令的寄存器版本,同样是多用途的。它可以调用动态计算出地址的函数,或者也可以实现调用返回(只需要 ra 作为源寄存器,x0 作为目的寄存器即可)。Switch 和 case 语句的地址跳转,也可以使用 jalr 指令,其中目的寄存器设为 x0。 + +### RV32I 指令模块小结 + +RISC-V指令集通过上面的讲解,我们可以得知其具有如下这些特性: + +* 所有操作都在**寄存器**之间(没有从寄存器到内存的操作) +* 允许加载 / 存储 有符号 / 无符号的 字 / 字节 / 半字 +* 所有的算数,逻辑和移位指令都有立即数版本的指令相对应 +* 立即数总是符号扩展 +* 仅提供一种数据寻址模式(寄存器 + 立即数)和PC相对寻址 +* 一个指令 `lui` 用于加载立即数到高位,这样加载 32 位常量到寄存器只需要 2 条指令 + +## 总结 + +本文对 CPU 设计中涉及的数字逻辑电路基本知识进行了概述,并细致讲解了 RISC-V 指令集的核心模块 RV32I,从具体的指令规范角度阐释了 RV32I 的指令特点。 + +系列文章预告:RISC-V CPU 结构设计及各结构模块的数据通路组合 + +## 参考资料 + +* 电子技术基础(数字部分)第六版 康华光 著 +* [RISC-V 手册](http://riscvbook.com/chinese/RISC-V-Reader-Chinese-v2p1.pdf) +* CPU 设计实战 汪文祥 邢金璋 著 + + + + + -- Gitee From 9a3930b81975437a917407c5898cca92d35b1982 Mon Sep 17 00:00:00 2001 From: BossWangST Date: Thu, 30 Jun 2022 17:28:36 +0800 Subject: [PATCH 2/5] Correct some grammar mistake --- ...t1-digital-electronic-and-riscv-isa-introduction.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md b/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md index 78cadd4..9fe4414 100644 --- a/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md +++ b/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md @@ -50,7 +50,7 @@ 有了 2 选 1 数据选择器,我们就可以以此为基本单元得到任意的 n 选 1 数据选择器了。在 CPU 的设计中,由于是硬件 Verilog 编程,所以对于数据的选择,就会更多的采用数据选择器的方式,而非 if-else 来选取某一数据通路。 -#####Verilog 实现 +##### Verilog 实现 ```verilog module mux#(parameter k = 32) @@ -113,12 +113,12 @@ endmodule ### 典型模块 -####寄存器 +#### 寄存器 * 结构:存储单元,能够对信号进行保持;可以即时进行信号更新 * Verilog中可以使用 `reg` 定义 -####触发器 +#### 触发器 * 结构:存储单元,能够对信号进行保持;在时钟信号的控制下,只有产生对应信号跳变时才根据输入更新输出状态,否则保持原有信号状态 @@ -163,7 +163,7 @@ endmodule 为了设计出一款基于 RISC-V 指令集的 CPU ,我们必须先对 RISC-V 指令集本身进行一定的了解。 -##指令集概述 +## 指令集概述 RISC-V 指令集是一款诞生于最近十年的,完全开源的指令集架构(ISA)。与几乎所有的旧架构不同,它的未来不受任何单一公司的浮沉或一时兴起的决定的影响(这一点让许多过去的指令集架构都遭了殃)。它属于一个开放的,非盈利性质的基金会。RISC-V 基金会的目标是保持 RISC-V 的稳定性。 @@ -251,7 +251,7 @@ RISC-V指令集通过上面的讲解,我们可以得知其具有如下这些 * 所有操作都在**寄存器**之间(没有从寄存器到内存的操作) * 允许加载 / 存储 有符号 / 无符号的 字 / 字节 / 半字 * 所有的算数,逻辑和移位指令都有立即数版本的指令相对应 -* 立即数总是符号扩展 +* 立即数总是**符号扩展** * 仅提供一种数据寻址模式(寄存器 + 立即数)和PC相对寻址 * 一个指令 `lui` 用于加载立即数到高位,这样加载 32 位常量到寄存器只需要 2 条指令 -- Gitee From ee546e99968a310c453759c9cd6bab82871ae686 Mon Sep 17 00:00:00 2001 From: BossWangST Date: Thu, 30 Jun 2022 17:35:37 +0800 Subject: [PATCH 3/5] Resize image --- ...l-electronic-and-riscv-isa-introduction.md | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md b/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md index 9fe4414..b083605 100644 --- a/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md +++ b/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md @@ -10,18 +10,18 @@ 学习一个逻辑门电路,关键在于了解其**真值表**,逻辑门是一切数字电路元件的基础! * 与门 - * 符号:![image-20220629203455143](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/image-20220629203455143.png) - * 真值表:![image-20220629203515292](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/image-20220629203515292.png) + * 符号:image-20220629203455143 + * 真值表:image-20220629203515292 * 或门 - * 符号:![image-20220629203653232](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292036290.png) - * 真值表:![image-20220629203702613](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292037659.png) + * 符号:image-20220629203653232 + * 真值表:image-20220629203702613 * 非门 - * 符号:![image-20220629203752403](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292037473.png) - * 真值表:![image-20220629203816366](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292038409.png) + * 符号:image-20220629203752403 + * 真值表:image-20220629203816366 * 异或 - * 符号:![image-20220629203840149](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292038202.png) - * 真值表:![image-20220629204040222](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206292040276.png) - * 技巧:任何二值异或 1,就是取反;任何二值异或 0,就是不变 + * 符号:image-20220629203840149 + * 真值表:image-20220629204040222 + * 技巧:任何二值**异或 1 <=> 取反**;任何二值**异或 0 <=> 不变** ## 组合逻辑电路 @@ -43,8 +43,13 @@ * 定义:能实现数据选择功能的逻辑电路。它的作用相当于多个输入的单刀多掷开关,又称“多路开关” * 功能:在通道选择信号的作用下,将多个通道的数据分时传送到公共的数据通道上去 -* 示意图:![image-20220630152614581](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206301526678.png) -* 元件组成:以 2 选1 数据选择器为例,可以使用上面的逻辑门组合而得到,如图所示:![image-20220630154111467](https://bosswang-pic.oss-cn-hangzhou.aliyuncs.com/linux-lab/202206301541544.png) +* 示意图: + +image-20220630152614581 + +* 元件组成:以 2 选1 数据选择器为例,可以使用上面的逻辑门组合而得到,如图所示: + +image-20220630154111467 -- Gitee From 45a56a9b96ad4055afeef7f2805aa776663a1205 Mon Sep 17 00:00:00 2001 From: BossWangST Date: Thu, 30 Jun 2022 17:40:13 +0800 Subject: [PATCH 4/5] Resize image2 --- ...l-electronic-and-riscv-isa-introduction.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md b/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md index b083605..648c4c8 100644 --- a/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md +++ b/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md @@ -10,17 +10,17 @@ 学习一个逻辑门电路,关键在于了解其**真值表**,逻辑门是一切数字电路元件的基础! * 与门 - * 符号:image-20220629203455143 - * 真值表:image-20220629203515292 + * 符号:image-20220629203455143 + * 真值表:image-20220629203515292 * 或门 - * 符号:image-20220629203653232 - * 真值表:image-20220629203702613 + * 符号:image-20220629203653232 + * 真值表:image-20220629203702613 * 非门 - * 符号:image-20220629203752403 - * 真值表:image-20220629203816366 + * 符号:image-20220629203752403 + * 真值表:image-20220629203816366 * 异或 - * 符号:image-20220629203840149 - * 真值表:image-20220629204040222 + * 符号:image-20220629203840149 + * 真值表:image-20220629204040222 * 技巧:任何二值**异或 1 <=> 取反**;任何二值**异或 0 <=> 不变** ## 组合逻辑电路 @@ -45,11 +45,11 @@ * 功能:在通道选择信号的作用下,将多个通道的数据分时传送到公共的数据通道上去 * 示意图: -image-20220630152614581 +image-20220630152614581 * 元件组成:以 2 选1 数据选择器为例,可以使用上面的逻辑门组合而得到,如图所示: -image-20220630154111467 +image-20220630154111467 -- Gitee From 1c4b2f0c4e587fc1ac61fb82eec770afa6289704 Mon Sep 17 00:00:00 2001 From: BossWangST Date: Thu, 30 Jun 2022 17:42:45 +0800 Subject: [PATCH 5/5] Polish some space --- ...esign-part1-digital-electronic-and-riscv-isa-introduction.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md b/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md index 648c4c8..6e12e72 100644 --- a/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md +++ b/articles/20220630-riscv-cpu-design-part1-digital-electronic-and-riscv-isa-introduction.md @@ -274,5 +274,3 @@ RISC-V指令集通过上面的讲解,我们可以得知其具有如下这些 - - -- Gitee