0

2 つのモジュールをインスタンス化するこのトップ モジュールがあります。

fillRam fillRam1(
  .clk(mclk),
  .ramaddrb(ramaddrb),
  .romaddrb(romaddrb),
  .romoutb(romoutbwire),
  .raminb(raminb));

vga vgainst(
  .ck(mclk),
  .HS(HS),
  .VS(VS),
  .outRed(OutRed),
  .outGreen(OutGreen),
  .outBlue(OutBlue),
  .sw(sw),
  .romouta(romoutawire),
  .ramouta(ramoutawire),
  .romaddra(romaddra),
  .ramaddra(ramaddra));

この最上位モジュールには、RAM と ROM を接続する 2 つのモジュールもあります。

rom rom_instance (
  .clka(mclk), // input clka
  .addra(romaddrawire), // input [14 : 0] addra
  .douta(romouta), // output [7 : 0] douta
  .clkb(ck), // input clkb
  .addrb(romaddrbwire), // input [14 : 0] addrb
  .doutb(romoutb) // output [7 : 0] doutb
);

私がやりたいことは、vga モジュールから romadra 値を取得し、それを rom_instance に渡し、romouta 値を取得して vga モジュールに戻すことです。そのために 2 つの変数を宣言します。

reg  [14:0] romaddra;
wire  [14:0] romaddrawire;
reg [7:0] romouta;
wire [7:0] romoutawire;
assign romaddrawire = romaddra;
assign romoutawire = romouta;

すべてのクロック サイクルで、vga インスタンスから romadra 値を取得し、それを romaddrawire に書き込み、ROM インスタンスに渡します。次に、romouta の値を取り、それを romoutawire に書き込み、VGA インスタンスに返します。

他の rom ポートと ram ポートにも同様の宣言があります。しかし、それらのすべてで、このエラーが発生します。

ERROR:HDLCompilers:102 - "top.v" line 82 Connection to output port 'romaddra' must be a net lvalue

VGA Verilog コードで:

output reg [14:0] romaddra;

およびROM Verilogで:

output [7 : 0] douta;

この全体のレジスタとワイヤの種類について非常に混乱しています。誰かがここで何がうまくいかないのか、その理由も説明してくれたらうれしいです. ありがとう。

4

3 に答える 3

2

ワークフローで SystemVerilog を使用できる場合、これらはすべてorlogicの代わりになり、問題は解決します。regwire

後で詳しく読むことができますが、今のところwire、接続用または割り当てステートメントの一部として使用してください。ブロックregで値を定義する場合に使用します。always

wire a_wire;
wire b_wire;

example_a_module(
  .a( a_wire )
);

example_b_module( 
  .a( a_wire )
);

assign b_wire = ~a_wire ;

登録

reg a_reg;
reg b_reg;

always @* begin
  a_reg = something_else;
end

always @(posedge clk or negedge rst_n) begin
  if (~rst_n) begin
    b_reg <= 1'b0;
  end
  else begin
    b_reg <= something_else;
  end
end

出力ポートは、順序ではなく名前 (持っているように見えます) で接続する場合、任意のタイプにすることができます。

出力 a はワイヤ タイプです。

module example_a_module(
  output a
);
endmodule

ここで、b は 10 ビットの reg タイプです。

module example_c_module(
  output reg [9:0] b
);
endmodule
于 2013-01-04T16:45:12.697 に答える
0

最上位では、バス ワイヤを宣言し、それらのバス ワイヤをインスタンス化で使用するだけです。reg と assign をドライバーと考えてください。ドライバーは不要で、ワイヤーが必要なため、「ワイヤー」を使用します。'wire a=1' を実行すると、実際にはドライバーを作成する割り当てになります。要するに、接続したいときは、アサインやレジスタではなく、ワイヤのみを使用してください。

wire  [14:0] connector_15;
wire  [8:0] connector_9;

fillRam fillRam1(
  .clk(mclk),
  .ramaddrb(ramaddrb),
  .romaddrb(romaddrb),
  .romoutb(romoutbwire),
  .raminb(raminb));

vga vgainst(
  .ck(mclk),
  .HS(HS),
  .VS(VS),
  .outRed(OutRed),
  .outGreen(OutGreen),
  .outBlue(OutBlue),
  .sw(sw),
  .romouta(connector_9),
  .ramouta(ramoutawire),
  .romaddra(connector_15),
  .ramaddra(ramaddra));

rom rom_instance (
  .clka(mclk), // input clka
  .addra(connector_15), // input [14 : 0] addra
  .douta(connector_9), // output [7 : 0] douta
  .clkb(ck), // input clkb
  .addrb(romaddrbwire), // input [14 : 0] addrb
  .doutb(romoutb) // output [7 : 0] doutb
);
于 2013-01-05T01:13:38.680 に答える
0

レジスタはスティッキーと考えることができますが、ワイヤは 2 つのポイントを接続するだけです (物理的なワイヤのように)。これは必ずしも reg が常にフリップフロップに合成されることを意味するわけではありませんが、reg は新しい値が割り当てられるまで以前の値を保持します。一方、ワイヤーは無記憶です。

一般的に言えば、モジュールの出力はregである傾向があり、モジュール間の相互接続はワイヤーである傾向があります。これは、適切な出力を生成するためのロジックがモジュールにカプセル化される傾向があるためです。そのため、インスタンス化モジュールは出力を渡すだけで済みます。もちろん、より複雑なシステムでは、モジュールがモジュール内にネストされる場合、これは当てはまりません。しかし、概念は同じままです。あるモジュールから別のモジュールにデータを渡すだけの場合は、ワイヤを使用してください。データを「スティッキー」にする必要がある場合は、reg を使用します。

romaddraそうは言っても、ワイヤーではなくregを作成する理由は何でしたか?

于 2013-01-04T15:56:13.637 に答える