Verilog debug 8-1 多路复用器 by gates
Verilog debug 8-1 Multiplexer by gates
我需要通过 2-1 多路复用器创建 8*1 多路复用器。
这时,我的代码就可以工作了。但是,输出不正确。
电线 O_0.O_1,O_2,O_3 可以正常工作。
当 2-1 多路复用器读取选择器 [1] 和 [2] 时,它不会改变。
输出介于 I0 和 I1 之间。
你能帮我解决这个问题吗?或者直接告诉我错在哪里?
这不是斜体
`
module MUX_8_1 (i0 ,i1 ,i2 ,i3 ,i4 ,i5 ,i6 ,i7 , selectors , o_8 );
input [31:0] i0 ,i1 ,i2 ,i3 ,i4 ,i5 ,i6 ,i7;
input [2:0] selectors ;
output [31:0] o_8 ;
wire [31:0] o_0;
wire [31:0] o_1;
wire [31:0] o_2;
wire [31:0] o_3;
wire [31:0] o_4;
wire [31:0] o_5;
MUX_2_1 M1(.i0 (i0), .i1 (i1), .sel (selectors[0]),.o (o_0));
MUX_2_1 M2(.i0 (i2), .i1 (i3), .sel (selectors[0]),.o (o_1));
MUX_2_1 M3(.i0 (i4), .i1 (i5), .sel (selectors[0]),.o (o_2));
MUX_2_1 M4(.i0 (i6), .i1 (i7), .sel (selectors[0]),.o (o_3));
MUX_2_1 M5(.i0 (o_0), .i1 (o_1), .sel (selectors[1]),.o (o_4));
MUX_2_1 M6(.i0 (o_2), .i1 (o_3), .sel (selectors[1]),.o (o_5));
MUX_2_1 M7(.i0 (o_4), .i1 (o_5), .sel (selectors[2]),.o (o_8));
endmodule
module MUX_2_1 (i0 ,i1 ,sel ,o);
input [31:0] i0 ,i1;
input sel ;
output [31:0] o;
assign #19 o = (i0 & (~sel)) | (i1 & sel);
endmodule`
这不是斜体
module MUX_8_1_TB;
// Inputs
reg [31:0] i0;
reg [31:0] i1;
reg [31:0] i2;
reg [31:0] i3;
reg [31:0] i4;
reg [31:0] i5;
reg [31:0] i6;
reg [31:0] i7;
reg [2:0] selectors;
// Outputs
wire [31:0]o_8;
// Instantiate the Unit Under Test (UUT)
MUX_8_1 uut (
.i0(i0),
.i1(i1),
.i2(i2),
.i3(i3),
.i4(i4),
.i5(i5),
.i6(i6),
.i7(i7),
.selectors(selectors),
.o_8(o_8)
);
initial begin
i0 = 32'b1000;
i1 = 32'b1001;
i2 = 32'b1010;
i3 = 32'b1011;
i4 = 32'b1100;
i5 = 32'b1101;
i6 = 32'b1110;
i7 = 32'b1111;
selectors = 3'b000;#100;
selectors = 3'b001;#100;
selectors = 3'b010;#100;
selectors = 3'b011;#100;
selectors = 3'b100;#100;
selectors = 3'b101;#100;
selectors = 3'b110;#100;
selectors = 3'b111;#100;
end
endmodule
您的 2:1 Mux 逻辑似乎有缺陷。尝试
assign o = (sel) ? i1 : i0;
我认为,MUX_2_1 中的 assign 语句是不正确的。
您有 2 个选项可以纠正它。
第一个选项
您可以使用三元运算符(根据我的意见,这是更可取的)
assign o = (sel) ? (i1) : (i0);
第二个选项
看来,您写这段代码是考虑了 2*1 多路复用器的实际门级原理图或网表。
但要模仿实际的门级设计,您应该考虑对 i0、i1 网络的各个位进行与运算。
因此您的代码可能如下所示:
assign o[0] = (i0[0] & ~sel) | (i1[0] & sel);
assign o[1] = (i0[1] & ~sel) | (i1[1] & sel);
assign o[2] = (i0[2] & ~sel) | (i1[2] & sel);
// Similarly for all 32 bits
assign o[31] = (i0[31] & ~sel) | (i1[31] & sel);
现在,您可能想知道,您需要复制同一条语句 32 次!!!!
所以你有一个替代方案:
genvar c;
generate
for (c = 0; c < 32; c = c + 1)
begin: test
assign o[c] = (i0[c] & ~sel) | (i1[c] & sel);
end
endgenerate
我需要通过 2-1 多路复用器创建 8*1 多路复用器。 这时,我的代码就可以工作了。但是,输出不正确。 电线 O_0.O_1,O_2,O_3 可以正常工作。 当 2-1 多路复用器读取选择器 [1] 和 [2] 时,它不会改变。 输出介于 I0 和 I1 之间。 你能帮我解决这个问题吗?或者直接告诉我错在哪里?
这不是斜体 `
module MUX_8_1 (i0 ,i1 ,i2 ,i3 ,i4 ,i5 ,i6 ,i7 , selectors , o_8 );
input [31:0] i0 ,i1 ,i2 ,i3 ,i4 ,i5 ,i6 ,i7;
input [2:0] selectors ;
output [31:0] o_8 ;
wire [31:0] o_0;
wire [31:0] o_1;
wire [31:0] o_2;
wire [31:0] o_3;
wire [31:0] o_4;
wire [31:0] o_5;
MUX_2_1 M1(.i0 (i0), .i1 (i1), .sel (selectors[0]),.o (o_0));
MUX_2_1 M2(.i0 (i2), .i1 (i3), .sel (selectors[0]),.o (o_1));
MUX_2_1 M3(.i0 (i4), .i1 (i5), .sel (selectors[0]),.o (o_2));
MUX_2_1 M4(.i0 (i6), .i1 (i7), .sel (selectors[0]),.o (o_3));
MUX_2_1 M5(.i0 (o_0), .i1 (o_1), .sel (selectors[1]),.o (o_4));
MUX_2_1 M6(.i0 (o_2), .i1 (o_3), .sel (selectors[1]),.o (o_5));
MUX_2_1 M7(.i0 (o_4), .i1 (o_5), .sel (selectors[2]),.o (o_8));
endmodule
module MUX_2_1 (i0 ,i1 ,sel ,o);
input [31:0] i0 ,i1;
input sel ;
output [31:0] o;
assign #19 o = (i0 & (~sel)) | (i1 & sel);
endmodule`
这不是斜体
module MUX_8_1_TB;
// Inputs
reg [31:0] i0;
reg [31:0] i1;
reg [31:0] i2;
reg [31:0] i3;
reg [31:0] i4;
reg [31:0] i5;
reg [31:0] i6;
reg [31:0] i7;
reg [2:0] selectors;
// Outputs
wire [31:0]o_8;
// Instantiate the Unit Under Test (UUT)
MUX_8_1 uut (
.i0(i0),
.i1(i1),
.i2(i2),
.i3(i3),
.i4(i4),
.i5(i5),
.i6(i6),
.i7(i7),
.selectors(selectors),
.o_8(o_8)
);
initial begin
i0 = 32'b1000;
i1 = 32'b1001;
i2 = 32'b1010;
i3 = 32'b1011;
i4 = 32'b1100;
i5 = 32'b1101;
i6 = 32'b1110;
i7 = 32'b1111;
selectors = 3'b000;#100;
selectors = 3'b001;#100;
selectors = 3'b010;#100;
selectors = 3'b011;#100;
selectors = 3'b100;#100;
selectors = 3'b101;#100;
selectors = 3'b110;#100;
selectors = 3'b111;#100;
end
endmodule
您的 2:1 Mux 逻辑似乎有缺陷。尝试
assign o = (sel) ? i1 : i0;
我认为,MUX_2_1 中的 assign 语句是不正确的。
您有 2 个选项可以纠正它。
第一个选项
您可以使用三元运算符(根据我的意见,这是更可取的)
assign o = (sel) ? (i1) : (i0);
第二个选项
看来,您写这段代码是考虑了 2*1 多路复用器的实际门级原理图或网表。
但要模仿实际的门级设计,您应该考虑对 i0、i1 网络的各个位进行与运算。
因此您的代码可能如下所示:
assign o[0] = (i0[0] & ~sel) | (i1[0] & sel);
assign o[1] = (i0[1] & ~sel) | (i1[1] & sel);
assign o[2] = (i0[2] & ~sel) | (i1[2] & sel);
// Similarly for all 32 bits
assign o[31] = (i0[31] & ~sel) | (i1[31] & sel);
现在,您可能想知道,您需要复制同一条语句 32 次!!!!
所以你有一个替代方案:
genvar c;
generate
for (c = 0; c < 32; c = c + 1)
begin: test
assign o[c] = (i0[c] & ~sel) | (i1[c] & sel);
end
endgenerate