各位看官好,最近小弟遇到了一个寄存器延迟的问题,虽然不是特别重要,但还是想弄明白,请各位看官指导。具体如下: 对于一个只有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,但问题依旧。请问各位看官,是我处理亚稳态的方法不对,还是上述问题并不是由亚稳态引起的?如果不是亚稳态,那又是什么问题引起的?
注:上述例子是为了方便说明进行的简化,实际上还有一些其他的信号。
什么亚稳态,在仿真环境下,除非你设置了非常专业的仿真延时参数,否则亚稳态什么的都是扯蛋,好好理解下自己的写的HDL,看看寄存器赋值该是什么样的,这是个很基础的问题,被你扯远了。。
一周热门 更多>