私はシフトキー検出器を設計しています。私はテストベンチを書きました。テストでは私の実装が間違っていたことがわかりました。VHDL - キー検出で未定義の動作
ここにModelSimのシミュレーションがあります。
赤線は不定示します。この現象は2回しか発生しませんでした。
私が困惑しているのは、なぜこれらの2つの値の間に大きなギャップがあるのかです。テストベンチを見ると、第3回と第4回の手順では、第1回と第2回に使用された形式を使用しています。
テストベンチはここにある:
http://pastebin.com/BJVFFgGr
検出器のコードはここにある:
http://pastebin.com/di42FLqT
あなたが見ることができるように。デザインには2つの州があります。 PS2レシーバーは、キーが押され(または放された)きれいな8ビットメイクコードをフィルターして生成します。ブレークコードは単に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は、変数ではなくシグナルです。ですから、どのような場合でも価値があるはずです。いずれかが変更されると、シフト信号への接続が自動的に更新されます。
誰かお手伝いできますか?ありがとう。
ありがとうございました。
ありがとうございます!どこにnext_state <= current_stateを挿入しますか?私は他のことをしましたが、私は私を台無しにしていると思います。ありがとう – CppLearner
next_stateを更新するプロセスの開始。それはデフォルトのケースなので、他の割り当てのどれもヒットしなければ、あなたはまだ次の状態が何であるべきかを定義しています。 –