寄存器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条回答
xjjhi
1楼-- · 2019-07-16 11:42
我觉得当你分频之后,时钟是有延时的,这时采样到的数据就像是当前的数据,其实只是时钟变化比数据变化慢而已
qietingfengyin
2楼-- · 2019-07-16 15:49
我也觉得和输入的数据怎么变化有关系。
glace12123
3楼-- · 2019-07-16 17:34
我告诉你,在默认参数设置情况下,仿真软件是绝对不会给你什么延时的,比如你第一段代码,data_in会在clk上升沿的时候赋给data_out,要刚好对齐于clk的上升沿,这才是对的。
什么亚稳态,在仿真环境下,除非你设置了非常专业的仿真延时参数,否则亚稳态什么的都是扯蛋,好好理解下自己的写的HDL,看看寄存器赋值该是什么样的,这是个很基础的问题,被你扯远了。。

一周热门 更多>