HDLBits练习 Circuits;Combinational Logic;Arithmetic Circuits

2023-10-07 22:30

本文主要是介绍HDLBits练习 Circuits;Combinational Logic;Arithmetic Circuits,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Circuits;Arithmetic Circuits

    • 1.Half adder
    • 2.Full adder
    • 3.3-bit binary adder
    • 4.Adder
    • 5.Signed addition overflow
    • 6.100-bit binary adder
    • 7.4-digit BCD adder
    • 7. ==问题==

要点:
1. 异或的理解:
异或(相异的时候进行或运算)真值表为

ABP
000
011
101
110

运算符为 " ^ "
2. 全加器与半加器的区别
半加器:两个数产生进位但不能够处理来自上一级的进位。真值表为:

abcoutsum
0000
0101
1001
1110

全加器:除了两个数的输入,输入还包括上一级的进位值。自然输出也会有一个进位值。真值表为:

abcout-in(上一级进位)cout-out(进位)sum
00000
00101
01001
01110
10001
10110
11010
11111

可以由两个半加器拼接成一个全加器
在这里插入图片描述

1.Half adder

例1:
在这里插入图片描述

解:
要求实现半加器

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

或者直接实现

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

2.Full adder

例1:
在这里插入图片描述
实现1bit 全加器

解:
直接想到的方法就是真值表得到逻辑式

abcout-in(上一级进位)cout-out(进位)sum
00000
00101
01001
01110
10001
10110
11010
11111

在这里插入图片描述
在这里插入图片描述

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

更简单的方法 是使用位拼接符号

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

3.3-bit binary adder

例1:
在这里插入图片描述

解:
要求实现一个3-bit全加器
有三种解决的方法

  1. 反复使用的真值表转为逻辑表达式
  2. 采用位拼接符号{ }进行对位的操作
  3. 例化1-bit全加器,使用三个1-bit全加器实现目标
    这里贴上模块操作Modules:Hierarchy
//方法3
module top_module( input [2:0] a, b,input cin,output [2:0] cout,output [2:0] sum
);adder u1 (.a(a[0]),.b(b[0]),.cin(cin),.cout(cout[0]),.sum(sum[0])
);adder u2 (.a(a[1]),.b(b[1]),.cin(cout[0]),.cout(cout[1]),.sum(sum[1])
);adder u3 (.a(a[2]),.b(b[2]),.cin(cout[1]),.cout(cout[2]),.sum(sum[2])
);
endmodule
module adder(//由于没有例化好的adder模块需要自己补上input a,b,cin,output cout,sum
);assign {cout,sum} = a + b + cin;
endmodule

4.Adder

例1:
在这里插入图片描述
实现图中的4-bit加法器

解:
由于有四个全加器想到了上题使用的例化的方法

 module top_module (input [3:0] x,input [3:0] y, output [4:0] sum);wire cout[2:0];adder u1 (.a(x[0]),.b(y[0]),.cin(1'b0),.cout(cout[0]),.sum(sum[0]),);adder u2 (.a(x[1]),.b(y[1]),.cin(cout[0]),.cout(cout[1]),.sum(sum[1]),);adder u3 (.a(x[2]),.b(y[2]),.cin(cout[1]),.cout(cout[2]),.sum(sum[2]),);adder u4 (.a(x[3]),.b(y[3]),.cin(cout[2]),.cout(sum[4]),.sum(sum[3]),);
endmodule
module adder (//给出全加器模块input a,b,cin,output cout,sum
);assign {cout,sum} = a + b + cin;
endmodule

看了知乎上的解答,可以直接使用assign sum = x + y 如果产生进位会直接扩展成为五位二进制数 (- _ -)

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

5.Signed addition overflow

例1:
在这里插入图片描述

解:
本题希望实现signed integer(有符号数)的加减并判断溢出,较难理解的是有关overflow的判断,关于有符号数的规则参考真 OO无双

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

本题任然存在较多疑问

6.100-bit binary adder

例1:
在这里插入图片描述
实现100bit全加器

解:
直接采用位拼接运算

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

7.4-digit BCD adder

例1:
在这里插入图片描述
题目中已经提供了BCD加法器bcd_fadd,需要实现一个16-bit的BCD加法器

解:
只需要简单例化4次就可以解决问题

module top_module( input [15:0] a, b,input cin,output cout,output [15:0] sum );wire [3:0] cout_temp;bcd_fadd u1(.a(a[3:0]),.b(b[3:0]),.cin(cin),.cout(cout_temp[0]),.sum(sum[3:0]));bcd_fadd u2(.a(a[7:4]),.b(b[7:4]),.cin(cout_temp[0]),.cout(cout_temp[1]),.sum(sum[7:4]));bcd_fadd u3(.a(a[11:8]),.b(b[11:8]),.cin(cout_temp[1]),.cout(cout_temp[2]),.sum(sum[11:8]));bcd_fadd u4(.a(a[15:12]),.b(b[15:12]),.cin(cout_temp[2]),.cout(cout_temp[3]),.sum(sum[15:12]));assign cout = cout_temp[3];endmodule

7. 问题

5

这篇关于HDLBits练习 Circuits;Combinational Logic;Arithmetic Circuits的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160855

相关文章

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd

014.Python爬虫系列_解析练习

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

如何快速练习键盘盲打

盲打是指在不看键盘的情况下进行打字,这样可以显著提高打字速度和效率。以下是一些练习盲打的方法: 熟悉键盘布局:首先,你需要熟悉键盘上的字母和符号的位置。可以通过键盘图或者键盘贴纸来帮助记忆。 使用在线打字练习工具:有许多在线的打字练习网站,如Typing.com、10FastFingers等,它们提供了不同难度的练习和测试。 练习基本键位:先从学习手指放在键盘上的“家位”开始,通常是左手的

anaconda3下的python编程练习-csv翻译器

相关理解和命令 一、环境配置1、conda命令2、pip命令3、python命令 二、开发思路三、开发步骤 一、环境配置 1、conda命令 镜像源配置 conda config --show channels //查看镜像源conda config --remove-key channels //删除添加源,恢复默认源#添加镜像源conda config --ad

推荐练习键盘盲打的网站

对于初学者来说,以下是一些推荐的在线打字练习网站: 打字侠:这是一个专业的在线打字练习平台,提供科学合理的课程设置和个性化学习计划,适合各个水平的用户。它还提供实时反馈和数据分析,帮助你提升打字速度和准确度。 dazidazi.com:这个网站提供了基础的打字练习,适合初学者从零开始学习打字。 Type.fun打字星球:提供了丰富的盲打课程和科学的打字课程设计,还有诗词歌赋、经典名著等多样

综合DHCP、ACL、NAT、Telnet和PPPoE进行网络设计练习

描述:企业内网和运营商网络如上图所示。 公网IP段:12.1.1.0/24。 内网IP段:192.168.1.0/24。 公网口PPPOE 拨号采用CHAP认证,用户名:admin 密码:Admin@123 财务PC 配置静态IP:192.168.1.8 R1使用模拟器中的AR201型号,作为交换路由一体机,下图的WAN口为E0/0/8口,可以在该接口下配置IP地址。 可以通过

JAVA学习-练习试用Java实现“删除有序数组中的重复项”

问题: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下