使用Verilog硬件描述语言练习加法器设计

描述

从今天开始新的一章-Circuits,包括基本逻辑威廉希尔官方网站 、时序威廉希尔官方网站 、组合威廉希尔官方网站 等。

今天更新整个算术威廉希尔官方网站 -加法器一小节题目,包括半加器,全加器等各种加法器。

半加器和全加器的区别

半加器

半加器是由一个异或门和一个与门连接而成的组合逻辑威廉希尔官方网站 。半加器威廉希尔官方网站 有两个输入:A 和 B,它们将两个输入数字相加并产生一个进位和一个和。

加法器


异或门的输出是两个数的和,而与门的输出是进位。进位加法不会转发,因为没有逻辑门来处理它。因此,这被称为半加器威廉希尔官方网站 。

逻辑表达式:

 

Sum = A XOR B
Carry = A AND B 

 

真值表:

加法器

全加器

全加器是由两个异或门、两个与门和一个或门组成的威廉希尔官方网站 。全加器是将三个输入相加并产生两个输出的加法器,前两个输入是 A 和 B,第三个输入是进位C-IN 的输入。输出进位指定为 C-OUT,正常输出指定为 S,即 SUM。

加法器

异或门得到的方程是二进制数字的和。而AND门得到的输出是加法得到的进位。

真值表:

加法器

逻辑表达式:

 

SUM = (A XOR B) XOR Cin = (A ⊕ B) ⊕ Cin
CARRY-OUT = A AND B OR Cin(A XOR B) = A.B + Cin(A ⊕ B) 

 

半加器和全加器的区别:

姓名 参数 半加器 全加器
1 描述 半加法器是一个组合逻辑威廉希尔官方网站 ,将两个 1 位数字相加。半加器产生两个输入的和。 全加器是一种组合逻辑威廉希尔官方网站 ,它对三个一位二进制数执行加法运算。全加器产生三个输入和进位值的总和。
2 上一次进位 不使用前一个进位。 使用前一个进位。
3 输入 在半加器中,有两个输入位(A,B)。 在全加器中,有三个输入位(A、B、C-in)。
4 输出 输出是两位和 和Carry 。 输出是 2 位的和和 3 位输入的Carry。
5 用作 半加器威廉希尔官方网站 不能以与全加器威廉希尔官方网站 相同的方式使用。 可以使用全加器威廉希尔官方网站 代替半加器威廉希尔官方网站 。
6 特征 它简单易行 全加器的设计并不像半加器那么简单。
7 逻辑表达式 半加器的逻辑表达式为: S=a⊕b ; C=a*b。 全加器的逻辑表达式为:S=a⊕b⊕Cin;Cout=(ab)+(Cin(a⊕b))。
8 逻辑门 由一个异或门和一个与门组成。 由两个异或门、两个 AND 门和一个 OR 门组成。
9 应用 用于计算器,计算机,数字测量设备等。 用于多位加法,数字处理器等。

下面开始我们的题目,对于加法器有个更深刻的认识~

Problem 65-Hadd

题目说明

创建一个半加法器。半加器将两位相加(没有进位)并产生和和进位(sum and carry-out)。

模块端口声明

 

module top_module( 
    input a, b,
    output cout, sum );

 

题目解析

根据半加器的逻辑表达式处理即可。

 

module top_module( 
    input logic a, b,
    output logic cout, sum 
    );
    assign cout = a & b;
    assign sum = a ^ b;
endmodule

加法器

 

点击Submit,等待一会就能看到下图结果:

加法器

注意图中无参考波形。

这一题就结束了。

Problem 66-Fadd

题目说明

创建一个全加器。全加器将三位相加(包括进位)并产生和和进位。

模块端口声明

 

module top_module( 
    input a, b, cin,
    output cout, sum );

 

题目解析

根据全加器的逻辑表达式处理即可。

简单解答

 

module top_module( 
    input logic a, b, cin,
    output logic cout, sum );

    assign sum = a^b^cin ;
    assign cout = a&b | cin&(a^b) ;
endmodule

 

加法器

点击Submit,等待一会就能看到下图结果:

加法器

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 67-Adder3

题目说明

现在已经知道如何构建一个全加器,例化 3 个实例来创建一个 3 位二进制波纹进位加法器(ripple-carry adder)。加法器将两个 3 位数字和一个进位相加产生一个 3 位和和进位。为了鼓励例化全加器,还要输出纹波进位加法器中每个全加器的进位。cout[2] 是最后一个全加器的最终进位,也是通常看到的进位。

模块端口声明

 

module top_module( 
    input [2:0] a, b,
    input cin,
    output [2:0] cout,
    output [2:0] sum );

 

题目解析

例化正常的全加器,然后处理好进位关系即可,这种波纹进位加法器的特点需要理解,最后注意我们要把上一题写的全加器附在后面。

 

module top_module( 
    input logic [2:0] a, b,
    input logic cin,
    output logic [2:0] cout,
    output logic [2:0] sum 
    );
    
    full_adder f_adder_u1 (.a(a[0]),
                      .b(b[0]), 
                      .cin(cin),
                      .cout(cout[0]), 
                      .sum(sum[0])
                     ); 
    
    full_adder f_adder_u2 (.a(a[1]),
                          .b(b[1]), 
                          .cin(cout[0]), 
                          .cout(cout[1]), 
                          .sum(sum[1]) 
                         ); 
    
    full_adder f_adder_u3 (.a(a[2]), 
                          .b(b[2]), 
                          .cin(cout[1]), 
                          .cout(cout[2]), 
                          .sum(sum[2]) 
                         ); 

    
endmodule
module full_adder( input logic a, 
                   input logic b, 
                   input logic cin, 
                   output logic cout, 
                   output logic sum
                   ); 
    assign sum = a ^ b ^ cin; 
    assign cout= a & b | cin&(a^b);   
endmodule

加法器

 

点击Submit,等待一会就能看到下图结果:

加法器

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 68-Exams/m2014 q4j

题目说明

实现下面威廉希尔官方网站 :

加法器

FA代表全加器。

模块端口声明

 

module top_module (
    input [3:0] x,
    input [3:0] y, 
    output [4:0] sum);

 

题目解析

这一题和上一题类似,看懂图片即可,将X[0]+Y[0]结果作为SUM[0],进位输入到下一级,以此类推。

 

module top_module (
    input logic [3:0] x,
    input logic [3:0] y, 
    output logic [4:0] sum
    );
    
    wire logic [3:0]cout ;
    full_adder f_adder_u1 (.a(x[0]),
                          .b(y[0]), 
                          .cin(1'd0),
                          .cout(cout[0]), 
                          .sum(sum[0])
                           ); 
    
    full_adder f_adder_u2 (.a(x[1]),
                          .b(y[1]), 
                          .cin(cout[0]), 
                          .cout(cout[1]), 
                          .sum(sum[1]) 
                          ); 
    
    full_adder f_adder_u3 (.a(x[2]), 
                           .b(y[2]), 
                           .cin(cout[1]), 
                           .cout(cout[2]), 
                           .sum(sum[2]) 
                          ); 

    full_adder f_adder_u4 (.a(x[3]), 
                           .b(y[3]), 
                           .cin(cout[2]), 
                           .cout(cout[3]), 
                           .sum(sum[3]) 
                           );    

    assign sum[4] = cout[3] ;
endmodule

module full_adder( input a, input b, input cin, output cout, output sum); 
    assign sum = a ^ b ^ cin; 
    assign cout= a & b | cin&(a^b);  
endmodule

 

加法器

点击Submit,等待一会就能看到下图结果:

加法器

注意图中无波形。

这一题就结束了。

Problem 69-Exams/ece241 2014 q1c

题目说明

假设有两个 2 进制 8bit 有符号数-a[7:0] 和 b[7:0]。这些数字相加产生 s[7:0]。还要计算是否发生了(有符号的)溢出。

模块端口声明

 

module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); 

 

题目解析

当两个正数相加产生负结果或两个负数相加产生正结果时,会发生有符号溢出。有几种检测溢出的方法:可以通过比较输入和输出数的符号来计算,或者从位 n 和 n-1 的进位推导出。简单说就是一是正正相加,产生正溢出;另一种情况是负负相减,产生负溢出。所以在代码中需要分别考虑这两种情况,将这两种情况取或判断溢出。

 

module top_module (
    input logic [7:0] a,
    input logic [7:0] b,
    output logic [7:0] s,
    output logic overflow
    ); 
 
    assign s = a+b ;
    assign overflow = a[7]&b[7]& ~s[7] | ~a[7] & ~b[7] & s[7] ;

endmodule

 

加法器

点击Submit,等待一会就能看到下图结果:

加法器

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 70-Adder100

题目说明

题目要求我们创建一个100bit的二进制的加法器,该威廉希尔官方网站 共包含两个100bit的输入和一个cin, 输出产生sum和cout。

模块端口声明

 

module top_module( 
    input [99:0] a, b,
    input cin,
    output cout,
    output [99:0] sum );

 

题目解析

没什么难度,就是位数多一点,其他没区别。

 

module top_module( 
    input logic [99:0] a, b,
    input logic cin,
    output logic cout,
    output logic [99:0] sum 
    );

    assign {cout, sum} = a + b  + cin;
endmodule

 

加法器

点击Submit,等待一会就能看到下图结果:

加法器

注意图中无波形。

这一题就结束了。

Problem 71-Bcdadd4

题目说明

题目给我们提供了一个BCD加法器名字为bcd_fadd, 输入为两个4bitBCD码,一个cin,产生输出为sum和cout。

 

module bcd_fadd {
    input [3:0] a,
    input [3:0] b,
    input     cin,
    output   cout,
    output [3:0] sum );

 

且题目也说明需要我们例化4次bcd_fadd来得到一个16-bit的BCD加法器(共16bit), 同样产生sum和cout。

模块端口声明

 

module top_module ( 
    input [15:0] a, b,
    input cin,
    output cout,
    output [15:0] sum );

 

题目解析

这个题目难度不大,主要考察例化语法,但是我们需要看下BCD加法器结构。

 

module top_module( 
    input logic [15:0] a, b,
    input logic cin,
    output logic cout,
    output logic [15:0] sum );
    
    wire logic [2:0] cout_temp;
    
    bcd_fadd u1_bcd_fadd(
        .a      (a[3:0]  ),
        .b      (b[3:0]  ),
        .cin (cin  ),
        .cout (cout_temp[0] ),
        .sum (sum[3:0] )
    );
    bcd_fadd u2_bcd_fadd(
        .a      (a[7:4]  ),
        .b      (b[7:4]  ),
        .cin (cout_temp[0] ),
        .cout (cout_temp[1] ),
        .sum (sum[7:4] )
    );
    bcd_fadd u3_bcd_fadd(
        .a      (a[11:8] ),
        .b      (b[11:8] ),
        .cin (cout_temp[1] ),
        .cout (cout_temp[2] ),
        .sum (sum[11:8] )
    );
    bcd_fadd u4_bcd_fadd(
        .a      (a[15:12] ),
        .b      (b[15:12] ),
        .cin (cout_temp[2] ),
        .cout (cout  ),
        .sum (sum[15:12] )
    );


endmodule

 

加法器

点击Submit,等待一会就能看到下图结果:

加法器

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

总结

今天的几道题就结束了,整体比较简单,没有复杂的代码,没有复杂的设计思路,主要在于加法器的设计。

最后我这边做题的代码也是个人理解使用,有错误欢迎大家批评指正,祝大家学习愉快~






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分