定义
半加器(Half Adder)是一种用于执行二进制数相加的简单逻辑电路。它可以将两个输入位的和(Sum)和进位(Carry)计算出来。
半加器有两个输入:A 和 B,分别代表要相加的两个二进制位。它的输出由两个部分组成:
1.和(Sum):表示 A + B 的个位数结果。
2.进位(Carry):表示 A + B 的十位数结果是否需要进位到下一位。
逻辑表达式
根据真值表可知,当 A 和 B 的输入都为 0 时,Sum 和 Carry 均为 0;当 A 和 B 的输入中有一个为 1 时,Sum 为 1,Carry 为 0;当 A 和 B 的输入都为 1 时,Sum 为 0,Carry 为 1。所以其逻辑表达式为:
Sum = A ^ B
Carry = A & B
逻辑电路
module half_adder(
input wire a_in ,
input wire b_in ,
output wire count ,//进位
output wire sum //半加和数
);
assign count = a_in & b_in;
assign sum = a_in ^ b_in;
// assign = {count,sum} = a_in + b_in ;
endmodule
`timescale 1ns/1ns
module tb_half_adder();
reg in_a;
reg in_b;
wire count;
wire sum;
initial begin
in_a = 0;
in_b = 0;
#10;
repeat(100)begin
in_a =($random);
in_b =($random);
#10;
end
#10;
$stop;
end
half_adder u_half_adder(
.a_in (in_a),
.b_in (in_b),
.count (count),//进位
.sum (sum) //半加和数
);
endmodule
module full_adder(
input wire a_in,
input wire b_in,
input wire c_in,
output wire count,
output wire sum
);
// reg count_r;
// reg sum_r;
assign sum = a_in ^ b_in ^ c_in;
assign count = (a_in ^ b_in)&c_in | a_in&b_in;
//{count , sum} = a_in + b_in + c_in
endmodule
module full_adder(
input wire a_in,
input wire b_in,
input wire c_in,
output wire count,
output wire sum
);
// reg count_r;
// reg sum_r;
assign sum = a_in ^ b_in ^ c_in;
assign count = (a_in ^ b_in)&c_in | a_in&b_in;
//{count , sum} = a_in + b_in + c_in
endmodule
module N_adder #(parameter N = 2) (
input [N-1:0] a_in,
input [N-1:0] b_in,
input cin,
output [N-1:0] sum,
output count
);
wire [N:0] c;
genvar i;
generate
for (i = 0;i<N ; i=i+1)
begin : adder_full_n
full_adder full_adder_inst (
.a_in (a_in[i]),
.b_in (b_in[i]),
.c_in (c[i]),
.sum (sum[i]),
.count (c[i+1])
);
end
endgenerate
assign c[0] = cin;
assign count = c[N];
endmodule
`timescale 1ns/1ns
module N_adder_tb ();
parameter N = 5;
reg [N-1:0] a_in;
reg [N-1:0] b_in;
reg cin;
wire [N-1:0] sum;
wire count;
initial begin
cin = 1'b0;
#5;
repeat(20)begin
a_in =($random)%5;
b_in =($random)%5;
#(5);
end
#(10)
$stop;
end
N_adder #(.N(N)) N_adder_inst (
.a_in (a_in),
.b_in (b_in),
.cin (cin),
.sum (sum),
.count (count)
);
endmodule
对于全加器,还是比较好理解的,主要是对组合逻辑的考察和理解,只要对组合逻辑有一定的理解我相信全加器还是比较好理解的。