第一章:Verilog与组合逻辑概述
各位同学好,我是你们的FPGA讲师。今天咱们聊聊数字电路最基础的东西——组合逻辑。说实话,我教了这么多年,发现很多新手一上来就急着写代码,结果后面debug到怀疑人生。所以第一章,咱们把地基打牢。
1.1 数字电路基础:从0和1说起
数字电路的世界里,只有两个值:0和1。听起来简单吧?但就是这两个小家伙,撑起了整个计算机帝国。
我刚开始学的时候,总觉得这玩意儿太抽象。后来做项目多了才明白,0和1其实就是开关的两种状态——断开和闭合。你想想看,一个开关要么通要么断,这不就是0和1吗?
数字电路里,我们主要处理三种基本门电路:
- 与门(AND):两个输入都是1,输出才是1。说白了就是「一个都不能少」。
- 或门(OR):只要有一个输入是1,输出就是1。典型的「有奶便是娘」。
- 非门(NOT):输入是1输出0,输入是0输出1。就是个「反骨仔」。
这三种门组合起来,就能实现任何你想要的逻辑功能。我在项目中遇到过最夸张的一次,一个复杂的控制逻辑,拆到最后其实就是几百个与门和或门的组合。嗯,别被吓到,后面咱们慢慢来。
1.2 组合逻辑与时序逻辑的区别
这个问题,我每次面试新人必问。很多人答不上来,或者答得模棱两可。
组合逻辑:输出只取决于当前的输入。输入一变,输出立刻跟着变。没有记忆能力,像个没心没肺的家伙。
时序逻辑:输出不仅取决于当前输入,还取决于之前的状态。它有记忆,能记住过去的事情。靠的是触发器(Flip-Flop)这种存储元件。
举个简单的例子:
- 一个加法器,输入两个数,马上输出和——这是组合逻辑。
- 一个计数器,每来一个时钟脉冲就加1——这是时序逻辑,因为它要记住当前计数值。
重要提醒:组合逻辑没有时钟概念,信号传播是「直通」的。时序逻辑依赖时钟边沿,信号在时钟沿到来时才更新。
我记得有一次,一个学员写了个计数器,但忘了加时钟触发,结果仿真时数值乱跳。我一看就笑了:「你这计数器,连个时钟都不给,它怎么知道什么时候该干活?」
1.3 Verilog HDL简介
Verilog,说白了就是用来描述数字电路的一种语言。它不像C语言那样是顺序执行的,而是描述硬件结构的。这个思维转变,是很多新手的第一道坎。
Verilog有几种描述方式:
- 门级描述:直接用与门、或门这些基本元件搭电路。太底层,现在很少用了。
- 数据流描述:用assign语句,描述信号之间的逻辑关系。适合组合逻辑。
- 行为级描述:用always块,描述电路的行为。最常用,也最灵活。
来看个最简单的例子,一个二输入与门:
// 数据流描述
module and_gate (
input wire a,
input wire b,
output wire y
);
assign y = a & b;
endmodule
这段代码,你一看就知道:y等于a和b相与。但注意,这里的assign是持续赋值的,不是像C语言那样只执行一次。硬件描述语言嘛,描述的是「一直存在」的连接关系。
个人习惯:我写组合逻辑时,喜欢用assign语句。简单明了,一眼就能看出逻辑关系。复杂的逻辑才用always块。
1.4 Lattice半导体公司及工具链概览
Lattice半导体,在FPGA圈子里算是「小而美」的代表。它的芯片功耗低、成本低,特别适合做接口桥接、控制逻辑这些不太复杂但要求低功耗的应用。
我最早接触Lattice,是因为一个手持设备项目。当时要求电池续航长,Xilinx和Altera的芯片功耗都偏高,最后选了Lattice的MachXO系列。嗯,真香。
Lattice的主要工具链:
| 工具名称 | 用途 | 我的评价 |
|---|---|---|
| Lattice Diamond | 综合、布局布线、时序分析 | 功能完整,但界面有点老气 |
| Radiant | 针对Nexus系列的新工具 | 比Diamond好用,推荐新手用 |
| iCEcube2 | iCE40系列专用 | 轻量级,适合小项目 |
| ModelSim(Lattice版) | 仿真验证 | 够用,但别指望太多 |
Lattice的芯片系列,我简单列一下:
- iCE40系列:超低功耗,适合可穿戴设备。我曾经用iCE40做过一个手势识别模块,功耗才几毫瓦。
- MachXO系列:适合做控制逻辑和接口桥接。稳定可靠,我项目里用得最多。
- ECP5系列:性能更强,带DSP和SERDES,可以做些中等复杂度的信号处理。
- Nexus系列:最新的28nm工艺,性能和功耗都很好。
避坑指南:我曾经在项目里选错芯片系列,导致IO电压不匹配,板子打回来才发现。所以选型时一定要仔细看数据手册,特别是IO bank的供电要求。
好了,第一章的内容就到这里。咱们把数字电路的基础、组合逻辑和时序逻辑的区别、Verilog的基本概念,还有Lattice的生态都过了一遍。这些是后面所有章节的基石,一定要理解透彻。
下一章,咱们开始动手写真正的组合逻辑代码。到时候我会带大家从最简单的门电路开始,一步步搭建自己的逻辑模块。
公众号:蓝海资料掘金营,微信deep3321