2. 数字电路基础回顾:二进制与逻辑电平、基本逻辑门、组合逻辑与时序逻辑、触发器与寄存器
说实话,很多刚学FPGA的朋友,一上来就盯着Verilog语法猛啃。但我得泼盆冷水——数字电路基础不牢,写出来的代码就是空中楼阁。我自己带过不少新人,发现出问题的地方,十有八九都是卡在这些最基础的概念上。
这一章,咱们就把地基夯实。别嫌简单,我保证里面有不少坑,是我当年用示波器一根一根线查出来的教训。
2.1 二进制与逻辑电平
数字电路的世界里,只有两个数字:0和1。说白了,这就是二进制。你想想看,我们平时用的十进制,逢十进一;二进制呢,逢二进一。比如十进制的5,在二进制里就是101。
那0和1在电路里怎么表示?靠电压。我习惯把逻辑电平理解成一种“约定”:
- 高电平(逻辑1):通常对应一个较高的电压,比如3.3V或1.8V。
- 低电平(逻辑0):通常对应一个较低的电压,比如0V(GND)。
重要概念: 逻辑电平不是的!TTL电平(5V)和CMOS电平(3.3V/1.8V)的阈值就不一样。我在项目中就吃过这个亏——把3.3V的FPGA输出直接连到5V的TTL芯片上,结果烧了IO口。嗯,这里要注意电平匹配。
二进制还有个好处:运算规则极其简单。加法和乘法都能用“与、或、非”这些基本操作拼出来。这也是为什么计算机选择二进制——电路实现起来最省事。
2.2 基本逻辑门
逻辑门是数字电路的最小积木块。我经常跟团队里的人说:你写的每一行Verilog代码,最终都会映射成这些门电路的组合。
咱们看看最常用的四个门:
| 逻辑门 | 符号 | 功能描述 | 真值表(A, B → Y) |
|---|---|---|---|
| 与门(AND) | Y = A & B | 全1出1,有0出0 | 0,0→0;0,1→0;1,0→0;1,1→1 |
| 或门(OR) | Y = A | B | 有1出1,全0出0 | 0,0→0;0,1→1;1,0→1;1,1→1 |
| 非门(NOT) | Y = ~A | 取反,0变1,1变0 | 0→1;1→0 |
| 异或门(XOR) | Y = A ^ B | 相同出0,不同出1 | 0,0→0;0,1→1;1,0→1;1,1→0 |
个人小技巧: 异或门在设计中特别有用。比如做奇偶校验、比较两个数是否相等,甚至做加法器里的半加器,都离不开它。我建议你把这个门的真值表背下来,用的时候能省不少事。
你可能会问:就这几个门,能搭出CPU吗?能。实际上,任何复杂的数字电路,都可以用“与非门”或者“或非门”单独实现。这叫逻辑完备性。不过实际设计中,我们直接用现成的门库,没必要从零搭。
2.3 组合逻辑与时序逻辑
这是数字电路里最核心的一个分水岭。我见过很多新手,代码跑不通,就是因为没搞清这两个概念。
组合逻辑:输出只取决于当前的输入。没有记忆功能。比如一个加法器,你输入2和3,它立刻输出5。输入变了,输出马上跟着变。
时序逻辑:输出不仅取决于当前输入,还取决于之前的状态。说白了,它有记忆。比如一个计数器,你给它一个时钟脉冲,它记住自己数到几了,然后加1。
避坑指南: 我曾经在项目里犯过一个低级错误——把组合逻辑的反馈环路直接连起来,没有加寄存器。结果仿真没问题,上板子就振荡,整个系统乱跳。后来查了三天才找到原因:组合逻辑的环路会产生竞争冒险。所以,凡是需要“记住”状态的地方,一定要用时序逻辑。
怎么区分?看代码里有没有always @(posedge clk)。有时钟沿触发的,就是时序逻辑;没有的,就是组合逻辑。简单粗暴。
2.4 触发器与寄存器
触发器是时序逻辑的基本单元。最常见的叫D触发器(D Flip-Flop)。它的工作原理很简单:
- 每个时钟上升沿(或下降沿),把输入D的值“锁存”到输出Q。
- 其他时间,Q保持不变。
你看,这不就是“记忆”吗?一个D触发器能记住1位二进制数。
寄存器呢?说白了,就是多个D触发器并排放在一起。比如一个8位寄存器,就是8个D触发器,共用同一个时钟。它能同时记住8位数据。
我举个例子:你在FPGA里写reg [7:0] data_reg;,综合工具就会给你生成8个D触发器。每个触发器负责存储1位。
关键点: 在FPGA内部,触发器是“硬核”资源,不是用逻辑门搭出来的。每个逻辑单元(比如Xilinx的Slice或Altera的LE)里都包含几个现成的触发器。所以,用触发器不费LUT资源,但数量有限。设计时要注意看芯片的触发器总数。
下面这张图,是我自己画的,帮你理清这一章的知识脉络:
从这张图你能看出来:二进制是基础,逻辑门是工具,组合逻辑和时序逻辑是两大分支,而触发器/寄存器是时序逻辑的核心实现。一环扣一环。
我的建议: 学这一章的时候,别光看。拿张纸,自己画一遍真值表,写一段简单的Verilog代码(比如一个D触发器),然后跑仿真看看波形。动手做一遍,比看十遍都管用。
好了,数字电路基础就回顾到这儿。这些东西看着简单,但往后学复杂设计的时候,你会发现——所有的高级技巧,最终都回归到这些最基础的概念上。把地基打牢,后面的路就好走了。
可可精品资料库