繁体   English   中英

尝试实现32位加法器时出错

[英]error trying to implement 32-bit adder

我正在尝试使用verilog将两个32位数字相加。但是我在resut中得到了很多不在乎的地方。 32位加法器使用4个8位加法器。一个8位加法器使用1位Full-Adder.FAdder使用3到8个解码器。 这是我的代码-

module Decoder(D,x,y,z);
    input x,y,z;
    output [0:7] D;
    wire xn,yn,zn;

    not n1(xn,x);
    not n2(yn,y);
    not n3(zn,z);

    and a1(D[0],xn,yn,zn);
    and a2(D[1],xn,yn,z);
    and a3(D[2],xn,y,zn);
    and a4(D[3],xn,y,z);
    and a5(D[4],x,yn,zn);
    and a6(D[5],x,yn,z);
    and a7(D[6],x,y,zn);
    and a8(D[7],x,y,z);
endmodule

module FAdder(S,C,x,y,z);
    input x,y,z;
    output S,C;
    wire [0:7] D;

    Decoder dec(D,x,y,z);

    assign S= D[1] | D[2] | D[4] | D[7];
    assign C= D[3] | D[5] | D[6] | D[7];

endmodule


module eightbitAdder(S,Carry,in1,in2,z);
    input [7:0] in1;
    input [7:0] in2;
    input z;
    output [7:0] S;
    output Carry;
    wire  C[7:0]; 
    assign z=0;
    FAdder F1(S[0],C[0],in1[0],in2[0],z);
    FAdder F2(S[1],C[1],in1[1],in2[1],C[0]);
    FAdder F3(S[2],C[2],in1[2],in2[2],C[1]);
    FAdder F4(S[3],C[3],in1[3],in2[3],C[2]);
    FAdder F5(S[4],C[4],in1[4],in2[4],C[3]);
    FAdder F6(S[5],C[5],in1[5],in2[5],C[4]);
    FAdder F7(S[6],C[6],in1[6],in2[6],C[5]);
    FAdder F8(S[7],C[7],in1[7],in2[7],C[6]);
    assign Carry=C[7];
endmodule

module t32bitadder(S,Carry1,in1,in2);
    input [31:0] in1,in2;
    output [31:0] S;
    output Carry1;
    wire [3:0] C1;
    wire initCarry;
    assign initCarry=0;
    eightbitAdder e1(S[7:0],C1[0],in1[7:0],in2[7:0],initCarry);
    eightbitAdder e2(S[15:8],C1[1],in1[15:8],in2[15:8],C1[0]);
    eightbitAdder e3(S[23:16],C1[2],in1[23:16],in2[23:16],C1[1]);
    eightbitAdder e4(S[31:24],C1[3],in1[31:24],in2[31:24],C1[2]);
    assign Carry1=C1[3];
endmodule

module testbench32bitAdder;
   reg [31:0] in1,in2;
   reg z;
   wire [31:0] S;
   wire C;
   t32bitadder Al(S,C,in1,in2);

   initial
      $monitor(,$time,"in1=%b,in2=%b,S=%b,C=%b",in1,in2,S,C);

   initial
      begin
         #0 in1=32'b00000001000000010000000110000001;in2=32'b00000001000000010000000110000001;
         #4 in1=32'b11000001100000011000000100000001;in2=32'b11000001100000010000000100000001;
         #4 in1=32'b00000001000000010000000100000001;in2=32'b10000001000000010000000100000001;


      end

这就是我得到的结果-

#                     0in1=00000001000000010000000110000001,in2=00000001000000010000000110000001,S=0000001000000010000000xx00000010,C=0
#                     4in1=11000001100000011000000100000001,in2=11000001100000010000000100000001,S=100000xx000000101000001000000010,C=1
#                     8in1=00000001000000010000000100000001,in2=10000001000000010000000100000001,S=10000010000000100000001000000010,C=0

注意第二个输出中的dont-care。 这是因为C1 [2]变为X 谁能指出我的错误?

vipin是正确的, assign z=0; eightbitAdder模块中的行导致“ eightbitAdder 在您的测试中,第一个8位加法器的进位为1,它将尝试将下一个8位加法器的z输入设置为1,但这与z的连续分配为0冲突,因此导致z = 1'bx 这种无关紧要的传播会通过第一个FA传播,并且也会影响第二个FA,这将导致结果的第8个和第9个地方(第一个位为第0位)中的2个无关紧要。 在第二个测试中,您的第三个和最终的8位加法器之间发生了相同的事情。 您的第三个测试不会在8位加法器之间传播进位,因此不会产生无关位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM