0

DE2-70 ボードを使用しており、そのボタンのいくつかを入力として使用しようとしています。ボタンは 0 でアクティブになり、数値を増減するために、特に 2 つのボタンが別々に押されているかどうかを確認する必要があります。

iKEY はボタンで、position は変更しようとしている番号です。

reg [4:0] position;
position = 5'b0;

output wire enable = !(iKEY[3] && iKEY[2]);
always @(posedge enable) begin  
    if(iKEY[3] == 0)
        position = position + 5'b00001;

    if(iKEY[2] == 0)
        position = position - 5'b00001;
end

ifs 条件を変更したり、イネーブル信号を設定するときのロジック関数を変更したりするなど、この実装のいくつかの違いを試しましたが、常に何らかの問題で行き詰まります。私はハードウェア ロジックに慣れていないので、間違った方法で考えている可能性があります。

編集:両方のボタンが同時に押された場合、ハードウェアが数値を増減しないと思います

4

3 に答える 3

2

チャット ディスカッションの概要:

  • 重要な背景情報がありません:
    • iKEY4ビットのアクティブロー入力です。入力ソースは物理ボタンから、
    • 操作はワンコールド (ワンホットの逆) で発生する必要がありますiKEY
    • 50MHzなどの利用可能なクロックがありますiCLK_50

  • 操作が予期せず実行される場合の解決策:

    • すべてiKEYを 1 つの always ブロックに移動し、case ステートメントで操作をデコードします。元:

      case(iKEY[3:0]) // one-cold, full-case
        4'b1110: /* operation 0 */
        4'b1101: /* operation 1 */
        4'b1011: /* operation 2 */
        4'b0111: /* operation 3 */
        default: /* default behavior */
      endcase
      
    • クロッキング イベントとして使用iKEYする場合は、ビット単位の NAND 演算を実行します。

      wire enable = ~&iKEY[3:0];

    • クロックを使用している場合はiCLK_50、ボタンを押すたびに 1 回の操作が確実に行われるように、ボタンのリリースを監視するレジスタを追加します。元:

      if (allow_op) begin // value from past clock event
        /* case statement defined above */
      end
      // value for next clock event
      allow_op = &iKEY[4:0]; // bit-wise AND
      
于 2013-10-17T18:56:28.903 に答える
0

おそらく、ボタンを押すことで変更を探しているはずです。以下のコードは、iKEY[3] 入力の立ち下がりエッジを探します。そうしないと、IKEY が押されるとすぐに、そのカウンターは NUTS になり、狂ったように増加または減少し始めます。

reg iKEY3_LAST;

output wire enable = !(iKEY[3] && iKEY[2]);
always @(posedge enable) begin  
  iKEY3_LAST = iKEY[3];
  if(iKEY[3] == 0 && iKEY3_LAST == 1)
    position = position + 5'b00001;
于 2013-10-17T01:00:05.937 に答える