这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 求助Modelsim仿真问题

共8条 1/1 1 跳转至

求助Modelsim仿真问题

菜鸟
2013-08-03 10:27:16     打赏

一个呼吸灯程序:

`timescale 1ns/ 1ps
module breath(clkn, rstn,ledn, PWMn,cntn);
   input clkn;
   input rstn;
   output  ledn;
   output reg [2:0] PWMn;  //原数据是【4:0】
   output reg [5:0] cntn;   //原数据是【23:0】
always @(posedge clkn ) 
   begin
     if(!rstn)
        cntn <= 0;
     else
        cntn <= cntn + 1'b1 ;
   end
wire [1:0] PWM_input = cntn[5]? cntn[4:3]: ~cntn[4:3];   //原数据是【3:0】【23】【22:19】【22:19】
always @(posedge clkn)
   begin
     if(!rstn)
        PWMn <= 0;
     else
        PWMn <= PWMn[1:0]+PWM_input;  //原数据是【3:0】
   end
  assign ledn = PWMn[2];  //原数据是【4】
endmodule
`resetall
不明白原理,就想在modelsim上仿真试试,把数据改了,上注释是原始数据,其中原程序中只有一个输入clkn,一个输出ledn,为方便弄清原理,我改了端口。

以下是testbench:

`timescale 1ns/ 1ps
module breaths;
    reg clks;
    reg rsts;
    wire leds;
    wire [5:0] cnts;
    wire [2:0] PWMs;
    breath led_inst(clks, rsts,leds, PWMs,cnts);
initial
   begin
      clks = 0;
      while(1)
         #5 clks = ~clks;
   end
initial
   begin
       rsts = 0;
       while(1)
          #5 rsts = 1;
   end
initial
   begin 
   $display($time, "clks = %d rsts = %d leds = %d cnts = %d PWMs = %d",clks,rsts,leds,cnts,PWMs);
   end
endmodule
`resetall
问题:

为什么display输出波形中leds,cnts,PWMs都是XXXX,如图波形图以下是script截图:


我是选择全编译后,直接startsimulate,

求助,刚接触这个没几天,这问题弄很久了。




关键词: FPGA     testbench     modelsim    

高工
2013-08-03 10:52:28     打赏
2楼
楼主,测试激励,也就是testbench例化breath模块有问题,找本语法书看看吧,有关模块例化的!

菜鸟
2013-08-04 09:25:06     打赏
3楼

我改成breath led_inst(.clkn(clks),

.rtsn(rsts),

.led(leds),

.PWMn(PWMs),

.cntn(cnts));

结果还是一样的。只有clks和rsts有波形


菜鸟
2013-08-04 09:27:37     打赏
4楼

我改成breath led_inst(.clkn(clks),

.rtsn(rsts),

.led(leds),

.PWMn(PWMs),

.cntn(cnts));

结果还是一样的。只有clks和rsts有波形


菜鸟
2013-08-04 10:14:05     打赏
5楼

我把testbench里复位改成

initial

   begin
       rsts = 0;
       while(1)
          #7 rsts = 1;把这里的数字改成了7,让他不与clks同一时刻上跳

   end

就有输出了

不过不明白为什么复位不能和时钟激励同一个上跳沿。。。。。


菜鸟
2013-08-09 09:23:22     打赏
6楼
楼主可以尝试修改一下:

always @(posedge clkn ) 

always @(posedge clkn or negedge rstn)
完了之后,用回你之前的

initial

   begin
       rsts = 0;
       while(1)
          #5 rsts = 1;

   end

再试验一下,看能否出波形
如果有,请回复我,我需要你的结果给出结论


菜鸟
2013-08-09 11:39:11     打赏
7楼

还没是这个,下午试试,不过我晓得原因了,时钟和复位在同一个上升沿导致的问题是:在时钟沿到来之时,来不及检测此时的复位0状态,导致复位不了。


菜鸟
2013-08-09 11:40:24     打赏
8楼

感谢各位热心人士


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]