2011-10-20 11 views
1

私はシフトキー検出器を設計しています。私はテストベンチを書きました。テストでは私の実装が間違っていたことがわかりました。VHDL - キー検出で未定義の動作

ここにModelSimのシミュレーションがあります。

enter image description here

赤線は不定示します。この現象は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は、変数ではなくシグナルです。ですから、どのような場合でも価値があるはずです。いずれかが変更されると、シフト信号への接続が自動的に更新されます。

誰かお手伝いできますか?ありがとう。

ありがとうございました。

答えて

3

私は

shift <= left_pressed or right_pressed; 

とright_pressedが定義されていないので、left_pressed際を通じてright_pressedショーで '0' 'U' になりますので、あなたが 'U' の出力を取得している期待しています。 ' - '、 'H'、 'L'

xは '0'、 '1'、 'U'、 'X'、 'Z'、とすることができる

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

ことを覚え

ありleft_pressed現時点では私

  1. に目立つ、彼らはいくつかの条件の次に1サイクルからその価値を運ぶようラッチが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が現在ラッチである理由の一部だと思う。

+0

ありがとうございます!どこにnext_state <= current_stateを挿入しますか?私は他のことをしましたが、私は私を台無しにしていると思います。ありがとう – CppLearner

+0

next_stateを更新するプロセスの開始。それはデフォルトのケースなので、他の割り当てのどれもヒットしなければ、あなたはまだ次の状態が何であるべきかを定義しています。 –

2

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

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

+0

ありがとうございます。私は今それを修正しようとしています。 – CppLearner

関連する問題