在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
阅读(3118) | 评论(0) | 转发(0) |