1

シフト キー検出器を設計しています。テスト ベンチを作成しました。テストの結果、実装が正しくないことがわかりました。

ModelSim でのシミュレーションは次のとおりです。

ここに画像の説明を入力

赤い線は UNDEFINED を示しています。この動作は 2 回だけ発生しました。

私が困惑したのは、なぜこれら 2 つの価値観の間にこれほど大きなギャップがあるのか​​ということです。テストベンチを見ると、3 番目と 4 番目の手順は、1 番目と 2 番目に使用された形式を使用しています。

テストベンチはこちら: http://pastebin.com/BJVFFgGr

検出コードはこちら: http://pastebin.com/di42FLqT

ご覧のように。私のデザインには 2 つの状態があります。PS2 レシーバーは、キーが押された (または離された) ときにフィルター処理を行い、クリーンな 8 ビットの make コードを生成します。ブレーク コードは単に F0 に続いて、リリースされたばかりのキーのメイク コードです。私のステート マシンは、2 つの余分なビットを使用して、どのシフト キーが押されたかを追跡します。

デバッグを行ったところ、3 番目のテスト値を入力すると、前の値の 1 ではなく SHIFT = U になりました。

-- 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 は、条件によっては 1 つのサイクルから次のサイクルに値を運ぶため、ラッチですが、クロックされたプロセスではありません。それらをプレーンなシグナルにしたい場合は、プロセスの開始時にデフォルト値を与える必要があります。それらをレジスターにしたい場合は、クロックされたプロセスにある必要があります。

    これは 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 がラッチされている理由の一部だと思います。

于 2011-10-20T08:44:19.957 に答える
2

組み合わせプロセスドライブleft_pressedright_pressed。ただし、プロセスの実行のすべてに値を割り当てるわけではありません。ハードウェアでは、これによりラッチが作成されます。シミュレーションでは、初期値('U')が残ります。

プロセスの開始時にこれらの信号にデフォルト値を割り当てるか、それらのレジスタを作成します。

于 2011-10-20T09:20:06.920 に答える