26.调用门原件实现的1位半加器
module half_add1(
input a,
input b,
output sum,
output cout
);
and (cout,a,b);
xor (sum,a,b);
endmodule
半加器电路是指对两个输入数据位相加,输出一个结果位和进位,没有进位输入的加法器电路。 一位半加器是实现两个一位二进制数的加法运算电路。
A和B是相加的两个数,S是半加和数,C是进位数。
所谓半加就是不考虑进位的加法,它的真值表如下 (见表):
表中:
逻辑表达式: ; 。
半加器的逻辑实现
27.数据流方式描述1位半加器
module half_add2(
input a,
input b,
output sum,
output count
);
assign sum = a ^ b;
assign count = a & b;
endmodule
28.采用行为描述的1位半加器
module half_add3(
input a,
input b,
output sum,
output cout
);
always@(a or b)begin
case({a,b})
2'b00 : begin
sum = 0;
cout = 0;
end
2'b01 : begin
sum = 1;
cout = 0;
end
2'b10 : begin
sum = 1;
cout = 0;
end
2'b11 : begin
sum = 0;
cout = 1;
end
end
endmodule
29.使用行为描述的1位半加器
module half_add3(
input a,
input b,
output sum,
output cout
);
always@(a or b)begin
sum = a ^ b;
cout = a & b;
end
endmodule
30. 调用门原件实现1位全加器
module full_add1(
input a,
input b,
input cin,
output sum,
output cout
);
wire s1,m1,m2,m3;
and (m1,a,b),
(m2,b,cin),
(m3,a,cin);
xor (s1,a,b),
(sum,s1,cin);
or (cout,m1,m2,m3);
endmodule
全加器英语名称为full-adder,是用门电路实现两个二进制数相加并求出和的组合线路,称为一位全加器。一位全加器可以处理低位进位,并输出本位加法进位。多个一位全加器进行级联可以得到多位全加器。
一位全加器的真值表如下图,其中Ai为被加数,Bi为加数,相邻低位来的进位数为Ci-1,输出本位和为Si。向相邻高位进位数为Ci。
一位全加器的表达式如下:
Si=Ai⊕Bi⊕Ci-1
第二个表达式也可用一个异或门来代替或门对其中两个输入信号进行求和:
31.数据流描述的1位全加器
module full_add2(
input a,
input b,
input cin,
output sum,
output cout
);
assign sum = a ^ b ^ cin;
assign cout = (a & b)|(b & cin)|(cin & a);
endmodule
32.1位全加器
module full_add1(
input a,
input b,
input cin,
output sum,
output cout
);
assign{cout,sum} = a + b + cin;
endmodule
33.行为描述的1位全加器
modulee full_add4(
input a,
input b,
input cin,
output reg sum,
output reg cout
);
reg m1,m2,m3;
always@(a or b or cin)begin
sum = (a ^ b) ^ cin;
m1 = a & b;
m2 = b& cin;
m3 = a& cin;
cout = (m1 | m2) | m3;
end
endmodule
33.结构描述的4位级联全加器
`include "full_add1.v"
module add4_1(
input [3:0] a,
input [3:0] b,
input cin,
output [3:0]sum,
output cout
);
wire cout1;
wire cout2;
wire cout3;
full_add1 f0(
.a(a[0]),
.b(b[0]),
.cin(cin),
.sum(sum[0]),
.cout(cout1)
);
full_add1 f1(
.a(a[1]),
.b(b[1]),
.cin(cout1),
.sum(sum[1]),
.cout(cout2)
);
full_add1 f2(
.a(a[2]),
.b(b[2]),
.cin(cout2),
.sum(sum[2]),
.cout(cout3)
);
full_add1 f3(
.a(a[3]),
.b(b[3]),
.cin(cout3),
.sum(sum[3]),
.cout(cout)
);
endmodule
34.数据流描述4位全加器
module add4_2(
input [3:0] a,
input [3:0] b,
input cin,
output [3:0] sum,
output cout
);
assign {cout,sum} = a + b + cin;
endmodule
35.行为描述的4位全加器
module add4_3(
input [3:0] a,
input [3:0] b,
input cin,
output reg [3:0] sum,
output reg cout
);
always@(a or b or cin)begin
{cout,sum} = a + b + cin;
end
endmodule