小插曲3——Modesim仿真常见问题

起因

因为本学期的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

感谢大家观看!

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值