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

全部博文(173)

文章存档

2018年(1)

2016年(1)

2013年(1)

2012年(118)

2011年(52)

分类: 嵌入式

2011-11-30 10:47:01

在fpga中对寄存器初始化可以使用两种办法:
1、使用initial语句,fpga上电后自动为相关寄存器初始化。
2、使用复位初始化,在检测到复位信号时,完成寄存器初始化。

使用initial初始化时,由于其初始化的时间相对时钟是任意的,类似于异步复位,若在时钟上升沿附近初始化,则可能导致出现亚稳态。

例如:

initial
begin
    vp=0;
    vp_last=1;
end

always@(posedge clk)
begin
    vp_last<=vp;
end

always@(posedge clk)
begin
    if(!vp && vp_last)
         a<=1;
    else
         a<=0;
end

在上例中,是想为vp和vp_last赋初始,使fpga上电后if(!vp && vp_last)判断满足,进行相关赋值。
但如果initial正好在clk上升沿前不久赋值,则可能由于setup时间不够,if(!vp && vp_last)中的a=1赋值不会进行。而vp_last=vp会进行。因此在初始化时对a的第一次赋值是失败的。

可以使用同步复位来解决这个问题:
always@(posedge clk)
begin
    if(!reset)
    begin
        vp<=0;
        vp_last<=1;
    end   
    else
        vp_last<=vp;
end

always@(posedge clk)

begin  
     if(!vp && vp_last)
         a<=1;
    else
         a<=0;
end


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