第 1 章:数字逻辑基础与 Verilog 概述¶
从"软件程序"到"硬件电路"——理解硬件描述语言的本质
章节概览¶
| 小节 | 内容 | 核心概念 |
|---|---|---|
| 1.1 | 什么是硬件描述语言 | HDL 概念、Verilog 与 VHDL 对比 |
| 1.2 | 数字电路基础 | 逻辑门、布尔代数、真值表 |
| 1.3 | Verilog 设计流程 | 从代码到电路的全流程 |
| 1.4 | 硬件思维 vs 软件思维 | 并行执行、持续驱动、时序概念 |
| 1.5 | 本章练习 | 基础概念自测 |
1.1 什么是硬件描述语言¶
从"画电路图"到"写代码"¶
在 Verilog 出现之前,工程师设计数字电路的方式是 手绘电路图 ——在图纸上画出每一个逻辑门、每一根连线。当电路规模达到成千上万个门时,这种方式变得极其低效且容易出错。
硬件描述语言(HDL)
硬件描述语言 (Hardware Description Language)是一种用文本形式描述数字电路结构和行为的编程语言。它让你像写代码一样"画"电路图。
乐高比喻: 如果把设计电路比作搭建乐高模型,那么: - 手绘电路图 = 用纸笔画出每个积木的位置和连接方式 - 写 Verilog 代码 = 用文字描述"这里放一个 2×4 积木,上面接一个 1×2 积木……" - 综合工具 = 自动把你的文字描述翻译成实际的积木搭建方案
Verilog 与 VHDL¶
目前主流的硬件描述语言有两种:
| 特性 | Verilog | VHDL |
|---|---|---|
| 语法风格 | 类似 C 语言,简洁灵活 | 类似 Ada 语言,严谨冗长 |
| 学习曲线 | 较平缓,适合初学者 | 较陡峭,类型系统严格 |
| 流行地区 | 北美、亚洲(工业界主流) | 欧洲、军工、航空航天 |
| 典型应用 | ASIC/FPGA 设计、验证 | 高可靠性系统、形式化验证 |
| 本教程选择 | ✅ 推荐入门 | 后续可拓展学习 |
为什么选择 Verilog 入门?
Verilog 的语法接近 C 语言,如果你有任何编程经验,上手会非常快。即使没有编程经验,Verilog 的语法也比 VHDL 更直观。
1.2 数字电路基础¶
数字信号:只有 0 和 1 的世界¶
数字电路只处理两种状态: 高电平(1) 和 低电平(0) 。这就像电灯开关——要么开,要么关,没有中间状态。
乐高比喻: 数字信号就像乐高积木的凸起——要么有凸起(1),要么没有(0)。不存在"半个凸起"。
基本逻辑门¶
逻辑门是数字电路的最小构建单元,就像乐高积木中最基础的 1×1 方块:
| 门类型 | 符号 | 真值表 | 功能描述 |
|---|---|---|---|
| 与门(AND) | Y = A & B |
00→0, 01→0, 10→0, 11→1 | 两个输入都为 1 时输出 1 |
| 或门(OR) | Y = A \| B |
00→0, 01→1, 10→1, 11→1 | 至少一个输入为 1 时输出 1 |
| 非门(NOT) | Y = ~A |
0→1, 1→0 | 输入取反 |
| 与非门(NAND) | Y = ~(A & B) |
00→1, 01→1, 10→1, 11→0 | 与门的输出取反 |
| 或非门(NOR) | Y = ~(A \| B) |
00→1, 01→0, 10→0, 11→0 | 或门的输出取反 |
| 异或门(XOR) | Y = A ^ B |
00→0, 01→1, 10→1, 11→0 | 两个输入不同时输出 1 |
生活化理解
- 与门 = 两道门锁:两把钥匙都插入才能开门
- 或门 = 双开关走廊灯:任一开关都能开灯
- 非门 = 跷跷板:一头上去,另一头就下来
- 异或门 = 两人猜拳:出的一样(平局),出的不同(有胜负)
布尔代数基础¶
布尔代数是分析和简化逻辑电路的数学工具。以下是核心定律:
| 定律 | 表达式 | 说明 |
|---|---|---|
| 同一律 | \(A \cdot 1 = A\),\(A + 0 = A\) | 与 1 相与不变,与 0 相或不变 |
| 零一律 | \(A \cdot 0 = 0\),\(A + 1 = 1\) | 与 0 相与得 0,与 1 相或得 1 |
| 互补律 | \(A \cdot \bar{A} = 0\),\(A + \bar{A} = 1\) | 自身与反变量相与得 0,相或得 1 |
| 交换律 | \(A \cdot B = B \cdot A\),\(A + B = B + A\) | 顺序可交换 |
| 结合律 | \((A \cdot B) \cdot C = A \cdot (B \cdot C)\) | 分组方式不影响结果 |
| 分配律 | \(A \cdot (B + C) = A \cdot B + A \cdot C\) | 类似乘法分配律 |
| 德摩根定律 | \(\overline{A \cdot B} = \bar{A} + \bar{B}\) | 与的非 = 非的或 |
1.3 Verilog 设计流程¶
从代码到芯片的五步流程¶
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 编写代码 │ → │ 功能仿真 │ → │ 综合 │ → │ 布局布线 │ → │ 下载验证 │
│ (Design) │ │ (Simulate)│ │(Synthesize)│ │(Place&Route)│ │(Program) │
└──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘
| 步骤 | 工具 | 做什么 | 乐高比喻 |
|---|---|---|---|
| 1. 编写代码 | VS Code / 任意编辑器 | 用 Verilog 描述电路功能 | 写下搭建说明书 |
| 2. 功能仿真 | Icarus Verilog + GTKWave | 验证逻辑是否正确(本教程重点) | 在脑海中模拟搭建过程 |
| 3. 综合 | Vivado / Quartus | 将代码转换为门级网表 | 将说明书翻译成积木清单 |
| 4. 布局布线 | Vivado / Quartus | 将门级网表映射到实际芯片资源 | 确定每个积木在底板上的位置 |
| 5. 下载验证 | Vivado / Quartus | 将配置文件烧录到 FPGA | 实际搭建并测试 |
本教程的范围
本教程聚焦于 步骤 1(编写代码) 和 步骤 2(功能仿真) ,使用免费开源的 Icarus Verilog 仿真器。步骤 3~5 需要 FPGA 开发板和厂商工具(Vivado/Quartus),属于进阶内容。
1.4 硬件思维 vs 软件思维¶
这是零基础学习者最容易困惑的地方。Verilog 虽然看起来像编程语言,但它的思维方式与软件编程 完全不同 。
核心差异对比¶
| 维度 | 软件编程(C/Python) | 硬件描述(Verilog) |
|---|---|---|
| 执行方式 | 顺序执行(一行接一行) | 并行执行(所有语句同时"生效") |
| 时间概念 | 代码运行有先后顺序 | 电路持续工作,由时钟驱动 |
| 变量本质 | 内存中的存储位置 | 电路中的物理连线或寄存器 |
| "运行" | 程序启动→执行→结束 | 电路上电后持续运行,没有"结束" |
| 调试方式 | 打断点、单步执行 | 看波形图、分析时序 |
最重要的思维转变
软件代码是 指令序列 ——CPU 一条一条执行。Verilog 代码是 电路描述 ——描述的是硬件连接关系,所有部分同时工作。
乐高比喻: - 软件编程 = 写一份"搭建步骤说明书"(先放红色积木,再放蓝色积木……) - Verilog 设计 = 画一张"最终成品图纸"(红色积木在左边,蓝色积木在右边,它们之间用黄色积木连接)
并行执行示例¶
// 以下三个 assign 语句在硬件中是同时生效的
// 不存在"先执行第一句,再执行第二句"的概念
assign y1 = a & b; // 与门:a 和 b 同时驱动 y1
assign y2 = a | b; // 或门:a 和 b 同时驱动 y2
assign y3 = a ^ b; // 异或门:a 和 b 同时驱动 y3
// 当 a 或 b 变化时,y1、y2、y3 同时更新
持续驱动 vs 一次性赋值¶
软件中的变量赋值是一次性的:
Verilog 中的连线是持续驱动的:
理解 assign 的关键
assign 不是"赋值一次",而是"建立持续的连接关系"。就像用导线把两个引脚焊在一起——只要输入变化,输出立刻跟随变化。
1.5 本章练习¶
基础概念自测¶
- 判断题 :Verilog 代码中的语句是顺序执行的。( )
- 填空题 :数字电路只处理两种状态:____ 和 ____。
- 简答题 :用一句话描述
assign语句的本质含义。 - 真值表练习 :画出三输入与门(
Y = A & B & C)的真值表。
逻辑门练习¶
用基本逻辑门(与、或、非)实现以下功能:
- 设计一个"两人投票器":A 和 B 各有一票,两人都同意时输出 1(通过)。
- 设计一个"两人表决器":A 和 B 各有一票,至少一人同意时输出 1(通过)。
思维转变练习¶
- 阅读以下 Verilog 代码,判断当
a从 0 变为 1 时,y1和y2的值分别如何变化:
FAQ:常见问题解答¶
Verilog 和 C 语言很像,它们是一回事吗?
绝对不是。 Verilog 的语法借鉴了 C 语言,但本质完全不同。C 语言描述的是"计算机怎么做",Verilog 描述的是"电路怎么连"。把 Verilog 当 C 写是初学者最常见的错误。
我没有 FPGA 开发板,能学 Verilog 吗?
完全可以。 本教程使用 Icarus Verilog(免费仿真器)+ GTKWave(波形查看器),不需要任何硬件。你可以在电脑上完成所有代码编写和仿真验证。
数字电路基础不好,会影响学习吗?
本教程会在需要时补充必要的数字电路知识。第 1 章已经覆盖了最基本的逻辑门概念,后续章节会在具体电路实现时进一步讲解。
assign 和软件中的 = 有什么区别?
软件中的 = 是"计算一次,存储结果"。Verilog 中的 assign 是"建立持续的连接关系"——输入变化,输出自动跟随。就像用导线焊接了两个引脚,而不是用计算器算了一次。
下一章预告: 在第 2 章中,我们将搭建 Verilog 开发环境,安装 Icarus Verilog 仿真器和 GTKWave 波形查看器,并编写运行第一个 Verilog 程序——一个简单的与门电路。