寄存器reg延迟问题

2019-07-16 00:22发布

   各位看官好,最近小弟遇到了一个寄存器延迟的问题,虽然不是特别重要,但还是想弄明白,请各位看官指导。具体如下:    对于一个只有clk、reset、data_in、data_out的模,当我们用如下代码赋值时会产生一个clk的延迟,即仿真软件会将posedge clk前一时刻的data_in赋值给data_out:
    always @(posedge clk) begin
         if(reset) data_out<=0;
         else data_out<=data_in;
    end
    然而如果在代码中增加一个clk二分频时钟clk_2,并用该信号来驱动data_out,则不会产生延迟,即仿真软件会把posedge clk_2后一时刻的data_in赋给data_out:
    always @(posedge clk) begin
         if(reset) clk_2<=0;
         else clk_2<=~clk_2;
    end
    always @(posedge clk_2) begin
         if(reset) data_out<=0;
         else data_out<=data_in;
    end
    问先问了下公司的一个前辈,他说有可能是使用clk_2会产生亚稳态,于是我用了一个reg来对clk_2打一个节拍产生clk_2_d,并用该时钟来触发data_out,但问题依旧。请问各位看官,是我处理亚稳态的方法不对,还是上述问题并不是由亚稳态引起的?如果不是亚稳态,那又是什么问题引起的?
注:上述例子是为了方便说明进行的简化,实际上还有一些其他的信号。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
阿兮
2019-07-16 08:41
chenchu0910 发表于 2014-11-17 14:28
用的是上升沿有效,你看clk信号是多久一个上升沿,而clk_2是多久一个上升沿,周期clk = 两倍的clk_2
...

    我个人觉得跟clk_2的周期没太大关系,因为看了你的回复之后,我回去分别将clk_2的周期修改为与clk相同或者是clk的2倍(利用pll),但得到的结果都是一样的,即模块无延迟地将reg_shift的结果赋值给data_out。所以我觉得应该回到寄存器触发上寻找答案,一般来说,模块会在时钟触发沿到来时将触发沿前一刻对应的数据赋给触发器输出端口(同一个clk进行触发的情况下),当用别的时钟进行触发时(clk_2),模块会将触发沿后一时刻对应的数据赋给触发器输出端口。这种情况是由亚稳态造成的还是说理论上就是如此?

一周热门 更多>