module adder32(input [31:0] a,
input [31:0] b,
input clk,
input ci,
output x,
output co,
input y,
output wire [3:0] an, //片选
output wire [6:0] seg //段选
);
wire [31:0] count;
wire [3:0]a1;//显示a
wire [3:0]b1;//显示b
wire [31:0]s;//运算结果的补码
wire [31:0]aa;//a的补码
wire [31:0]bb;//b的补码
wire [31:0]gg;//根据是否加减改变b的符号
wire [31:0]ff;//运算结果
wire [3:0]jj;//七段数码管显示结果
assign a1[0]=a[0];
assign a1[1]=a[1];
assign a1[2]=a[2];
assign a1[3]=a[3];//显示第一个操作数
assign b1[0]=b[0];//显示第二个操作数
assign b1[1]=b[1];
assign b1[2]=b[2];
assign b1[3]=b[3];
comp_conv f1(a,aa);//求a的补码
assign gg=y?{~b[31],b[30:0]}:b;
comp_conv f2(gg,bb);//求b的补码
add i0(aa[0],bb[0],ci,s[0],count[0]);//按位相加
add i1(aa[1],bb[1],count[0],s[1],count[1]);
add i2(aa[2],bb[2],count[1],s[2],count[2]);
add i3(aa[3],bb[3],count[2],s[3],count[3]);
add i4(aa[4],bb[4],count[3],s[4],count[4]);
//以此类推
test f4(s,ff);
assign x=ff[31];
assign jj[0]=ff[0];
assign jj[1]=ff[1];
assign jj[2]=ff[2];
assign jj[3]=ff[3];
assign co=count[31]^count[30];
DigitalDisplay f3(clk,a1,b1,jj,an,seg);//七段数码管调用
endmodule
module add(input a ,input b, input ci,output s,output co);//一位全加器
assign {co, s} = a + b + ci;
endmodule
module comp_conv( //补码运算
input[31:0]a,
output[31:0]a_comp
);
assign a_comp=a[31]?{a[31],~a[30:0]+1}:a;//(方法3)不用中间变量y,直接得到a_comp结果
//逻辑不太复杂时,用位拼接,二选一
endmodule
module test(input [31:0] a,//补码转原码
output [31:0]b
);
assign b=a[31]?{a[31],~(a[30:0]-1)}:a;
endmodule
module adder(
input [3:0] aa,
input [3:0] bb,
input clk,
input ci,
output x,
output co,
output z,
input y,
output wire [3:0] an, //片选
output wire [6:0] seg //段选 );
);
adder32 U1({28'b0,aa[3:0]},
{28'b0,bb[3:0]},
clk, ci,x,co,z,y,
an, //片选
seg //段选
);
endmodule
有符号的32位加减法器(改进版)
最新推荐文章于 2024-08-27 15:01:57 发布