2

4 つの基本操作 (乗算、加算、減算、および除算) を FPGA ボードにある 4 つのキーの 1 つにマップしようとしています。どのキーが押されたかを確認し、適切なステートメントを実行するifステートメントがあります。ただし、ブロックに何を配置しても、常にブロックの機密リストを作成すると、4 つのキーすべてが認識されません。感度ブロックを空のままにしておくと、すべてのキーが認識されますが、最初のキーの操作が実行され、他のキーが押されてそれらの操作が実行されるのを待ちます。

always @(negedge KEY) begin
    if (KEY[0] == 0) begin
    ...
    end else if(KEY[1] == 0) begin
        //Check for value for A and B
        if(SW[15:8] < SW[7:0]) begin
            ...     
        end
    end else if(KEY[2] == 0) begin
    ...
    end
end

このようなコードを実装すると、KEY1 に接続されている操作のみが計算されます。残りのキーは、プログラムされていないかのように機能します。この小さな煩わしさを回避する方法はありますか?

ありがとう!

4

2 に答える 2

3

クロック フリップフロップをモデル化している場合を除き、組み合わせブロックには常に既定の (@*) センシティビティ リストを使用する必要があります。信号の負のエッジにのみ敏感な合成可能な組み合わせ回路はありません。

キーが最初に押されたときにのみ何かを実行したい場合は、キーの状態を、レジスタに格納されている前のクロック エッジからのキーの値と比較します。

always @* begin
  if(key[0] && !key_last[0]) begin
      //assert some signal on key0 press
  end
  if(key[1] ...) begin
      //assert on key1 press
  end
end

always @(posedge clock) key_last <= key;

複数のキーの状態を確認する場合は、if/else ステートメントを使用しないでください。最初の true ステートメントの後にチェックが停止するためです。4 つの個別の if ステートメントを記述するだけです。

于 2013-05-01T03:18:28.007 に答える
0

特定の問題は、イベント制御式がマルチビット式の最下位ビットでのみ評価されることです。そのため、always ブロックは KEY[0] の立ち下がりエッジのみを待機していました。

これが単なるシミュレーション モデルである場合、これを修正する方法は複数あります。always @(negedge KEY[0], negedge KEY[1], negedge KEY[2], negedge KEY[3])がそうであるように、仕事をするでしょうalways @*。合成している場合は、クロックを使用して 4 ビットをサンプリングする必要があります。

于 2013-05-01T12:09:19.487 に答える