第1章:数字电路基础——从布尔代数到触发器
各位同学,我是老张。在芯片行业摸爬滚打十几年,今天咱们聊聊数字电路最底层的那些东西。别看这些基础概念简单,我敢说,很多做了三五年设计的人,遇到时序问题照样翻车。咱们从最根本的布尔代数开始。
1.1 布尔代数:芯片世界的数学语言
说白了,数字芯片里只有两种状态:0和1。布尔代数就是处理这两个值的数学工具。你想想看,整个CPU、GPU、AI芯片,几十亿个晶体管,底层逻辑全是这套东西。
三个基本运算:
- 与(AND):两个都是1,结果才是1。我习惯叫它「全票通过」。
- 或(OR):只要有一个1,结果就是1。这叫「一票通过」。
- 非(NOT):取反。1变0,0变1。
举个例子,你设计一个安全系统,需要两个传感器同时触发才报警。这就是与门。我在一个工业控制项目里用过这个逻辑,当时传感器信号有毛刺,差点误触发——嗯,后面会讲怎么处理。
核心公式(记住这几个就够了):
- A · 0 = 0(与0归零)
- A + 1 = 1(或1置1)
- A · A' = 0(互补律)
- A + A' = 1(排中律)
- 德摩根定律:(A·B)' = A' + B'
德摩根定律特别实用。我在做低功耗设计时,经常用它来转换逻辑结构,减少晶体管数量。说白了,就是「与门的非等于非的或」,反过来也一样。
1.2 逻辑门:从公式到电路
布尔代数写出来是公式,用晶体管搭出来就是逻辑门。常见的门电路有这些:
| 门类型 | 逻辑符号 | 布尔表达式 | 真值表(简) |
|---|---|---|---|
| 与门 | & | 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 |
| 与非门 | & + 圈 | Y = (A·B)' | 00→1, 01→1, 10→1, 11→0 |
| 或非门 | ≥1 + 圈 | Y = (A+B)' | 00→1, 01→0, 10→0, 11→0 |
| 异或门 | =1 | Y = A ⊕ B | 00→0, 01→1, 10→1, 11→0 |
我个人习惯用与非门和或非门做基础单元。为什么?因为CMOS工艺里,与非门和或非门的晶体管堆叠更对称,速度更快。我曾经在一个28nm的项目里,把所有与门都换成了与非门加非门,时序直接改善了5%。
小技巧:实际芯片里很少直接用与门和或门。大部分标准单元库只提供与非门、或非门和反相器。你需要学会用这些「万能门」搭出所有逻辑。
1.3 组合逻辑 vs 时序逻辑
这是数字电路里最重要的分水岭。我面试新人时必问这个问题。
组合逻辑:输出只取决于当前输入。没有记忆功能。比如加法器、多路选择器、译码器。
时序逻辑:输出不仅取决于当前输入,还取决于之前的状态。说白了,它有记忆。比如计数器、状态机、寄存器。
为什么会这样?因为时序逻辑里有存储元件——触发器和锁存器。它们能记住过去的信号。
我记得刚入行时,有个同事把组合逻辑的毛刺直接送进了时钟树,结果整个芯片功能紊乱。排查了三天才找到原因。从那以后,我对组合逻辑的输出一定要加一级寄存器才放心。
避坑指南:组合逻辑的输出可能有毛刺(glitch)。因为不同路径的延迟不一样,信号到达时间有先后。我曾经在一个高速ADC的接口设计里,因为没处理好组合逻辑的毛刺,导致采样数据全是错的。解决方案?在关键路径上加一级寄存器,或者用格雷码编码。
1.4 触发器与锁存器:存储的奥秘
这两个东西经常被搞混。我简单说说区别:
- 锁存器(Latch):电平触发。使能信号有效时,输出跟随输入变化。说白了,它是透明的。
- 触发器(Flip-Flop):边沿触发。只在时钟上升沿或下降沿采样输入。其他时间输出保持不变。
实际项目中,我强烈建议多用触发器,少用锁存器。为什么?锁存器在使能期间是透明的,任何输入变化都会直接传到输出,容易产生毛刺和时序问题。我在一个65nm的低功耗项目里,因为用了锁存器做流水线,结果静态时序分析(STA)跑出了几百条violation,改得我头皮发麻。
触发器的基本结构:
// D触发器行为描述(Verilog)
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q <= 1'b0;
else
q <= d;
end
这段代码描述了一个带异步复位的D触发器。时钟上升沿采样,复位信号低有效。我习惯把复位写成异步的,因为上电时能保证寄存器处于已知状态。
关键参数(选型时必看):
- 建立时间(setup time):数据必须在时钟沿之前稳定
- 保持时间(hold time):数据必须在时钟沿之后保持稳定
- 时钟到输出延迟(clk-to-q):时钟沿到输出变化的延迟
这三个参数决定了你的芯片能跑多快。我见过一个项目,因为库里的触发器建立时间太大,导致目标频率死活上不去,最后只能换工艺库。
知识体系总览
下面这张图是我自己画的,把本章的核心逻辑串起来了。你仔细看看,从布尔代数到触发器,是一条完整的链路。
这张图你看懂了吗?从布尔代数的数学基础,到逻辑门的物理实现,再到组合逻辑和时序逻辑的分野,最后落到触发器和锁存器这个存储单元上。整个数字芯片的底层逻辑,就是这么一层层搭起来的。
我的建议:初学者先别急着写代码。花一周时间,把布尔代数化简练熟,把真值表画明白。我见过太多人,Verilog写得飞起,结果综合出来的电路一堆冗余逻辑。基础不牢,地动山摇。
好了,这一章就到这里。记住,数字电路的核心就两件事:组合逻辑做运算,时序逻辑做存储。后面的章节,我们会一步步深入,从加法器到CPU,从触发器到整个芯片。慢慢来,不着急。
公众号:蓝海资料掘金营,微信deep3321