计算机体系结构——功能部件

2023-05-16

一、功能部件——加法器

1. 全加器

全加器——将两位本地二进制数和1位低位进位的数进行相加,求的1位本地结果以及1位向高位进位的结果。简单来说就是3个input,2个output,这里的逻辑比较简单,我就不具体介绍了。
下图所示的数全加器的逻辑图,这里我们需要分析一下门的延迟,得到进位Cout需要2级门的延迟,得到结果S需要3级门的延迟。这个延迟需要特别留意,对后面分析问题比较重要‼️

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

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

2 串行进位加法器

所谓串行进位加法器就是把多个全加器进行串接起来,低位的Cout接到高位的Cin,依次串联。
下图所示即为串行进位加法器,从我们刚才分析全加器的门延迟来看,这里得到c16需要(16 * 2)=32级门延迟,得到s15则需要(15 * 2+3)=33级门延迟
解释:这里我稍微解释一下怎么计算的,得到c16我想大家能想明白,就是每一级的Cin到Cout都需要2级门的延迟,所以一共16个全加器就是32级门的延迟。s15的计算就是到c15的时候是30级门的延迟,再加上最后这个全加器,Cin到S的这个3级门的延迟,所以总共是33级门延迟。

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

3 先行进位加法器

工程师说这个串行进位的32级门延迟太慢了,所以又进行了改进。
这里的先行进位加法器,就是通过加快进位传递来加快速度的加法器。主要思想就是并行计算每一位的进位。


下面就开始比较绕了,要慢慢理解。
首先假设有两个N位数相加,被加数为A = a N − 1 _{N-1} N1a N − 2 _{N-2} N2……a i _{i} ia i − 1 _{i-1} i1……a 1 _{1} 1a 0 _{0} 0 ,加数为B = b N − 1 _{N-1} N1b N − 2 _{N-2} N2……b i _{i} ib i − 1 _{i-1} i1……b 1 _{1} 1b 0 _{0} 0 ,相加的和为S = s N − 1 _{N-1} N1s N − 2 _{N-2} N2……s i _{i} is i − 1 _{i-1} i1……s 1 _{1} 1s 0 _{0} 0 ,第i位的进位输入为c i _{i} i,进位输出为c i + 1 _{i+1} i+1

首先介绍几个概念:
进位生成因子:g i _i i = a i _i i & b i _i i
进位传递因子:p i _i i = a i _i i|b i _i i

我们在没有进位生成因子和进位传递因子之前,我们是如何来表示c i + 1 _{i+1} i+1的呢?
c i + 1 _{i+1} i+1 =( a i _i i & b i _i i) | (a i _i i & c i _i i) | (b i _i i & c i _i i) = (a i _i i & b i _i i) | (a i _i i | b i _i i) & c i _i i
但是当引入g i _i i和p i _i i之后,我们就可以简化这个表达式:
c i + 1 _{i+1} i+1 = g i _i i|p i _i i & c i _i i

如果还不是很懂,那么我举个例子来帮助理解
就用一个四位加法器来解释:
首先我们罗列出c i _i i的展开式:

在这里插入图片描述
解释:
拿c1来看,有两种情况c1能为1 ,第一种情况,就是a 0 _0 0和b 0 _0 0都为1,也就是生成因子g 0 _0 0为1,那肯定能生成进位;第二种情况就是a 0 _0 0和b 0 _0 0中只有一个为1,也就是p 0 _0 0为1,再另加上c 0 _0 0为1 ,这样也能生成进位。其他c i _i i类似。

下图4是一个4位的并行进位的逻辑图
首先我要说的是,产生p i _i i 和 g i _i i 是两级门延迟,为什么呢?因为在cmos实现的时候 与门 = 与非门+非门 、 或门 = 或非门 + 非门,所以是两级门的延迟。

再来对比一下,这里产生c 4 _4 4是2级门的延迟,而串行进位则是8级门的延迟,确实是减少了很多的延迟。那就会有同学问,能不能做成64位的?emmm,答案是理论上可以但现实不可以,为什么,看这个例子中,有一个5输入的与非门,这个多输入与非门的延迟是非常大的,一般我们最多用4级,所以我们不能无限扩展位数。那怎么才能实现64位的呢?往下看。

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

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

刚才我们说不能无限扩展位数,那还有什么其他办法能做到呢?
那工程师又提出一个解决办法:分块,实现块内并行,块间串行的加法器。

如图6是一个16位加法器逻辑图:

图6:
在这里插入图片描述
这里采用的是块内并行,块间串行,那得到c15的门延迟为(4 * 2) = 8级门延迟,因为块内产生4位进位只需要2级门的延迟。还不懂的往上看一下图4,从p i _i i 、 g i _i i到c 1 − 4 _{1-4} 14是不是只需要2级门的延迟。对比一下,从串行进位的32级门,到现在的8级门延迟,好像已经降低了很多很多了,但是还不够,继续优化。

为了进一步提升加法器的速度,我们在块间也采用了先行进位的方法。
块间也采用先行进位,那么跟上面产生p i _i i 、 g i _i i一样,这里块间进位也需要进位生成因子G 和进位传递因子 P。

块间进位生成因子:G = g 3 _3 3|( p 3 _3 3 & g 2 _2 2 )|( p 3 _3 3 & p 2 _2 2 & g 1 _1 1 ) | ( p 3 _3 3 & p 2 _2 2 & p 1 _1 1 & g 0 _0 0 );
块间进位传递因子:P = p 3 _3 3 & p 2 _2 2 & p 1 _1 1 & p 0 _0 0

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

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

图7是一个四位的进位生成逻辑,而且是包含了P和G。

那一起看一下16位的块内并行、块间并行的逻辑图。

图8:
在这里插入图片描述
看这张图需要看两层,底下这一层是4个4位的进位逻辑,产生了第二层的p i _i i 和 g i _i i
这里比较难理解,我重点解释一下。

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

结合这张图,我们来看这个执行过程,首先是每一个块内由p i _i i 和 g i _i i生成P 、G,这里可以看图7,一共是2级门的延迟,对应的是图8绿圈部分。第二步是通过第二层(上层)的这个4位进位逻辑产生了c 4 _4 4、c 8 _8 8、c 12 _{12} 12,这里不知道大家能不能理解,因为第一层(底层)的P和G是作为第二层(上层)的p i _i i 和 g i _i i输入的,所以可以由此产生进位c,这步操作也是2级门的延迟,对应的是黄圈部分。第三步是由底层的这4个进位逻辑,产生c 5 − 7 _{5-7} 57、c 9 − 11 _{9-11} 911、c 13 − 15 _{13-15} 1315,这个也是2级门的延迟,对应的图中是蓝圈部分。
所以综上,得出块内并行、块间并行进位逻辑总共的延迟为6级门的延迟,也就是说一个16位先行进位加法器一共需要(2 + 6 + 3) = 11级门延迟,这里的2是产生p i _i i 和 g i _i i的,6是先行进位逻辑产生的,3是从c到结果s产生的。

好啦,我们从串行进位的32级门延迟——>块内并行,块间串行8级门延迟——>块内并行、块间并行6级门延迟,那么优化也到这里就告一段落了。

检测一下大家有没有真的学懂,采用块内并行、块间并行实现64位加法器一共是多少级门延迟呢?

解答一下吧:
答案是(2+10+3) = 15级门延迟。

不会算的话我再简单教一下:

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

这是一个块内并行、块间并行32位的加法器,和64的原理一样,我就拿这个图来解释。(从下往上依次为第一、第二、第三层)
第一层的p i _i i 和 g i _i i产生P和G传递给第二层的p i _i i 和 g i _i i,这里需要2级门的延迟;
第二层的p i _i i 和 g i _i i生成P和G传递给第三层的p i _i i 和 g i _i i,这里需要2级门的延迟;
第三层的p i _i i 、g i _i i 以及 c 0 _0 0 产生c 16 _{16} 16 传递给第二层,也就是图中的红线部分,这里需要2级门的延迟;
第二层的p i _i i 、g i _i i 以及 c 16 _{16} 16 产生c 16 _{16} 16、c 20 _{20} 20、c 24 _{24} 24、c 28 _{28} 28传递给第一层,这里需要2级门的延迟;
第一层通过p i _i i 、g i _i i 以及 c 0 _0 0产生了c 16 − 19 _{16-19} 1619、c 20 − 23 _{20-23} 2023等等进位信号,这里需要2级门的延迟;
这样这个32/64位的先行进位加法器的进位逻辑部分就是10级门的延迟,加上之前说的,产生第一层p i _i i 、g i _i i 时需要的2级门延迟,加上第三层进位信号c i _i i到结果S需要的3级门延迟,就是一共15级门的延迟。

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

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

4 减法操作

这应该不用详细介绍了,就是利用加法器来实现减法操作,贴张图简单看一看就行,就是在加法器之前加一个二选一的逻辑,是减法的话就把被加数[B] 补 _补 取反加1即可。
在这里插入图片描述

二、功能部件——乘法器

这是一个难点,在学这个之前,我们先来了解一下补码的定义。
补码的定义是什么?
假设 [Y] 补 _补 = y 31 _{31} 31y 30 _{30} 30……y 1 _{1} 1y 0 _{0} 0 ,那么我们怎么计算这个Y的值呢?
Y = - y 31 _{31} 31 * 2 31 ^{31} 31 + y 30 _{30} 30 * 2 30 ^{30} 30 + …… + y 1 _{1} 1 * 2 1 ^{1} 1 + y 0 _{0} 0 * 2 0 ^{0} 0


知道了Y的值是怎么计算的,那么我们是不是就能求[X*Y] 补 _补 了呢?
[X * Y] 补 _补 = [X] 补 _补 * Y
其实很简单,我们知道 [X + Y] 补 _补 = [X] 补 _补 + [Y] 补 _补 ,那么[X * Y] 补 _补 就是Y个 [X] 补 _补 相加的结果。

图12:
在这里插入图片描述
举个例子,我们根据补码的定义,我们可以非常方便的计算两个数的相乘,只不过这里需要注意的是一定要进行符号扩展后才可以进行相加,而且只需要对y的最高位进行减操作,其他位都是加操作,最后这个减操作也很简单,只需要“按位取反,末尾加1”即可。


1 一位Booth算法

Booth夫妇把补码乘法的每一位的部分积都统一成相同的形式,通过每次扫描乘数的2位来确定乘积项。

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

为什么数这样的运算规则呢?
来看看Booth夫妇对补码定义公式进行的改动。

Y = - y 31 _{31} 31 * 2 31 ^{31} 31 + y 30 _{30} 30 * 2 30 ^{30} 30 + …… + y 1 _{1} 1 * 2 1 ^{1} 1 + y 0 _{0} 0 * 2 0 ^{0} 0

===> Y = ( y 30 _{30} 30 - y 31 _{31} 31) * 2 31 ^{31} 31 + ( y 29 _{29} 29 - y 30 _{30} 30 ) * 2 30 ^{30} 30 + …… + ( y 0 _{0} 0 - y 1 _{1} 1 ) * 2 1 ^{1} 1 + ( y − 1 _{-1} 1 - y 0 _{0} 0) * 2 0 ^{0} 0

其中y − 1 _{-1} 1 为0

来看刚才两个四位数相乘的例子:
图14:
在这里插入图片描述

其实改动并不大,这个一位Booth乘法只是把部分积形式统一了一下而已,并没有加快多少运算速度。

2 两位Booth算法

这算是非常大的优化了,首先让我们看一下如何优化表达式的:
Y = - y 31 _{31} 31 * 2 31 ^{31} 31 + y 30 _{30} 30 * 2 30 ^{30} 30 + …… + y 1 _{1} 1 * 2 1 ^{1} 1 + y 0 _{0} 0 * 2 0 ^{0} 0

===> Y = ( y 30 _{30} 30 - y 31 _{31} 31) * 2 31 ^{31} 31 + ( y 29 _{29} 29 - y 30 _{30} 30 ) * 2 30 ^{30} 30 + …… + ( y 0 _{0} 0 - y 1 _{1} 1 ) * 2 1 ^{1} 1 + ( y − 1 _{-1} 1 - y 0 _{0} 0) * 2 0 ^{0} 0

===> Y = ( y 29 _{29} 29 + y 30 _{30} 30 - 2 * y 31 _{31} 31) * 2 30 ^{30} 30 + ( y 27 _{27} 27 + y 28 _{28} 28 - 2 * y 29 _{29} 29 ) * 2 28 ^{28} 28 + …… + ( y 1 _{1} 1 + y 2 _{2} 2 -2 * y 3 _{3} 3 ) * 2 2 ^{2} 2 + (y − 1 _{-1} 1 + y 0 _{0} 0 - 2 * y 1 _{1} 1) * 2 0 ^{0} 0

每次可以扫描乘数的3位来确定乘积项,这样乘积项就少了一半。
图15:
在这里插入图片描述
来看看具体例子:
是不是相较于上面的一位Booth运算量减少了很多

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

这里有几点需要注意:
1、每一次运算后是左移2位;(图16中的右边)这个地方指的是部分积的对齐;
2、加减2倍的[X] 补 _补 时,另外再多左一1位,因为左一和乘2是等效的;(图16中的左边)
3、-[X] 补 _补 就是“按位取反,末尾加1”
4、相加时依旧需要符号扩展后再相加

3 Booth的实现

我们知道两位Booth算法部分积一共会产生五种结果:
+[X] 补 _补 —— 对应的是x i _i i
-[X] 补 _补 —— 对应的是-x i _{i} i
+2[X] 补 _补 —— 对应的是x i − 1 _{i-1} i1
-2[X] 补 _补 —— 对应的是-x i − 1 _{i-1} i1
0 —— 可以不管

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

其实实现两位Booth最重要的就是选择

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

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

4 华莱士树(Wallace tree)

核心思想:

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

图21:
在这里插入图片描述
这里解释一下16个数相加的1位华莱士树,就是第一层,把16个数使用5个全加器变成11个数相加,第二层用3个全加器,把11个数变成了8个数相加,第三层使用2个全加器和1个半加器把8个数变成6个数相加,第四层用2个全加器把6个数变成4个数相加,第五层用一个全加器把4个数变成3个数相加,第六层用一个全加器把3个数变成2个数相加,然后最后可以通过一个加法器实现两个数相加便成一个数。这里只需要12级门延迟就可以完成16个数相加转换成2个数相加。

图22:
在这里插入图片描述
其实说简单也是比较简单的,看这幅图就比较清晰明了,两个32位数相乘。使用16个2位Booth算法形成16个部分积,再用64个1位华莱士树(这里不知道大家有没有疑问,为什么数64个?其实是因为32+32 = 64位,因为2个32位数相乘的结果是64位的),这里是把每一位的16个部分积送到一个华莱士树中,比如第0位的16个部分积送到第0棵华莱士树中;每棵华莱士树会产生两位结果,其中s是送入a中相应位,比如0号就是送入a0,但是c就要送到b中高一位,这样最后再通过一个加法器就能求出结果。

这里需要注意16个末尾加1信号的位置,图中已经注明。因为在Booth算法时加-[X] 补 _补 和-2[X] 补 _补 时只取反,而没有加1,所以这里需要加上。

三 、Verilog实现

实现一个16位的先行进位加法器

module add16(a, b, cin, out, cout);
	input [15:0] a;
	input [15:0] b;
	input cin;
	output [15:0] out;
	output cout;
	
	wire [15:0] p = a|b;
	wire [15:0] g = a&b;
	wire [3:0] P, G;
	wire [15:0] c;
	
	assign c[0] = cin;
	
	C4 C0_3(.p(p[3:0]),.g(g[3:0]),.cin(c[0]),.P(P[0]),.G(G[0]),.cout(c[3:1]));
	C4 C4_7(.p(p[7:4]),.g(g[7:4]),.cin(c[4]),.P(P[1]),.G(G[1]),.cout(c[7:5]));
	C4 C8_11(.p(p[11:8]),.g(g[11:8]),.cin(c[8]),.P(P[2]),.G(G[2]),.cout(c[11:9]));
	C4 C12_15(.p(p[15:12]),.g(g[15:12]),.cin(c[12]),.P(P[3]),.G(G[3]),.cout(c[15:13]));
	C4 C_INTER(.p(P),.G(G),.cin(c[0]),.P(),.G(),.cout({c[12],c[8],c[4]}));

	assign cout = (a[15]&b[15]) | (a[15]&c[15]) | (b[15]&c[15]);
	assign out = (~a&~b&c)|(~a&b&~c)|(a&~b&~c)|(a&b&c);
endmodule

module C4(p,g,cin,P,G,cout)
	input [3:0] p, g;
	input cin;
	output P,G;
	output [2:0] cout;
	
	assign P=&p;
	assign G=g[3]|(p[3]&g[2])|(p[3]&p[2]&g[1])|(p[3]&p[2]&p[1]&g[0]);
	
	assign cout[0]=g[0]|(p[0]&cin);
	assign cout[1]=g[1]|(p[1]&g[0])|(p[1]&p[0]&cin);
	assign cout[2]=g[2]|(p[2]&g[1])|(p[2]&p[1]&g[0])|(p[2]&p[1]&p[0]&cin);
endmodule
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机体系结构——功能部件 的相关文章

  • breakpad简单使用

    breakpad简单使用 文章目录 1 breakpad简介2 源码下载3 源码编译3 1 编译遇到的问题 4 In Process测试程序 xff1a 4 1 测试程序编译4 2 生成sym文件4 3 产生minidump文件4 4 分析
  • 树莓派+PX4固件+T265+MAVROS+QGC实现室内定位

    树莓派 43 PX4固件 43 T265 43 MAVROS 43 QGC实现室内定位 整了整整两礼拜 终于稍微搞明白了一点PX4和MAVROS 因为APM固件下MISSIONPLANNER地面站只能windows下 觉得windows和U
  • Python调用sumo,解决自定义vehicle颜色等问题

    Python调用SUMO接口 xff0c 解决vehicle颜色设置问题 1 Python调用sumo 的traci接口 xff0c 通过 traci vehicle setColor进行设置 以下是 示例代码 span class tok
  • 反向散射通信

    原文 xff1a Ambient Backscatter Communications A Contemporary Survey 反向散射通信 反向散射通信系统根据其体系结构可分为三大类 xff1a a 单基地反向散射通信系统 xff08
  • ESP8266+Micropython+OLED网络天气和时钟

    在网上查了很多的资料 xff0c 打算做一个可以按键显示网络时间和天气预报的东西 手头有WeMos nodeMCU和I2C接口的OLED12864 xff0c 不打算用时钟模块 xff0c 因为ESP8266可以上网 xff0c 完全可以借
  • ros入门与控制无人机

    一 概述 总体来说 xff0c 分为三步 step1 xff1a roscore step2 xff1a 发布话题 step3 xff1a 订阅话题并显示 二 roscore roscore 是你在运行所有ROS程序前首先要运行的命令 现理
  • Oracle创建新用户

    Oracle 创建新用户 SQL语句 span class token operator span span class token operator span span class token operator span 创建用户 cre
  • Centos8.2安装配置 VNC 远程桌面Xfce、解决输入法VNC无法使用的问题、解决浏览器无法播放视频的问题

    本文使用MobaXterm Xshell Xfce TightVNC来搭建百度智能云Centos8 2 同时解决解决输入法VNC无法使用的问题 解决浏览器无法播放视频的问题 目录 一 Windows软件列表 MobaXterm TightV
  • python自定义函数 def 的奇妙世界

    自定义函数 def注意事项案例分析作死挑战函数参数形参与实参位置参数关键字参数默认参数必选参数可变参数可变关键字参数 参数问题解答 这里是三岁 xff0c 来和大家唠唠自定义函数 xff0c 这一个神奇的东西 xff0c 带大家白话玩转自定
  • Qt 怎么设置黑色背景/黑色主题?

    目录 整体分为三步1 更改主题颜色1 1 更改颜色 xff1a 1 2 重启 Qt1 3 第一阶段完成 xff0c 效果如下所示 2 更改编辑器颜色2 1 更改颜色2 2 第二阶段完成 xff0c 效果如下所示 3 更改 Qt 窗口上边框颜
  • YOLOv4在ROS-Melodic上的部署-libtorch(附源码,非Darknet)

    有关YOLOv4 LibTorch的部署可以看我的这篇博客 然后移植到ROS Melodic上就相对简单了 直接上GitHub链接吧 初版可能有点乱 xff0c 但是注释挺详细 xff0c 欢迎交流经验哈 2020 12 16 更新 YOL
  • 手把手安装Windows11虚拟机

    创建虚拟机 想要在虚拟机当中安装windows11系统 xff0c 首先我们就要在Vmware中创建一个虚拟机 这个操作比较简单 xff0c 只需要打开新建虚拟机向导 xff0c 按照提示操作就可以了 在创建虚拟机的时候 xff0c 安装w
  • C++ 学习过程中遇到的难题及解决 (笔记,随更

    C 43 43 报错表达式必须含有常量值 原因 xff1a c 43 43 中不允许使用变量作为数组的长度定义数组 xff0c 必须为常量值 xff0c c 43 43 中所有的内存需求都是在程序执行前通过定义的常量来确定的 C 43 43
  • 一篇文章快速提高Python能力

    确实当你学了Python的一段时间之后会有一阵不知道如何更快的提高自己的功力 其实Python也是语言的一种 xff0c 虽然语法很简单 xff0c 但是内涵真的很丰富 xff0c 招式非常的多 修炼武功我个人觉得分几个层次 第一招是语法
  • python 图形界面库对比合集

    从 Python 语言的诞生之日起 xff0c 就有许多优秀的 GUI 工具集整合到 Python 当中 xff0c 这些优秀的 GUI工具集 xff0c 使得 Python 也可以在图形界面编程领域当中大展身手 xff0c 由于 Pyth
  • TensorFlow深度学习及教程分享

    TensorFlow深度学习框架 Google不仅是大数据和云计算的领导者 xff0c 在机器学习和深度学习上也有很好的实践和积累 xff0c 在2015年年底开源了内部使用的深度学习框架TensorFlow 与Caffe Theano T
  • Python 中国象棋源码 V1

    Pygame 做的中国象棋 xff0c 一直以来喜欢下象棋 xff0c 写了 python 就拿来做一个试试 xff0c 水平有限 xff0c 电脑走法水平低 xff0c 需要在下次版本中更新电脑走法 xff0c 希望源码能帮助大家更好的学
  • python数据爬下来保存在哪里

    昨天下班后忽然兴起想写一个爬虫抓抓网页上的东西 花了一个钟简单学习了python的基础语法 xff0c 然后参照网上的例子自己写了个爬虫 xff08 推荐学习 xff1a Python视频教程 xff09 python数据爬下来保存在本地
  • python求平均值

    python求平均值 首先我们先来了解一下计算平均数的IPO模式 输入 xff1a 待输入计算平均数的数 处理 xff1a 平均数算法 输出 xff1a 平均数 推荐 xff1a python教程 明白了程序的IPO模式之后 xff0c 我
  • 如何用for循环实现一个无限循环

    使用while True可以轻松的实现一个无限循环 xff0c 也叫死循环 xff0c 那么for循环能够实现类似的功能么 xff1f 当然可以 xff0c 借助itertools模块的cycle函数就可以 import time from

随机推荐

  • 闲得发慌之趣味技能:python之猫脸检测

    Python 小猫检测 xff0c 通过调用opencv自带的猫脸检测的分类器进行检测 分类器有两个 xff1a haarcascade frontalcatface xml和 haarcascade frontalcatface exte
  • 目标检测性能的衡量指标:mAP图解

    最近又重新复习了下mAP xff0c 在网上找了有关mAP的文章 xff0c 但是感觉大多数都是左抄一点又抄一点那种 写的比较乱 xff0c 可能因为mAP的计算方法前后变过几次 xff0c 所以导致有很多版本的说法存在 为了更好的理解 x
  • 热门编程——python

    python是干什么的 xff1f 要找出python火爆的原因 xff0c 我们就不得不先来了解python本身 Python 是一种面向对象的解释型计算机程序设计语言 xff0c 由荷兰人 Guido van Rossum 于 1989
  • Python求两个数的最大公约数

    一 求最大公约数算法 整数A对整数B进行取整 余数用整数C来表示 举例 C 61 A B 如果C等于0 则C就是整数A和整数B的最大公约数 如果C不等于0 将B赋值给A 将C赋值给B 然后进行 1 2 两步 直到余数为0 则可以得知最大公约
  • VINS-MONO学习笔记 [基于滑动窗口的非线性优化]

    目录 1 代码2 ceres解析求导3 ceres李代数加法代码实现4 预积分约束残差计算5 预积分雅克比计算6 视觉重投影约束7 滑动窗口边缘化 1 代码 代码位置 xff1a vins estimator gt src gt estim
  • CMakeLists入门

    目录 基础增加依赖库将 cpp文件 编译成一个库 xff0c 供其他文件调用 xff1a 变量名list自动检测编译器是否支持C 43 43 11add definitionsinclude directoriestarget includ
  • 记录一次rviz无法启动,报错segmentation fault (core dumped)的解决过程

    起因 好久没有使用ROS相关程序了 xff0c 突然想运行莫程序发现rviz打不开 仔细定位后发现在终端直接输入rviz也无法打开 经过 在网上尝试搜索了好几个小时 xff0c 尝试了以下各种方法 xff0c 更新3D graphics l
  • ROS创建功能包

    ROS创建自己的功能包 ROS中工作空间 workspace 是一个存放工程开发相关文件的文件夹 xff0c 其中有四个文件夹 src 代码空间 Source Space build 编译空间 Build Space devel 开发空间
  • webpack中的加载器(loader)

    一 了解webpack加载器 1 webpack加载器 xff08 loader xff09 的作用 在实际开发过程中 xff0c webpack默认只能打包处理以 js后缀名结尾的模块 xff0c 其他非 js后缀名结尾的模块 xff0c
  • python画图(线条颜色、大小、类型:点、虚线等)(图文详细入门教程四)

    初衷 本人由于平常写论文需要输出一些结果图 xff0c 但是苦于在网上搜python画图时 xff0c 详细的教程非常多 xff0c 但是就是找不到能马上解决自己问题那一行代码 xff0c 所以打算写一些适合需求简单的朋友应急用的教程 xf
  • Linux常用命令详解 xfs文件系统的备份与还原 xfsdump和xfsrestore命令详解

    Linux常用命令详解 xfs文件系统的备份与还原 xfsdump和xfsrestore命令详解 一 引言 1 xfsdump xff1a xfs文件系统的备份 2 xfsstore xff1a xfs文件系统的还原 二 命令具体介绍与用法
  • 小白入门gitee(码云)

    文章目录 一 介绍二 注册账户三 本地环境的配置1 如果是在linux系统2 如果是windows系统 四 本地代码库的操作1 基本概念2 命令操作 五 远程代码库的操作1 下载远程代码库的代码2 同步远程仓库 xff08 上传代码 xff
  • ubuntu:安装cmake后查看版本报错:CMake Error: Could not find CMAKE_ROOT !!!

    问题描述 xff1a ubuntu18原来安装过cmake xff0c 想升级下版本 xff0c 在安装新版本的cmake完成后 xff0c 输入指令 xff1a cmake version 查看版本号时出现以下错误 xff1a CMake
  • g++ 编译选项

    返回主页 lsgxeva MyGitee https gitee com lsgx MyGithub https github com lsgxeva 博客园首页新随笔联系订阅管理 随笔 437 文章 0 评论 1 GCC 警告 优化以及调
  • STM32CubMx+FreeRTOS互斥锁和递归互斥锁(五)

    文章目录 FreeRTOS系统一 简绍二 STM32CubMx配置1 准备2 添加互斥锁2添加递归互斥锁 三 互斥锁1 代码2 测试 四 递归互斥锁1 代码2 测试 FreeRTOS系统 一 简绍 互斥锁 xff0c 谁获得的消息谁来释放
  • ESP8266-12F最小系统板程序烧录

    文章目录 ESP8266一 简介二 准备1 ESP8266 12F系统板2 转接板3 USB转串口模块4 烧录软件 三 连接烧录四 下载 ESP8266 一 简介 前一段时间一直用ESP8266 12F开发板来学习开发 xff0c 但是最近
  • ESP8266+0.96OLED驱动显示(I2C)

    文章目录 ESP8266一 简介二 管脚定义三 代码 ESP8266 一 简介 这篇我们说一下ESP8266来驱动OLED显示屏显示 xff0c 这里使用的是I2C的屏幕 xff0c 像Arduino中有好几个库可以驱动屏幕 xff0c 但
  • Node.js超详细指南(一)

    文章目录 一 概述二 Node js的特点1 异步I O2 事件驱动3 单线程4 支持微服务 三 Node js下载与安装安装步骤验证安装是否正确 一 概述 Node js的官方开发语言是JavaScript JavaScript是前端开发
  • Linux未设置root初始密码怎么办?

    问题描述 xff1a Linux未设置初始密码 xff0c 无法从用户状态切换到root状态怎么办 xff1f 是不是遇上下面的情况 xff1a 解决方案 xff1a 使用下列命令进行修改root密码 sudo passwd root
  • 计算机体系结构——功能部件

    一 功能部件 加法器 1 全加器 全加器 将两位本地二进制数和1位低位进位的数进行相加 xff0c 求的1位本地结果以及1位向高位进位的结果 简单来说就是3个input xff0c 2个output xff0c 这里的逻辑比较简单 xff0