跳转至

第 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 一次性赋值

软件中的变量赋值是一次性的:

// C 语言
int y = a + b;   // 此时计算 a+b,y 固定为计算结果
a = 10;          // 修改 a,y 不会自动更新!

Verilog 中的连线是持续驱动的:

// Verilog
assign y = a + b;  // y 始终等于 a+b
// 当 a 变为 10 时,y 自动更新为 10+b
// 不需要"重新赋值"——这是硬件连接,不是软件赋值

理解 assign 的关键

assign 不是"赋值一次",而是"建立持续的连接关系"。就像用导线把两个引脚焊在一起——只要输入变化,输出立刻跟随变化。


1.5 本章练习

基础概念自测

  1. 判断题 :Verilog 代码中的语句是顺序执行的。( )
  2. 填空题 :数字电路只处理两种状态:____ 和 ____。
  3. 简答题 :用一句话描述 assign 语句的本质含义。
  4. 真值表练习 :画出三输入与门(Y = A & B & C)的真值表。

逻辑门练习

用基本逻辑门(与、或、非)实现以下功能:

  1. 设计一个"两人投票器":A 和 B 各有一票,两人都同意时输出 1(通过)。
  2. 设计一个"两人表决器":A 和 B 各有一票,至少一人同意时输出 1(通过)。

思维转变练习

  1. 阅读以下 Verilog 代码,判断当 a 从 0 变为 1 时,y1y2 的值分别如何变化:
assign y1 = a & b;   // 假设 b = 1
assign y2 = a | b;   // 假设 b = 0

FAQ:常见问题解答

Verilog 和 C 语言很像,它们是一回事吗?

绝对不是。 Verilog 的语法借鉴了 C 语言,但本质完全不同。C 语言描述的是"计算机怎么做",Verilog 描述的是"电路怎么连"。把 Verilog 当 C 写是初学者最常见的错误。

我没有 FPGA 开发板,能学 Verilog 吗?

完全可以。 本教程使用 Icarus Verilog(免费仿真器)+ GTKWave(波形查看器),不需要任何硬件。你可以在电脑上完成所有代码编写和仿真验证。

数字电路基础不好,会影响学习吗?

本教程会在需要时补充必要的数字电路知识。第 1 章已经覆盖了最基本的逻辑门概念,后续章节会在具体电路实现时进一步讲解。

assign 和软件中的 = 有什么区别?

软件中的 = 是"计算一次,存储结果"。Verilog 中的 assign 是"建立持续的连接关系"——输入变化,输出自动跟随。就像用导线焊接了两个引脚,而不是用计算器算了一次。


下一章预告: 在第 2 章中,我们将搭建 Verilog 开发环境,安装 Icarus Verilog 仿真器和 GTKWave 波形查看器,并编写运行第一个 Verilog 程序——一个简单的与门电路。

继续第 2 章:开发环境搭建与第一个程序 →