4 つの 16:4 マルチプレクサを実装するために、次のコードを作成しました。
module coder(
selCh0, selCh1, selCh2, selCh3,
outCh0, outCh1, outCh2, outCh3,
inEnc0, inEnc1, inEnc2, inEnc3
);
input wire [1:0] selCh0, selCh1, selCh2, selCh3;
output wire [3:0] outCh0, outCh1, outCh2, outCh3;
input wire [3:0] inEnc0, inEnc1, inEnc2, inEnc3;
mux_16x4 ch0(selCh0, inEnc0, inEnc1, inEnc2, inEnc3, outCh0);
mux_16x4 ch1(selCh1, inEnc0, inEnc1, inEnc2, inEnc3, outCh1);
mux_16x4 ch2(selCh2, inEnc0, inEnc1, inEnc2, inEnc3, outCh2);
mux_16x4 ch3(selCh3, inEnc0, inEnc1, inEnc2, inEnc3, outCh3);
endmodule
module mux_16x4(sel, enc0, enc1, enc2, enc3, out);
input wire [1:0] sel;
input wire [3:0] enc0, enc1, enc2, enc3;
output reg [3:0] out;
always @(sel, enc0, enc1, enc2, enc3)
begin
case ({sel})
2'b00: out <= enc0;
2'b01: out <= enc1;
2'b10: out <= enc2;
2'b11: out <= enc3;
default: out <= 4'b0;
endcase;
end
endmodule
私の質問は 2 つあります。
- これを行うためのより効率的および/またはより良い方法はありますか? 勉強中なので書いたコードに特に問題はありませんが、改善できないかチェックしてみようと思いました。
- 各 4:1 マルチプレクサの 4 番目のビットを逆にする必要があります。現在、各 inEncN バスのすべてのビットが入力であり、各 outChY バスのすべてのビットが出力です。最初はこのように書いて動作するかどうかを確認しましたが、実際のハードウェアには逆方向に進むための信号が必要です。
より簡潔にするために、特定のシグナルのセットで説明します。現在、outCh0[3:0] のビットはすべて出力です。outCh0[3] を入力として、選択信号によって選択された inEncN[3] バスにマップする必要があります。したがって、すべての inEncN[3] 信号を、それぞれのバスの他の 3 ビットのような入力ではなく出力にする必要があります。
orinout
の代わりに問題のすべてのバスを作成しようとしましたが、何を試してもコンパイルできませんでした。input
output
上記のコードは 32 個のロジック エレメントにコンパイルされ、8 個のスペアが残ります。コードを 40 個以下のロジック要素に収めることは大きなメリットですが、許容できるプラン B があります。
どんな助けでも大歓迎です。