【问题标题】:Verilog debug 8-1 Multiplexer by gatesVerilog debug 8-1 Multiplexer by gates
【发布时间】:2016-02-07 15:44:19
【问题描述】:

我需要通过 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

【问题讨论】:

    标签: verilog


    【解决方案1】:

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

    assign o = (sel) ? i1 : i0;
    

    【讨论】:

      【解决方案2】:

      我相信,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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多