第1章:数字电路基础回顾
各位同学,欢迎来到嵌入式CPU设计的第一课。说实话,很多初学者一上来就盯着RTL代码、流水线架构,结果连最基本的门电路都搞不清楚——这就像还没学会走路就想跑马拉松。今天咱们花点时间,把数字电路的底子打扎实。
1.1 布尔代数:一切数字逻辑的根基
布尔代数,说白了就是用0和1做数学运算。你想想看,CPU里几十亿个晶体管,本质上都在干同一件事:算布尔表达式。
最基本的三个操作:
- 与(AND):两个1才出1,否则出0。我习惯记成「一票否决制」。
- 或(OR):只要有一个1,结果就是1。有点像「凑人头」。
- 非(NOT):取反,1变0,0变1。
这里有个小坑——我在项目中遇到过,新手经常把「与非」和「或非」搞混。其实记住德摩根定律就好:~(A & B) = ~A | ~B,反过来也一样。
重要公式:
A + 0 = A
A · 1 = A
A + A' = 1
A · A' = 0
嗯,这些公式看着简单,但实际设计组合逻辑时,化简表达式全靠它们。我刚开始做设计时,总觉得化简多此一举,直到有一次因为逻辑太复杂导致时序违例...从那以后,我写任何组合逻辑前都会先化简。
1.2 组合逻辑电路
组合逻辑的特点:输出只取决于当前输入,跟历史状态无关。说白了就是「没记忆」。
1.2.1 基本门电路
与或非门,这是最基础的积木块。实际芯片里用的都是CMOS工艺,但咱们从逻辑功能层面理解就够了。
| 门类型 | 逻辑符号 | 布尔表达式 | 真值表(简) |
|---|---|---|---|
| 与门 | & | Y = A · B | 00→0, 01→0, 10→0, 11→1 |
| 或门 | ≥1 | Y = A + B | 00→0, 01→1, 10→1, 11→1 |
| 非门 | 1 | Y = A' | 0→1, 1→0 |
个人经验:实际项目中,我很少直接用离散的门电路。但理解它们能帮你读懂标准单元库的文档——每个标准单元本质上就是这些基本门的组合。
1.2.2 译码器
译码器,说白了就是「把编码翻译成具体信号」。比如3-8译码器,3位输入,8位输出——每次只有1位输出为1。
为什么会用到译码器?我举个例子:CPU要访问内存,地址总线是32位的,但你不能同时选通所有存储单元吧?这时候就需要译码器,根据地址选通对应的那一行。
// 3-8译码器的Verilog描述
module decoder_3to8 (
input [2:0] in,
output [7:0] out
);
assign out = 1 << in;
endmodule
避坑指南:我曾经在设计一个地址译码器时,忘了考虑「未使用的编码组合」——结果某些地址访问时,多个存储单元同时被选通,数据总线打架了。记住:译码器的输出必须互斥。
1.2.3 多路选择器
多路选择器(MUX),就是从多个输入中选一个输出。你可以把它想象成一个「数据开关」。
2选1 MUX的逻辑表达式:Y = S ? A : B,也就是 Y = (S · A) + (S' · B)。
实际项目中,MUX用得特别多。比如CPU的寄存器堆,读端口就需要MUX来选择读哪个寄存器。我建议你记住一个规律:N选1 MUX需要 log2(N) 根选择线。
1.3 时序逻辑电路
时序逻辑和组合逻辑最大的区别:它有记忆功能。输出不仅取决于当前输入,还取决于之前的状态。
1.3.1 触发器
触发器是时序逻辑的基本单元。最常见的是D触发器:每个时钟沿,把输入D的值锁存到输出Q。
我记得刚学数字电路时,总觉得触发器和锁存器是一回事。其实区别很大:
- 锁存器:电平敏感,时钟为高时透明
- 触发器:边沿敏感,只在时钟跳变时采样
关键点:在CPU设计中,我们几乎只用边沿触发的D触发器。为什么?因为电平敏感的锁存器容易产生毛刺,导致时序混乱。
1.3.2 寄存器
寄存器,说白了就是一组D触发器并排放在一起。比如8位寄存器,就是8个D触发器共享同一个时钟和复位。
// 8位寄存器的Verilog描述
module reg_8bit (
input clk,
input rst_n,
input [7:0] d,
output [7:0] q
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q <= 8'b0;
else
q <= d;
end
endmodule
这里有个细节:复位信号为什么用 rst_n(低有效)?嗯,这是行业惯例——低有效复位在芯片上电时更可靠,不容易被噪声误触发。
1.3.3 计数器
计数器,就是每个时钟周期加1(或减1)的寄存器。CPU里的程序计数器(PC)就是最典型的计数器。
我建议你掌握两种计数器:
- 二进制计数器:按二进制顺序计数,N位计数器能数0到2^N-1
- 模N计数器:数到N-1就归零,常用于分频
实战经验:我曾经设计一个定时器,计数器溢出后忘了清零,结果定时时间翻倍了。记住:计数器溢出后要立即复位,或者用模N计数器自动回绕。
本章知识体系
下面这张图,是我用SVG画的本章知识结构。你可以把它当作一个「思维导图」来用:
好了,这一章的内容就到这里。数字电路基础是CPU设计的「内功心法」,别急着往下赶。把这些基本概念吃透了,后面学流水线、缓存、总线的时候,你会感谢今天自己的耐心。
公众号:蓝海资料掘金营,微信deep3321