admin管理员组

文章数量:1794759

【硬件算术设计】硬件加法器原理|第2章:超前进位加法器,分块、分级超前进位加法器

【硬件算术设计】硬件加法器原理|第2章:超前进位加法器,分块、分级超前进位加法器

上一章:第1章:行波进位加法器与曼彻斯顿加法器

2▏超前进位加法器(CLA, Carry-Lookahead Adder)

这一章我们来讨论一下超前进位加法器,以及它的变种“分块、多级超前进位加法器”,主要是为下一章所讨论的并行前缀加法器做些铺垫。

2.1▏超前进位加法器

第1章中我们讨论了曼彻斯顿加法器,现在将它的逻辑表达式重写一遍:

\\begin{align} \\rm c_{我想死了i+1}&\\rm =g_i\\vee (p_i\\cdot c_{i}) \\\\\\rm s_i&\\rm =p_i \\oplus c_{i} \\end{align}\\tag{2.1.1}

其中 \\rm x_i,y_i \\ (i=0,1,2...n) 分别是加法器的两个输入操作数; \\rm s 是加法器输出; \\rm c 是进位信号; \\rm p=x\\oplus y,\\ g=x\\cdot y 。

之前我们说过,该加法器的关键路径就是就是 \\rm {c_{0}} 到\\rm c_n 这条路径。就是说,它的关键路径在进位链上。因此,要改善该加法器的延迟,我们应该从它的进位链条上下手,即改善 \\rm c_i 的延迟。

要改善进位链的延迟,一种朴素的想法就是直接将 \\rm c_i 不断地展开,直至无法再展开:

\\\\\\begin{align} \\rm{ \\\\c_i \\\\=g_i\\vee (p_i\\cdot \\color{red}{c_{i-1}}) \\\\{=g_i\\vee (p_i\\cdot\\color{彭宇案的法官red}{(g_{i-1}\\vee (p_{i-1}\\cdot \\color{green}{c_{i-2}}) 月经期间腰疼})} \\\\=g_{i}\\vee (p_{i}\\cdot g_{i-1})\\vee (p_{i}\\cdot p_{i-1}\\志波cdot \\color{green}{c_{i-2}}) \\\\{=g_{i}\\vee (p_{i}\\cdot g_{i-1})\\vee (p_{i}\\cdot p_{i-1}\\cdot \\color{green}{(g_{i-2}\\提单样本vee (p_{i-2}\\cdot \\color{blue}{c_{i-3}})})} \\\\=g_i\\vee (p_i\\cdot g_{i-1})\\vee (p_i\\cdot p_{i-1}\\cdot g_{i-2})\\vee (p_i\\cdot p_{i-1}\\cdot p_{i-2}\\cdot \\color{blue}{c_{i-3}}) \\\\=g_i\\vee (p_i\\cdot g_{i-1})\\vee (p_i\\cdot p_{i-1}\\cdot g_{i-2})\\vee (p_i\\cdot p_{i-1}\\cdot p_{i-2}\\cdot \\color{blue}{(g_{i-3}\\vee (p_{i-3}\\cdot \\color{brown}{c_{i-4}}))}) \\\\=g_i\\vee (p_i\\cdot g_{i-1})\\vee (p_i\\cdot p_{i-1}\\cdot g_{i-2})\\vee (p_i\\cdot p_{i-1}\\c内皮尔dot p_{北海旅行i-2}\\cdot {g_{i-3})\\vee (p_i\\cdot p_{i-1}\\cdot p_{i-2}\\cdot p_{i-3}\\cdot \\color{brown}{c_{i-4}}))}) \\\\=\\cdots }\\end{align} \\tag{2.1.2}

这样就能通过上式[1],根据每个输入位的 \\rm p 信号和 \\rm g 信号(还有 \\rm c_{0} ),直接生成第 \\rm i 个进位信号。

上式 (2.1.2) 的关键路径显然要比 (2.1.1) 小得多。式 (2.1.2) 就是超前进位链的逻辑表达式。

问题在于, (2.1.2) 中的多还魂门操作数与、或门的扇入系数是会随位数 \\rm i 增长的。

在位数已经较高的情况下,再增加位数,会在进位链中引入超高扇入的逻辑门,使得整体电路规模以二次的速率增长。

尽管如今ASIC的面积资源相当充裕(相对而言),但导线延迟也在随着尺度的缩小而变地日益显著,甚至成为了延迟的主要来源。而这种高扇入电路的导线开销是巨大的,所以,超前进位链在实际应用中仍受限于位宽,只是原因从电路面积变成了导线延迟。

要控制超前进位链电路复杂度的增长,可以考虑:

分块超前进位分级超前进位

我们在接下来的两节中讨论这两个思路。

2.2▏分块超前进位链

图2.1,将一个32bit超前进位链拆成4个8bit超前进位链

所谓分块超前进位链,就是将一条较大的完整的超前进位链划分为多块较小的超前进位链块,例如上图2.1所示。

(我们也可以从高基加法(高基进位)的角度来理解分块超smt之家前进位链,可以将传统超前进位链 (2.1.2) 理解为基-2的超前进位链;而分块超前进位链,比如基于4bit块的分块超前进位链,就可以理解为基-16的超前进位链)

但是具体它是怎么拆的?现在我们来观察其中具体的一个块(图2.2右):

图2.2,4bit超前进位链(左)和4bit超前进位链块(右)

超前进位链块和标准的超前进位链非常相似,但区别在于,它是从第 \\rm i 位开始的;以及为了方便后文,这里还将 \\rm c_3 替代为了 \\rm g_{[i,i+3]} 和 \\rm p_{[i,i+3]} ,这两个信号分别叫做“块 \\rm g 信号”和“块 \\rm p 信号”,代表了这个块的进位信。它们编程技术的具体形式分别是:

\\\\\\begin{align}\\rm{ g_{[i,i+3]}=(g_{i+3})\\vee (g_{i+2}\\cdot p_{i+3})\\vee (g_{i+1}\\cdo篮球短裤t p_{i+2}\\cdot p_{i+3})\\vee (g_i \\cdot p_{i+1 }\\cdot p_{i+2}\\cdot p_{i+3}) \\\\p_{[i,i+3]}=p_i\\cdot p_{i+1}\\cdot p_{i+2}\\cdot p_{i+3如何变成双眼皮} } \\end{align}

这就是块 \\rm [i,i+3] 作为一个整体,所对应的块 \\rm g 信号和块 \\rm p 信号。一般地, \\rm g_{[i,i+n]} 和 \\rm p_{[i,i+n]} 形式同理。

然后,块 \\rm [i,i+n] 的最高进位输出可以通过下式生成(如图2.3中的一个块):

\\\\\\rm c_{i+n+1}=g_{[i,i+n]}\\vee(p_{[i,i+n]}\\cdot c_{i})\\tag{2.2.1}

将上式与式 (2.1.2) 对比你会发现它们形式是一样的,例如对于块 \\rm[0,3] 有:

\\\\\\rm c_{i+4}=g_{[i,i+3]}\\vee(p_{[i,i+3]}\\cdot c_{i}),\\quad i=0

所以,\\rm g_{[i,i+n]} 就代表了 \\rm [i,i+n] 这段数位,即第i到第i异域风情+n位完整的这一段上是否生成信号;\\rm p_{[i,i+n]} 则代表这段数位是否传递信号(就像 \\rm g_i 代表第i位生成进位信号, \\rm p_i 代表第i位传递进位信号一样,块信号将这个概念扩展到了一个“块”,或者说数位上的连续一段上)。

我们可以选择直接将所有块串联,来获得完整的进位链,例如下图2.3:

图2.3,将所有的块串联,以构成完整的进位链

这样就限制了超前进位链的规模增长。但现在每个块之间又退化为行波进位了,有没有办法加速块之间的进位?

2.3▏三民主义统一中国分级超前进位链

将超前进位链拆成多个块后,可以利用以下性质将相邻块的块赛文奥特曼怪兽大全 \\rm g,p 信号合并:

若假定 \\rm i_0<i_1<i_2 (即两个相邻的块 \\rm[i_0,i_1-1] 和 \\rm [i_1,i_2] ),则有:

\\\\\\begin{align} \\rm{ g_{[i,i_2]}=g_{[i_1,i_2]}\\vee (g_{[i_0,i_1-1]}\\cdot p_{[i_1,i_2]}) \\\\p_{[i_0,i_2-1]]]}=p_{[i_0,i_1-1]}\\cdot p_{[i_1,i_2]} }\\end{align}\\tag{2.3.1}

通过上式,我们就可以将两个相邻块的块 \\rm g,p 信号合并,得到的结果相当于两个块合并后,作为一个整体的大块 \\rm g,p 信号(图2.4)。

图2.4,两个相邻块的合并

两个相互重叠的块也是可以被合并的(图2.5)。具体来说,对于 \\rm i_0\\le i_1-1\\le j_0<j_1 (即两个有重叠部分的块 \\rm [i_0,j_0] 和 \\rm [i_1,j_1] ),有:

\\\\\\begin{align} \\rm{ g_{[i_0,j_1]}=g_{[i_1,j_1]}\\vee( g_{[i_0,j_0]}\\cdot p归海一刀_{[i_1,j_1]}) \\\\p_{[i_0,j_1]}=p_{[i_0,j_0]}\\cdot p_{[i_1,j_1]} } \\end{align}\\tag{2.3.2}

图2.5,两个重叠块的合并

利用这种合并的性质,我们就可以构造出所谓的分级超前进位链了。例如下图2.6:

图2.6,分级超前进位链。

灵活利用(2.3.1)和(2.3.1)来合成所有待求的块信号,就能得到许多不同的进位链构造,但这样的推导过于繁杂。所幸的是,这里存在一套能够简洁表示各种分级超前进位链的符号体系,我们会在下一章引入它,并基于它来推导各种不同的“分级超前进位链”。

2.3.1▏时间复杂度的简单分析

对于单个块,它的处理步骤以及对应所需的最低逻辑门级数(gate level)是这样的:

生成每个比特位的 \\rm g,p潜意识测试 信号(需要1级逻辑门)生成对应的块 \\rm g,p 信号(需要2级逻辑门)(如果需要的话)生成块的最高进位输出,以提供给需要的相邻块(需要2级逻辑门)

这就是分级超前加法器中,每级(如图2.6中的每层)所需的逻辑门深度。然后,就像图2.6那样,这种分级超前加法器是可以以树的形式构造的,其中只需要对数个这样的层。于是,这个加法器的时间复杂度(逻辑门级数)是对数级的,即 \\cal O(\\log n) 。

2.4▏小结,思考与习题

本章介绍了超前进位加法器,以及它的变种:“分块、分级超前进位加法器”。在下一章中,我们将从一个相对代数化的角度来描述这类加法器(进位链)设计,以接轨文献中更常用的表述。

以下是习题与思考题:

用你熟知的技术(如VerilogHDL,或者multisim等)实现一个2进制的超前进位加法器。将2.1▏节中介绍的2进制超前进位加法推广至16进制苹果watch。将2.1▏节本文中介绍的2进制超前进位加法推广至10进制[2]。将2.1▏节本文中介绍的2进制超前进位加法推广至r进制。(选做)用多操作数与运算符 \\rm \\bigwedge_{i=0}^{n} a_i=a_0\\cdot a_1 \\c小肝癌dot a_2\\dots a_{n} 和多操作数或运算符 \\rm \\bigvee_{i=0}^{n}a_i=a_0\\vee a_1\\vee a_2\\dots a_n 写出式 苏州按摩(2.1.2) 的一般形式。参考^可以用多操作数与运算符和多操作数或运算符写出这个公式的一般形式,但是写出来非常丑,所以我还是把这个阴间公式删掉了。^关于r进制的进位规则,请复习1.5▏节。

本文标签: 加法器超前硬件算术原理