2022年11月17日木曜日

verilog : セレクタ(マルチプレクサ) の記述 いろいろ

目的

セレクタの記述の仕方について 記す

記述の仕方

  1. 3項演算子で記述
    最もよく使用する記述。
  2. 配列のインデックス(添え字) で選択
    選択数が多い場合は、この方法で記述。
  3. case文 で記述
    function 文 や always 文 内で使用する。
    セレクタを使いまわす場合は function で記述する。
  4. if文 で記述
    function 文 や always 文 内で使用する。
    セレクト条件が複数の信号の組み合わせでも記述できる。
    但し、複雑な条件となると
     可読性か悪くなる
     シミュレーション時に条件成立が判りにくい
    等の問題がある。
    セレクト条件は assign 文で 1信号 にしてから使用した方がよい。
以下に記述例を示す。

記述例

図の様なセレクタを記述する例を示す。
  1. 3項演算子で記述
    assign sel_data  = (sel == 4'd0)  ?  data_0 :
                       (sel == 4'd1)  ?  data_1 :
                       (sel == 4'd2)  ?  data_2 :
                       (sel == 4'd3)  ?  data_3 :
                                          8'd0 ;

  2. 配列のインデックス(添え字) で選択
    reg [7:0] all_data[0:15] ;   //選択対象の 2次元配列データ
    assign sel_data = all_data[sel] ;  //セレクタ
    選択対象が配列になっていない場合、以下のように データを 2次元配列に代入する。
     ( 16 x 8bit の 配列に 4つのデータを代入し、残り 12個を 8'd0 で埋める場合。)
    wire [7:0] all_data[0:15] ;     // 2次元配列データ
    assign all_data[0] = data_0 ;
    assign all_data[1] = data_1 ;
    assign all_data[2] = data_2 ;
    assign all_data[3] = data_3 ;
    genvar i ;
    generate
      for (i=4; i<16; i=i+1) begin
        assign all_data[i] = 8'd0 ;
      end
    endgenerate

  3. case文 で記述
    function 文 で選択の場合
    function [7:0] data_sel (
    input [3:0] select,
    input [7:0] in_data0,
    input [7:0] in_data1,
    input [7:0] in_data2,
    input [7:0] in_data3
    ) ;
      begin
        case (sel)
          4'd0    : sel_data = in_data0 ;
          4'd1    : sel_data = in_data1 ;
          4'd2    : sel_data = in_data2 ;
          4'd3    : sel_data = in_data3 ;
          default : sel_data = 8'd0     ;
        endcase
      end
    endfunction

    assign sel_data = data_sel(.select(sel),.in_data0(data_0),.in_data1(data_1),
                               .in_data2(data_2),.in_data3(data_3)) ;
    always 文 で選択の場合
    always @(*) begin
      case (sel)
        4'd0    : sel_data = data_0 ;
        4'd1    : sel_data = data_1 ;
        4'd2    : sel_data = data_2 ;
        4'd3    : sel_data = data_3 ;
        default : sel_data = 8'd0   ;
      endcase
    end

  4. if文 で記述
    always 文 で選択の場合
    always @(*) begin
      if      (sel == 4'd0)  sel_dt5 = data_0 ;
      else if (sel == 4'd1)  sel_dt5 = data_1 ;
      else if (sel == 4'd2)  sel_dt5 = data_2 ;
      else if (sel == 4'd3)  sel_dt5 = data_3 ;
      else                   sel_dt5 = 8'd0   ;
    end



0 件のコメント:

コメントを投稿