Verilog十日谈Day 1: 从软件思维到硬件思维:我的第一行Verilog代码与ModelSim仿真
告别点灯侠!从第一天起,就用工程师的方式写代码、做仿真。
各位未来的芯片设计与FPGA高手,你是否:
- 困在“点灯”阶段:代码只会下载到板子看结果,出了问题一脸茫然,调试基本靠猜?
- 对仿真望而生畏:听说过Testbench和ModelSim,但觉得复杂难学,迟迟不敢上手?
- 缺乏工程化思维:教程只教语法,不教如何在一个完整的工程环境下编译、仿真、调试?
如果你的答案是“是”,那么你来对地方了。
我们见过太多学习者,因为第一步就走错了方向——他们只学语法,不学验证;只会综合,不会仿真。结果就是永远无法独立完成高质量的设计。
《Verilog十日谈》系列,就是要从根本上解决这个问题。 我们承诺:
- ✅ 工业级流程:从Day 1起,就带你使用Quartus + ModelSim这一行业标准组合。
- ✅ 验证驱动开发:强调Testbench编写与仿真分析,让你“代码未下载,已知结果对”。
- ✅ 完整的工程视角:每个例子都是一个完整的Quartus工程,让你知其然,更知其所以然。
- ✅ 手把手实战
今天,就让我们跨越理论与实践的鸿沟,完成从“学生”到“工程师”的第一个关键转变。
一、 思维破壁:你的代码不是程序,是电路蓝图!
请立刻忘记C/C++/Python!你不再是“程序员”,而是“数字世界的建筑师”。
- 软件思维
- 硬件思维:代码描述电路结构,核心是“空间结构”和“并行工作”。
一个比喻:
你的Verilog代码就像一张电路蓝图。module就是你设计的芯片;input/output是芯片的引脚;assign和always块则是内部具体的逻辑门和寄存器。一旦上电,整个电路同时工作。
理解“代码即电路”,是学好Verilog的唯一前提。
二、 环境准备:打造你的专业“数字工作站”
本系列使用 Intel QuartusII 和 ModelSim 进行联合仿真。
关于安装:
- 请确保你的Quartus版本中包含了ModelSim(例如Intel FPGA Edition或预装了ModelSim的版本)。
- 关于软件安装、License设置(Quartus和ModelSim均有免费版本),B站有极其详尽的视频教程。请自行搜索学习,这是成为工程师的必备技能。
关键一步:关联仿真工具
- 打开Quartus,进入
Tools -> Options -> General -> EDA Tool Options。 - 在“ModelSim”一项中,指定你的ModelSim可执行文件所在路径(例如
.../intelFPGA/XX.x/modelsim_ase/win32aloem)。 - 这一步是Quartus能调用ModelSim的关键!
三、 第一行代码:设计一个“与门”芯片
启动Quartus,创建一个新项目(项目路径和名称不要有中文和空格!)。器件可以先选择一个Cyclone IV EP4CE6系列。
新建一个Verilog文件,保存为 and_gate.v,输入以下代码:
// 模块声明:定义一个名为 and_gate 的“芯片”
module and_gate (
input a, // 输入端口 a,好比一个开关
input b, // 输入端口 b,好比另一个开关
output y // 输出端口 y,好比一个灯泡
);
// 连续赋值语句:描述电路功能
// 这里是一个与门——只有当a和b都为1时,y才输出1
assign y = a & b;
endmodule
点击 编译按键。如果下方信息窗口显示成功,恭喜!你的第一个数字电路“蓝图”已经绘制完毕。
点击RTL图可以看到生成的电路图:
可以看到生成了一个与门
四、 第一个Testbench:为你的芯片搭建“测试平台”
这是工程师的核心技能!Testbench就是一个虚拟的“测试平台”,用来给你的设计(DUT)施加激励,并检查其输出。
新建Testbench文件:在Quartus中,再新建一个Verilog文件,命名为 tb_and_gate.v。注意:这个文件不需要加入到项目中,它仅用于仿真。
编写测试脚本:将以下代码写入 tb_and_gate.v。
// 测试模块(Testbench)
// 注意:testbench模块没有输入输出端口!
`timescale 1ns/1ns // 定义仿真时间单位/精度
module tb_and_gate();
// 1. 定义连接到被测模块的信号
reg a, b; // "reg" 类型:在测试中用于驱动输入
wire y; // "wire"类型:用于连接被测模块的输出
// 2. 实例化被测模块 (Device Under Test, DUT)
// 这相当于把设计好的“and_gate”芯片插到测试底座上
and_gate u_and_gate (
.a (a),
.b (b),
.y (y)
);
// 3. 产生激励波形
initial begin
// 初始化信号
a = 1'b0;
b = 1'b0;
#20; // 等待20个时间单位
// 测试用例1: a=0, b=1
a = 1'b0;
b = 1'b1;
#20;
// 测试用例2: a=1, b=0
a = 1'b1;
b = 1'b0;
#20;
// 测试用例3: a=1, b=1
a = 1'b1;
b = 1'b1;
#20;
// 测试结束
$stop; // 暂停仿真(ModelSim中可继续),用 $finish 则直接退出
end
endmodule
五、 联合仿真:在ModelSim中见证电路工作!
设置仿真工具:在Quartus中,进入 Assignments -> Settings -> EDA Tool Settings -> Simulation。
Tool nameFormat for output netlistOutput directory: simulation/modelsim (默认即可)
启动仿真:
- 点击
Tools -> Run Simulation Tool -> RTL Simulation。 - Quartus会自动编译你的设计,生成仿真模型,并启动ModelSim。
在ModelSim中查看结果:
- ModelSim启动后,你可能需要手动将测试信号添加到波形窗口。在"Transcript"窗口输入:
do wave.do (如果Quartus已生成) 或手动将左侧Objects窗口中的信号 a, b, y 拖到波形窗口。 - 在Transcript窗口输入:
run 100ns 或点击工具栏上的"Run"按钮。 - 现在,请凝视你的波形图!
这,就是你的芯片在工作! 你不再需要物理板卡,在电脑上就完美验证了设计的正确性。这就是仿真的威力!
【今日源码下载】
我们为本文提供了完整的源码与Testbench文件。
lesson1.rar
【明日预告 & 系列精华一览】
今天,你迈出了最关键的一步:建立了硬件思维,并掌握了设计-验证的完整工业流程。接下来的课程,我们将在这个坚实的基础上,快速构建你的Verilog知识体系。