Verilogプライオリティエンコーダ:4入力8ビットセレクタ実装
プライオリティエンコーダ(優先度付きエンコーダ/マルチプレクサ)
本設計は、4つの8ビット入力(a, b, c, d)から、2ビット選択信号selに基づいて1つを出力outに選択するマルチプレクサです。優先順位はselの値そのもの(00→a, 01→b, 10→c, 11→d)で固定されます。
設計
module pr_en (
input [7:0] a,
input [7:0] b,
input [7:0] c,
input [7:0] d,
input [1:0] sel,
output reg [7:0] out
);
always @(a or b or c or d or sel) begin
if (sel == 2'b00)
out <= a;
else if (sel == 2'b01)
out <= b;
else if (sel == 2'b10)
out <= c;
else
out <= d; // sel == 2'b11
end
endmodule
ハードウェア回路図
テストベンチ
各入力にランダム値を設定し、selを0→1→2→3と順に変化させて出力を確認します。
module tb_4to1_mux;
reg [7:0] a, b, c, d;
wire [7:0] out;
reg [1:0] sel;
integer i;
pr_en pr_en0 (
.a(a), .b(b), .c(c), .d(d),
.sel(sel), .out(out)
);
initial begin
sel <= 0;
a <= $random; b <= $random; c <= $random; d <= $random;
for (i = 1; i < 4; i = i + 1)
#5 sel <= i;
#5 $finish;
end
endmodule
動作確認ポイント
sel=00:出力 = 入力asel=01:出力 = 入力bsel=10:出力 = 入力csel=11:出力 = 入力d
改良のヒント
- case文使用:
case(sel) 2'b00: out<=a; ... endcaseで可読性向上 - パラメータ化:入力数、ビット幅をパラメータに
- デフォルトケース:
default: out <= 'xで未定義値検出しやすく - ワンホットセレクト:
selをワンホット(4ビット)にすると優先度エンコーダ不要で高速化可能
「プライオリティエンコーダ」の用語について
本モジュールは厳密には「4:1マルチプレクサ」です。一般に「プライオリティエンコーダ」は、複数の入力ラインのうち最も優先度の高いアサートされている入力のインデックスを出力する回路を指します(例:req[3:0]のうち最上位ビットが立っている番号をエンコード)。本記事のタイトルは慣用的に使われていますが、機能はマルチプレクサです。
Verilog
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog関数のマスター:効率的なRTL設計のために
- Verilogタスクの理解:関数との違い、構文、使用法
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog数学関数のマスター:効率的なハードウェア設計のために
- Verilog $timeformatのマスター:精度と表示制御
- 任意のスコープでのVerilog timescale理解と表示
- VerilogファイルI/Oの完全ガイド:オープン、読み取り、書き込み、クローズ