加法器

加法器

只愿长相守 提交于 2020-03-09 04:43:28
半加器 一个与门一个异或门 通过一个异或门计算出个位,通过一个与门计算出是否进位 与门 A B AB 0 0 0 0 1 0 1 0 0 1 1 1 异或门 A B AB 0 0 0 0 1 1 1 0 1 1 1 0 A B 0 + 0 = 00 0 + 1 = 01 1 + 0 = 01 1 + 1 = 10 A ~~~~~B ~~~~~~~~~\\ 0+0=00\\ 0+1=01\\ 1+0=01\\ 1+1=10 A B 0 + 0 = 0 0 0 + 1 = 0 1 1 + 0 = 0 1 1 + 1 = 1 0 前面是与门,同1进1,计算的是是否进位。 后面是异或门,同0异1,计算的是个位数上的值。 这样就组成了简单得二进制数的加法 这样更直观吧 电路图演示是这样的 全加器 两个半加器和一个或门 现假如还是刚才的例子,只不过二进制头上多了个进位 于是乎 我们先来看个位数上的值 有了进位信号,原来的个位数上的值和进位信号进行 异或 操作便可更新个位数上的值 我们在来定义下,从右往左数,第二列不是十位,就称之为“二位” 二位的值怎么算呢 先不看进位信号,如果加数和被加数都是1,那么半加器进行 与 操作 ( 1 + 1 = 1 ) (1+1=1) ( 1 + 1 = 1 ) 二位结果自然是1 (图4) 之前的进位结果不是1,但是进位信号与原来个位数进行 与 操作( 1 + 1

PAT乙级1074 宇宙无敌加法器

穿精又带淫゛_ 提交于 2020-03-08 21:33:47
题目描述 代码实现 # include <iostream> # include <bits/stdc++.h> using namespace std ; int a [ 22 ] = { 0 } , b [ 22 ] = { 0 } , c [ 22 ] = { 0 } , d [ 22 ] = { 0 } ; void change ( string s , string s1 , string s2 ) { int n = s1 . size ( ) ; int m = s2 . size ( ) ; int p = s . size ( ) ; for ( int i = 0 ; i < p ; i ++ ) { c [ i ] = s [ p - 1 - i ] - '0' ; } for ( int i = 0 ; i < n ; i ++ ) { a [ i ] = s1 [ n - 1 - i ] - '0' ; } for ( int i = 0 ; i < m ; i ++ ) { b [ i ] = s2 [ m - 1 - i ] - '0' ; } } int main ( ) { string s1 , s2 , s3 ; cin >> s1 >> s2 >> s3 ; change ( s1 , s2 , s3 ) ; /

多路选择器,加法器原理及verilog实现

帅比萌擦擦* 提交于 2020-03-04 18:58:03
1.数据选择器是指经过选择,把多个通道的数据传到唯一的公共数据通道上。实现数据选择功能的逻辑电路称为数据选择器,它的作用相当于多个输入的单刀多掷开关。本例程以四选一数据选择器 (电平触发) 为例。 四选一数据选择器书堆 4 个数据源进行选择, 使用量为地址 A1A0 产生 4 个地址信号,由 A1A0 等于“00” 、 “01” 、 “10” 、 “11”来选择输出,真值表如下: 对应的verilog代码为 module mux4(d0,d1,d2,d3,y,a,g); input d0,d1,d2,d3; // 输入的四个数据 input g; // 输入使能端 input[1:0] a; // 输入的选择端 output y; // 输出数据 reg y; // 输出数据寄存器 always@(d0 or d1 or d2 or d3 or g or a) // 电平触发,当 d0,d1,d2,d3,a 有变化时 候、// 触发 begin if(g==1'b0) //当 当 g 为 为 0 时候 y=1'b0; //y 置 置 0 else case(a) // 判断 a 的取值,并作出相应的赋值 2'b00:y=d0; 2'b01:y=d1; 2'b10:y=d2; 2'b11:y=d3; default:y=1'b0; //a 为其他值得条件下,y 赋予 0

计算机组成与设计(五)—— 加法器的优化

允我心安 提交于 2020-03-04 18:43:28
4-bit加法器示例 先看一下上一节得到的加法器实现,可以看出改进的地方。 不难发现整个过程是从右至左依次执行,每一个进位需要等前面的运算全完成,可以在一开始得到所有的进位吗? 行波进位加法器(Ripple-Carry Adder,RCA) 像上面4-bit加法器这样实现的加法器被称作行波进位加法器,所有的进位像波浪一样向左推进。 结构特点:低位全加器的C out 连接到高一位全加器C in 优点:电路布局简单,设计方便 缺点:高位的运算必须等待低位的运算完成 4-bit RCA的门电路实现 我们考察其中的关键路径(延迟最长的路径) 总延迟时间:(T + T)*4 + T = 9T,推广到n位,总时间为(2n + 1)*T。降低总延迟时间就是我们优化的方向。 加法器的优化思路 主要思路:提前计算出“进位信号”。对进位信号进行分析: $C_{i+1} = (A_i · B_i) + (A_i · C_i) + (B_i · C_i) = (A_i · B_i) + (A_i + B_i) · C_i$ 设:生成信号( Genarate ):$G_i = A_i · B_i$,传播信号 (Propagate ):$P_i = A_i + B_i$,则:$C_{i+1} = G_i + P_i · C_i$ 如果把这看作一个递推公式,这是一个等差函数,通项可直接求出来,且只与$A_i$和

Vivado学习使用构建加法器

為{幸葍}努か 提交于 2020-03-02 04:19:32
实验步骤: 1、首先双击打开Vivado软件,然后点击File,选择New project,在如下界面中选择储存的文件地址并输入工程文件名为adder,然后按照下面各图的顺序往下进行(同时还需要新建一个add文件) 然后新建一个adder.v(也需要新建一个add.v)文件,并写入给定的程序,随后在旁边的工具栏中找到Add Sources,添加已经写好的源文件: 随后编写另外一个文件,同时完成仿真文件:点击Add sources选择Add or create simulation sources 点击next,再选择Create File,选择文件保存的地址,文件名设置为si_adder 在主界面找到仿真文件,点开就会看到新建的仿真文件,并填写好,点击Run Simulation中的Run Behavioral Simulation。随后可以看综合仿真后的文件和信息 同时在控制台可以看到输出的数字信息 来源: CSDN 作者: ZhangLH66 链接: https://blog.csdn.net/ZhangLH66/article/details/104594138

计算机CPU是怎么认识代码的?

夙愿已清 提交于 2020-02-11 14:41:45
先说一下半导体,啥叫半导体?就是介于导体和绝缘体中间的一种东西,比如二极管。 电流可以从A端流向C端,但反过来则不行。你可以把它理解成一种防止电流逆流的东西。 当C端10V,A端0V,二极管可以视为断开。 当C端0V,A端10V,二极管可以视为导线,结果就是A端的电流源源不断的流向C端,导致最后的结果就是A端=C端=10V 等等,不是说好的C端0V,A端10V么?咋就变成结果是A端=C端=10V了?你可以把这个理解成初始状态,当最后稳定下来之后就会变成A端=C端=10V。 文科的童鞋们对不住了,实在不懂问高中物理老师吧。反正你不能理解的话就记住这种情况下它相当于导线就行了。 利用半导体,我们可以制作一些有趣的电路,比如【与门】 此时A端B端只要有一个是0V,那Y端就会和0V地方直接导通,导致Y端也变成0V。只有AB两端都是10V,Y和AB之间才没有电流流动,Y端也才是10V。 我们把这个装置成为【与门】,把有电压的地方计为1,0电压的地方计为0。至于具体几V电压,那不重要。 也就是AB必须同时输入1,输出端Y才是1;AB有一个是0,输出端Y就是0。 其他还有【或门】【非门】和【异或门】,跟这个都差不多,或门就是输入有一个是1输出就是1,输入00则输入0。 非门也好理解,就是输入1输出0,输入0输出1。 异或门难理解一些,不过也就那么回事,输入01或者10则输出1

深入浅出计算机组成原理学习笔记: 第十三讲

六月ゝ 毕业季﹏ 提交于 2020-02-09 08:25:33
一、上节回顾 上一讲,我们看到了如何通过电路,在计算机硬件层面设计最基本的单元,门电脑,我给你看的门电路非常简单,只能做简单的“与(AND)”“或(OR)”“NOT(非)”和“异或(XOR)”, 这样最基本的单比特逻辑运算。下面这些门电路的标你需要非常熟悉,后续的电路都是由这些门电路组合起来的。 这些基本的门电路,是我们计算机硬件端的最基本的“积木”,就好像了高积木里面最简答的小方块,看似不起眼但把他们组合起来满最终可以搭出一个星际大战里面千年年隼这样的大玩意儿。 我们今天包含十亿级别晶体管的现代 CPU,都是由这样一个一个的门电路组合而成的。 二、异或们和半加器 1、2个8位整数的加法 1、2排8个开关加法得到结果 2、需要1排8位的开关 2、其实加法器就是像一个办法把三排开关电路连起来 3、我们人在计算加法的时候一般会怎么操作 4、为什么我们需要异或? 其实异或就是一个最简单的整数加法,所需要使用的基本电路 5、进位 那这个就对应一个与门,也就是有且只有在加数和被加数都是1的时候,我们的进位才是1 6、半加器 所以、通过一个异或们计算机出个位,通过一个与或门计算出是否仅为,我们就通过电脑算出了一位数的加法、 于是、我们把两个门电路打包,给它取一个名字,就叫做半加器 7、半加器的电路演示 三、全加器 1、半加器存在的问题 1、解决了什么问题? 2、存在什么问题? 2

L1-3 宇宙无敌加法器 (20分) java

余生长醉 提交于 2020-02-02 04:22:56
地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的。而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”。每个 PAT 星人都必须熟记各位数字的进制表,例如“……0527”就表示最低位是 7 进制数、第 2 位是 2 进制数、第 3 位是 5 进制数、第 4 位是 10 进制数,等等。每一位的进制 d 或者是 0(表示十进制)、或者是 [2,9] 区间内的整数。理论上这个进制表应该包含无穷多位数字,但从实际应用出发,PAT 星人通常只需要记住前 20 位就够用了,以后各位默认为 10 进制。 在这样的数字系统中,即使是简单的加法运算也变得不简单。例如对应进制表“0527”,该如何计算“6203 + 415”呢?我们得首先计算最低位:3 + 5 = 8;因为最低位是 7 进制的,所以我们得到 1 和 1 个进位。第 2 位是:0 + 1 + 1(进位)= 2;因为此位是 2 进制的,所以我们得到 0 和 1 个进位。第 3 位是:2 + 4 + 1(进位)= 7;因为此位是 5 进制的,所以我们得到 2 和 1 个进位。第 4 位是:6 + 1(进位)= 7;因为此位是 10 进制的,所以我们就得到 7。最后我们得到:6203 + 415 = 7201。 输入格式: 输入首先在第一行给出一个 N 位的进制表(0 << < N ≤

乘法器的实现

巧了我就是萌 提交于 2020-02-01 06:04:01
如果希望CPU支持某一种运算,我们就需要用硬件电路来实现对应的功能部件。我们现在已经有了一种乘法运算的方法,适合硬件来进行实现。而且,我们还掌握了一些硬件电路的基本知识。我们就可以一起来尝试如何构建一个硬件的乘法器。 现在我们来看乘法器是怎么实现的。我们用一个简单的二进制乘法作为例子,1000乘以1001,这是两个四位的二进制数相乘,那么为此我们要实现一个四位的乘法器。 首先我们需要一个寄存器来保存被乘数(Multiplicand),被乘数寄存器是一个8位的寄存器,而且带有左移的功能。它有一个左移的控制信号输入,当外部的控制逻辑(Control test)将这个信号视为有效时,在下一个时钟顺延到来的时候,被乘数寄存器当中的内容就会向左移动一位。 第二个寄存器是乘积(Product)寄存器,这也是一个8位的寄存器,用来保存运算的结果。被乘数寄存器当中的内容和乘积寄存器当中的内容需要进行加法运算,这里我们就需要进行一个8位的加法器,它会将被乘数寄存器当中的内容和乘积寄存器当中的内容进行相加,并将结果再送到乘积寄存器当中。 另外,我们还需要一个寄存器来保存乘数。这个寄存器只要4位就可以了,但有一点比较特殊,乘数寄存器的最低位被连到了控制逻辑(Control test),也就说控制逻辑可以观察当前乘数寄存器的最低位,并据此来生成相关的控制信号。这些控制信号就包括是否要让加法器进行加法运算

格雷码加法器

强颜欢笑 提交于 2020-01-30 12:37:33
1、概述   格雷码执行加1操作最多只会变1位,可用在多位地址指针中消除毛刺。 2、verilog代码 1 `timescale 1ns / 1ps 2 3 module gray_adder 4 #(parameter length = 5) 5 ( 6 input clk, 7 input rstn, 8 input inc, 9 output [length-1:0] Gray 10 ); 11 12 reg [length-1:0] Gray_reg; 13 reg [length-1:0] Gray_next_reg; 14 15 reg [length-1:0] Bin_reg; 16 reg [length-1:0] Bin_next_reg; 17 18 integer i; 19 20 always @(posedge clk or negedge rstn) begin 21 if(!rstn) begin 22 Gray_reg <= 0; 23 end 24 else begin 25 Gray_reg <= Gray_next_reg; 26 end 27 end 28 29 30 always @(*) begin 31 Bin_reg[length-1] = Gray_reg[length-1]; // 格雷码转二进制码 32 for(i=length