赞
踩
启动quartus,菜单栏选择Tools->options,左侧选择EDA Tool Options,在modelsim一栏选择modelsim安装路径下的win64文件夹。
File->New Project Wizard,选择存放项目路径及工程名字,路径不要有汉字,空格及其他乱七八糟的符号,next。
然后选择对应芯片型号,如果仅是写写程序,随便选一个凑合凑合next。
仿真工具选择ModelSim,语言格式Verilog HDL,一路next直到Finlish。
File->New,选择Verilog HDL。
以一个简单的序列检测器为例,程序如下。项目顶层模块名需要和工程名字一致,由于该项目就一个模块,所以模块名为p224_1。
module p224_1(x,clk,rst,z); input x,clk,rst; output z; reg [2:0] state; //状态 wire z; parameter IDLE = 3'd0, A = 3'd1, B = 3'd2, C = 3'd3, D = 3'd4, E = 3'd5, F = 3'd6, G = 3'd7; assign z = (state==D && x==0)?1:0; //状态为D且又检测到x为0,此时输出z为1 always@(posedge clk or negedge rst) if(!rst) begin state <= IDLE; end else casex(state) IDLE: if(x==1) state <= A; else state <= IDLE; A: if(x==0) state <= B; else state <= A; B: if(x==0) state <= C; else state <= F; C: if(x==1) state <= D; else state <= G; D: if(x==0) state <= E; else state <= A; E: if(x==0) state <= C; else state <= A; F: if(x==1) state <= A; else state <= B; G: if(x==1) state <= F; else state <= B; default:state <= IDLE; endcase endmodule
保存后,点击界面上方蓝色三角形按钮,或菜单栏processing->Start compilation开始编译,在左下角message窗口查看结果。
菜单栏选择processing->Start->Start Test Bench Template Writer,此时针对该工程会生成一个test bench的模板。
打开该文件,File->open,工程文件夹下simulation->modelsim->工程名.vt,注意右下角文件类型选择All Files
编写测试程序,复制测试程序的模块名备用,即该示例中的p224_1_vlg_tst,保存即可。
`timescale 1 ns/ 1 ns module p224_1_vlg_tst(); reg clk; reg rst; reg [23:0]data; wire z,x; assign x=data[23]; p224_1 i1 ( .clk(clk), .rst(rst), .x(x), .z(z) ); initial begin clk = 1; rst = 1; #2 rst = 0; #30 rst = 1; data = 20'b1100_1001_0000_1001_0100; #20000 $stop; end //时钟 always #20 clk <= ~clk; always @(posedge clk) begin #2 data={data[22:0],data[23]}; end endmodule
接着菜单栏打开Assignment->Settings,左侧EDA Tool Settings->simulation。选择Test Benches
在打开的窗口中填入刚刚复制的测试程序的模块名,接着选择测试文件(工程名.vt),点击add会添加到下方窗口中,最后一路OK即可。
各类仿真的介绍
https://www.cnblogs.com/lvtu/articles/5553608.html
https://blog.csdn.net/i13919135998/article/details/52458685
菜单栏Tools->Run simulation Tool,RTL simulation为前仿真(综合后仿真,即综合后功能仿真,验证逻辑功能是否正确),gata level simulation为后仿真(时序仿真,综合后考虑线路延时),若测试程序出现错误,会在modelsim的窗口中提示。
上述程序为Verilog 数字系统教程第三版(夏宇闻 编著)中的例题,在写程序时不小心打错了个字母
assign z = (state==D && x==0)?1:0; //正确
assign z = (state==D && z==0)?1:0; //错误
且编译没有报错,在仿真时提示Iteration limit reached at time 340 ns
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。