为什么要获得推断锁存器?

时间:2015-10-22 11:24:42

标签: vhdl

我知道在没有定义每个可能的路径时会出现推断锁存器,但我已经考虑过在我的过程中避免这种情况:

信号是:

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;      

对于那些想知道的人,是的,这是学术活动的一部分!

2 个答案:

答案 0 :(得分:1)

如果button0既不是'0'也不是'1'会怎样?有你的闩锁。 (ditto button1)即使'H''L'对你或我来说都有明确的含义,即使BothButtons <= button0 & button1;SEARCH也会混淆它。

现在你需要ISNUMBER不做什么? (我可能误解了你遇到的问题)

答案 1 :(得分:1)

你有锁存器,因为你有一个没有时钟的内存进程。

在第一个示例中,您只需要在if-case的末尾需要一个else。否则,它被强制使用先前的值,这需要它具有此先前值的一些内存。存储器需要锁存器或触发器 - 没有时钟就会被迫使用锁存器。

在第二个示例中,行count0 := count0 + 1;count0 := count0;使用上一次迭代过程中的值。这需要记忆。没有时钟的内存会为你提供锁存。