シフト キー検出器を設計しています。テスト ベンチを作成しました。テストの結果、実装が正しくないことがわかりました。
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 値を持つ必要があります。それらのいずれかが変更されると、シフト信号への接続が自動的に更新されます。
誰か助けてくれませんか?ありがとう。
ありがとう。