Chinaunix首页 | 论坛 | 博客
  • 博客访问: 304504
  • 博文数量: 118
  • 博客积分: 313
  • 博客等级: 二等列兵
  • 技术积分: 615
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-12 22:51
文章分类

全部博文(118)

文章存档

2012年(68)

2011年(50)

分类:

2011-12-01 00:00:58

原文地址:clk skew造成的赋值不正确 作者:FBI888XH

若在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的时钟


阅读(578) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~