Circuits;Arithmetic Circuits
要点:
1. 异或的理解:
异或(相异的时候进行或运算)真值表为
A | B | P |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
运算符为 " ^ "
2. 全加器与半加器的区别
半加器:两个数产生进位但不能够处理来自上一级的进位。真值表为:
a | b | cout | sum |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 |
全加器:除了两个数的输入,输入还包括上一级的进位值。自然输出也会有一个进位值。真值表为:
a | b | cout-in(上一级进位) | cout-out(进位) | sum |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
可以由两个半加器拼接成一个全加器
1.Half adder
例1:
解:
要求实现半加器
module top_module(
input a, b,
output cout, sum );
assign sum = a ^ b;
assign cout = a & b;
endmodule
或者直接实现
module top_module(
input a, b,
output cout, sum );
assign {cout,sum} = a + b;
endmoudle
2.Full adder
例1:
实现1bit 全加器
解:
直接想到的方法就是真值表得到逻辑式
a | b | cout-in(上一级进位) | cout-out(进位) | sum |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
module top_module(
input a, b, cin,
output cout, sum );
assign cout = (a & cin)|(a & b)|(b & cin);
assign sum = (~a & ~b & cin)|(~a & b& ~cin)|(a & ~b & ~cin)|(a & b & cin);
endmodule
更简单的方法 是使用位拼接符号
module top_module(
input a, b, cin,
output cout, sum );
assign {cout , sum} = a + b + cin;
endmodule
3.3-bit binary adder
例1:
解:
要求实现一个3-bit全加器
有三种解决的方法
- 反复使用的真值表转为逻辑表达式
- 采用位拼接符号{ }进行对位的操作
- 例化1-bit全加器,使用三个1-bit全加器实现目标
这里贴上模块操作Modules:Hierarchy
//方法3
module top_module(
input [2:0] a, b,
input cin,
output [2:0] cout,
output [2:0] sum
);
adder u1 (
.a(a[0]),
.b(b[0]),
.cin(cin),
.cout(cout[0]),
.sum(sum[0])
);
adder u2 (
.a(a[1]),
.b(b[1]),
.cin(cout[0]),
.cout(cout[1]),
.sum(sum[1])
);
adder u3 (
.a(a[2]),
.b(b[2]),
.cin(cout[1]),
.cout(cout[2]),
.sum(sum[2])
);
endmodule
module adder(//由于没有例化好的adder模块需要自己补上
input a,b,cin,
output cout,sum
);
assign {cout,sum} = a + b + cin;
endmodule
4.Adder
例1:
实现图中的4-bit加法器
解:
由于有四个全加器想到了上题使用的例化的方法
module top_module (
input [3:0] x,
input [3:0] y,
output [4:0] sum);
wire cout[2:0];
adder u1 (
.a(x[0]),
.b(y[0]),
.cin(1'b0),
.cout(cout[0]),
.sum(sum[0]),
);
adder u2 (
.a(x[1]),
.b(y[1]),
.cin(cout[0]),
.cout(cout[1]),
.sum(sum[1]),
);
adder u3 (
.a(x[2]),
.b(y[2]),
.cin(cout[1]),
.cout(cout[2]),
.sum(sum[2]),
);
adder u4 (
.a(x[3]),
.b(y[3]),
.cin(cout[2]),
.cout(sum[4]),
.sum(sum[3]),
);
endmodule
module adder (//给出全加器模块
input a,b,cin,
output cout,sum
);
assign {cout,sum} = a + b + cin;
endmodule
看了知乎上的解答,可以直接使用assign sum = x + y 如果产生进位会直接扩展成为五位二进制数 (- _ -)
module top_module (
input [3:0] x,
input [3:0] y,
output [4:0] sum
);
assign sum = x + y;
endmodule
5.Signed addition overflow
例1:
解:
本题希望实现signed integer(有符号数)的加减并判断溢出,较难理解的是有关overflow的判断,关于有符号数的规则参考真 OO无双
module top_module (
input [7:0] a,
input [7:0] b,
output [7:0] s,
output overflow
);
wire[8:0]t;
assign t = {a[7],a} + {b[7],b} ;
assign s = t[7:0];
assign overflow = t[8] ^ t[7];
endmodule
本题任然存在较多疑问
6.100-bit binary adder
例1:
实现100bit全加器
解:
直接采用位拼接运算
module top_module(
input [99:0] a, b,
input cin,
output cout,
output [99:0] sum );
assign {cout,sum} = a + b + cin;
endmodule
7.4-digit BCD adder
例1:
题目中已经提供了BCD加法器bcd_fadd,需要实现一个16-bit的BCD加法器
解:
只需要简单例化4次就可以解决问题
module top_module(
input [15:0] a, b,
input cin,
output cout,
output [15:0] sum );
wire [3:0] cout_temp;
bcd_fadd u1(
.a(a[3:0]),
.b(b[3:0]),
.cin(cin),
.cout(cout_temp[0]),
.sum(sum[3:0])
);
bcd_fadd u2(
.a(a[7:4]),
.b(b[7:4]),
.cin(cout_temp[0]),
.cout(cout_temp[1]),
.sum(sum[7:4])
);
bcd_fadd u3(
.a(a[11:8]),
.b(b[11:8]),
.cin(cout_temp[1]),
.cout(cout_temp[2]),
.sum(sum[11:8])
);
bcd_fadd u4(
.a(a[15:12]),
.b(b[15:12]),
.cin(cout_temp[2]),
.cout(cout_temp[3]),
.sum(sum[15:12])
);
assign cout = cout_temp[3];
endmodule
7. 问题
5