逻辑运算加法器

前言

逻辑门本质上操作的是单个二进制数,通过高低电压或者有无信号来表示,并且,因为二进制数的原因,一个数字,我们可以通过二进制数来表示,整数可以精确表示,浮点数可以近似表示
本篇文章使用逻辑门来构建加法器
git地址:https://gitlab.com/lingyanTools/comvirtual.git

加法器

先来看整数,一个二进制整数是怎么进行加法运算的呢?
看下面两个二进制数
A = 101 (十进制) = 01100101 (二进制) A = 101(十进制) = 01100101(二进制) A=101(十进制)=01100101(二进制)
B = 201 (十进制) = 11001001 (二进制) B = 201(十进制) = 11001001(二进制) B=201(十进制)=11001001(二进制)
我们从右边开始往左侧进行计算,计算相应的位,如果大于1,则进位,整个流程如下:

  1. 默认进位是0
  2. 1 + 1 + 进位0 = 0,进位1
  3. 0 + 0 + 进位1 = 1,进位0
  4. 1 + 0 + 进位0 = 1,进位0
  5. 0 + 1 + 进位0 = 1,进位0
  6. 0 + 0 + 进位0 = 0,进位0
  7. 1 + 0 + 进位0 = 1,进位0
  8. 1 + 1 + 进位0 = 0,进位1
  9. 0 + 1 + 进位1 = 0,进位1

因为最后有个进位,所以最终的结果位100101110 = 302 = 101 + 201
很容易发现,对于二进制的加法的每一位操作,有两个值需要我们确定,一个是当前的进位值 C i C_i Ci,一个是当前的计算值 F i F_i Fi,可以用下面的公式表示:
{ F i = ( X i 异或 Y i ) 异或 C i − 1 , C i = ( X i 与 C i − 1 ) 或 ( Y i 与 C i − 1 ) 或 ( X i 与 Y i ) \begin{cases} F_i = (X_i 异或 Y_i) 异或 C_{i-1},\\ C_i = (X_i 与 C_{i-1}) 或 (Y_i 与 C_{i-1}) 或 (X_i 与 Y_i ) \end{cases} {Fi=(Xi异或Yi)异或Ci1,Ci=(XiCi1)(YiCi1)(XiYi)

用电路表示 F i F_i Fi的值为:
在这里插入图片描述

用电路表示 C i C_i Ci的值为:
在这里插入图片描述

我们把通过输入 X i X_i Xi Y i Y_i Yi C i − 1 C_{i-1} Ci1获取输出$F_i 和 和 C_i$用C语言表示如下:

/**
 * 全加器
 * 输入两个二进制位,其实就是两根电路
 * 输入进位位:c
 * param:
 * f:输出值
 * c1:输出进位值
 * 返回加法位
 */
void full_add(long x,long y,long c,long* f, long* c1)
{
    long a = xor_gate(x, y);
    *f = xor_gate(a, c);
    
    long b1 = and_gate(x, c);
    long b2 = and_gate(y, c);
    long b3 = and_gate(x, y);
    *c1 = or_gate(or_gate(b1, b2),b3);
}

这个电路组合叫做全加器

串位进位加法器

上述的全加器可以计算一位的加法,我们把每位的运算连起来,就是我们上面计算过程列出的那样,从右向左依次计算,假设我们需要满足一个64位的加法器,我们可以用64个全加器串行连接起来,下图中n=64:
在这里插入图片描述

这种连接方式叫做串位进位加法器
这样我们的64位加法器就可以用C语言描述了

/**
 * 逻辑运算器的加法
 * param:
 * in_1:输入1
 * in_2:输入2
 * bits:选择执行加法的位数
 * 初始进位,并且返回执行后的进位
 * return: 返回输出结果
 */
long alu_add(long in_1, long in_2, long bits,long* c)
{
    long result = 0;
    for(int i = 0;i<bits;i++)
    {
        long x = alu_bit(in_1, i); // 获取输入1的第i位
        long y = alu_bit(in_2, i); // 获取输入2的第i位
        long f = 0;
        full_add(x, y, *c, &f, c);
        result |= f<<i;
    }
    return result;
}

/**
 * 获取二进制位
 * param:
 * in_1:输入的数据
 * bits:获取哪一位的二进制位,0~sizeof(long)-1
 * return
 * 返回获取到的数据0或1
 */
unsigned long alu_bit(unsigned long in_1, long bits)
{
    unsigned long a = 1;
    return ((a<<bits)&in_1)>>bits;
}

进位选择加法器

串位进位加法器由于是串行的,这就导致每一步的运算必须等待前面一位计算完成。几乎所有的算术运算都要用到ALU, ALU的核心还是加法器,因此要提高运算速度, 加法器的速度非常关键。
在进行进位选择加法器讲解之前,先介绍一种选择器,2-1选择器

2-1选择器

2-1选择器是根据一位控制位控制2个输入输出哪一个的电路选择器,电路图如下:
在这里插入图片描述

我们可以用C语言实现一下

long select_2_1(long in_1,long in_2,long door)
{
    long a1 =  and_gate(in_1, door);
    long a2 =  and_gate(in_2, not_gate(door));
    return or_gate(a1, a2);
}

并且该C函数可以不止实现单个位的选择,对于64位以内的可以通过该方法返回选择后的值。

进位选择加法器

进位选择加法器是这样一种算法,比如对于64位的加法,分成四部分

  • A:0~15位
  • B:16~31位
  • C:32~47位
  • D:48~63位

BCD部分都有两种计算逻辑,一种假设进位为0,一种假设进位为1
所以,A,B0,B1,C0,C1,D0,D1可以并行运算。运算完成后进行拼接,拼接逻辑如下:

  • 根据A的进位选择B0或者B1
  • 根据上一步选择的B0或者B1是否发生进位选择C0或者C1
  • 根据上一步选择的C0或者C1是否发生进位选择D0或者D1

下面看一下C语言的实现

long alu_add_16(long in_1, long in_2)
{
    long ac = 0;
    long bc0 = 0;
    long bc1 = 1;
    long cc0 = 0;
    long cc1 = 1;
    long dc0 = 0;
    long dc1 = 1;
    
    // 下面这些并行运算
    long a = alu_add(in_1, in_2, 16,&ac);
    long b0 = alu_add(in_1>>16, in_2>>16, 16,&bc0);
    long b1 = alu_add(in_1>>16, in_2>>16, 16,&bc1);
    long c0 = alu_add(in_1>>32, in_2>>32, 16,&cc0);
    long c1 = alu_add(in_1>>32, in_2>>32, 16,&cc1);
    long d0 = alu_add(in_1>>48, in_2>>48, 16,&dc0);
    long d1 = alu_add(in_1>>48, in_2>>48, 16,&dc1);
    
    long b = select_2_1(b1, b0, ac);
    long c = select_2_1(c1, c0, b==b1?bc1:bc0);
    long d = select_2_1(d1, d0, c==c1?cc1:cc0);
    return a | b<<16 | c<<32 | d<<48;
}

如何进行减法运算

使用逻辑门进行减法运算,涉及借位,运算比较麻烦,但是我们可以通过操作将减法运算变成加法运算,比如对下面的减法运算:
A = X − Y A = X - Y A=XY
我们可以写成加法的形式:
A = X + ( − Y ) A = X + (-Y) A=X+(Y)

而对于补码编码的数据来说,-Y等于Y取反然后加1,取反操作之需要对Y执行反相器即可,而加1的操作正好可以通过设置加法的初始进位为1来进行处理,下面给出减法运算的C语言电路描述

long alu_not(long in_1, long bits)
{
    long res = 0;
    for(int i = 0;i<bits;i++)
    {
        long x = alu_bit(in_1, i); // 获取输入1的第i位
        res |= (not_gate(x)<<i);
    }
    return res;
}

long alu_sub(long in_1, long in_2, long bits)
{
    long a = alu_not(in_2,64);
	int c = 1;
    return alu_add(in_1, a, bits,&c);
}

这样,我们就使用C语言按照电路图的设计实现了加减的逻辑处理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端查漏补缺】每日10题 2023-12-25

1. 实现lodash _get方法 _.get 是 Lodash 库中的一个方法&#xff0c;用于按照给定的路径从对象中获取值。它是一种安全的方式&#xff0c;可以避免在获取嵌套属性时出现的空指针错误。 _.get 方法的语法如下&#xff1a; _.get(object, path, [defaultValue])参数说明&…

python dash call_back 多output 7

效果 代码 # 导入Dash库及其相关组件&#xff0c;用于构建交互式Web应用 from dash import Dash, dcc, html, Input, Output, callback# 定义一个外部样式表&#xff0c;用于美化应用界面 external_stylesheets [https://codepen.io/chriddyp/pen/bWLwgP.css]# 创建一个D…

Jupyter Notebook的安装及在网页端和VScode中使用教程(详细图文教程)

目录 一、Jupyter Notebook1.1 组成组件1.2 优点1.3 常规用途 二、安装及使用2.1 网页端2.1.1 安装Jupyter Notebook2.1.2 检验是否安装成功2.1.3 启动Jupyter Notebook2.1.4 使用Jupyter Notebook 2.2 VScode中安装及使用2.2.1 安装Jupyter2.2.2 使用Jupyter 三、常用命令3.1 …

有没有简单好用的仓库管理系统?

“我是一家小型加工制造企业&#xff0c;希望使用一款免费的仓库管理软件管理下仓库物资&#xff0c;要上手比较快&#xff0c;有各类报表统计功能&#xff01;同时有客服人员可以答疑。PS&#xff1a;最好有配套APP就最方便了。” 稍微总结一下仓库管理系统的需求—— 免费的仓…

开源自托管导航页配置服务Dashy本地搭建结合内网穿透远程访问

开源自托管导航页配置服务Dashy本地搭建结合内网穿透远程访问 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一…

220v电源转换12v和24v用什么芯片

问&#xff1a;将220V电源转换为12V和24V - 使用什么芯片&#xff1f; 答&#xff1a;常用于将220V电源转换为12V和24V的芯片是AH8669和AH8665。 问&#xff1a;AH8669芯片提供了什么特点&#xff1f; 答&#xff1a;AH8669芯片适用于最大电流为700mA的应用。它内置了MOSFET…

Text2SQL学习整理(五)将Text-to-SQL任务与基本语言模型结合

导语 上篇博客&#xff1a;Text2SQL学习整理&#xff08;四&#xff09;将预训练语言模型引入WikiSQL任务简要介绍了两个借助预训练语言模型BERT来解决WIkiSQL数据集挑战的方法&#xff1a;SQLOVA和X-SQL模型。其中&#xff0c;借助预训练语言模型的强大表示能力&#xff0c;S…

maven下载jar包失败

配置国内镜像 设置国内的仓库,比如: <!--阿里仓库--><mirror><id>alimaven</id><name>aliyun maven</name><url>https://maven.aliyun.com/repository/public/</url><mirrorOf>central</mirrorOf></mirror>…

C++11(上):新特性讲解

C11新特性讲解 前言1.列表初始化1.1{ }初始化1.2std::initializer_list 2.类型推导2.1 auto2.2 typeid2.3 decltype 3.范围for4.STL的变化4.1新容器4.2容器的新方法 5.右值引用和移动语义5.1 左值引用和右值引用5.2 左值引用与右值引用比较5.3 右值引用的使用场景5.4 右值、左值…

张驰咨询:企业提质增效的关键:掌握六西格玛设计(DFSS)的核心法则

在当今快节奏、变革迅速的商业世界中&#xff0c;企业面临的最大挑战之一是如何兼顾成本效益与高品质输出。六西格玛设计&#xff08;DFSS&#xff09;方法论不仅响应了这一挑战&#xff0c;而且提供了一个综合解决方案&#xff0c;将顾客需求和企业目标完美融合&#xff0c;并…

汽车行业必须知识--CAN FD通讯

关注菲益科公众号—>对话窗口发送 “CANoe ”或“INCA”&#xff0c;即可获得canoe入门到精通电子书和INCA软件安装包&#xff08;不带授权码&#xff09;下载地址。 前面我们讲了CAN的基础知识&#xff0c;但是由于CAN总线存在通讯速率低&#xff0c;报文头过长&#xff0c…

嵌入式科普(7)你知道JTAGSWD接口最少接几根线?

一、目的/概述 二、实际问题 2.1 原接线方式 2.2 解决方案 2.3 思考GND原因 三、资料来源 四、JTAG&SWD相关概念的逻辑 五、总结和提问 嵌入式科普(7)你知道JTAG&SWD接口最少接几根线&#xff1f; 一、目的/概述 1、那位同学直接抢答说2根线&#xff0c;数…

【网络编程】基于UDP数据报实现回显服务器/客户端程序

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 前言 我们如果…

2023大数据十大关键词

随着我国大数据产业政策日趋完善、产业基础日益巩固、数据要素市场建设不断深化&#xff0c;大数据产业再次迎来巨大发展空间。6月26日至28日&#xff0c;由中国信息通信研究院、中国通信标准化协会主办&#xff0c;中国通信标准化协会大数据技术标准推进委员会&#xff08;CCS…

中国信通院「星熠」案例公布,个推消息推送获评绿色SDK产品优秀案例

12月22日&#xff0c;由中国信息通信研究院安全研究所主办、大数据应用与安全创新实验室承办的“数据安全共同体计划成员大会&#xff08;2023&#xff09;”在京举行。每日互动&#xff08;个推&#xff09;作为“数据安全共同体计划”的联合发起单位及首批成员单位受邀出席大…

unity HoloLens2开发,使用Vuforia识别实体 触发交互(二)(有dome)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、打包到HoloLens二、Vuforia相关1.配置识别框2.制作一个半透明识别框&#xff1a;3.设置如下4.问题 四 HoloLens2 问题总结 前言 我使用的utniy 版本&#xff1a;Unity 2021.3…

如何做代币分析:以 LINK 币为例

作者&#xff1a;lesleyfootprint.network 数据源&#xff1a;Token Dashboard 在加密货币和数字资产领域&#xff0c;代币分析起着至关重要的作用。代币分析指的是深入研究与代币相关的数据和市场行为的过程。 通过代币分析&#xff0c;我们可以获得对市场趋势、风险因素、…

Wi-Fi、蓝牙、ZigBee等多类型无线连接方式的安全物联网网关设计

随着物联网和云计算技术的飞速发展.物联网终端的数量越来越多&#xff0c;终端的连接方式也更趋多样化&#xff0c;比如 Wi-Fi蓝牙和 ZigBee 等。现有的物联网网关大多仅支持一种或者几种终端的接人方式。无法满足终端异构性的需求。同时&#xff0c;现有的物联网网关与终端设备…

基于SpringBoot+vue实现的学生档案信息管理系统

一、 系统架构 前端&#xff1a;Vue | Element-ui 后端&#xff1a;SpringBoot | mybatis-plus 环境&#xff1a;JDK1.8 | Mysql | Maven | nodejs 二、代码及数据库 三、功能介绍 01. 登录 02. 首页 03. 基本信息 04. 课程学业信息-课业成绩 05. 课程学业信息-科研项目…

QAM 归一化因子

文章目录 前言一、归一化1、作用2、OFDM 归一化因子 二、归一化因子公式 前言 在做通信系统仿真时&#xff0c;遇到了 QAM 归一化因子的求解&#xff0c;对这里不是很清楚&#xff0c;因此本文对 QAM&#xff08;正交振幅调制&#xff09;归一化因子学习做了一下记录。 一、归…
最新文章