进位ALU(Verilog)故障

进位ALU(Verilog)故障,verilog,Verilog,作为一项任务,首先在ALtera Quartus中使用常规、点击和拖动门等制作一个4位ALU。现在,我们正在使用Verilog实现它 我有这个4x1多路复用器: module MUX_4x1(I0, I1, I2, I3, S1, S0, H); input I0, I1, I2, I3, S1, S0; output H; wire mux1, mux2; MUX_2x1 mux_1(I0, I1, S1, mux1); MUX_2x1 mux_2(I2

作为一项任务,首先在ALtera Quartus中使用常规、点击和拖动门等制作一个4位ALU。现在,我们正在使用Verilog实现它

我有这个4x1多路复用器:

module MUX_4x1(I0, I1, I2, I3, S1, S0, H);
    input I0, I1, I2, I3, S1, S0;
    output H;
    wire mux1, mux2;
    MUX_2x1 mux_1(I0, I1, S1, mux1);
    MUX_2x1 mux_2(I2, I3, S1, mux2);
    MUX_2x1 mux_3(mux1, mux2, S0, H);
endmodule
此全加器:

module Full_Adder(A, B, Cin, S, Cout);
    input A, B, Cin;
    output S, Cout;
    assign S = (A ^ B) ^ Cin;
    assign Cout = ((A ^ B) & Cin) | (A & B);
endmodule
最后,ALU的算术单元:

module AU(A3, A2, A1, A0, B3, B2, B1, B0, S1, S0, G3, G2, G1, G0, Carry, N, V);
  input A3, A2, A1, A0, B3, B2, B1, B0, S1, S0;
  output G3, G2, G1, G0, Carry, N, V;
  wire mux1W, mux2W, mux3W, mux4W, Cin, C0_out, C1_out, C2_out, C3_out;
  MUX_4x1 mux1(B0, !B0, 1'b1, 1'b1, S1, S0, mux1W);
  MUX_4x1 mux2(B1, !B1, 1'b0, 1'b1, S1, S0, mux2W);
  MUX_4x1 mux3(B2, !B2, 1'b0, 1'b1, S1, S0, mux3W);
  MUX_4x1 mux4(B3, !B3, 1'b0, 1'b1, S1, S0, mux4W);
  assign Cin = (!S1 & S0);
  Full_Adder fAdder1(A0, mux1w, Cin, G0, C0_out);
  Full_Adder fAdder2(A1, mux2w, C0_out, G1, C1_out);
  Full_Adder fAdder3(A2, mux3w, C1_out, G2, C2_out);
  Full_Adder fAdder4(A3, mux4w, C2_out, G3, C3_out);
  assign Carry = C3_out;
  assign N = G3;
  assign V = 1'b0;
endmodule
我将V(溢出)设置为0,只是因为它取决于进位,进位现在已断开。我做了一个功能模拟,并将其与之前的算术单元进行了比较,进位相差很大:


我想不出我的代码出了什么问题?我在想也许我需要对电线做些什么,但就是想不出来。

假设您的
MUX_2x1
的代码是正确的,我注意到您的代码中有两个地方可能是错误的根源:

  • AU
    模块中,您已将mux输出声明为
    muxNW
    (如
    mux1W
    ),但您将其作为
    Full_加法器的输入,作为
    muxNW
    mux1W
    )使用小写字母“w”,而不是大写字母“w”。因此,网络连接不正确,因为如果未明确声明变量,大多数工具都会推断出
    wire
    。将
    `default\u nettype none
    添加到所有文件的顶部以避免此行为

  • 虽然没有更多信息,但我不能确定,我认为您的
    S1
    S0
    行在
    MUX\u 4x1
    中混淆了。通常,
    S0
    将选择LSb和
    S1
    MSb,因此
    {S1,S0}
    等于输入的数字。例如,
    S1=1'b1
    S0=1'b0
    将选择
    I2
    ,而在当前设计中,它将选择
    I1

  • 另一个建议是使用显式端口分配。虽然您没有犯我在您提供的代码中看到的任何错误,但使用隐式连接很容易出错。使用显式连接的示例:

    Full_Adder fa1(.A(A), .B(mux1W), .Cin(Cin), .S(G0), .Cout(C0_out));
    

    假设您的
    MUX_2x1
    的代码是正确的,我注意到您的代码中有两点可能是错误的根源:

  • AU
    模块中,您已将mux输出声明为
    muxNW
    (如
    mux1W
    ),但您将其作为
    Full_加法器的输入,作为
    muxNW
    mux1W
    )使用小写字母“w”,而不是大写字母“w”。因此,网络连接不正确,因为如果未明确声明变量,大多数工具都会推断出
    wire
    。将
    `default\u nettype none
    添加到所有文件的顶部以避免此行为

  • 虽然没有更多信息,但我不能确定,我认为您的
    S1
    S0
    行在
    MUX\u 4x1
    中混淆了。通常,
    S0
    将选择LSb和
    S1
    MSb,因此
    {S1,S0}
    等于输入的数字。例如,
    S1=1'b1
    S0=1'b0
    将选择
    I2
    ,而在当前设计中,它将选择
    I1

  • 另一个建议是使用显式端口分配。虽然您没有犯我在您提供的代码中看到的任何错误,但使用隐式连接很容易出错。使用显式连接的示例:

    Full_Adder fa1(.A(A), .B(mux1W), .Cin(Cin), .S(G0), .Cout(C0_out));
    

    请不要在代码中使用图像。有人可能想剪切并粘贴它来解决您的问题。对于图像,您获得答案的机会较低。很抱歉,我已将其更改。请不要在代码中使用图像。有人可能想剪切并粘贴它来解决您的问题。有了图像,你得到答案的机会就少了。对不起,我改了。