0

Altera DE2 開発ボードを使用しており、スイッチの入力を読み取りたいと考えています。これはレジスタに格納されます。カウンタに基づいて、これらのレジスタがインクリメントされます。レジスタは、B2D コンバーターを介して 7 セグメント ディスプレイに出力されることになっています。しかし、関数にレジスタを渡すことはできません。

wire [26:0] Q,Q2,Q3,Q4;
wire [3:0] one,two,three,four;
reg SecInc,MinInc,HrInc;
reg [3:0] M1,M2,H1,H2;

assign one = SW[3:0];
assign two = SW[7:4];
assign three = SW[11:8];
assign four = SW[15:12];

always begin
    M1 = SW[3:0];
    M2 = SW[7:4];
    H1 = SW[11:8];
    H2 = SW[15:12];
end

これが、入力を取得して保存する方法です。それらは、時間と分のバイナリ表現として使用するスイッチに由来します。カウンターに基づいて、1 分または 1 時間のレジスターをインクリメントします。

    //increment seconds from 0 to 60
counter seconds (SecInc,KEY[0],Q2);
defparam seconds.n = 8;
defparam seconds.mod = 60;

    always @ (negedge CLOCK_50) begin
      if (Q2 >= 60) begin
        MinInc = 1;
        M1 <= M1 + 1'b1;
        if(M1 >= 9) begin
          M1 <= 0;
          M2 <= M2 + 1'b1;
        end
        end else begin
          MinInc = 0;
        end
      end

結果を SSD に表示します。

    hex(M1,HEX4);
    hex(M2,HEX5);
    hex(H1,HEX6);
    hex(H2,HEX7);

ここに問題があります。これは Verilog では許可されていません。B2D 変換を使用して 0 から 9 までの数値を表示する関数にレジスタを送信する方法が必要です。

Verilog を正式に紹介したことは一度もありませんでしたが、できることはすべて試しました。私は、私が示したカウンターの Q2 のように、1、2、3、4 を渡し、モジュールにそれらをインクリメントさせる新しいモジュールを作成しようとさえしました。どんな提案や助けも大歓迎です!

ここで要求されているのは、hex モジュールです。

    module hex(BIN, SSD);
    input [15:0] BIN;
    output reg [0:6] SSD;

    always begin
      case(BIN)
        0:SSD=7'b0000001;
        1:SSD=7'b1001111;
        2:SSD=7'b0010010;
        3:SSD=7'b0000110;
        4:SSD=7'b1001100;
        5:SSD=7'b0100100;
        6:SSD=7'b0100000;
        7:SSD=7'b0001111;
        8:SSD=7'b0000000;
        9:SSD=7'b0001100;
      endcase
    end
  endmodule

前もって感謝します!

4

2 に答える 2

1

モジュールhexは関数ではなく、モジュールであるため、次のようなインスタンス名でインスタンス化する必要があります。

hex digit0(.BIN(M1), .SSD(HEX4));
hex digit1(.BIN(M2), .SSD(HEX5));
hex digit2(.BIN(H1), .SSD(HEX6));
hex digit3(.BIN(H2), .SSD(HEX7));
于 2013-11-19T03:50:42.133 に答える
1

nguthrie が正しいことに加えて、16 進コンバーターをモジュールとしてインスタンス化する必要があるため、M1always ブロックで競合状態からドライブします。ノンブロッキング割り当ては、ブロック内で同時に (または実質的に同時に) 評価されます。これは、物事が順番に起こるプログラムではありません。うまくいく可能性があるのは次のとおりです。

always @ (negedge CLOCK_50) begin
if (Q2 >= 60) begin
    MinInc = 1;
    if (M1 < 9) begin
        M1 <= M1 + 1'b1;
    end else begin
      M1 <= 0;
      M2 <= M2 + 1'b1;
    end
    end else begin
      MinInc = 0;
    end
end

また、MinInc へのブロッキング割り当てから予期しない結果が生じる可能性もありますが、これがどこで読み取られるかわからないため、何が起こるかを知るのは困難です。Verilog でのブロッキング (=) と非ブロッキング (<=) の割り当てについて調べてください。これは言語の最もトリッキーな概念の 1 つであり、2 つの操作の誤用は、私が今まで見た中で最も卑劣なバグの 90% の原因です。編集: あなたの質問を読み直すと、少なくとも 3 つの場所から M1-4 を運転しようとしているようです。always begin連続ブロックとalways @ (negedge clock) begin同じレジスタを駆動するクロック ( )を持つことはできません。これにより、コンパイラが癇癪に陥ります。

于 2013-11-19T15:13:08.893 に答える