Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1147383
  • 博文数量: 173
  • 博客积分: 4048
  • 博客等级:
  • 技术积分: 2679
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-12 18:53
文章分类

全部博文(173)

文章存档

2018年(1)

2016年(1)

2013年(1)

2012年(118)

2011年(52)

分类: 嵌入式

2011-11-30 15:09:03

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


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

重返人生2011-12-01 00:01:20

学习了