如果我在VHDL过程中编写语句来指定a是+1,那么这是一个好习惯吗?VHDL中的<= a + 1是一个很好的练习吗?
我对此感到困惑,因为模拟器工作正常,但是当我尝试在FPGA中实现时,综合工具会抱怨创建锁存器。
这是什么意思?
如果我在VHDL过程中编写语句来指定a是+1,那么这是一个好习惯吗?VHDL中的<= a + 1是一个很好的练习吗?
我对此感到困惑,因为模拟器工作正常,但是当我尝试在FPGA中实现时,综合工具会抱怨创建锁存器。
这是什么意思?
你应该只在一个钟控过程中做这样的陈述。如果你想合成它,建议进行额外的初始化(重置)。可能如下:
process(clk, reset)
begin
if reset='1' then
a <= 0;
elsif rising_edge(clk) then
a <= a + 1;
end if;
end process;
在钟控程序中,这很好。其他地方,可能不是。
做一个时钟的过程,这很好。它的意思是“的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型触发器的时钟。
实际上,在您的最后一个例子中,Altera的综合工具将实现'a'作为由'en'定时的寄存器。 (这可以说是正确的,因为没有异步复位,所以不需要检查en'event。)但这可能不是一个好主意! – pc3e 2013-04-18 08:29:15
好点,我会注意到边缘和透明锁存器之间的区别...... – 2013-04-18 11:03:42
如果锁存器有时保存该值,但没有在时钟块中指定锁存器,则隐含锁存器。 – Morgan 2013-03-12 22:19:43