我编写了以下代码来实现四个 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
我的问题是双重的:
- 有没有更有效和/或更好的方法来做到这一点?我正在学习,所以我写的代码没有任何特殊问题,但我想我会检查一下是否可以改进。
- 我需要反转每个 4:1 多路复用器的第四位。现在,每个 inEncN 总线中的每一位都是输入,而每个 outChY 总线中的每一位都是输出。我一开始是这样写的,看看它是否可以工作,但真正的硬件需要一个信号才能走另一条路。
为了更简洁,我将用一组特定的信号进行解释。现在,outCh0[3:0] 中的位都是输出。我真的需要 outCh0[3] 作为输入,并将其映射到选择信号选择的任何 inEncN[3] 总线。因此,我还需要将所有 inEncN[3] 信号作为输出,而不是像每个相应总线中的其他三位那样作为输入。
我试图制作所有有问题的总线,inout
而不是input
or output
,但无论我尝试了什么,我都无法编译它。
上面显示的代码编译为 32 个逻辑元素,剩下 8 个备用。将代码放入 40 个或更少的逻辑元素中将是一个巨大的胜利,但我有一个可以接受的 B 计划。
任何帮助将不胜感激。