首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ALU的进位故障(Verilog)

ALU的进位故障(Verilog)
EN

Stack Overflow用户
提问于 2018-04-11 21:15:05
回答 1查看 184关注 0票数 0

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

我有这个4x1的MUX:

代码语言:javascript
复制
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

这个完整的加法器:

代码语言:javascript
复制
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的算术单元:

代码语言:javascript
复制
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,仅仅是因为它取决于现在的进位和进位。我做了一个功能模拟,并将其与以前的算术单元进行了比较,结果表明:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-11 23:13:29

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

  1. 在您的AU模块中,您已经将mux输出声明为muxNW (类似于mux1W),但是您可以将它们作为对Full_Adder as muxNw (mux1w)的输入,小写是'W‘,而不是大写'w’。因此,如果没有显式声明变量,则大多数工具都会推断出一个wire。将`default_nettype none添加到所有文件的顶部,以避免这种行为。
  2. 虽然没有更多的信息,我不能肯定,我认为您的S1S0线混淆在您的MUX_4x1中。通常,S0将选择LSb,S1选择MSb,因此{S1, S0}等于输入号。例如,S1 = 1'b1S0 = 1'b0将选择I2,而在当前设计中它将选择I1

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

代码语言:javascript
复制
Full_Adder fa1(.A(A), .B(mux1W), .Cin(Cin), .S(G0), .Cout(C0_out));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49784585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档