2017-04-10 8 views
0

main.vsignal.vという2つのモジュールがあります。信号を外部モジュールに移動しようとしたときにエラーが発生する

main.vには、方形波に対応する値で16ビットreg txを更新するコードがいくつかあります。

reg [1:0] counter; 
    reg [15:0] tx; 
    always @(posedge clk) begin 
     counter = counter + 1; 
     if (counter[1] == 1) begin 
     tx[15:0] <= 16'b1010101010101010; 
     else 
     tx[15:0] <= 16'b0000000000000000; 
    end 

これは問題なく動作します。結局のところ、この信号を別のファイルsignal.vに移動したいのです。なぜなら、txに渡す信号は着実に大きくなるからです。私はこれをやろうとするとエラーに遭遇しました。最初は、上記のコードをすべてファイルsignal.vに移動しようとしました。次に、図のように2つのファイルの間にワイヤーを使用しました。

module signal(clk, get_tx); 
    input clk; 
    output reg get_tx; 
    reg [1:0] counter; 

    always @(posedge clk) begin 
     counter = counter + 1; 
     if (counter[1] == 1) begin 
     get_tx[15:0] <= 16'b1010101010101010; 
     else 
     get_tx[15:0] <= 16'b0000000000000000; 
    end 

はその後main.vで、私は出力をオシロスコープで見たものに基づいて

wire get_tx; 
reg [15:0] tx; 
signal my_signal(.clk(clk), .get_tx(get_tx)); 
always @(get_tx) begin 
    tx <= get_tx; 
end 

を追加しようとしました、このメソッドは動作していない、と私はなぜかどうか分かりませんこれは。最初のケースは正常に動作しているようですので、私が2番目のケースに移動すると失敗する理由はわかりません(信号はまったく違って見えます)。 私はどんなヘルプ/アドバイスもありがとう!

答えて

2

まず、モジュールの宣言で完全なコードを追加すると、接続を理解してコードをシミュレートする方が良いでしょう。
問題は信号タイプにあります。出力をwireに変更してください。同様に、1ビット信号だけでなく、バ​​スを宣言する必要があります。あなたのカウンターに初期値を与えてください(それ以外の場合は'X' +1の結果に'X'となり、条件if (counter[1] == 1)は決して達成されません)。上部モジュールで

module signal(clk, get_tx); 
    input clk; 
    output [15:0] get_tx; 
    reg [15:0] tx_out; 
    reg [1:0] counter = 2'd0; 

    always @(posedge clk) begin 
     counter = counter + 1; 
     if (counter[1] == 1) 
     tx_out[15:0] <= 16'b1010101010101010; 
     else 
     tx_out[15:0] <= 16'b0000000000000000; 
    end 
    assign get_tx = tx_out; 
endmodule 

次のエラーは、そこにあなたもただ1つのビットwire [15:0] get_tx;ではなく、バスを宣言する必要があります。
このエラーを修正しようとすると、モジュールが機能します。

+0

出力はVerilogのレジスタにすることができます。 – Laleh

+0

あなたが正しいです、私は文を削除しました。 – Roman

+0

それは動作します - ありがとう! –

関連する問題