门电路

在这里插入图片描述

与门(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

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

半加器

半机器其实就是 异或门 + 与门而得到的。为了记录进位状态特地添加的
@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
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐