若在fpga设计中使用到自己产生的时钟(如计数器),则会产生clk skew。这会在设计中产生很多问题。
例如:
其中vp由clk0时钟产生,由触发器产生延时tco。
clk1和clk0之间的延时为clk_skew。
vp到clk1上升沿之间的时间为clk_skew-tco。
如果使用如下verilog语句来捕捉vp的上升沿:
always @ (posedge clk1)
begin
vp_last<=vp;
end
always @ (posedge clk1)
begin
if(vp && !vp_last)
begin
a=1;
end
end
则结果可能不正确。设if(vp && !vp_last)组合逻辑产生的延时为delay。
则如果clk_skew-tco>setup_time 则 vp_last可以正确赋值。
但同时clk_skew-tco-delay因此永远不能捕捉到vp的上升沿而对a赋值。
可以使用如下程序捕捉vp上升沿:
always @ (posedge clk1)
begin
vp_now<=vp;
vp_last<=vp_now;
end
always @ (posedge clk1)
begin
if(vp_now && !vp_last)
begin
a=1;
end
end
由于vp_now和vp_last总保持一个时钟周期延时,因此可以保证对a的赋值。
总之,由于clk skew的存在,对数据采样时,可能造成采集的数据不对。因此一般尽量使用pll产生没有clk skew的时钟
阅读(2387) | 评论(1) | 转发(1) |