HDEBits中组合逻辑类的部分题目练习

文章目录

  • 1. More logic gates
  • 2. Truth tables
  • 3. 256-to-1 4-bit multiplexer
  • 4. 3-bit binary adder
  • 5. Signed addition overflow
  • 6. 4-digit BCD adder
  • 7. Minimum SOP and POS
  • 8. Karnaugh map
  • 9. K-map implemented with a multiplexer
  • 总结

1. More logic gates

题目:让我们尝试同时构建几个 logic gates。构建一个具有两个输入(a 和 b)的组合电路。
有 7 个输出,每个输出都有一个逻辑门驱动它:
out_and:a 和 b
out_or:a 或 b
out_xor:a xor b
out_nand:a nand b
out_nor:a 和 b
out_xnor:a xnor b
out_anotb:a 和非 b
思路:熟悉各个逻辑门的图形以及运算原则。
在这里插入图片描述

and:与门 ——a & b
or:非门——a | b
xor:异或门——a ^ b
nand:与非门——~(a & b)
nor:或非门——~(a | b)
xnor:同或门——~(a ^ b)
anotb:a and not b——a & ~b

module top_module( input a, b,output out_and,output out_or,output out_xor,output out_nand,output out_nor,output out_xnor,output out_anotb
);assign out_and   =   a  &  b;assign out_or    =   a  |  b;assign out_xor   =   a  ^  b;assign out_nand  = ~(a  &  b);assign out_nor   = ~(a  |  b);assign out_xnor  = ~(a  ^  b);assign out_anotb =   a  &~ b;//a and not b:a与非b
endmodule

2. Truth tables

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

思路:从真值表综合电路。
真值表共有8行,对应三个输入的所有可能组合。输出f为1的行是第2、3、5、7行。我需要把这些行的输入条件找出来,然后转换成逻辑表达式。
创建实现真值表函数的电路的一种简单方法是以乘积总和的形式表示函数。乘积之和(即 OR )(即 AND)是指在真值表的每一行使用一个 N 输入 AND 门(以检测输入何时与每一行匹配),后跟一个 OR 门,该门仅选择导致“1”输出的那些行。

行2:x3=0, x2=1, x1=0 → (~x3) & x2 & (~x1)
行3:x3=0, x2=1, x1=1 → (~x3) & x2 & x1
行5:x3=1, x2=0, x1=1 → x3 & (~x2) & x1
行7:x3=1, x2=1, x1=1 → x3 & x2 & x1
然后,这些四个与项需要或起来。所以最终的表达式应该是这四个项的或。
所以逻辑表达式为:
f = (~x3 & x2 & ~x1) | (~x3 & x2 & x1) | (x3 & ~x2 & x1) | (x3 & x2 & x1)
简化后的表达式是:
f = (~x3 & x2) | (x3 & x1)

module top_module( input x3,input x2,input x1,  // three inputsoutput f   // one output
);assign f = (~x3 & x2) | (x3 & x1);
endmodule

3. 256-to-1 4-bit multiplexer

题目:创建一个 4 位宽、256 对 1 的多路复用器。256 个 4 位输入全部打包到一个 1024 位输入向量中。sel=0 应该选择 [3:0] 中的位,sel=1 选择 [7:4] 中的位,sel=2 选择 [11:8] 中的位,等等。
思路:确定sel的值映射到输入向量的相应位置

module top_module (input [1023:0] in,input [7:0] sel,output [3:0] out
);assign out = {in[sel*4+3], in[sel*4+2], in[sel*4+1], in[sel*4+0]}; //一一对应输出// assign out = in[sel*4 +: 4];		// assign out = in[sel*4+3 -: 4];endmodule

4. 3-bit binary adder

题目:要求实现一个3-bit全加器

思路:有三种解决的方法。
1、反复使用的真值表转为逻辑表达式
2、采用位拼接符号{ }进行对位的操作
3、例化1-bit全加器,使用三个1-bit全加器实现目标(这里采用)

//方法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

5. Signed addition overflow

题目在这里插入图片描述

思路:要实现两个8位补码数的加法并检测有符号溢出,需根据以下条件判断溢出:
溢出 =(两正数相加结果为负)或(两负数相加结果为正)

加法可以直接用加法运算符实现,比如assign s = a + b;。
但是,溢出需要根据上述条件来判断。例如,当a和b的最高位都为0(正数),而s的最高位为1(负数),则溢出;或者a和b的最高位都为1(负数),而s的最高位为0(正数),则溢出。
或者,另一种方法是检查进位。补码加法的溢出可以表示为:
溢出 = (a[7] & b[7] & ~s[7]) | (~a[7] & ~b[7] & s[7])。也就是说,当两个操作数都是负数,但结果为正,或者两个操作数都是正数,但结果为负时,溢出发生。

module top_module (input [7:0] a,input [7:0] b,output [7:0] s,output overflow
); assign s = a + b;    // 直接计算和// 溢出条件:两正数结果为负,或两负数结果为正assign overflow = (a[7] & b[7] & ~s[7]) | (~a[7] & ~b[7] & s[7]);endmodule

6. 4-digit BCD adder

题目在这里插入图片描述

思路:例化bcd_fadd,使用四个bcd_fadd实现目标

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. Minimum SOP and POS

题目在这里插入图片描述

思路:按照题目要求画出卡诺图,注意abcd的权值顺序:
在这里插入图片描述
画出卡诺图:
在这里插入图片描述对于SOP(积之和),即最小项之和。输出为1的情况是2(0010)、7(0111)、15(1111)。所以需要将这些情况转化为乘积项,然后合并。同时,无关项可以视情况加入,以简化表达式。

同样,POS(和之积)需要考虑输出为0的情况,即当输出为0时,对应的最大项需要被覆盖。而无关项可能可以被用来简化POS表达式。

module top_module (input a,input b,input c,input d,output out_sop,output out_pos
); assign out_sop = (c & d)|(~a & ~b & c & ~d);assign out_pos = (c & ~b & ~a)|(c & d & ~a)|(c & d & b);
endmodule

8. Karnaugh map

题目
在这里插入图片描述

思路:通过ab来控制cd输出的值,与上题的解决思路一样。

module top_module (input [4:1] x, output f );assign f = ( ~x[1] & x[3])|(x[1] & x[2] & ~x[3]);
endmodule

9. K-map implemented with a multiplexer

题目在这里插入图片描述

思路

module top_module (input c,input d,output [3:0] mux_in
); assign mux_in = {(c & d),(~d),(1'b0),(c|d)};
endmodule

总结

通过对组合逻辑类相关题目的练习,初步掌握了如何用verilog 语言来编写逻辑门电路、多路复用器、还有真值表和卡诺图能够帮助我们解决问题,收获颇多!

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

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

相关文章

Apache httpclient okhttp(2)

学习链接 Apache httpclient & okhttp(1) Apache httpclient & okhttp(2) okhttp github okhttp官方使用文档 okhttp官方示例代码 OkHttp使用介绍 OkHttp使用进阶 译自OkHttp Github官方教程 SpringBoot 整合okHttp…

【git项目管理】长话短说

目录 主要分为三种使用情况 安装git后第一次使用创建新仓库并管理克隆仓库并管理 初次使用git 首先确定电脑的用户名是纯英文,没有中文和奇怪的符号,如果不满足这个条件,参考这个 链接 修改用户名 git config --global user.name "…

算法刷题记录——LeetCode篇(3.2) [第211~212题](持续更新)

更新时间:2025-04-04 算法题解目录汇总:算法刷题记录——题解目录汇总技术博客总目录:计算机技术系列博客——目录页 优先整理热门100及面试150,不定期持续更新,欢迎关注! 215. 数组中的第K个最大元素 给…

【linux学习】linux系统调用编程

目录 一、任务、进程和线程 1.1任务 1.2进程 1.3线程 1.4线程和进程的关系 1.5 在linux系统下进程操作 二、Linux虚拟内存管理与stm32的真实物理内存区别 2.1 Linux虚拟内存管理 2.2 STM32的真实物理内存映射 2.3区别 三、 Linux系统调用函数 fork()、wait()、exec(…

react redux的学习,多个reducer

redux系列文章目录 第一章 简单学习redux,单个reducer 前言 前面我们学习到的是单reducer的使用;要知道redux是个很强大的状态存储库,可以支持多个reducer的使用。 combineReducers ‌combineReducers‌是Redux中的一个辅助函数,主要用于…

Oracle数据库数据编程SQL<3.5 PL/SQL 存储过程(Procedure)>

存储过程(Stored Procedure)是 Oracle 数据库中一组预编译的 PL/SQL 语句集合,存储在数据库中并可通过名称调用执行。它们是企业级数据库应用开发的核心组件。 目录 一、存储过程基础 1. 存储过程特点 2. 创建基本语法 3. 存储过程优点 4. 简单示例 二、没有参数的存储…

手撕AVL树

引入:为何要有AVL树,二次搜索树有什么不足? 二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此产生了AVL树&#xff0c…

《 C语言中的变长数组:灵活而强大的特性》

🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言 🌍文章目入 一、变长数组的定义二、变长数组的优势三、变长数组的使用示例示例1:动态输入数组大小示例2:变长数组在函数中的应用 四、变长数组的…

【微服务】基础概念

1.什么是微服务 微服务其实就是一种架构风格,他提倡我们在开发的时候,一个应用应该是一组小型服务而组成的,每一个服务都运行在自己的进程中,每一个小服务都通过HTTP的方式进行互通。他更加强调服务的彻底拆分。他并不是仅局限于…

Linux make与makefile 项目自动化构建工具

本文章将对make与makefile进行一些基础的讲解。 假设我们要建造一座房子,建造过程涉及很多步骤,比如打地基、砌墙、安装门窗、粉刷墙壁等。每个步骤都有先后顺序,并且有些步骤可能依赖于其他步骤的完成。比如,你必须先打好地基才…

如何判断多个点组成的3维面不是平的,如果不是平的,如何拆分成多个平面

判断和拆分三维非平面为多个平面 要判断多个三维点组成的面是否为平面,以及如何将非平面拆分为多个平面,可以按照以下步骤进行: 判断是否为平面 平面方程法: 选择三个不共线的点计算平面方程:Ax By Cz D 0检查其…

多layout 布局适配

安卓多布局文件适配方案操作流程 以下为通过多套布局文件适配不同屏幕尺寸/密度的详细步骤,结合主流适配策略及最佳实践总结: 一、‌创建多套布局资源目录‌ ‌按屏幕尺寸划分‌ 在 res 目录下创建以下文件夹(根据设备特性自动匹配&#xff…

Java 大视界 -- Java 大数据在智能农业无人机植保作业路径规划与药效评估中的应用(165)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

美关税加征下,Odoo免费开源ERP如何助企业破局?

近期,美国特朗普政府推行的关税政策对全球供应链和进出口企业造成巨大冲击,尤其是依赖中美贸易的企业面临成本激增、利润压缩和合规风险。在此背景下,如何通过数字化转型优化管理效率、降低运营成本成为企业生存的关键。本文以免费开源ERP系统…

go游戏后端开发25:红中麻将规则介绍

一、游戏基础规则介绍 在开发红中麻将游戏之前,我们需要先了解其基础规则。红中麻将的牌面由 a、b、c、d 四种花色组成,其中 a、b、c 分别代表万、条、筒,每种花色都有 1 - 9 的九种牌,每种牌各有四张,总计 36 张 4 …

Unity:平滑输入(Input.GetAxis)

目录 1.为什么需要Input.GetAxis? 2. Input.GetAxis的基本功能 3. Input.GetAxis的工作原理 4. 常用参数和设置 5. 代码示例:用GetAxis控制角色移动 6. 与Input.GetAxisRaw的区别 7.如何优化GetAxis? 1.为什么需要Input.GetAxis&…

OpenCV:计算机视觉的强大开源库

文章目录 引言一、什么是OpenCV?1.OpenCV的核心特点 二、OpenCV的主要功能模块1. 核心功能(Core Functionality)2. 图像处理(Image Processing)3. 特征检测与描述(Features2D)4. 目标检测&#…

AI浪潮下的IT职业转型:医药流通行业传统IT顾问的深度思考

AI浪潮下的IT职业转型:医药流通行业传统IT顾问的深度思考 一、AI重构IT行业的技术逻辑与实践路径 1.1 医药流通领域的智能办公革命 在医药批发企业的日常运营中,传统IT工具正经历颠覆性变革。以订单处理系统为例,某医药集团引入AI智能客服…

Qt进阶开发:QFileSystemModel的使用

文章目录 一、QFileSystemModel的基本介绍二、QFileSystemModel的基本使用2.1 在 QTreeView 中使用2.2 在 QListView 中使用2.3 在 QTableView 中使用 三、QFileSystemModel的常用API3.1 设置根目录3.2 过滤文件3.2.1 仅显示文件3.2.2 只显示特定后缀的文件3.2.3 只显示目录 四…

KAPC的前世今生--(下)下RPCRT4!NMP_SyncSendRecv函数分析

第一部分:nt!KiDeliverApc函数调用nt!IopCompleteRequest函数后准备返回 1: kd> kv # ChildEBP RetAddr Args to Child 00 ba3eec18 80a3c83b 896e4e40 ba3eec64 ba3eec58 nt!IopCompleteRequest0x3a3 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv…