HDLBits中文版,标准参考答案 | 3.1.3 Arithmetic Circuits | 算术电路

news2024/11/25 6:54:49

关注 望森FPGA  查看更多FPGA资讯

这是望森的第 10 期分享

作者 | 望森
来源 | 望森FPGA

目录

1 Half adder | 半加器

2 Full adder | 全加器

3 3-bit binary adder | 3位二进制加法器

4 Adder | 加法器

5 Signed addition overflow | 有符号数的加法溢出

6 100-bit binary adder | 100位二进制加法器

7 4-digit BCD adder | 4位BCD加法器


本文中的代码都能够正常运行,请放心食用😋~

练习的官方网站是:https://hdlbits.01xz.net/

注:作者将每个练习的知识点都放在了题目和答案之后


1 Half adder | 半加器

题目:

创建一个半加器。半加器将两位相加(无进位),然后得出和与进位。

答案:

module top_module( 
    input a, b,
    output cout, sum );
 
    always@(*) begin
               sum = a ^ b;
        cout = a & b;
    end
    
endmodule

2 Full adder | 全加器

题目:

创建一个全加器。全加器将三位(包括进位)相加,并得出和与进位。

答案:

module top_module( 
    input a, b, cin,
    output cout, sum );
 
    always@(*) begin
               sum = a ^ b ^ cin;
        cout = a & b | a & cin | b & cin;
    end
    
endmodule

3 3-bit binary adder | 3位二进制加法器

题目:

现在您已经知道如何构建全加器,请创建 3 个实例以创建 3 位二进制行波进位加法器。该加法器将两个 3 位数和一个进位相加,以产生 3 位和并输出进位。为了鼓励您实际实例化全加器,还要在行波进位加法器中输出每个全加器的进位。cout[2] 是最后一个全加器的最终进位,也是您通常看到的进位。

答案:

module top_module( 
    input [2:0] a, b,
    input cin,
    output [2:0] cout,
    output [2:0] sum );
 
    full_adder adder0(
        .a(a[0]),
        .b(b[0]),
        .cin(cin),
        .cout(cout[0]),
        .sum(sum[0])
    );
    
    full_adder adder1(
        .a(a[1]),
        .b(b[1]),
        .cin(cout[0]),
        .cout(cout[1]),
        .sum(sum[1])
    );
    
    full_adder 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 );
 
    always@(*) begin
               sum = a ^ b ^ cin;
        cout = a & b | a & cin | b & cin;
    end
    
endmodule

4 Adder | 加法器

题目:

实现以下电路:

("FA" is a full adder)

答案:

module top_module (
    input [3:0] x,
    input [3:0] y, 
    output [4:0] sum);
 
    wire [2:0] cout;
    full_adder adder0(
        .a(x[0]),
        .b(y[0]),
        .cin(1'b0),
        .cout(cout[0]),
        .sum(sum[0])
    );
    
    full_adder adder1(
        .a(x[1]),
        .b(y[1]),
        .cin(cout[0]),
        .cout(cout[1]),
        .sum(sum[1])
    );
    
    full_adder adder2(
        .a(x[2]),
        .b(y[2]),
        .cin(cout[1]),
        .cout(cout[2]),
        .sum(sum[2])
    );
    
    full_adder adder3(
        .a(x[3]),
        .b(y[3]),
        .cin(cout[2]),
        .cout(sum[4]),
        .sum(sum[3])
    );
    
endmodule
 
module full_adder( 
    input a, b, cin,
    output cout, sum );
 
    always@(*) begin
               sum = a ^ b ^ cin;
        cout = a & b | a & cin | b & cin;
    end
    
endmodule
参考答案:
module top_module (
        input [3:0] x,
        input [3:0] y,
        output [4:0] sum
);
 
        // This circuit is a 4-bit ripple-carry adder with carry-out.
        assign sum = x+y;        // Verilog addition automatically produces the carry-out bit.
 
        // Verilog quirk: Even though the value of (x+y) includes the carry-out, (x+y) is still considered to be a 4-bit number (The max width of the two operands).
        // This is correct:
        // assign sum = (x+y);
        // But this is incorrect:
        // assign sum = {x+y};        // Concatenation operator: This discards the carry-out
endmodule

5 Signed addition overflow | 有符号数的加法溢出

题目:

假设有两个 8 位 2 的补码数,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
); //
 
    wire [8:0] sum;
    assign sum = {a[7],a} + {b[7],b};
    
    assign s = sum[7:0];
    assign overflow = sum[8] ^ sum[7];
 
endmodule

知识点:

提示:当两个正数相加产生负数,或者两个负数相加产生正数时,就会发生带符号溢出。有几种检测溢出的方法:可以通过比较输入和输出数字的符号来计算溢出,也可以从位n和n-1的进位导出溢出。


6 100-bit binary adder | 100位二进制加法器

题目:

创建一个 100 位二进制加法器。该加法器将两个 100 位数字和一个进位相加,得到一个 100 位和及进位输出。

答案:

module top_module( 
    input [99:0] a, b,
    input cin,
    output cout,
    output [99:0] sum );
 
    wire [100:0] a_t,b_t;
    assign a_t = {1'b0,a};
    assign b_t = {1'b0,b};
    
    assign {cout,sum} = a_t + b_t + cin;
    
endmodule
参考答案:
module top_module (
        input [99:0] a,
        input [99:0] b,
        input cin,
        output cout,
        output [99:0] sum
);
 
        // The concatenation {cout, sum} is a 101-bit vector.
        assign {cout, sum} = a+b+cin;
 
endmodule

7 4-digit BCD adder | 4位BCD加法器

题目:

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

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

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

答案:

module top_module ( 
    input [15:0] a, b,
    input cin,
    output cout,
    output [15:0] sum );
 
    wire [2:0] cout_t;
    bcd_fadd addr0(
        .a(a[3:0]),
        .b(b[3:0]),
        .cin(cin),
        
        .cout(cout_t[0]),
        .sum(sum[3:0])
    );
    
    bcd_fadd addr1(
        .a(a[7:4]),
        .b(b[7:4]),
        .cin(cout_t[0]),
        
        .cout(cout_t[1]),
        .sum(sum[7:4])
    );
    
    bcd_fadd addr2(
        .a(a[11:8]),
        .b(b[11:8]),
        .cin(cout_t[1]),
        
        .cout(cout_t[2]),
        .sum(sum[11:8])
    );
    
    bcd_fadd addr3(
        .a(a[15:12]),
        .b(b[15:12]),
        .cin(cout_t[2]),
        
        .cout(cout),
        .sum(sum[15:12])
    );
    
endmodule

- END -

公z号/CSDN搜索【望森FPGA】,查看更多FPGA资讯~

相关文章请到我的主页查看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2194691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaEE初阶】深入理解线程池的概念以及Java标准库提供的方法参数分析

前言 🌟🌟本期讲解关于MySQL索引事务,希望能帮到屏幕前的你。 🌈上期博客在这里:【JavaEE初阶】多线程案列之定时器的使用和内部原码模拟-CSDN博客 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl…

ScholarAI发一个月会员啦!

诸神缄默不语-个人CSDN博文目录 ScholarAI是一个用于学术的工具,用LLM智能检索用户所需的论文,可以进行简单的总结和分析。可以理解成“LLM帮你读论文”这种感觉。 这次之所以发会员是因为GPT Store服务出问题了,所以给了用户一个月会员作为…

双向数据库迁移工具:轻松实现 MySQL 与 SQLite 数据互导

项目概述与作用 该项目的核心是实现 MySQL 和 SQLite 两种数据库之间的数据迁移工具。它能够轻松地将 MySQL 数据库中的数据导出为 SQLite 数据库文件,反过来也可以将 SQLite 数据库中的数据上传到 MySQL 数据库中。这个双向迁移工具非常适用于: 数据库备…

【C++】--类和对象(2)

👌个人主页: 起名字真南 👆个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 类的默认成员函数2 构造函数3 析构函数4 拷贝构造5 赋值运算符重载5.1 运算符重载5.2 赋值运算符的重载 1 类的默认成员函数 默认成员函数就是用户没有显示实现,…

制作U盘启动盘1 — UltraISO

官网:UltraISO软碟通中文官方网站 - 光盘映像文件制作/编辑/转换工具 点击工具栏的“打开”,在弹出的窗口选择要刻录的ISO文件。 点击菜单栏的“启动”—“写入磁盘映像”。 硬盘驱动器选择要刻录的U盘。 点击写入,会弹出数据丢失的提示&…

数据结构和算法简介

目录 1.认识数据结构 什么是数据结构 逻辑结构 物理结构 常见的数据结构 2.认识算法 什么是算法 如何衡量算法效率 时间复杂度 什么是时间复杂度 如何计算时间复杂度 大O渐进表示法 常见时间复杂度计算例子 空间复杂度 什么是空间复杂度 如何计算空间复杂度 常…

【数据结构】深度解析堆排序

目录 💯引言 💯堆的概念 (一)什么是堆 (二)堆的表示 💯堆排序原理 (一)建堆 (二)排序 💯代码实现 💯代码分析 &…

【Sqlite】sqlite内部函数sqlite3_value_text特性

目录 ⚛️1 结论 ☪️2 说明 ☪️3 传入数值转成科学计数法 ♋3.1 只有整数部分 ♏3.2 只有小数部分 ♐3.3 整数小数 ⚛️1 结论 整数(sqlite视为int64)位数 > 20位,sqlite3_value_text 采用科学计数法。否则正常表示。 浮点数(sqlite视为double)的整数部…

STM32 通用同步/异步通信

一、串行通信简介 CPU与外围设备之间的信息交换称为通信。基本的通信方式有并行通信和串行通信两种。STM32单片机提供了功能强大的串行通信模块,即通用同步/异步收发器(USART)。 1.串行通信 串行通信是数据字节一位一位地依次传送的通信方式。…

HarmonyOS第一课 05 从简单的页面开始-习题

【习题】从简单的页面开始 通过/及格分80/ 满分100 判断题 1.Button作为容器使用时可以通过添加子组件实现包含文字、图片等元素的按钮,其类型包括胶囊按钮、圆形按钮、普通按钮。T 正确(True) 错误(False) 大部分前端框架的按钮都具有这几个类型,鸿蒙也不例外…

Ubuntu+VsCode++搭建C++开发环境

Ubuntu下使用VsCode搭建C开发环境 1、基本工具的安装 首先Ubuntu下安装好C开发的一个些基本工具g、gdb、make、cmake等,安装方式点这里 检查一下安装环境 $ g --version g (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 Copyright (C) 2021 Free Software Foundation,…

位图的应用

目录 问题引入 位图概念 位图的实现 应用2:找到只出现一次的整数 应用三:找交集 STL中的位图 问题引入 面试题 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在 这40亿个数中。【腾讯】 解决…

幂,你去哪儿了-《分析模式》漫谈37

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 “Analysis Patterns”的第3章的图3.5,原文的图是: 2004(机械工业出版社)中译本的图是: direct翻译成分子,inv…

master节点k8s部署]33.ceph分布式存储(四)

总结ceph分布式存储(三)中提到的三种方法: 1.创建rbda,并且在创建pv的时候配置该rbda,以下代码仅展示关键信息。 [rootxianchaomaster1 ~]# cat pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: ceph-pv ...…

MySQL多表查询:行子查询

先看我的表数据 dept表 emp表 行子查询 子查询返回的结果是一行&#xff08;可以是多列&#xff09;, 这种子查询称为行子查询 常用的操作符: , <>, IN, NOT IN 例子1. 查询与“张无忌” 的薪资及直属领导相同的员工信息 拆解成两个问题 a. 查询"张无忌"…

基于SpringBoot+Vue+MySQL的汽车租赁系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着城市化和交通需求的不断增加&#xff0c;汽车租赁业务成为了现代社会的一个重要组成部分。汽车租赁服务为人们提供了一种灵活便捷的交通解决方案&#xff0c;让用户在无需购买车辆的情况下&#xff0c;根据实际需要租赁车辆…

端口冲突的解决方案以及SpringBoot自动检测可用端口demo

端口冲突的解决方案 端口冲突通常发生在尝试运行两个或多个应用程序或服务时&#xff0c;它们尝试使用同一个端口号&#xff0c;导致系统无法正确分配资源。 各种端口错误 你是否遇到过下面这些报错信息呢&#xff1f; Windows 系统报错&#xff1a; 系统错误 1004 套接字操作…

图像转3D视差视频:DepthFlow、kling

1、DepthFlow 参看: https://github.com/BrokenSource/DepthFlow 通过深度图实现图像3d效果 安装 https://brokensrc.dev/get/pypi/#installing pip insatll depthflow shaderflow broken-source pianola spectronote turbopipe 使用 1、下载项目 git clone https://gith…

约数个数约数之和

好久没发文章了.......不过粉丝还是一个没少...... 今天来看两道超级恶心的数论题目&#xff01; No.1 约数个数 No.2 约数之和 先来看第一道&#xff1a;约数个数 题目描述 给定 n 个正整数 ai​,请你输出这些数的乘积的约数个数,答案对 10^97 取模 输入格式 第一行包含…

Python_文件处理

一个完整的程序一般都包括数据的存储和读取&#xff1b;我们在前面写的程序数据都没有进行实际的存储&#xff0c;因此python解释器执行完数据就消失了。实际开发中&#xff0c;我们经常需要从外部存储介质&#xff08;硬盘、光盘、U盘等&#xff09;读取数据&#xff0c;或者将…