数字IC习题1--输入一个8bit数,输出其中1的个数。如果只能使用1bit全加器,最少需要几个
【问题分析】
全加器(full_adder):是用门电路实现两个二进制数相加并求出和的组合线路,称为一位全加器,一位全加器可以处理低位进位,并输出本位加法进位。多个一位全加器进行级联可以得到多位全加器。
全加器输入信号有三个 dina、dinb、cin,输出的信号有两个sum、cout。
dina和dinb是输入信号,cin是低位进位,sum是dina和dinb当前位上的和,cout是dina和dinb相加后的高进位。
例如dina = 1,dinb = 0,cin = 1, sum = 0,cout = 1
1bit的全加器的dina、dinb、sum信号的长度是1位。
2bit的全加器可以由两个1bit的全加器连接组成,2bit的全加器的dina、dinb、sum信号的长度是2位。
3bit的全加器可以由一个1bit的全加器+一个2bit的全加器连接组成,也就是三个1bit的全加器,3bit的全加器的dina、dinb、sum信号的长度是3位。
1bit的全加器
module full_adder_one( input dina, input dinb, input cin, output sum, output cout ); assign {cout,sum} = dina + dinb + cin; endmodule
2bit的全加器
module adder2( input[1:0] dina, input[1:0] dinb, input cin, output[1:0] sum, output cout ); wire co; full_adder_one u0( .dina (dina[0]), .dinb (dinb[0]), .cin (cin), .sum (sum[0]), .cout (co) ) full_adder_one u1( .dina (dina[1]), .dinb (dinb[1]), .cin (co), .sum (sum[1]), .cout (cout) ) endmodule
3bit的全加器
module adder3( input[2:0] dina, input[2:0] dinb, input cin, output[2:0] sum, output cout ); wire co; full_adder_one u0( .dina (dina[0]), .dinb (dinb[0]), .cin (cin), .sum (sum[0]), .cout (co) ) adder2 u1( .dina (dina[2:1]), .dinb (dinb[2:1]), .cin (co), .sum (sum[2:1]), .cout (cout) ) endmodule
图中所示,两个1bit全加器,一个2bit全加器,一个3bit全加器。即7个1bit全加器。
【最终代码】
module number_one( input clk, input rest_n; input [7:0] din; output [3:0] num_one; ); wire [1:0] sum0; wire [1:0] sum1; wire [2:0] sum2; full_adder_one u0( .dina (din[0]), .dinb (din[1]), .cin (din[2]), .sum (sum0[0]), .cout (sum0[1]) ); full_adder_one u1( .dina (din[3]), .dinb (din[4]), .cin (din[5]), .sum (sum1[0]), .cout (sum1[1]) ); adder2 u3( .dina (sum0), .dinb (sum1), .cin (din[6]), .sum (sum2[1:0]), .cout (sum2[2]) ); adder3 u2( .dina (sum2), .dinb (0), .cin (din[7]), .sum (num_one[2:0]), .cout (num_one[3]) ); endmodule module full_adder_one( input dina, input dinb, input cin, output sum, output cout ); assign {cout,sum} = dina + dinb + cin; endmodule module adder2( input[1:0] dina, input[1:0] dinb, input cin, output[1:0] sum, output cout ); wire co; full_adder_one u0( .dina (dina[0]), .dinb (dinb[0]), .cin (cin), .sum (sum[0]), .cout (co) ) full_adder_one u1( .dina (dina[1]), .dinb (dinb[1]), .cin (co), .sum (sum[1]), .cout (cout) ) endmodule module adder3( input[2:0] dina, input[2:0] dinb, input cin, output[2:0] sum, output cout ); wire co; full_adder_one u0( .dina (dina[0]), .dinb (dinb[0]), .cin (cin), .sum (sum[0]), .cout (co) ) adder2 u1( .dina (dina[2:1]), .dinb (dinb[2:1]), .cin (co), .sum (sum[2:1]), .cout (cout) ) endmodule