📖 第1课:数字电路基础与RISC-V入门
在看 rv_control 芯片之前,先搞懂几个基本概念:什么是数字电路、RISC-V 是什么、Verilog 怎么描述硬件。
🎯 本课目标
理解组合逻辑vs时序逻辑、时钟/复位的作用、RISC-V指令集的基本概念、Verilog和软件编程的区别。
一、组合逻辑 vs 时序逻辑
两种逻辑的对比
flowchart LR
subgraph COMB["组合逻辑: 输出只取决于当前输入"]
C1["a ──→ AND门 ──→ out = a & b"]
C2["b ──→"]
end
subgraph SEQ["时序逻辑: 输出取决于输入+历史"]
S1["D ──→ 触发器(FF) ──→ Q"]
S2["clk ──→ ↑ 上升沿更新"]
end
style COMB fill:#3987e5,color:#fff
style SEQ fill:#199e70,color:#fff
组合逻辑就像普通计算器——输入变了,输出立刻变(经过一段延迟后)。比如 `AND` 门:两个输入都是 1,输出才是 1。
时序逻辑的关键是时钟——在时钟的上升沿(从0变1的瞬间)才更新输出。触发器(Flip-Flop, FF)是最基本的时序元件,它的输出会"记住"上一次上升沿时的输入。
二、时钟和复位 —— 芯片的心跳和重启
时钟(clk)就是一根周期性地在 0 和 1 之间跳变的信号线。它像心跳一样给芯片里所有的触发器提供同步节奏。rv_control 的时钟频率是 200MHz——也就是每秒跳变 2 亿次。
复位(rst_n)让所有触发器回到初始状态(通常是 0)。rv_control 用的是"异步复位"——`rst_n=0` 时立即复位(不等时钟沿),`rst_n=1` 时正常工作。`_n` 后缀表示"低有效"(0=复位, 1=正常)。
三、RISC-V 是什么?
RISC-V 是一套开源免费的CPU指令集——它定义了 CPU 应该支持哪些指令、每种指令怎么编码,但不强制你用特定的硬件实现。你可以用 VHDL、Verilog、甚至电路板搭出来。
rv_control 用的是 RV32I——"32位基础整数指令集":
- R型: 寄存器间操作(ADD, SUB, AND, OR...)——两个寄存器值做运算,结果存第三个寄存器
- I型: 立即数操作(ADDI, LW...)——一个寄存器值 + 一个常数
- S型: 存储操作(SW, SH, SB)——把寄存器值写入内存
- B型: 分支操作(BEQ, BNE...)——条件判断,决定跳不跳转
- U型/J型: 大立即数/跳转(LUI, JAL...)
四、Verilog 和软件编程有什么不同?
| 软件编程 (C/Python) | 硬件描述 (Verilog) |
|---|---|
| 指令顺序执行 | 所有语句同时执行(并行) |
| 可以随时改变变量 | `wire` 是连线,不能"赋值两次" |
| 循环自动串行 | `for` 循环是"复制N份电路" |
| `=` 是赋值 | `<=` 是非阻塞赋值(在时钟沿一起更新) |
| `if/else` 是分支 | `if/else` 被综合成 MUX(多路选择器) |
💡 理解 Verilog 的关键
Verilog 描述的不是"步骤"而是电路连接关系。`assign out = a & b;` 的意思是"在芯片上放一个 AND 门,输入接 a 和 b,输出接 out",而不是"计算 a & b 然后存到 out"。
五、知识图谱:rv_control 入门概念关系
基础概念之间的关联
graph TB
A["组合逻辑
(AND/OR/NOT门)"] --> D["CPU ALU
(算数逻辑单元)"] B["时序逻辑
(触发器FF)"] --> E["CPU 寄存器
(x0-x31)"] B --> F["流水线寄存器
(IF→ID→EX)"] C["时钟 clk"] --> B C --> G["时钟树 (CTS)
(同步分发时钟)"] H["RISC-V 指令集
(RV32I)"] --> I["CPU 译码
(32bit→操作+操作数)"] A --> J["总线译码器
(地址→设备选择)"] B --> K["外设 FIFO
(8字节缓冲)"]
(AND/OR/NOT门)"] --> D["CPU ALU
(算数逻辑单元)"] B["时序逻辑
(触发器FF)"] --> E["CPU 寄存器
(x0-x31)"] B --> F["流水线寄存器
(IF→ID→EX)"] C["时钟 clk"] --> B C --> G["时钟树 (CTS)
(同步分发时钟)"] H["RISC-V 指令集
(RV32I)"] --> I["CPU 译码
(32bit→操作+操作数)"] A --> J["总线译码器
(地址→设备选择)"] B --> K["外设 FIFO
(8字节缓冲)"]