加法器实现
input output inout的使用
计算每一位进位的公式为:
C i + 1 = G i + P i ⋅ C i C_{i+1}=G_i+P_i·C_i Ci+1=Gi+Pi⋅Ci
其中:
生成信号 P i = A i ⋅ B i P_i=A_i·B_i Pi=Ai⋅Bi
传播信号 G i = A i + B i G_i=A_i+B_i Gi=Ai+Bi
得到八位超前进位加法器如下
module add_ahead(a,b,sum,cin,cout);
input [7:0] a,b; //8位加法
input cin;
output [7:0] sum;
output cout;
wire [7:1]c; //各级进位输出
wire [8:0] g,p;
assign g=a&b;
assign p=a|b;
assign sum=g^p^{c,cin};
assign {cout,c}=g|(p&{c,cin});
endmodule
全加器
module full_add(a,b,sum,cin,cout);
input a,b,cin;
output sum,cout;
assign sum=a^b^c;
assign cout=a&b|(a^b)&c;
endmodule
利用八个全加器构成级联进位加法器
module bit8_serial_add(a,b,sum,cin,cout);
input wire[7:0] a,b;
input cin;
output reg[7:0] sum;
output cout;
full_add u1(a[0],b[0],sum[0],cin,cin1);
full_add u2(a[1],b[1],sum[1],cin1,cin2);
full_add u3(a[2],b[2],sum[2],cin2,cin3);
full_add u4(a[3],b[3],sum[3],cin3,cin4);
full_add u5(a[4],b[4],sum[4],cin4,cin5);
full_add u6(a[5],b[5],sum[5],cin5,cin6);
full_add u7(a[6],b[6],sum[6],cin6,cin7);
full_add u8(a[7],b[7],sum[7],cin7,cout);
endmodule
测试代码如下;
module add_tb();
reg [7:0] a,b;
wire [7:0] sum;
reg cin;
wire cout;
bit8_serial_add u1(a,b,sum,cin,cout);
initial
begin
a=8'b00000000;
b=8'b00000000;
cin=1'b0;
end
always #5 begin
a<=a+1'b1;
b<=b+1'b1;
cin<=~cin;
$display("%b,%b,%b,%b",a,b,cin,sum);
end
endmodule