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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3696|回复: 7

[原创] 寄存器输出出现数据不稳定! 望大虾指点

[复制链接]
发表于 2010-12-15 10:50:52 | 显示全部楼层 |阅读模式

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

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

x
我将4位的输入 在时钟上升沿赋给输出寄存器,结果输出寄存器在数据稳定前 出现不该有的值!
我又在输出和输入之间加入了一级中间寄存器,输入给中间寄存器,中间寄存器在给输出,结果中间寄存器的数据稳定变化,输出端不稳定。在加中间寄存器后,结果类似:输出端不稳,中间寄存器稳定。我又把中间寄存器也作为输出,结果输出端和作为输出的中间寄存器输出都不稳定 望大虾指点!!!代码如下:
直接复制的代码:
module count(data,data1,clk,rst);
   output [3:0] data;
   input  clk;
   input  rst;
   
   reg [3:0]  data;
   input [3:0]  data1;
   always@(posedge clk )
     if(rst==0)
       data<=1110;
     else
       data<=data1;
endmodule // count

输入直接赋给输出的波形

输入直接赋给输出的波形

中间加了一个寄存器data2后的代码:
module count(data,data1,clk,rst);
   output [3:0] data;
   input  clk;
   input  rst;
   
   reg [3:0]  data;
   input [3:0]  data1;
   reg [3:0]  data2;
   always@(posedge clk )
     if(rst==0)
       data2<=0;
     else
       data2<=data1;
   always@(posedge clk)
     data<=data2;
endmodule // count

有中间寄存器data2后的输出波形

有中间寄存器data2后的输出波形

加了一级中间寄存器data2的波形

加了一级中间寄存器data2的波形

加了中间寄存器data2 data3后的代码同时将data3作为输出的代码:

module count(data,data1,data3,clk,rst);
   output [3:0] data;
   input  clk;
   input  rst;
   
   reg [3:0]  data;
   input [3:0]  data1;
   reg [3:0]  data2;
   output reg [3:0] data3;
   always@(posedge clk )
     if(rst==0)
       data2<=1110;
     else
       data2<=data1;
   always@(posedge clk)
     data3<=data2;
   always@(posedge clk)
     data<=data3;
endmodule // count

加了data2 data3中间寄存器的,并且data3和data都为输出

加了data2 data3中间寄存器的,并且data3和data都为输出



testbench
`timescale 1ns/1ns
module count_test();
   wire [3:0] data;
   wire [3:0] data3;
   reg        rst;
   reg [3:0]  data1;
   
   reg        clk;
   count  M1(.data(data),.data3(data3),.data1(data1),.clk(clk),.rst(rst));
   initial #3000 $finish;
   initial
     begin
clk=0;
forever #20 clk=~clk;
     end
   initial
     begin
rst=1;
#10 rst=0;
#35 rst=1;
     end
   always@(posedge clk)
     data1<={$random}%16;
endmodule // count_test
发表于 2010-12-15 12:29:05 | 显示全部楼层
你的data1实在时钟上升边沿变化的,同时也在采样,也就是边沿采样边沿的问题,QQ群:127971002;欢迎一起交流
发表于 2010-12-15 15:43:20 | 显示全部楼层
我感觉,最后一步换成过程连续赋值语句assign data=data1试试,是不是能好点。
发表于 2010-12-17 23:19:05 | 显示全部楼层
你這個是在做后仿呢?如果是後方,這個正常,如果是前仿,肯定是工具的問題,代碼應該沒有問題。
发表于 2010-12-18 21:13:54 | 显示全部楼层
做后仿的话,由于不同的单元有不同的时序信息,稳定前的抖动是不可避免的。
发表于 2010-12-31 12:29:25 | 显示全部楼层
回复 1# 天天PDF


    有些仿真工具就是这样 的!

你可以用 a <= #1 b;

来解决这个问题!
发表于 2010-12-31 22:02:37 | 显示全部楼层
我也想知道啊
发表于 2011-1-1 12:09:09 | 显示全部楼层
你这个是做后仿。延迟参数是你自己加的吗?这样的代码书写没有问题,实际情况不会出现这种现象。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-27 11:25 , Processed in 0.041858 second(s), 9 queries , Gzip On, Redis On.

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