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
目录
相关文章
|
1月前
|
存储 缓存 网络协议
dpdk课程学习之练习笔记二(arp, udp协议api测试)
dpdk课程学习之练习笔记二(arp, udp协议api测试)
95 0
|
1月前
|
缓存 监控 网络协议
dpdk课程学习之练习笔记五(kni理解及测试)
dpdk课程学习之练习笔记五(kni理解及测试)
126 0
|
1月前
|
存储
存地址实现组包逻辑的一个测试代码。
存地址实现组包逻辑的一个测试代码。
24 0
|
10月前
|
测试技术 编译器
软件测试用例经典方法 | 逻辑覆盖测试法及案例
逻辑覆盖测试法是常用的一类白盒测试方法,其以程序内部逻辑结构为基础,通过对程序逻辑结构的遍历来实现程序测试的覆盖。逻辑覆盖测试法要求测试人员对程序的逻辑结构有清晰的了解。 逻辑覆盖测试法是一系列测试过程的总称,是使测试过程逐渐进行越来越完整的通路测试。从覆盖源程序语句的详尽程度,可以将其分为语句覆盖、判定覆盖、条件覆盖、判断/条件覆盖、条件组合覆盖和路径覆盖等。接下来将通过下面程序的逻辑覆盖测试用例一一介绍这些覆盖准则,该程序的流程图如图4-1所示,其中,a、b、c、d、e是控制流上的若干程序点。
321 0
软件测试用例经典方法 | 逻辑覆盖测试法及案例
|
8月前
|
运维 测试技术 区块链
链动2+1模式系统开发指南流程丨成熟案例丨功能设计丨测试部署丨方案项目丨逻辑需求丨源码出售
链动2+1模式系统开发方案是指一个较为复杂的系统开发模式,其中包含两个公链和一个私链的组合。
|
JavaScript 前端开发 BI
JavaScript —— JSchallenger Objects 对象练习(测试一下你的 JS 对象基础)【专题三】
JavaScript —— JSchallenger Objects 对象练习(测试一下你的 JS 对象基础)【专题三】
|
JavaScript 前端开发 网络架构
JavaScript —— JSchallenger Arrays 数组练习(测试一下你的 JS 数组基础)【专题二】
JavaScript —— JSchallenger Arrays 数组练习(测试一下你的 JS 数组基础)【专题二】
|
JavaScript 前端开发 Java
JavaScript —— JSchallenger Basics 基础练习(测试一下你的 JS 基础)【专题一】
JavaScript —— JSchallenger Basics 基础练习(测试一下你的 JS 基础)【专题一】
106 0
|
安全
实战!!!利用burpsuit定点测试网站逻辑漏洞
实战!!!利用burpsuit定点测试网站逻辑漏洞
169 0
For 基本使用 逻辑扩展 测试水仙花数
For循环 循环结构的概念 循环,即事物周而复始的变化 循环结构,使一部分代码按照次数或一定的条件反复执行的一种代码结构。
75 0
For 基本使用 逻辑扩展 测试水仙花数