目的
セレクタの記述の仕方について 記す
記述の仕方
- 3項演算子で記述
最もよく使用する記述。 - 配列のインデックス(添え字) で選択
選択数が多い場合は、この方法で記述。 - case文 で記述
function 文 や always 文 内で使用する。
セレクタを使いまわす場合は function で記述する。 - if文 で記述
function 文 や always 文 内で使用する。
セレクト条件が複数の信号の組み合わせでも記述できる。
但し、複雑な条件となると
可読性か悪くなる
シミュレーション時に条件成立が判りにくい
等の問題がある。
セレクト条件は assign 文で 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 ; - 配列のインデックス(添え字) で選択
reg [7:0] all_data[0:15] ; //選択対象の 2次元配列データ選択対象が配列になっていない場合、以下のように データを 2次元配列に代入する。
assign sel_data = all_data[sel] ; //セレクタ
( 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
- case文 で記述
function 文 で選択の場合
function [7:0] data_sel (always 文 で選択の場合
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 @(*) 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
- 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 件のコメント:
コメントを投稿