6

ワンホット入力に従って x 入力データパケットを単一出力パケットに切り替えるモジュールを作成しようとしています。

x が 4 の固定値の場合、case ステートメントを作成します。

case (onehot)
  4'b0001  : o_data = i_data[0];
  4'b0010  : o_data = i_data[1];
  4'b0100  : o_data = i_data[2];
  4'b1000  : o_data = i_data[3];
  default  : o_data = 'z;
endcase

しかし、変数 x を使用して、すべてのケースを定義するにはどうすればよいでしょうか?

ありがとう。

4

4 に答える 4

11

onehotそれが真にワンホットまたは 0 であると断言できる場合は、generate を使用できます。

package mytypes;
typedef logic [7:0] packet_t;
endpackage 

module mux #(int X) (
      input logic [X-1:0] onehot,
      input mytypes::packet_t i_data[X],
      output wire mytypes::packet_t o_data
      );
for(genvar i=0;i<X;i++) begin
   assign o_data = onehot[i] ? i_data[i] : 'z;
end
endmodule
于 2013-11-09T15:38:20.713 に答える
4

これは、OR ツリーを使用してワンホット入力 (つまり、優先度エンコーディングなし) 用に最適化された、完全にパラメーター化された合成可能なマルチプレクサです。入力が有効になっていない場合、出力は 'z' ではなく 0 に駆動されることに注意してください。

module mux
 #( parameter int unsigned inputs = 4,
    parameter int unsigned width = 8 )
  ( output logic [width-1:0] out,
    input logic sel[inputs],
    input logic [width-1:0] in[inputs] );

    always_comb
    begin
        out = {width{1'b0}};
        for (int unsigned index = 0; index < inputs; index++)
        begin
            out |= {width{sel[index]}} & in[index];
        end
    end
endmodule
于 2014-10-15T04:18:04.657 に答える