第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 (组合逻辑无记忆,时序逻辑有记忆,布尔代数是数学基础)

好了,这一章的内容就到这里。数字电路基础是CPU设计的「内功心法」,别急着往下赶。把这些基本概念吃透了,后面学流水线、缓存、总线的时候,你会感谢今天自己的耐心。


公众号:蓝海资料掘金营,微信deep3321