加法器实现 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