门电路
与门(AND)
只有当所有输入都为 1 时,输出才为 1,否则输出为 0
符号为“∧”。例如,当我们需要检测某个人的身份证号和密码是否都正确时,就可以使用与门电路
A | B | Q |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
或门(OR)
只要有一个输入为 1,输出就为 1,否则输出为 0。符号为“∨”
例如,当我们需要检测某个人是否拥有某个权限时,就可以使用或门电路
A | B | Q |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
非门(NOT)
只有一个输入,输出与输入相反。符号为“¬”
例如,当我们需要判断某个人是否为非法用户时,就可以使用非门电路
A | Q |
---|---|
0 | 1 |
1 | 1 |
或非门(NOR)
当所有的输入都是0时,输出为1,其他情况输出为0
A | B | Q |
---|---|---|
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 0 |
异或门(XOR)
两个输入不同时,输出为1,否则输出为0
A | B | Q |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
与非门(NAND)
当所有的输入都是1时,输出为0,其他情况输出为1
A | B | Q |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
二进制加法
1 | 0 | 0 | 1 | |
+ | 0 | 1 | 0 | 1 |
进位 | 0 | 0 | 1 | 0 |
和 | 1 | 1 | 1 | 0 |
从表格可知 异或门就是一个最简单的整数加法,但是还需要一个记录进位的门电路
半加器
半机器其实就是 异或门 + 与门而得到的。为了记录进位状态特地添加的
全加器
半加器可以解决个位的加法问题,但是如果放到二位上来说,就不够用
二位用一个半加器不能计算完成的原因也很简单。因为二位除了一个加数和被加数之外,还需要加上来自个位的进位信号,一共需要三个数进行相加,才能得到结果
所以需要用两个半加器和一个或门,就能组成一个全加器
4位全加器
计算: 10(b1010) + 7(b0111) = 17(b10001)
图片中实现了对应的加法: 进位信号(Y4) . 累加值(s4) . 累加值(s3) . 累加值(s1) . 累加值(s0)
Verilog 实现 4位全加器
项目地址
4位全加器代码
module adder4(a, b, cin, sum, cout);
input [3:0] a, b; // 4位输入a和b
input cin; // 进位
output [3:0] sum; // 4位输出和
output cout; // 进位输出
wire [3:0] c; // 中间进位变量
full_adder fa0(a[0], b[0], cin, sum[0], c[0]); // 第一位的全加器
full_adder fa1(a[1], b[1], c[0], sum[1], c[1]); // 第二位的全加器
full_adder fa2(a[2], b[2], c[1], sum[2], c[2]); // 第三位的全加器
full_adder fa3(a[3], b[3], c[2], sum[3], cout); // 第四位的全加器
endmodule
module full_adder(a, b, cin, sum, cout);
input a, b, cin; // 输入a, b, 进位cin
output sum, cout; // 输出和sum和进位cout
assign sum = a ^ b ^ cin; // 异或运算
assign cout = (a & b) | (a & cin) | (b & cin); // 与、或运算
endmodule
测试文件
module adder4_tb;
reg [3:0] a;
reg [3:0] b;
reg cin;
wire [3:0] sum;
wire cout;
adder4 adder(a, b, cin, sum, cout);
initial begin
// 测试1:a=4'b0000, b=4'b0000, cin=0
a = 4'b0000;
b = 4'b0000;
cin = 0;
#10;
$display("a=%b, b=%b, sum=%b, cout=%b", a, b, sum, cout);
// 测试2:a=4'b1111, b=4'b1111, cin=0
a = 4'b1111;
b = 4'b1111;
cin = 0;
#10;
$display("a=%b, b=%b, sum=%b, cout=%b", a, b, sum, cout);
// 测试3:a=4'b1100, b=4'b1010, cin=1
a = 4'b1100;
b = 4'b1010;
cin = 1;
#10;
$display("a=%b, b=%b, sum=%b, cout=%b", a, b, sum, cout);
end
endmodule
测试结果
iverilog -o adder4 -y ./ adder4.v adder4_tb.v
vvp -n adder4 -lxt2
a=0000, b=0000, sum=0000, cout=0
a=1111, b=1111, sum=1110, cout=1
a=1100, b=1010, sum=0111, cout=1
标签:输出,全加器,cout,实现,sum,cin,进位
From: https://blog.csdn.net/weixin_40398522/article/details/137275881