起因
因为本学期的FPGA期末考试要使用机考,且需要使用Modesim进行波形仿真,所以最近也是在练习使用Modesim。
不过在使用Modesim时我也遇到了不少的问题,所以想要发布一个总结帖子,希望能帮助到大家,而且也为自己以后的复习准备好资源。
问题整理
1.打开工程
如果有人发给你一个Modesim工程,那么该如何打开该工程呢?
直接打开左上角的文件,进入工程,选择显示所有文件,打开.mqf文件,就可以打开该工程了。这就类似于STM32的project,如果用keil5打开32工程的话,那就直接打开.projec
就行了。
2.打开文件
如何选Modesim工程里面的.v文件?这个最好不要直接双击project里的文件,因为很有可能让Modesim发生错误,造成不停自动打开。如果要打开一个文件的话,就点击左上角的文件夹,通过文件夹的方式打开文件。
3.Modesim不停自动打开
为什么有时候打开Modesim,Modesim会不停的自动打开?
遇到这种情况的,大部分是华为、荣耀类型的电脑,具体原因我也不清楚,解决办法是:按住Ctrl+ALT+Delete启动任务管理器,关闭荣耀/华为电脑管家。如果还是不行,那就退出,重新尝试。
4.登录错误(can't read_dients():no such variable)
这个错误的原因我也不清楚,解决办法是点击搜索,输入regedit ,打开注册登记表
点击HKEY_CURRENT_USER,找到SOFTWARE
点击Model Technology Incorporated,点击Modelsim,将Modelsim所有的内容全部删除。
然后再打开Modelsim就可以正常进入了。
4.如何仿真?
(1)编写程序文件test,和仿真文件test_top,test_top用于设置初始值,比如设置时钟频率,复位信号。
(2)开始编译,点击Comple All
若编译成功后,就点击Start Simulation,开始仿真。
打开work,点击编译成功的test_top仿真文件,取消Enable optimation,然后点击“OK”
然后会调转到这个界面
在左侧Skim处右击鼠标,按如下操作:
然后会进入如下界面,然后点击“run-all”
就大功告成了,如果还是没有显示,就点击放大镜图标
波形就成功仿真了。
5.如何修改代码?
切记,修改代码前一定要关闭仿真!点击STOP图标。
确保仿真关闭后,就可以进行代码修改了。
代码修改完后,就可以保存了。保存之后,再按照之前的步骤就可以继续仿真了。
6.添加时间尺度预编译指令
例如:
`timescale 100ns/10ps
表示以100ns为单位,精度为10ps。要注意,“`”是键盘1左边的“'”,不是单引号。
timescale 时间单位/时间精度。
100ns表示时间单位,在仿真时用#+数字表示延时多久。如果没有加时间尺度预编译指令,则默认为1ns。举例:
always begin
#1 clk = ~clk;//表示每隔100ns,就转换一次时钟电平
end
10ps表示时间精度
就是说不断放大波形,最多放大到10ps。
测试代码
test文件
module Moore(
input clk, //????
input areset, //??????????
input in ,//????
output reg[1:0] out //????
);
//------------<???????>------------------------------------------
//???????????
parameter A=2'b01;
parameter B=2'b10;
//------------<reg??>-------------------------------------------------
reg [1:0] cur_state; //???????
reg [1:0] next_state; //???????
always @(posedge clk or posedge areset) begin
if(areset)
cur_state <= B; //???????
else
cur_state <= next_state; //????????
end
always @(*) begin
if(areset)
next_state = B; //???????
else
case(cur_state) //?????????
A:
if(!in)
next_state = B; //??????
else
next_state = A; //???????
B:
if(!in)
next_state = A; //??????
else
next_state = B; //???????
default:;
endcase
end
always @(posedge clk or posedge areset) begin
if(areset)
out <= 1'b1;//??????
else
case(next_state)//???????????????????
A: out <= 1'b0;
B: out <= 1'b1;
default:out <= 1'b1;
endcase
end
endmodule
test_top文件
`timescale 10ns / 10ns
module moore_tb;
reg clk;
reg areset;
reg in;
wire out;
Moore u_Moore(
.clk(clk),
.areset(areset),
.in(in),
.out(out)
);
initial
begin
in=1;
clk=0;
areset=1;
#200 areset=0;
end
always #10 clk=~clk;
always#10 in=~in;
endmodule
感谢大家观看!