4位全加器的实现

门电路

在这里插入图片描述

与门(AND)

只有当所有输入都为 1 时,输出才为 1,否则输出为 0

符号为“∧”。例如,当我们需要检测某个人的身份证号和密码是否都正确时,就可以使用与门电路

ABQ
000
010
100
111
或门(OR)

只要有一个输入为 1,输出就为 1,否则输出为 0。符号为“∨”

例如,当我们需要检测某个人是否拥有某个权限时,就可以使用或门电路

ABQ
000
011
101
111
非门(NOT)

只有一个输入,输出与输入相反。符号为“¬”

例如,当我们需要判断某个人是否为非法用户时,就可以使用非门电路

AQ
01
11
或非门(NOR)

当所有的输入都是0时,输出为1,其他情况输出为0

ABQ
001
010
100
110
异或门(XOR)

两个输入不同时,输出为1,否则输出为0

ABQ
000
011
101
110
与非门(NAND)

当所有的输入都是1时,输出为0,其他情况输出为1

ABQ
001
011
101
110

二进制加法

1001
+0101
进位0010
1110

从表格可知 异或门就是一个最简单的整数加法,但是还需要一个记录进位的门电路

半加器

半机器其实就是 异或门 + 与门而得到的。为了记录进位状态特地添加的
@w=600

全加器

半加器可以解决个位的加法问题,但是如果放到二位上来说,就不够用

二位用一个半加器不能计算完成的原因也很简单。因为二位除了一个加数和被加数之外,还需要加上来自个位的进位信号,一共需要三个数进行相加,才能得到结果

所以需要用两个半加器和一个或门,就能组成一个全加器
在这里插入图片描述

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
  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值