逻辑运算加法器

2023-12-25 19:20
文章标签 逻辑运算 加法器

本文主要是介绍逻辑运算加法器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

逻辑门本质上操作的是单个二进制数,通过高低电压或者有无信号来表示,并且,因为二进制数的原因,一个数字,我们可以通过二进制数来表示,整数可以精确表示,浮点数可以近似表示
本篇文章使用逻辑门来构建加法器
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.chinasem.cn/article/536656

相关文章

【Java中的位运算和逻辑运算详解及其区别】

Java中的位运算和逻辑运算详解及其区别 在 Java 编程中,位运算和逻辑运算是常见的两种操作类型。位运算用于操作整数的二进制位,而逻辑运算则是处理布尔值 (boolean) 的运算。本文将详细讲解这两种运算及其主要区别,并给出相应示例。 应用场景了解 位运算和逻辑运算的设计初衷源自计算机底层硬件和逻辑运算的需求,它们分别针对不同的处理对象和场景。以下是它们设计的初始目的简介:

基本和复合逻辑运算

目录 基本逻辑运算 与运算 或运算 非运算 复合逻辑运算   与非运算 或非运算  异或运算 同或运算   基本逻辑运算 与运算         两个都为1才为1,否则为0,类似于编程语言里的&。 有0出0,全1出1。 逻辑表达式就是AB,可以省略中间的点。 逻辑符号输入A和B输出Y,中间有个&符号,表示与门。 或运算         只

Pandas-数据操作-数值型(三):逻辑筛选【逻辑运算符号】【逻辑运算函数:query()、isin()】

2.1 逻辑运算符号 例如筛选data[“open”] > 23的日期数据 data[“open”] > 23返回逻辑结果 data["open"] > 232018-02-27 True2018-02-26 False2018-02-23 False2018-02-22 False2018-02-14 False # 逻辑判断的结果可以作为筛选的

Simulink代码生成:关系运算与逻辑运算

文章目录 1 引言2 模块使用实例2.1 关系运算2.2 关系运算 3 代码生成4 总结 1 引言 在Simulink中经常需要判断两个信号的大小关系、是否相等,或者判断布尔类型信号的与、或、非等。本文研究通过关系运算与逻辑运算模块实现上述需求。 2 模块使用实例 2.1 关系运算 Relational Operator模块常用于判断信号相等、不等以及大小关系,在Simul

【计算机组成原理】二、数据的表示和运算:3.算术逻辑单元ALU(逻辑运算、加法器)

4.运算器ALU 文章目录 4.运算器ALU4.1逻辑运算非(NOT)与(AND)或(OR)异或(XOR)同或(XNOR) 4.2加法器4.2.1一位全加器4.2.2串行加法器4.2.3并行加法器 4.3ALU功能与结构 运算器由 算术逻辑单元ALU和若干 通用寄存器(用于暂存操作数和中间结果),如 累加器ACC, 乘商寄存器MQ, 操作数寄存器X, 变址寄存器IX

常用的逻辑运算及其指令

1. xor亦或运算 只有在两个比较的位不同时其结果是1,否则结果为0 即“两个输入相同时为0,不同则为1”! 0000000011111111111111110101xor0000000011111111000000000010结果0000000000000000111111110111 2. and与运算 只有两个位都是1时才为1 即有假(0)即得假(0) 00000000111

C# OpenCvSharp 逻辑运算-bitwise_and、bitwise_or、bitwise_not、bitwise_xor

bitwise_and 函数 🤝 作用或原理: 将两幅图像进行与运算,通过逻辑与运算可以单独提取图像中的某些感兴趣区域。如果有掩码参数,则只计算掩码覆盖的图像区域。 示例: 在实际应用中,可以用 bitwise_and 来提取图像中的某些部分。例如,我们可以从图像中提取出一个特定的颜色范围(如红色)。 using OpenCvSharp;class Program{static void

C和C++中的逻辑运算和位运算

1:&&具有短路特性,如果前一个逻辑表达式计算的结果是错,则不会继续进行第二个逻辑表达式的计算。 2:||也是一个操作符,它可以用于把两个其他的逻辑表达式合并成一个。如果那两个表达式中有任何一个计算结果是对则合并后的结果就是对,否则结果为错。这个操作符也具有短路特性,如果第一个逻辑表达式计算结果是对则整个结果一定是对,就不会进行第二个逻辑表达式的计算了。 3:!也是一个逻辑表达式,它可以用于对

1074 宇宙无敌加法器(测试点5)

solution 每位权值不同的高精度加法测试点5:结果为0的情况 #include<iostream>#include<string>using namespace std;int main(){string rule, a, b, ans = "";int carry = 0, temp, cnt, power;cin >> rule >> a >> b;for(int i =

【计算机视觉】数字图像处理基础:以像素为单位的图像基本运算(点运算、代数运算、逻辑运算、几何运算、插值)

0、前言 在上篇文章中,我们对什么是数字图像、以及数字图像的组成(离散的像素点)进行了讲解🔗【计算机视觉】数字图像处理基础知识:模拟和数字图像、采样量化、像素的基本关系、灰度直方图、图像的分类。 我们知道,数字图像其实就是像素点组成的二维矩阵。本节我们要讲的就是基于这个二维矩阵进行一些数学上的基本运算(本质就是就是矩阵的计算——线性代数),对图像进行处理,这些基本运算也是数字图像处理的基础和