【问题标题】:VHDL - Undefined behavior in my key detectionVHDL - 我的密钥检测中的未定义行为
【发布时间】:2012-11-11 11:57:54
【问题描述】:

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

这是 ModelSim 中的模拟。

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

让我不解的是:为什么这两个值之间会有这么大的差距?如果您查看测试台,第 3 和第 4 程序使用的格式用于第 1 和第 2 次。

测试台在这里:http://pastebin.com/BJVFFgGr

检测器代码在这里:http://pastebin.com/di42FLqT

如您所见。我的设计中有两种状态。当按下(或释放)键时,PS2 接收器将过滤并生成干净的 8 位生成代码。中断代码只是 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;

left_pressed 和 right_pressed 是信号,而不是变量。因此,它们在任何情况下都应该具有 a 值。如果其中之一发生变化,则与换档信号的连接将自动更新。

有人可以帮帮我吗?谢谢。

谢谢。

【问题讨论】:

    标签: keyboard vhdl circuit


    【解决方案1】:

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

    shift <= left_pressed or right_pressed;
    

    而 right_pressed 是未定义的,所以当 left_pressed 变为 '0' 时,right_pressed 中的 'U' 会显示出来。

    记住

    1 or x == 1
    0 or x == x
    

    其中 x 可以是“0”、“1”、“U”、“X”、“Z”、“-”、“H”、“L”

    您的代码存在一些令我印象深刻的问题

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

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

      next_state <= current_state;
      
    2. current_state 需要在异步进程的敏感列表中。

    3. 使用单独的流程在测试台中生成时钟。目前,它与扰乱时钟周期的刺激混合在一起。它也使阅读变得困难。

      process p_clkgen
      begin
          repeat begin
              clk <= NOT clk;
              wait for 50 ns;
          end;
      end process;
      

      那么其他进程只处理输入转换时。 (我不记得 repeat 是否是 VHDL 中的有效关键字,但你明白了)

    4. 我怀疑您对自己所在州的看法有些混乱。大概状态应该是按下了左移键或右移键,每一个上的通断就是状态之间的转换。我认为这种混淆是 left_pressed 和 right_pressed 目前是闩锁的部分原因。

    【讨论】:

    • 谢谢!!!我在哪里插入 next_state
    • 开始更新 next_state 的进程。这是一个默认情况,所以如果没有其他分配命中,那么你仍然定义了下一个状态应该是什么。
    【解决方案2】:

    您的组合进程驱动left_pressedright_pressed。但是,您不会在流程的每个可能执行中分配一个值。在硬件中,这将创建一个闩锁。在模拟中,您只剩下初始值 ('U')。

    要么在进程开始时为这些信号分配一个默认值,要么为它们创建寄存器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      相关资源
      最近更新 更多