Verilog通过门调试8-1多路复用器

时间:2016-02-06 23:50:11

标签: verilog

我需要通过2-1多路复用器创建8 * 1多路复用器。 这时,我的代码可以工作。但是,输出不正确。 并且导线O_0.O_1,O_2,O_3可以正常工作。 当2-1多路复用器读取选择器[1]和[2]时,它不会改变。 输出介于I0和I1之间。 你能帮我解决这个问题吗?或者只是告诉我错误在哪里?

这不是斜体 `

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

这不是斜体

gotoIf

2 个答案:

答案 0 :(得分:1)

你的2:1 Mux逻辑似乎有缺陷。试试

assign o = (sel) ? i1 : i0;

答案 1 :(得分:0)

我相信,MUX_2_1中的assign语句不合适。

您有2个选项可以纠正它。

第一个选项

您可以使用三元运算符(根据我的观点,这是更优选的)

assign o = (sel) ? (i1) : (i0);

第二个选项

看来你编写了这段代码,考虑了2 * 1多路复用器的实际门级原理图或网表。

但是为了模仿实际的门级设计,你应该考虑对i0,i1网的各个位进行AND运算。

所以你的代码可能如下所示:

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