HDLBits练习汇总-08-组合逻辑设计测试--加法器电路

简介: HDLBits练习汇总-08-组合逻辑设计测试--加法器电路

半加器


创建一个半加器。半加器将两位相加(没有进位)并产生一个两数之和和一个进位。

Module Declaration

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

答案:

module top_module( 
    input a, b,
    output cout, sum );
    assign {cout, sum}=a+b;
endmodule

全加器


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

Module Declaration

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

答案:

module top_module( 
    input a, b, cin,
    output cout, sum );
    assign {cout,sum } = a+b+cin;
endmodule

3位二进制加法器


加法器将两个 3 位数字和一个进位输入相加以产生 3 位总和并执行。为了鼓励您实际实例化全加器,还要输出纹波进位加法器中每个全加器的进位。cout[2] 是最后一个全加器的最后进位,也是你经常看到的进位。

Module Declaration

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

答案:

module top_module( 
    input [2:0] a, b,
    input cin,
    output [2:0] cout,
    output [2:0] sum );
    full_adder full_adder0(
        .a(a[0]),
        .b(b[0]),
        .cin(cin),    
        .cout(cout[0]),
        .sum(sum[0])
    );
    full_adder full_adder1(
        .a(a[1]),
        .b(b[1]),
        .cin(cout[0]),    
        .cout(cout[1]),
        .sum(sum[1])
    );
    full_adder full_adder2(
        .a(a[2]),
        .b(b[2]),
        .cin(cout[1]),    
        .cout(cout[2]),
        .sum(sum[2])
    );
endmodule
module full_adder( 
    input a, b, cin,
    output cout, sum );
    assign {cout,sum } = a+b+cin;
endmodule

加法器


实现以下电路:

image.png

Module Declaration

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

答案:

module top_module (
    input [3:0] x,
    input [3:0] y, 
    output [4:0] sum);
    wire [2:0] cout;
  FA full_adder0(
        .a(x[0]),
        .b(y[0]),
        .cin(0),    
        .cout(cout[0]),
        .sum(sum[0])
    );
    FA full_adder1(
        .a(x[1]),
        .b(y[1]),
        .cin(cout[0]),    
        .cout(cout[1]),
        .sum(sum[1])
    );
    FA full_adder2(
        .a(x[2]),
        .b(y[2]),
        .cin(cout[1]),    
        .cout(cout[2]),
        .sum(sum[2])
    );
    FA full_adder3(
        .a(x[3]),
        .b(y[3]),
        .cin(cout[2]),    
        .cout(sum[4]),
        .sum(sum[3])
    );
endmodule
module FA( 
    input a, b, cin,
    output cout, sum );
    assign {cout,sum } = a+b+cin;
endmodule

有符号加法溢出


假设您有两个8位2的补数,a[7:0]和b[7:0]。这些数字加起来就是s[7:0]。还要计算是否发生了(有符号的)溢出。(当两个正数相加产生负结果或两个负数相加产生正结果时,就会发生 有符号溢出。有几种检测溢出的方法:它可以通过比较输入和输出数字的符号来计算,或者从位 n 和 n-1 的进位导出。)

Module Declaration

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

答案:

module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); 
    wire cout;
    assign {cout,s} = a+b;
    assign overflow = cout ^ s[7] && ((a[7]&&b[7])||(!a[7]&&!b[7]));
endmodule

100位二进制加法器


创建一个100位二进制加法器。加法器将两个100位的数字加上一个进位,产生一个100位的和和进位。

Module Declaration

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

答案:

module top_module( 
    input [99:0] a, b,
    input cin,
    output cout,
    output [99:0] sum );
    assign {cout,sum} = a+b+cin;
endmodule

4位加法器


为您提供了一个名为bcd_fadd的BCD(二进制编码的十进制)一位数加法器,它将两个BCD数字和进位相加,并产生一个和和进位。

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

实例化4个bcd_fadd副本以创建一个4位BCD纹波进位加法器。您的加法器应该将两个4位BCD数字(打包成16位向量)和一个进位相加,以产生一个4位的和并进行运算。

Module Declaration

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

答案:

module top_module( 
    input [15:0] a, b,
    input cin,
    output cout,
    output [15:0] sum );
    wire [3:0] cout_connect;
    bcd_fadd u0_bcd_fadd(
        .a   (a[3:0]),
        .b   (b[3:0]),
        .cin (cin),
        .cout(cout_connect[0]),
        .sum (sum[3:0])
        );
    bcd_fadd u1_bcd_fadd(
        .a   (a[7:4]),
        .b   (b[7:4]),
        .cin (cout_connect[0]),
        .cout(cout_connect[1]),
        .sum (sum[7:4])
        );
  bcd_fadd u2_bcd_fadd(
        .a   (a[11:8]),
        .b   (b[11:8]),
        .cin (cout_connect[1]),
        .cout(cout_connect[2]),
        .sum (sum[11:8])
        );
  bcd_fadd u3_bcd_fadd(
        .a   (a[15:12]),
        .b   (b[15:12]),
        .cin (cout_connect[2]),
        .cout(cout),
        .sum (sum[15:12])
        );
endmodule
目录
相关文章
|
6月前
|
存储 缓存 网络协议
dpdk课程学习之练习笔记二(arp, udp协议api测试)
dpdk课程学习之练习笔记二(arp, udp协议api测试)
172 0
|
SQL 安全 网络安全
交易所开发测试版丨交易所系统开发规则玩法/架构设计/项目步骤/方案逻辑/案例解析/源码部署
The development process of the exchange system involves multiple steps and links. The following is the detailed process and steps for the development of the exchange system:
|
23天前
|
SQL 分布式计算 Hadoop
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
25 4
|
23天前
|
SQL
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
27 2
|
3月前
|
Java 测试技术 API
SpringBoot单元测试快速写法问题之复杂的业务逻辑设计有效的单元测试如何解决
SpringBoot单元测试快速写法问题之复杂的业务逻辑设计有效的单元测试如何解决
|
4月前
|
测试技术
详解单元测试问题之@InjectMocks注解的执行逻辑如何解决
详解单元测试问题之@InjectMocks注解的执行逻辑如何解决
63 1
|
4月前
|
测试技术 UED
软件测试的科学与艺术:从数据导向到逻辑严密的实践
本文旨在探讨软件测试领域中数据导向和逻辑严密性的重要性,并分析如何通过科学严谨的方法提升测试效率和质量。文章首先概述了软件测试的基本概念和挑战,随后深入讨论了数据在测试设计和结果分析中的关键作用,以及如何利用逻辑推理来构建有效的测试案例和识别潜在缺陷。最后,本文提出了一系列实践建议,旨在帮助测试人员更好地整合数据驱动和逻辑推理方法,以实现软件测试的最优化。
39 0
|
6月前
|
缓存 监控 网络协议
dpdk课程学习之练习笔记五(kni理解及测试)
dpdk课程学习之练习笔记五(kni理解及测试)
252 0
|
6月前
|
存储
存地址实现组包逻辑的一个测试代码。
存地址实现组包逻辑的一个测试代码。
42 0
|
测试技术 编译器
软件测试用例经典方法 | 逻辑覆盖测试法及案例
逻辑覆盖测试法是常用的一类白盒测试方法,其以程序内部逻辑结构为基础,通过对程序逻辑结构的遍历来实现程序测试的覆盖。逻辑覆盖测试法要求测试人员对程序的逻辑结构有清晰的了解。 逻辑覆盖测试法是一系列测试过程的总称,是使测试过程逐渐进行越来越完整的通路测试。从覆盖源程序语句的详尽程度,可以将其分为语句覆盖、判定覆盖、条件覆盖、判断/条件覆盖、条件组合覆盖和路径覆盖等。接下来将通过下面程序的逻辑覆盖测试用例一一介绍这些覆盖准则,该程序的流程图如图4-1所示,其中,a、b、c、d、e是控制流上的若干程序点。
463 0
软件测试用例经典方法 | 逻辑覆盖测试法及案例