第九章 数字电路基础
本章在讲什么
从这一章开始,我们进入"数字电路篇"。数字电路主要由各种门电路、触发器和寄存器等组成——它们是所有 FPGA 设计的"原子"。前面学到的 Verilog 语法是"怎么写代码",而数字电路基础回答的是"代码背后的电路是什么"。俗话说得好:基础不牢,地动山摇。想写出真正合理、可靠的硬件逻辑,这些理论地基必须打牢。
本章包括五个部分:
- 什么是数字电路:数字信号与模拟信号的区别;
- 数字进制简介:二进制/十进制/十六进制及其转换;
- 逻辑门简介:与、或、非等基本门电路;
- 逻辑电路简介:组合逻辑与时序逻辑;
- 硬件描述语言:VHDL 与 Verilog 的定位。
核心概念拆解
9.1 什么是数字电路
要搞明白数字电路,先要分清生活中的两种信号概念:
- 模拟信号:在时间上连续变化的信号,如压力、气温、速度等信号,取值可以无限细分;
- 数字信号:在时间上不连续(离散)变化的信号,如电平信号,只在有限的离散电平(0 和 1)之间跳变。


对比两张示意图可以很直观地看出:模拟信号是一条平滑连续的曲线,数字信号则是阶梯状的离散电平。
一个重要的现实结论:IC/FPGA 逻辑设计里面,一般只能处理数字信号。当然,现在也有一些高端 FPGA 集成了 AD(模数转换)模块,可以直接采集模拟量信号——但就我们学习的 ZYNQ-7000 系列 FPGA 而言,PL 部分处理的是纯数字信号。现实世界的温度、声音等模拟量,需要先经过 AD 转换成数字量,才能交给 FPGA 处理。
9.2 数字进制简介
数字进制格式包括二进制、八进制、十进制和十六进制,常用的是二进制、十进制和十六进制。这直接对应了 Verilog 中的表示方法(上一章已经用过):
| 进制 | Verilog 格式 | 示例 | 说明 |
|---|---|---|---|
| 二进制(BIN) | <位宽>'b<数值> |
4'b0101 |
4 位二进制数字 0101 |
| 十进制(DEC) | <位宽>'d<数值> |
4'd2 |
4 位十进制数 2,即二进制 0010 |
| 十六进制(HEX) | <位宽>'h<数值> |
4'ha |
4 位十六进制数 a,即二进制 1010 |
十六进制的计数方式为 0,1,2…9,a,b,c,d,e,f,最大计数为 f(f 对应十进制 15)。再次提醒:当代码中没有指定数字的位宽与进制时,默认为 32 位的十进制,比如直接写 100,实际表示 32'd100。
进制如何转换?推荐两种方法:
方法一:Windows 自带计算器(最常用)。打开 Windows 计算器,切换到"程序员模式",可以看到四个进制栏:HEX(16 进制)、DEC(10 进制)、OCT(8 进制)、BIN(2 进制)。在任一栏输入数字,其余栏实时显示换算结果。以二进制 4'b1101 为例,计算器直接显示:HEX=D、DEC=13、OCT=15。

方法二:查表对照。常用数值建议直接记住三种进制的对应关系,例如:
| 十进制 | 二进制 | 十六进制 |
|---|---|---|
| 0 | 0000 | 0 |
| 1 | 0001 | 1 |
| 5 | 0101 | 5 |
| 10 | 1010 | a |
| 13 | 1101 | d |
| 15 | 1111 | f |
由于 4 位二进制恰好对应 1 位十六进制(0~f 共 16 种组合),二进制与十六进制之间的转换可以"一组 4 位一组 4 位"地进行,非常方便——这也是底层开发偏爱十六进制的原因。
9.3 逻辑门简介
数字电路的基础是各种门电路。基本门包括与门、或门和非门;为了简化逻辑表达,实际电路还扩展出与非门、或非门、异或门和同或门。它们的名称、英文缩写与逻辑表达式如下:
| 名称 | 英文 | 逻辑表达式 | 一句话记忆 |
|---|---|---|---|
| 与门 | AND | Y = A&B | 有 0 出 0,全 1 出 1 |
| 或门 | OR | Y = A|B | 有 1 出 1,全 0 出 0 |
| 非门 | NOT | Y = ~A | 取反,1 变 0、0 变 1 |
| 与非门 | NAND | Y = ~(A&B) | 先与后非 |
| 或非门 | NOR | Y = ~(A|B) | 先或后非 |
| 异或门 | XOR | Y = A^B | 相异出 1,相同出 0 |
| 同或门 | XNOR | Y = ~A&~B | A&B | 相同出 1,相异出 0 |
以与门为例,把 A、B 的全部输入组合列出来就是真值表:
| 输入 A | 输入 B | 输出 Y(与) |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
这 7 种门电路是构成一切数字电路的积木——上一章 Verilog 里的位运算符 &、|、~、^ 正是直接对应这些逻辑门。把每种门的符号、表达式和输入输出关系烂熟于心,后面看综合出的电路原理图、分析时序波形时才不会吃力。
9.4 逻辑电路简介
数字电路按逻辑功能分为两大类:组合逻辑电路和时序逻辑电路。这是贯穿整个 FPGA 设计生涯的一对核心概念。
组合逻辑电路:任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。它没有记忆功能、没有反馈环路——输入一变,输出立刻(经过门延迟后)跟着变。典型的组合逻辑就是上一章讲到的 assign 语句和不带时钟的 always 语句(记得用阻塞赋值 =、if 必带 else、case 必带 default,否则会产生 latch)。
时序逻辑电路:任意时刻的输出不仅取决于当时的输入信号,还取决于电路原来的状态——或者说与以前的输入有关。它能"记住"历史,靠的是锁存器、触发器、寄存器这类存储单元,而状态更新由时钟沿统一控制。带时钟的 always 语句(非阻塞赋值 <=)综合出的就是时序逻辑。
对比记忆:
| 特性 | 组合逻辑 | 时序逻辑 |
|---|---|---|
| 输出取决于 | 当前输入 | 当前输入 + 电路原状态 |
| 是否有记忆 | 无 | 有(触发器/寄存器) |
| 是否受时钟控制 | 否 | 是 |
| Verilog 写法 | assign / 不带时钟的 always(=) |
带时钟的 always(<=) |
后续章节我们会先从"与""或""非"门开始学习组合逻辑,再从锁存器、触发器和寄存器入手学习时序逻辑。
9.5 硬件描述语言
硬件描述语言(HDL)包括 VHDL 和 Verilog HDL 两种,都是 IEEE 标准。
Verilog HDL 借鉴了 C 语言的部分语法形式(如控制语句等),具有一定易学性;同时能灵活地对数字电路进行描述,从简单的逻辑门电路到复杂的片上系统(SoC)都能有效建模,可以在较短时间内学习和掌握,目前已在 FPGA 开发/IC 设计领域占据绝对领导地位。
Verilog 的详细语法在上一章(第八章语法篇)已经系统讲解过,本章不再重复。想深入钻研的读者可以回到第八章反复体会,特别是阻塞/非阻塞赋值与组合/时序逻辑的对应关系——正是本章理论与语法的连接点。
初学者容易踩的坑
- 分不清模拟量与数字量的边界:FPGA 的 PL 逻辑只能直接处理数字信号。要采集温度、电压等模拟量,必须外接或片内集成 AD 模块先做转换,不能想当然地在逻辑里"直接读"。
- 进制换算死算不查工具:程序员模式计算器和"4 位二进制 ↔ 1 位十六进制"的心算规律,远比手写长除法/乘方还原高效;
4'b1101 = 4'hd = 4'd13这样的等价关系要秒答。 - 忘记默认进制:Verilog 中裸写
100是 32 位十进制,不是你以为的二进制或 4 位宽度。涉及位运算、比较的场合务必显式写全位宽和进制(如4'd10)。 - 异或/同或记反:异或"相异出 1",同或"相同出 1"。这两个门在奇偶校验、比较器等电路中极其常用,记反了电路功能就全错了。
- 组合逻辑与时序逻辑混淆:看到输出"和上一时刻有关"就是时序逻辑,需要时钟和寄存器;用组合逻辑去实现"需要记忆"的功能,要么综合出 latch,要么行为错误。结合上一章的阻塞/非阻塞赋值规则一起理解。
小结 & 下一步
本章是数字电路篇的开篇,为后续硬件理论学习搭好了骨架:
- 信号分类:模拟信号时间上连续,数字信号离散;FPGA 逻辑一般只能处理数字信号(高端 FPGA 可集成 AD 采集模拟量);
- 数字进制:掌握二进制/十进制/十六进制的 Verilog 表示(
4'b0101、4'd2、4'ha),会熟练使用 Windows 计算器程序员模式和"4 位二进制 ↔ 1 位十六进制"规律进行转换,未指定位宽进制时默认 32 位十进制; - 逻辑门:与、或、非、与非、或非、异或、同或七种门的表达式与真值表,它们是数字电路的积木;
- 逻辑电路两大类:组合逻辑(输出只看当前输入、无记忆、无反馈)与时序逻辑(输出还取决于原状态、有时钟、有存储);
- 硬件描述语言:VHDL 与 Verilog 双雄并立,Verilog 因易学易用成为主流。
至此,第 1~9 章的讲解笔记全部完成。从下一章开始,我们将把语法篇与数字电路篇的知识结合起来,进入一个个具体的外设实验(按键、数码管、定时器等),在实践中巩固"组合逻辑怎么写、时序逻辑怎么控"的肌肉记忆。
本笔记基于正点原子《领航者 ZYNQ 之 FPGA 开发指南》第九章整理,图片版权归原厂所有。