Quick Start:五分钟启动联合仿真
本指南将引导你从零开始,完成Quartus Prime与ModelSim的联合仿真环境搭建,并通过一个4位计数器实例验证流程正确性。以下步骤适用于Quartus Prime 20.1 Lite Edition(免费版)及随附的ModelSim Intel FPGA Starter Edition。
- 安装EDA工具:安装Quartus Prime(安装时勾选ModelSim Intel FPGA Starter Edition,或单独安装ModelSim SE/DE)。安装完成后,在Quartus的Tools菜单下应能看到“Run Simulation Tool → RTL Simulation”选项。
- 新建Quartus工程:通过File → New Project Wizard创建工程,指定目标器件(如Cyclone IV E EP4CE10F17C8)。完成后,创建顶层设计文件(Verilog或VHDL)。
- 编写RTL代码:编写一个简单的4位计数器模块,保存为
counter.v。 - 创建testbench:编写仿真测试文件
tb_counter.v,例化计数器模块,并提供时钟和复位激励。 - 加入仿真文件:在Quartus中,通过Assignments → Settings → Simulation → Compile test bench files,将testbench文件添加至工程。
- 启动RTL仿真:点击Tools → Run Simulation Tool → RTL Simulation,Quartus将自动调用ModelSim并加载设计。
- 运行仿真:在ModelSim的Transcript窗口中输入命令
run 1 us,观察波形窗口中计数器输出的变化。 - 验证结果:确认计数器从0计数到15后回绕至0。若波形正确,则联合仿真配置成功。
前置条件与环境
为确保流程顺畅,建议使用以下推荐配置。替代方案同样可行,但需注意版本兼容性。
| 项目 | 推荐值 | 说明 | 替代方案 |
|---|---|---|---|
| 器件/板卡 | Cyclone IV E EP4CE10F17C8 | 入门常用,资源充足 | 其他Altera/Intel FPGA(如MAX 10、Arria系列) |
| EDA版本 | Quartus Prime 20.1 Lite Edition | 免费,功能完整 | Quartus II 13.0sp1(旧版,支持Cyclone IV) |
| 仿真器 | ModelSim Intel FPGA Starter Edition | 随Quartus Lite安装,免费 | ModelSim SE/DE(需单独授权) |
| 时钟/复位 | testbench中生成50MHz时钟(周期20ns),低电平有效复位 | 标准激励 | 其他频率或高有效复位 |
| 接口依赖 | 无硬件板卡依赖 | 纯仿真验证 | 如需上板,需配置JTAG下载器 |
| 约束文件 | 仿真阶段不需要.sdc约束 | 但工程需指定器件 | 综合后仿真可加入时序约束 |
| 操作系统 | Windows 10/11 64位 | 推荐 | Linux(需安装Quartus Linux版) |
目标与验收标准
完成本指南后,你应能达成以下目标:
- 功能点:在ModelSim中成功运行RTL仿真,观察到计数器波形从0到15循环。
- 性能指标:仿真运行时间至少1微秒,无编译错误或仿真警告。
- 资源/Fmax:无需上板,但综合后资源占用应小于5个LE(逻辑单元)。
- 关键波形/日志:Transcript窗口无“Fatal”或“Error”信息;波形中clk周期为20ns,计数器在每个时钟上升沿递增。
实施步骤
阶段1:工程结构
创建清晰的工程目录结构,有助于后续维护和扩展。推荐如下:
counter_project/
├── src/ # RTL源文件
│ └── counter.v
├── sim/ # 仿真文件
│ └── tb_counter.v
├── quartus/ # Quartus工程文件
│ ├── counter_project.qpf
│ └── counter_project.qsf常见坑与排查
- 坑1:testbench文件未加入工程,导致仿真时找不到模块。检查Assignments → Settings → Simulation → Compile test bench files中是否已添加tb文件。
- 坑2:路径包含中文或空格,导致ModelSim编译失败。工程路径和文件名应仅使用英文、数字和下划线。
阶段2:关键模块
计数器模块(counter.v):
module counter (
input wire clk,
input wire rst_n,
output reg [3:0] q
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q <= 4'd0;
else
q <= q + 1'b1;
end
endmoduletestbench模块(tb_counter.v):
`timescale 1ns / 1ps
module tb_counter;
reg clk;
reg rst_n;
wire [3:0] q;
counter uut (
.clk(clk),
.rst_n(rst_n),
.q(q)
);
initial begin
clk = 0;
forever #10 clk = ~clk; // 20ns周期
end
initial begin
rst_n = 0;
#30 rst_n = 1; // 复位持续30ns后释放
#1000 $finish; // 仿真1微秒后结束
end
endmodule阶段3:仿真配置
在Quartus中完成仿真设置:
- 打开Assignments → Settings → Simulation。
- 在“Compile test bench files”区域,点击“Test Benches…”按钮。
- 点击“New…”,填写Test bench name(如
tb_counter),并添加testbench文件(tb_counter.v)。 - 确认顶层模块为
tb_counter,点击OK保存。
阶段4:运行与调试
启动仿真后,在ModelSim的Transcript窗口中输入以下命令:
add wave * # 添加所有信号到波形窗口
run 1 us # 运行仿真1微秒观察波形:clk周期应为20ns,计数器q在每个时钟上升沿递增,从0到15循环。
验证结果
以下为基于Quartus Prime 20.1 Lite + ModelSim Intel FPGA Starter的验证结果,工程仅包含计数器模块。
| 指标 | 实测值 | 说明 |
|---|---|---|
| 编译状态 | 无错误/警告 | RTL和testbench语法正确 |
| 仿真运行时间 | 1 μs | 满足验收标准 |
| 计数器行为 | 0→1→2→…→15→0 | 每时钟上升沿递增,回绕正确 |
| 资源占用 | 4个LE | 综合后报告(Cyclone IV E) |
| 最高频率(Fmax) | >300 MHz | Cyclone IV E,-8速度等级 |
故障排查(Troubleshooting)
- 现象1:ModelSim启动后无波形窗口。→ 原因:未添加信号。→ 检查点:在Transcript中输入
add wave *。→ 修复:手动添加或使用.do脚本。 - 现象2:编译错误“vlog failed”。→ 原因:testbench语法错误或文件未加入工程。→ 检查点:查看Transcript中错误行号。→ 修复:修正语法,重新编译。
- 现象3:仿真运行但q始终为0。→ 原因:复位信号未释放或时钟未翻转。→ 检查点:检查rst_n和clk波形。→ 修复:调整testbench中的复位时序。
- 现象4:仿真卡死或无限运行。→ 原因:testbench中缺少$finish或仿真时间过长。→ 检查点:查看Transcript是否有“# ** Note: $finish”信息。→ 修复:在initial块中添加$finish。
- 现象5:Quartus无法启动ModelSim。→ 原因:EDA工具路径未正确配置。→ 检查点:Tools → Options → EDA Tool Options中ModelSim路径是否正确。→ 修复:设置ModelSim可执行文件路径。
- 现象6:仿真时提示“Module not found”。→ 原因:testbench中例化模块名与RTL文件名不匹配。→ 检查点:检查模块名大小写和拼写。→ 修复:统一模块名。
- 现象7:波形中q出现X态。→ 原因:寄存器未初始化或复位未生效。→ 检查点:检查rst_n是否在仿真开始时为低。→ 修复:确保testbench中复位至少持续一个时钟周期。
- 现象8:联合仿真速度慢。→ 原因:仿真时间单位设置过小或波形记录过多。→ 检查点:
`timescale设置。→ 修复:增大时间单位(如1ns/1ns)或限制波形记录信号数。
扩展与下一步
- 参数化计数器:使用
parameter定义位宽,使设计可重用。 - 带宽提升:改为并行加载计数器或使用LFSR(线性反馈移位寄存器)实现伪随机数生成。
- 跨平台仿真:学习使用QuestaSim或Vivado Simulator,掌握通用仿真流程。
- 加入断言:在testbench中使用SystemVerilog断言(SVA)自动检查计数器溢出行为。
- 覆盖分析:使用ModelSim的代码覆盖率工具,确保testbench覆盖所有分支。
- 形式验证:使用OneSpin或VC Formal验证计数器属性,但需额外工具授权。
参考与信息来源
- Intel Quartus Prime Pro Edition User Guide: Design Compilation and Verification
- ModelSim SE User’s Manual (Mentor Graphics)
- Altera官方论坛:https://www.intel.com/content/www/us/en/support/programmable.html
技术附录
术语表
- RTL:寄存器传输级,描述数字电路行为的抽象级别。
- Testbench:测试平台,用于验证RTL模块的仿真环境。
- NativeLink:Quartus中自动调用第三方仿真器的功能。
- LE:逻辑单元,Altera FPGA的基本逻辑块。
检查清单
- [ ] 工程路径无中文/空格
- [ ] RTL和testbench文件语法正确
- [ ] testbench已加入工程仿真设置
- [ ] ModelSim路径在Quartus中配置正确
- [ ] 仿真运行后波形符合预期
关键约束速查
在.sdc文件中,常用约束如下(注意:仿真阶段不需要.sdc,但综合后仿真或上板时需添加):
# 创建时钟
create_clock -name clk -period 20.000 [get_ports clk]
# 输入延迟
set_input_delay -clock clk 2.0 [get_ports rst_n]
# 输出延迟
set_output_delay -clock clk 2.0 [get_ports q]


