第一章:数字电路基础回顾——从晶体管到逻辑门,组合逻辑与时序逻辑的核心区别,为什么我们需要可编程逻辑?
1.1 从晶体管到逻辑门:数字世界的基石
说实话,很多人一上来就学Verilog、学FPGA,却忽略了最底层的晶体管。我个人觉得,这就像盖楼不打地基。你想想看,一个逻辑门是怎么工作的?
晶体管,说白了就是一个开关。MOS管有源极、漏极、栅极。栅极加电压,源漏就导通;不加电压,就断开。就这么简单。
我在项目中遇到过一件事:有个同事写代码时,总觉得组合逻辑的延迟无所谓。结果板子跑起来,信号毛刺满天飞。后来一查,就是几个晶体管级的传播延迟没算清楚。嗯,这里要注意——晶体管不是理想开关,它有导通电阻、有寄生电容。
两个晶体管组合,就能搭出一个反相器(NOT门)。三个、四个晶体管,就能搭出NAND、NOR门。再往上,就是AND、OR、XOR。你看,从晶体管到逻辑门,其实就两步:
- NMOS + PMOS 组成互补对,实现逻辑取反
- 多个互补对并联/串联,实现与、或、异或
我习惯把逻辑门看作「数字电路的最小功能单元」。一个芯片里动辄几亿个晶体管,但抽象成逻辑门之后,我们就不用管那些物理细节了。这就是抽象的力量。
核心要点:晶体管是开关,逻辑门是开关的组合。从晶体管到逻辑门,是数字电路设计的第一层抽象。
1.2 组合逻辑 vs 时序逻辑:核心区别在哪?
这个问题,我面试过不下50个候选人。能说清楚的人,真不多。
组合逻辑:输出只取决于当前输入。没有记忆,没有状态。比如一个加法器,输入A和B,输出就是A+B。输入变了,输出立刻变(当然有微小延迟)。
时序逻辑:输出不仅取决于当前输入,还取决于过去的状态。说白了,它有记忆。比如一个计数器,当前输出是多少,取决于之前计了多少个数。
为什么会这样?因为时序逻辑里有个关键元件——触发器(Flip-Flop)。触发器能存储1位数据,在时钟边沿采样输入,然后保持住。
我曾经犯过一个低级错误:在设计一个状态机时,把组合逻辑和时序逻辑混在一起写。结果状态跳转完全乱套,仿真能过,上板就挂。后来花了整整两天才定位到问题——一个组合反馈环路。
避坑指南:我曾经见过有人把组合逻辑的输出直接反馈到自己的输入,形成组合环路。这在FPGA里是绝对禁止的!组合环路会导致时序不可预测,甚至烧毁芯片。
我建议你记住这张对比表:
| 特性 | 组合逻辑 | 时序逻辑 |
|---|---|---|
| 输出依赖 | 仅当前输入 | 当前输入 + 历史状态 |
| 存储能力 | 无 | 有(触发器) |
| 时钟 | 不需要 | 需要时钟驱动 |
| 典型电路 | 加法器、多路选择器、译码器 | 计数器、寄存器、状态机 |
| 延迟特性 | 传播延迟(门延迟) | 时钟到输出延迟(Tco) |
1.3 为什么我们需要可编程逻辑?
这个问题,说白了就是:为什么不用固定的芯片,非要搞个能编程的?
你想想看,如果每个项目都去流片做ASIC,成本有多高?一次流片几十万到上百万,周期3-6个月。万一设计有bug,直接报废。我经历过一次流片失败,那感觉……嗯,不想再提了。
可编程逻辑(FPGA)的出现,解决了三个核心痛点:
- 灵活性:同一块芯片,今天做通信协议,明天做图像处理,后天做AI加速。改代码就行,不用换硬件。
- 快速迭代:从设计到验证,几个小时就能完成。ASIC得等几个月。
- 低成本小批量:几十片、几百片的需求,用FPGA比ASIC划算太多。
我记得2018年做一个项目,客户需求变了好几次。要是用ASIC,早就破产了。但用FPGA,每次改完代码,重新综合、布局布线,第二天就能跑新版本。这就是可编程逻辑的价值。
个人经验:FPGA内部其实就是大量的查找表(LUT)+ 触发器(FF)+ 布线资源。LUT本质上是一个小RAM,用查表的方式实现任意组合逻辑。触发器实现时序逻辑。再加上可编程的连线,就构成了一个万能数字电路平台。
1.4 本章知识体系
下面这张图,是我自己总结的本章知识结构。从晶体管到逻辑门,再到组合逻辑和时序逻辑的区别,最后落到可编程逻辑的必要性。你看一遍,应该就能串起来了。
从这张图你能看到,整个数字电路的发展脉络:从最底层的晶体管,到逻辑门,再到组合逻辑和时序逻辑两大分支,最后汇聚到可编程逻辑。FPGA就是站在这些基础之上,把灵活性发挥到了极致。
本章小结:
- 晶体管是开关,逻辑门是开关的组合
- 组合逻辑无记忆,时序逻辑有记忆
- 可编程逻辑解决了灵活性、迭代速度、成本三大问题
- FPGA = LUT(实现组合逻辑)+ FF(实现时序逻辑)+ 可编程布线
好了,这一章就到这里。记住这些基础,后面学Verilog、学时序约束,你会觉得顺很多。毕竟,地基打牢了,楼才能盖得高。
公众号:蓝海资料掘金营,微信deep3321