2013-03-12 102 views
2

如果我在VHDL过程中编写语句来指定a是+1,那么这是一个好习惯吗?VHDL中的<= a + 1是一个很好的练习吗?

我对此感到困惑,因为模拟器工作正常,但是当我尝试在FPGA中实现时,综合工具会抱怨创建锁存器。

这是什么意思?

+1

如果锁存器有时保存该值,但没有在时钟块中指定锁存器,则隐含锁存器。 – Morgan 2013-03-12 22:19:43

回答

7

你应该只在一个钟控过程中做这样的陈述。如果你想合成它,建议进行额外的初始化(重置)。可能如下:

process(clk, reset) 
begin 
    if reset='1' then 
     a <= 0; 
    elsif rising_edge(clk) then 
     a <= a + 1; 
    end if; 
end process; 
5

在钟控程序中,这很好。其他地方,可能不是。

3

做一个时钟的过程,这很好。它的意思是“的a下一个值应该是a +1当前值”


如果你做到这一点作为一个连续的分配(任何过程之外的),什么你说的是“是总是得到+ 1分配给它“这是一个自我参考循环!

如果包括a在启动过程中的灵敏度名单,你会得到同样的效果

process (en, a) 
begin 
    if en = '1' then 
     a <= a + 1; 
    end if; 
end process; 

(你可以用这种形式来创建透明锁存器:

process (en, insig) 
begin 
    if en = '1' then 
     a <= insig; 
    end if; 
end process; 


如果你在非时钟进程中执行它,它是敏感a

process (en) 
begin 
    if en = '1' then 
     a <= a + 1; 
    end if; 
end process; 

您将创建一个正边沿触发锁存器,如a需要不断的变化en之间的值。实际上,en成为d型触发器的时钟。

+0

实际上,在您的最后一个例子中,Altera的综合工具将实现'a'作为由'en'定时的寄存器。 (这可以说是正确的,因为没有异步复位,所以不需要检查en'event。)但这可能不是一个好主意! – pc3e 2013-04-18 08:29:15

+0

好点,我会注意到边缘和透明锁存器之间的区别...... – 2013-04-18 11:03:42

相关问题