在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4384|回复: 14

[求助] 帮忙看下代码问题

[复制链接]
发表于 2012-3-6 21:38:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
布线后仿真波形.bmp 放大图形.bmp
能否抽点时间帮我看一下。
原始代码:
module COUNTER(              
              Rst,
                Clk_ro,      
                Clk_std,
               Cnt_numb);
input Rst;
input Clk_ro;
input Clk_std;
output [7:0]Cnt_numb;
reg Flag_ro;
wire Flag_std;
reg bdat1;
reg bdat2;
reg [7:0]Ro_numb;
reg [7:0]Cnt_numb;
  
always@(negedge Rst or posedge Clk_ro)
   begin
     if(!Rst)
       begin
         Ro_numb <= 8'h00;
         Flag_ro<=0;
       end
     else
       if(Ro_numb==8'h77)
          Flag_ro<=1;
       else
          Ro_numb <= Ro_numb+1;
   end
always@(negedge Rst or posedge Clk_std)
   begin
     if(!Rst)
       {bdat2,bdat1}<=2'b00;
     else
       {bdat2,bdat1}<={bdat1,Flag_ro};
   end
assign Flag_std=bdat2;   
  
always@(negedge Rst or posedge Clk_std)
   begin
      if(!Rst)
         Cnt_numb<=8'h00;
      else
        if(Flag_std==0)         
           Cnt_numb<=Cnt_numb+1;
        else ;
  end
endmodule

测试文件:
initial
  begin
        Rst=0;
        Clk_ro=0;
        Clk_std=0;
    #20  Rst=1;
    #2000  Rst=0;
    #20  Rst=1;
    #2000 Rst=0;
    #20  Rst=1;
    #2000  Rst=0;
    #20  Rst=1;
  end
always #5 Clk_std=~Clk_std;
always #20 Clk_ro=~Clk_ro;
initial
  begin
    #10000;
    $stop;
  end
布线后仿真波形.bmp
布线后仿真波形.bmp
 楼主| 发表于 2012-3-6 21:43:23 | 显示全部楼层
不好意思哈,第一次发图片,有点乱。也没找到删除的地方
发表于 2012-3-6 22:09:04 | 显示全部楼层
我不知道你这个代码想要实现什么功能,但是这段代码
     else
       if(Ro_numb==8'h77)
          Flag_ro<=1;
       else
          Ro_numb <= Ro_numb+1;
会把Ro_numb固定在8'h77上的.
另外,你的仿真rst信号给的时间点不对导致unknown出来了
 楼主| 发表于 2012-3-6 22:49:02 | 显示全部楼层
本帖最后由 longjilb 于 2012-3-6 22:50 编辑

回复 3# digitalimage


  Cnt_numb固定在这个值是我想要的。请教下Rst给的时间点不对指的是?
发表于 2012-3-6 22:54:00 | 显示全部楼层
回复 4# longjilb 从波形看,好像rst和clk同时跳变,虽然前仿没有时序问题,但是同时变化会有问题的,你最好错开一点时间.
另外你的问题到底是什么,你还没说过?
 楼主| 发表于 2012-3-6 23:03:52 | 显示全部楼层
本帖最后由 longjilb 于 2012-3-6 23:05 编辑

回复 5# digitalimage


    我的问题其实就在这,clk频率相对rst来说变化会很快,我怎么去控制这两个不同时变化呢。尤其是在后仿真有布线延时的影响会变得很难去估计吧
发表于 2012-3-6 23:08:29 | 显示全部楼层
回复 6# longjilb
用时钟去同步复位信号,寄存器用异步复位,仿真的时候同步器要用非时序模型代替
 楼主| 发表于 2012-3-6 23:14:09 | 显示全部楼层
回复 7# digitalimage


   十分感谢。仿真的时候同步器要用非时序模型代替。。这句话是什么意思哦
发表于 2012-3-7 09:24:03 | 显示全部楼层
异步复位同步撤离。。
发表于 2012-3-7 09:52:33 | 显示全部楼层
你这个是后仿的么?貌似加了timingcheck啊,理由上面的人已经说了,clk_ro和rst同时作用的问题。你可以通过以下方法来做:
1. 用clk_ro和clk_std同步rst生成每个时钟域的rst。如下:
always @ ( negedge clk_ro )
  begin
     rst_ro_sync1 <= rst;
     rst_ro_sync2 <= rst_ro_sync1;
  end

always @ ( negedge clk_std )
  begin
    rst_std_sync1 <= rst;
    rst_std_sync2 <= rst_std_sync1;
  end
然后使用rst_ro_sync2作为clk_ro的异步复位,使用rst_std_sync2作为clk_std的异步复位。
需要注意:clk_std和clk_ro要是一直有的,不能被门控,或者说不能跟rst有关系。另外,仿真还是会出问题,我不知道modelsim怎么设置,你在vcs里面应该对rst_ro_sync1和rst_std_sync1设置notimingcheck,否则的话还是会有x,虽然实际电路中不会有x。

2.如果你只是想仿真的话。在testbench里面用以下语句来释放rst。
initial
  begin
    rst = 1'b0;
    .....
    @(negedge clk_ro); //这里也有可能使用clk_std。
    #10; //这个延迟是根据clk_ro和clk_std之间的相位关系来设置,保证clk_ro没问题后,clk_std也没问题。
    rst = 1'b1;
    ......
   end
这个方法就是去适应仿真器脾气的。玩玩的时候用用就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-9 05:45 , Processed in 0.026627 second(s), 10 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表