Verilog十日谈Day 1:从软件思维到硬件思维:我的第一行Verilog代码与仿真
标题: Verilog十日谈Day 1: 从软件思维到硬件思维:我的第一行Verilog代码与ModelSim仿真
副标题: 告别点灯侠!从第一天起,就用工程师的方式写代码、做仿真。
正文开始:
困在“点灯”阶段:代码只会下载到板子看结果,出了问题一脸茫然,调试基本靠猜?
对仿真望而生畏:听说过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 name
-
-
- :
-
ModelSimFormat for output netlist
-
-
- :
-
VerilogOutput directory
-
-
- :
-
simulation/modelsim
-
-
- (默认即可)
-
启动仿真:点击 Tools -> Run Simulation Tool -> RTL Simulation。Quartus会自动编译你的设计,生成仿真模型,并启动ModelSim。
在ModelSim中查看结果:
在0-20ns, a=0, b=0, y=0。在20-40ns, a=0, b=1, y=0。在40-60ns, a=1, b=0, y=0。在60-80ns, a=1, b=1, y=1。
ModelSim启动后,你可能需要手动将测试信号添加到波形窗口。
在"Transcript"窗口输入:do wave.do
(如果Quartus已生成) 或手动将左侧Objects窗口中的信号 a, b, y 拖到波形窗口。
在Transcript窗口输入:run 100ns 或点击工具栏上的"Run"按钮。
现在,请凝视你的波形图!
-
-
- 你可以清晰地看到:
-
这,就是你的芯片在工作! 你不再需要物理板卡,在电脑上就完美验证了设计的正确性。这就是仿真的威力!
【今日源码下载】
我们为本文提供了完整的源码与Testbench文件。
由于本次代码较为简单,已全部提供在文章内,直接复制即可,不再另外单独提供。
【明日预告 & 系列精华一览】
今天,你迈出了最关键的一步:建立了硬件思维,并掌握了设计-验证的完整工业流程。接下来的课程,我们将在这个坚实的基础上,快速构建你的Verilog知识体系。
《Verilog十日谈》系列精华抢先看:
Day 2: 数字电路的筋骨:详解wire、reg与模块层次化设计。深入硬件描述核心,搞懂“线”与“寄存器”的本质区别。
Day 3: 组合逻辑的双刃剑:assign与always@(*)与Latch陷阱。掌握描述组合逻辑的两种方式,并规避初学者100%会踩的锁存器大坑!
Day 4: 时序逻辑的基石:时钟、复位与非阻塞赋值(<=)。进入能够“记忆”的时序逻辑世界,这是CPU、FIFO等一切复杂设计的基础。
Day 5: 价值千金的法则:阻塞(=)与非阻塞(<=)的终极对决本系列灵魂一课! 用大量波形图揭秘其底层差异,总结出让你终生受益的编码风格。
Day 6: 实战:用有限状态机实现一个序列检测器。综合运用前5天知识,完成一个经典、实用的数字系统设计。
Day 7: Testbench进阶:自动化验证、任务与系统函数。教你写出更强大、高效的测试脚本,真正驾驭ModelSim。
Day 8: 高效设计之道:PLL、RAM等IP核的调用与仿真。站在巨人的肩膀上,快速构建复杂系统。
Day 9 & 10: 番外答疑与FPGA学习路线图。集中解决难题,为你规划清晰的进阶路径。
从思维到工具,从语法到项目,我们已经为你铺平了道路。点击关注,用十天,我们深入Verilog的“筋骨”所在,不见不散!
互动话题: 在Quartus和ModelSim联仿中遇到什么问题?或者你最想在下节课中深入了解哪个知识点?欢迎在评论区留言!
481