我知道在没有定义每个可能的路径时会出现推断锁存器,但我已经考虑过在我的过程中避免这种情况:
信号是:
signal BothButtons : std_logic_vector (1 downto 0) ;
过程是:
Signaling : process(button0, button1)
begin
if (button0= '0') AND (button1 = '0') then
BothButtons <= "00";
elsif (button0= '0') AND (button1 = '1') then
BothButtons <= "01";
elsif (button0= '1') AND (button1 = '0') then
BothButtons <= "10";
elsif (button0= '1') AND (button1 = '1') then
BothButtons <= "11";
end if;
end process;
这让我发疯,任何帮助都表示赞赏,也许我对一些非常简单的事情缺乏了解!
错误是:
警告(10631):swDisplay.vhd上的VHDL流程语句警告(28):推断信号或变量“BothButtons”的锁存器,它在过程的一个或多个路径中保存其先前值
据我所知,我没有同时为信号分配两个值,而是在不同情况下接收值?
这次我使用前一个信号驱动另一个进程的输出,但另一个锁存器出现在其中,这次我确实考虑了任何其他值并放置一个“else”语句来处理,但没有运气:
Counting : process(BothButtons)
variable count0 : integer range 0 to 9; -- to hold the counter value
begin
if BothButtons = "00" then
count0 := 0;
elsif BothButtons = "01" then
count0 := count0 + 1;
elsif BothButtons = "10" then
count0 := count0;
elsif BothButtons = "11" then
count0 := count0;
else
count0 := 0;
end if;
对于那些想知道的人,是的,这是学术活动的一部分!
答案 0 :(得分:1)
如果button0既不是'0'也不是'1'会怎样?有你的闩锁。 (ditto button1)即使'H'
和'L'
对你或我来说都有明确的含义,即使BothButtons <= button0 & button1;
和SEARCH
也会混淆它。
现在你需要ISNUMBER
不做什么? (我可能误解了你遇到的问题)
答案 1 :(得分:1)
你有锁存器,因为你有一个没有时钟的内存进程。
在第一个示例中,您只需要在if-case的末尾需要一个else
。否则,它被强制使用先前的值,这需要它具有此先前值的一些内存。存储器需要锁存器或触发器 - 没有时钟就会被迫使用锁存器。
在第二个示例中,行count0 := count0 + 1;
和count0 := count0;
使用上一次迭代过程中的值。这需要记忆。没有时钟的内存会为你提供锁存。