从零到一:Quartus与Modelsim联合仿真的全流程实战指南

张开发
2026/4/12 18:27:35 15 分钟阅读

分享文章

从零到一:Quartus与Modelsim联合仿真的全流程实战指南
1. 环境准备与工具安装第一次接触FPGA开发的朋友可能会被一堆专业软件搞晕Quartus和Modelsim就像是一对黄金搭档一个负责设计电路一个负责验证电路是否正确。我刚开始学习时也花了不少时间摸索这两个工具的配合使用现在就把最实用的安装配置经验分享给大家。Quartus是Intel原Altera推出的FPGA开发工具建议直接到Intel官网下载最新版本。安装时有个小技巧如果你只是做仿真验证可以只安装Quartus Prime Lite Edition这个版本完全免费。我实测发现对于大多数学习用途来说Lite版本的功能已经足够用了。安装过程中记得勾选Quartus Prime和Devices选项建议至少选择一个Cyclone系列器件支持包比如Cyclone IV E这是很多入门开发板常用的芯片。Modelsim的安装稍微复杂些。如果你是学生可以申请免费的Modelsim-Intel FPGA Starter Edition这个版本和Quartus配合得最好。安装时要注意两点一是安装路径不要有中文或空格二是记住安装位置后面配置联合仿真时会用到。我在Windows系统下通常安装在C:\intelFPGA_lite\modelsim_ase这样的路径下这样不容易出错。提示安装完成后建议先单独打开Modelsim测试下输入vsim命令能正常启动说明安装成功。我第一次安装时就遇到了环境变量问题导致无法从命令行启动。2. 创建第一个Quartus工程打开Quartus时可能会被复杂的界面吓到别担心跟着我的步骤来操作。点击File→New Project Wizard会出现一个向导界面。这里有个新手常犯的错误工程路径和名称的设置。我建议专门创建一个工作目录路径尽量短且不要包含中文。工程名称最好用英文比如edge_detector这样后续仿真时不容易出问题。芯片选择环节很重要但也很容易搞错。如果你用的是常见的Cyclone IV E开发板可以这样选择在Device family选择Cyclone IV E在Available devices中找到EP4CE6E22C8这是很多入门板用的型号如果找不到确切型号选个引脚数相近的也可以创建工程后我们需要添加Verilog文件。点击File→New→Verilog HDL File这里我推荐一个实用技巧先写模块声明部分保存时文件名必须和模块名完全一致。比如模块声明是module edge_detector那文件就要保存为edge_detector.v。这个细节很多新手会忽略导致编译报错。3. 编写边沿检测模块代码边沿检测是数字电路中的常见需求我们来实现一个能检测上升沿、下降沿的模块。下面是我在实际项目中验证过的代码加入了详细注释module edge_detector( input clk, // 时钟信号 input rst_n, // 低电平复位 input signal_in, // 输入信号 output pos_edge, // 上升沿标志 output neg_edge, // 下降沿标志 output any_edge // 任意边沿标志 ); // 用寄存器存储前两个时钟周期的信号状态 reg [1:0] signal_history; always (posedge clk or negedge rst_n) begin if(!rst_n) signal_history 2b00; else signal_history {signal_history[0], signal_in}; end // 上升沿检测前一个周期为0当前周期为1 assign pos_edge (signal_history 2b01); // 下降沿检测前一个周期为1当前周期为0 assign neg_edge (signal_history 2b10); // 任意边沿检测 assign any_edge pos_edge | neg_edge; endmodule写完代码后点击工具栏的蓝色三角图标编译。如果编译报错最常见的三个原因是模块名和文件名不一致语法错误比如漏掉分号中文符号建议全程使用英文输入法4. 配置Modelsim联合仿真环境这是整个流程中最关键也最容易出问题的环节。首先需要告诉Quartus Modelsim的安装位置点击Tools→Options→EDA Tool Options在ModelSim栏浏览到安装路径例如C:\intelFPGA_lite\modelsim_ase\win32aloem接下来创建测试激励文件。Quartus可以帮我们生成模板点击Processing→Start→Start Test Bench Template Writer在工程目录下会生成一个.vt文件如edge_detector.vt打开这个文件我们需要添加测试逻辑。下面是一个完整的测试用例timescale 1ns/1ns module edge_detector_tb; // 定义输入输出信号 reg clk, rst_n, signal_in; wire pos_edge, neg_edge, any_edge; // 实例化被测模块 edge_detector uut ( .clk(clk), .rst_n(rst_n), .signal_in(signal_in), .pos_edge(pos_edge), .neg_edge(neg_edge), .any_edge(any_edge) ); // 生成50MHz时钟周期20ns initial clk 0; always #10 clk ~clk; // 测试激励 initial begin // 初始化 rst_n 0; signal_in 0; // 释放复位 #100 rst_n 1; // 生成测试信号 #20 signal_in 1; // 产生上升沿 #40 signal_in 0; // 产生下降沿 #30 signal_in 1; // 再次上升沿 #50 signal_in 0; // 再次下降沿 // 仿真运行500ns后停止 #500 $stop; end endmodule5. 运行仿真与分析波形配置好测试文件后需要告诉Quartus使用这个测试文件点击Assignments→Settings→Simulation在Tool name选择ModelSim点击Compile test bench→Test Benches→New填写测试模块名edge_detector_tb添加.vt文件现在可以开始仿真了点击Tools→Run Simulation Tool→RTL SimulationModelsim会自动启动。如果一切正常你会看到如下界面在Workspace窗口可以看到仿真实例在Transcript窗口会显示仿真日志右键点击uut实例选择Add Wave添加波形波形窗口中可以看到各个信号的变化。重点关注这几个时刻100ns时rst_n释放电路开始工作120ns时signal_in第一次上升pos_edge应该出现一个时钟周期的高脉冲160ns时signal_in第一次下降neg_edge应该出现高脉冲210ns时的第二个上升沿如果波形不符合预期常见的排查方法检查时钟和复位信号是否正常检查输入信号变化时刻是否与边沿检测时钟对齐查看signal_history寄存器的值变化是否符合预期6. 常见问题与调试技巧在实际操作中你可能会遇到这些问题问题1Modelsim启动后报Error loading design解决方法检查测试文件中的模块名是否与被测模块一致确认所有信号端口都正确连接在Quartus中重新编译整个工程问题2波形窗口中看不到信号解决方法确保在Modelsim中正确添加了波形右键点击实例名选择Add to Wave→All items in region输入run -all命令让仿真跑完问题3边沿检测信号出现毛刺解决方法检查时钟频率和输入信号变化时间是否合理可能需要添加同步处理逻辑在测试文件中适当调整信号变化时刻我常用的调试技巧是在测试文件中添加$display语句在特定时刻打印变量值initial begin // ... #150 $display(At time %t: signal_history %b, $time, uut.signal_history); // ... end7. 进阶技巧与优化建议当你掌握了基本流程后可以尝试这些提升效率的方法自动化脚本 创建一个.do文件来自动化Modelsim操作内容如下vlib work vlog ../output_files/edge_detector.vo vlog edge_detector_tb.v vsim -voptargsacc edge_detector_tb add wave * run -all代码覆盖率分析 在Modelsim中运行coverage save coverage.ucdb coverage report -html -output covhtml参数化设计 改进边沿检测模块使其可配置module edge_detector #( parameter WIDTH 1 // 支持多信号同时检测 )( input clk, input rst_n, input [WIDTH-1:0] signal_in, output [WIDTH-1:0] pos_edge, // ...其他端口 );实际项目中我通常会建立这样的目录结构/project /src # 源代码 /sim # 仿真文件 /output # 编译输出 /doc # 文档这样不仅条理清晰也方便版本管理。每次修改代码后建议先做功能仿真再下载到板子能节省大量调试时间。

更多文章