Vhdl 为什么我会被锁上?

Vhdl 为什么我会被锁上?,vhdl,Vhdl,我知道,当并非所有可能的路径都已定义时,会发生推断锁存,但我已在我的过程中考虑避免这种情况: 信号是: signal BothButtons : std_logic_vector (1 downto 0) ; 这个过程是: Signaling : process(button0, button1) begin if (button0= '0') AND (button1 = '0') then BothButtons <= "00"; elsif (bu

我知道,当并非所有可能的路径都已定义时,会发生推断锁存,但我已在我的过程中考虑避免这种情况:

信号是:

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;

对于那些想知道,是的,这是一个学术练习的一部分

如果按钮0既不是“0”也不是“1”,会发生什么情况?这是你的门闩。(同上按钮1)即使是
'H'
'L'
也会混淆它,即使它们对你我都有明确的意义


现在你需要什么,这两个按钮你有锁存,因为你有一个没有时钟的内存进程

在第一个示例中,您只需要在if案例的末尾添加一个
else
。否则,它将被迫使用前一个值,这要求它具有该前一个值的一些内存。内存需要锁存器或触发器,如果没有时钟,则必须使用锁存器


在第二个示例中,行
count0:=count0+1
count0:=count0使用来自流程上一次迭代的值。这需要内存。没有时钟的内存会给你锁存。

如果
按钮0
既不是“0”也不是“1”,会发生什么?这是你的门闩。(同上按钮1)现在你需要什么
两个按钮@BrianDrummond哦,你的意思是如果这两个按钮的浮动值既不高也不低?感谢这确实解决了我的问题,请将其作为答案,以便我可以选择:)请参考我更新的问题,因为我在其他地方遇到了类似的问题!在第二个过程中,直接请求闩锁。我建议在这一点上学习时钟进程。谢谢,我将继续连接时钟,由于第一个答案,我已经解决了第一个问题!谢谢,当我介绍它时,我的编译器和FPGA都高兴得尖叫起来!对于深入研究VHDL,您有什么建议?在线资源不会告诉您类似的事情?忘记在线资源吧。您需要对底层逻辑有相当深入的理解,才能编写任何可在模拟器之外使用的VHDL程序。当我开始学习VHDL时,我使用的是Peter J.Ashenden的数字设计(VHDL):一种使用VHDL的嵌入式系统方法。它将与VHDL一起教您逻辑方面的知识。我不知道今天有没有更好的东西,但是如果你对所有这些东西都是新手,那就太好了。是的,在线资源只对语法和肤浅的技巧有用,没有别的,谢谢,我会看看那本书的!当涉及到数字设计时,编程语言实际上只占工作的5%。
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;