Keyboard VHDL-我的密钥检测中未定义的行为

Keyboard VHDL-我的密钥检测中未定义的行为,keyboard,vhdl,circuit,Keyboard,Vhdl,Circuit,我正在设计一个移位键检测器。我写了一个测试台。测试表明我的实现不正确 这是ModelSim中的模拟 红线表示未定义。这种行为只发生过两次 让我困惑的是:为什么这两种价值观之间存在如此大的差距?如果您查看试验台,第3和第4个程序使用的格式与第1和第2个程序使用的格式相同 试验台在这里: 探测器代码如下: 如你所见。我的设计有两种状态。当按键或松开时,PS2接收器将过滤并生成干净的8位make代码。断开代码仅为F0,后跟刚刚释放的钥匙的make代码。我的状态机使用两个额外的位来跟踪按下了哪个sh

我正在设计一个移位键检测器。我写了一个测试台。测试表明我的实现不正确

这是ModelSim中的模拟

红线表示未定义。这种行为只发生过两次

让我困惑的是:为什么这两种价值观之间存在如此大的差距?如果您查看试验台,第3和第4个程序使用的格式与第1和第2个程序使用的格式相同

试验台在这里:

探测器代码如下:

如你所见。我的设计有两种状态。当按键或松开时,PS2接收器将过滤并生成干净的8位make代码。断开代码仅为F0,后跟刚刚释放的钥匙的make代码。我的状态机使用两个额外的位来跟踪按下了哪个shift键

我进行了调试,当我们输入第三个测试值时,SHIFT=U,而不是前一个值的1

-- release left shift
hex <= "11110000";
wait for 5 ns;
clk <= NOT clk;
wait for 50 ns;
clk <= NOT clk;
wait for 50 ns;

hex <= "00010010";       <----- when I am here shift is already U
wait for 5 ns;
clk <= NOT clk;
wait for 50 ns;
clk <= NOT clk;
wait for 50 ns;

if (shift /= '0')then
    error <= '1'; 
end if;
左按和右按是信号,而不是变量。因此,它们在任何情况下都应该具有a值。如果其中一个发生变化,与换档信号的连接将自动更新

有人能帮我吗?谢谢


谢谢。

我希望您得到“U”输出,因为

shift <= left_pressed or right_pressed;
其中x可以是“0”、“1”、“U”、“x”、“Z”、““-”、“H”、“L”

你的代码中有一些问题我很清楚

此时按下左键和按下右键是锁存,因为在某些情况下,它们会将其值从一个周期传送到下一个周期,但它们不在时钟过程中。如果希望它们是普通信号,则需要在流程开始时为它们提供默认值。如果您想让它们成为寄存器,那么它们需要处于时钟进程中

下一个州也是如此。它应该有一个默认值

next_state <= current_state;
当前_状态需要在异步进程的敏感度列表中

使用单独的过程在测试台上生成时钟。目前,它与刺激因素混合在一起,正扰乱你的时钟周期。它也使阅读变得困难

process p_clkgen
begin
    repeat begin
        clk <= NOT clk;
        wait for 50 ns;
    end;
end process;
然后,另一个过程只处理输入转换时的情况。我不记得repeat在VHDL中是否是一个有效的关键字,但你明白了

我怀疑你对你所在州的看法有误。可能状态应该是按下左或右shift键,每个键的接通或断开是状态之间的转换。我认为这种混淆是为什么左键按下和右键按下是当前锁存的部分原因


我想你会得到“U”输出,因为

shift <= left_pressed or right_pressed;
其中x可以是“0”、“1”、“U”、“x”、“Z”、““-”、“H”、“L”

你的代码中有一些问题我很清楚

此时按下左键和按下右键是锁存,因为在某些情况下,它们会将其值从一个周期传送到下一个周期,但它们不在时钟过程中。如果希望它们是普通信号,则需要在流程开始时为它们提供默认值。如果您想让它们成为寄存器,那么它们需要处于时钟进程中

下一个州也是如此。它应该有一个默认值

next_state <= current_state;
当前_状态需要在异步进程的敏感度列表中

使用单独的过程在测试台上生成时钟。目前,它与刺激因素混合在一起,正扰乱你的时钟周期。它也使阅读变得困难

process p_clkgen
begin
    repeat begin
        clk <= NOT clk;
        wait for 50 ns;
    end;
end process;
然后,另一个过程只处理输入转换时的情况。我不记得repeat在VHDL中是否是一个有效的关键字,但你明白了

我怀疑你对你所在州的看法有误。可能状态应该是按下左或右shift键,每个键的接通或断开是状态之间的转换。我认为这种混淆是为什么左键按下和右键按下是当前锁存的部分原因


您的组合过程驱动左按和右按。但是,您并不是在流程的每个可能执行中都指定一个值。在硬件中,这将创建一个闩锁。在模拟中,将保留初始值“U”


您可以在进程开始时为这些信号指定一个默认值,或者为它们创建寄存器。

您的组合进程驱动左按和右按。但是,您并不是在流程的每个可能执行中都指定一个值。在硬件中,这将创建一个闩锁。在模拟中,将保留初始值“U”


在处理开始时为这些信号指定一个默认值,或者为它们创建寄存器。

谢谢!!!在何处插入下一个\u状态更新下一个\u状态的进程的开始。这是一个默认情况,所以如果没有其他赋值命中,那么您仍然定义了下一个状态。谢谢!!!在何处插入下一个\u状态更新下一个\u状态的进程的开始。这是默认情况,所以如果没有 另一个赋值命中,那么您仍然定义了下一个状态应该是什么。