2016-05-03 9 views
0

フィルタモジュールの入力を多重化しようとしていますが、構文に問題があります。誰も助けることができますか?私は、考えていたVerilogパーツをgenvarコンテキストで選択

reg [y:0] MULTICHANNEL_INPUT; 
wire [x:0] channelDataIn; 
wire [1:0] channelNumberIn; 

Filter XYZ (
... 
.chan_in(channelNumberIn), 
.din(channelDataIn),    //[x:0] data in 
... 
); 

always @ (*) 
case(channelNumberIn) 
    0: assign channelDataIn = MULTICHANNEL_INPUT[x:0] 
    1: assign channelDataIn = MULTICHANNEL_INPUT[2x:x+1] 
    ... 
endcase 

これはコンパイルされません。私はこれをどのようにしなければならないのですか?

+0

コンパイルエラーは次のとおりです。channelDataInは正当なregまたは可変長の値ではありません。 - 私は理解しているが、私が望むのは、2本の線を持つマルチプレックスである:Dをregに変換しないこと。 – toomanychushki

+0

'x'と' y'は何ですか?パラメーター? Genvars?入力? – nguthrie

+0

変数を 'reg'として宣言しても、それがあなたが心配しているものならば、フリップフロップを推測することはありません。 – nguthrie

答えて

1

私はあなたが達成しようとしているもので、推測を取っていますが、あなただけのベクトルの一部をつかむしたい場合は、これがケースでも、を行うことができます

module test 
#(
    parameter x = 4, 
    parameter y = 4*x 
) 
    (
    input [y-1:0] MULTICHANNEL_INPUT, 
    input [1:0] channelNumberIn, 
    output [x-1:0] channelDataIn 
) 

    assign channelDataIn = MULTICHANNEL_INPUT[x*channelNumberIn +: x]; 

endmodule 

を選択し、インデックス付きの部分を使用することができます声明:それはalwaysブロック内で駆動するので、私は出力regをしなければならなかった

module test 
#(
    parameter x = 4, 
    parameter y = 4*x 
) 
    (
    input [y-1:0] MULTICHANNEL_INPUT, 
    input [1:0] channelNumberIn, 
    output reg [x-1:0] channelDataIn 
) 

    always_comb begin 
     case(channelNumberIn) 
     2'd0: channelDataIn = MULTICHANNEL_INPUT[1*x-1:0*x]; 
     2'd1: channelDataIn = MULTICHANNEL_INPUT[2*x-1:1*x]; 
     2'd2: channelDataIn = MULTICHANNEL_INPUT[3*x-1:2*x]; 
     2'd3: channelDataIn = MULTICHANNEL_INPUT[4*x-1:3*x]; 
     endcase 
    end 

endmodule 

注意してください。しかし、これは何も変わらない。これらの2つのモジュールは同じゲートに合成する必要があります。私はエラーが起こりにくいので、最初のソリューションがより好きです:2番目のタイプミスは、重複するパートの選択につながります。

もうひとつの楽しみのためのオプションです。私は何が起こっているのか非常に明確ではありませんので、この限り好きではない、あなたは(私は実際に右ここでそれをやったかわからない)逆方向の寸法を得ることのリスクを実行します。

wire [3:0][x-1:0] input_2d; 
assign input_2d = MULTICHANNEL_INPUT; 
assign channelDataIn = input_2d[channelNumberIn]; 
+0

その乗算はどのように合成されますか?私はそれが私にシンプルなマルチプレクサを与えるほど賢明ではないかと疑っています。 – toomanychushki

+0

賢いと思います。これらのパラメータはコンパイル時に静的です。 – nguthrie

0

シンプル未登録のマルチプレクサを取得するアプローチは、連続的な割り当てを使用することです。

assign <wire1> = <2-bit_select> ? <value0> : <2-bit_select> ? <value1> : ... <value1>; 
関連する問題