第九章 数字电路基础

本章在讲什么

从这一章开始,我们进入"数字电路篇"。数字电路主要由各种门电路、触发器和寄存器等组成——它们是所有 FPGA 设计的"原子"。前面学到的 Verilog 语法是"怎么写代码",而数字电路基础回答的是"代码背后的电路是什么"。俗话说得好:基础不牢,地动山摇。想写出真正合理、可靠的硬件逻辑,这些理论地基必须打牢。

本章包括五个部分:

  1. 什么是数字电路:数字信号与模拟信号的区别;
  2. 数字进制简介:二进制/十进制/十六进制及其转换;
  3. 逻辑门简介:与、或、非等基本门电路;
  4. 逻辑电路简介:组合逻辑与时序逻辑;
  5. 硬件描述语言:VHDL 与 Verilog 的定位。

核心概念拆解

9.1 什么是数字电路

要搞明白数字电路,先要分清生活中的两种信号概念:

  • 模拟信号:在时间上连续变化的信号,如压力、气温、速度等信号,取值可以无限细分;
  • 数字信号:在时间上不连续(离散)变化的信号,如电平信号,只在有限的离散电平(0 和 1)之间跳变。

图9.1.1 模拟信号

图9.1.2 数字信号

对比两张示意图可以很直观地看出:模拟信号是一条平滑连续的曲线,数字信号则是阶梯状的离散电平。

一个重要的现实结论: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。

图9.2.1 Windows计算器

方法二:查表对照。常用数值建议直接记住三种进制的对应关系,例如:

十进制 二进制 十六进制
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)包括 VHDLVerilog HDL 两种,都是 IEEE 标准。

Verilog HDL 借鉴了 C 语言的部分语法形式(如控制语句等),具有一定易学性;同时能灵活地对数字电路进行描述,从简单的逻辑门电路到复杂的片上系统(SoC)都能有效建模,可以在较短时间内学习和掌握,目前已在 FPGA 开发/IC 设计领域占据绝对领导地位

Verilog 的详细语法在上一章(第八章语法篇)已经系统讲解过,本章不再重复。想深入钻研的读者可以回到第八章反复体会,特别是阻塞/非阻塞赋值与组合/时序逻辑的对应关系——正是本章理论与语法的连接点。

初学者容易踩的坑

  1. 分不清模拟量与数字量的边界:FPGA 的 PL 逻辑只能直接处理数字信号。要采集温度、电压等模拟量,必须外接或片内集成 AD 模块先做转换,不能想当然地在逻辑里"直接读"。
  2. 进制换算死算不查工具:程序员模式计算器和"4 位二进制 ↔ 1 位十六进制"的心算规律,远比手写长除法/乘方还原高效;4'b1101 = 4'hd = 4'd13 这样的等价关系要秒答。
  3. 忘记默认进制:Verilog 中裸写 100 是 32 位十进制,不是你以为的二进制或 4 位宽度。涉及位运算、比较的场合务必显式写全位宽和进制(如 4'd10)。
  4. 异或/同或记反:异或"相异出 1",同或"相同出 1"。这两个门在奇偶校验、比较器等电路中极其常用,记反了电路功能就全错了。
  5. 组合逻辑与时序逻辑混淆:看到输出"和上一时刻有关"就是时序逻辑,需要时钟和寄存器;用组合逻辑去实现"需要记忆"的功能,要么综合出 latch,要么行为错误。结合上一章的阻塞/非阻塞赋值规则一起理解。

小结 & 下一步

本章是数字电路篇的开篇,为后续硬件理论学习搭好了骨架:

  • 信号分类:模拟信号时间上连续,数字信号离散;FPGA 逻辑一般只能处理数字信号(高端 FPGA 可集成 AD 采集模拟量);
  • 数字进制:掌握二进制/十进制/十六进制的 Verilog 表示(4'b01014'd24'ha),会熟练使用 Windows 计算器程序员模式和"4 位二进制 ↔ 1 位十六进制"规律进行转换,未指定位宽进制时默认 32 位十进制;
  • 逻辑门:与、或、非、与非、或非、异或、同或七种门的表达式与真值表,它们是数字电路的积木;
  • 逻辑电路两大类:组合逻辑(输出只看当前输入、无记忆、无反馈)与时序逻辑(输出还取决于原状态、有时钟、有存储);
  • 硬件描述语言:VHDL 与 Verilog 双雄并立,Verilog 因易学易用成为主流。

至此,第 1~9 章的讲解笔记全部完成。从下一章开始,我们将把语法篇与数字电路篇的知识结合起来,进入一个个具体的外设实验(按键、数码管、定时器等),在实践中巩固"组合逻辑怎么写、时序逻辑怎么控"的肌肉记忆。


本笔记基于正点原子《领航者 ZYNQ 之 FPGA 开发指南》第九章整理,图片版权归原厂所有。