1

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

这是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 值。如果其中之一发生变化,与换档信号的连接将自动更新。

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

谢谢。

4

2 回答 2

3

我希望你得到'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;
    

    然后另一个过程只处理输入转换时。(我不记得重复是否是 VHDL 中的有效关键字,但你明白了)

  4. 我怀疑你对你的状态的想法是混淆的。大概状态应该是按下了左移或右移键,每一个上的成或断就是状态之间的转换。我认为这种混淆是 left_pressed 和 right_pressed 当前是闩锁的部分原因。

于 2011-10-20T08:44:19.957 回答
2

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

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

于 2011-10-20T09:20:06.920 回答