优选实施例详述
1.流水线乘法器
流水线乘法器被设计成在每个时钟周期接收两个将被相乘的新数字。两者的乘积在许多级中计算,并当所有级已经运算过时准备好该乘积。例如,对于32*32位的乘法,级数可以是17(16个用于乘法和1个用于最后的加法)。每个时钟周期,计算下一个乘积,但是仅在17个时钟周期后准备好结果。所以在同一个时钟周期至多同时处理17个乘积。
对于一种高效的流水线乘法器,已经设计出长整数计算从而保持流水线被充满。一种必须避免的情况是新的计算依靠正在进行的计算结果。在这种情况必须插入等待状态。这就是为什么设计蒙哥马利乘法器用于不同于类似RSA计算的椭圆曲线计算的原因。
紧接着所述乘法,乘法器执行两步加法P=X.Y+A+B。其中一步加法两个长整数乘法所必需的,其中该乘法必须被分成许多基本的32*32位乘法。
流水线乘法器能够被设计用于不同的位数,例如8*8或16*16。
2.蒙哥马利乘法
蒙哥马利乘法计算乘积P=x.y.R-1 mod p。这里,x和y是要被相乘的输入,p是乘法的模数。此外,R=2n,其中n是该系统的位数,例如1024用于类似RSA的系统,和160用于椭圆曲线。作为一个实例选择一种具有17级的32*32位乘法器。
3.利用基数B的蒙哥马利乘法
这种方法适用于很大的值Nw以及RSA。
·B=232,假定32位的处理器字长。
·R=BNw,Nw是长整数的32位字的数目。
·a[i]是数字a的第i个32位字。
·T[0]是临时变量T的最低有效32位部分。
预先存储的常量:
·m’=-(p-1)mod B(32位宽)
·素数p
输入:a mod p,b mod p
输出:蒙哥马利乘积:MonPro(a,b)=a.b.R-1mod p
运算如下:
T=0
For i=0 to Nw-1
{T=T+a[i].b; //Nw乘法
Ui=T[0].m’mod B; //1乘法
T=(T+Ui.p)/B //Nw乘法
}
if T>p then T=T-p
4.对于512位操作数的计算
在我们的实例中,a和b由16个32位字组成。首先从i=0开始计算T=T+a[i].b。
第一个计算在时隙0开始,最后一个计算在时隙15开始。在时隙16增加一个等待周期。
在时隙17准备好第一个结果T[0]。然后我们从这个时隙开始计算乘积Ui=T[0].m’,该乘积在时隙34输出。
下一系列的计算是T=(T+Ui.p)/B,其在时隙34开始,并在时隙49结束。其第一个结果在时隙51输出,但因为该结果总是为零所以将其丢弃。第二个结果是在时隙52输出。
从时隙52开始,重新开始循环。当前一轮结果准备好时,它立刻使用前一轮的结果。
这里有16轮,所以时隙总数是16*52=832。
在时隙848准备好完全的结果。
5.对于1024位操作数的计算
首先从i=0开始计算T=T+a[i].b。
我们以计算最初的17个乘积开始。
第一个结果T[0]在时隙17准备好。在该时隙中我们计算乘积Ui=T[0].m’,该乘积在时隙34输出.从时隙18直到32,我们计算T=T+a[i].b的剩余的乘积。
下一系列计算(T+Ui.p)/B从时隙34开始并在时隙65结束。当在时隙66开始新一轮计算时,准备好第一个结果。
这里有32轮,所以时隙总数是32*66=2112。
在时隙2128准备好完全的结果。
6.对于2048位操作数的计算
首先从i=0开始计算T=T+a’[i].b’。
我们以计算最初的17个乘积开始。
第一个结果T[0]在时隙17准备好。在该时隙中我们计算乘积Ui=T[0].m’,该乘积在时隙34输出。从时隙18到Nw,我们计算剩余的乘积。
下一系列计算(T+Ui.p)/B从时隙Nw开始,并在时隙2Nw-1结束。
当在时隙2Nw开始新一轮计算时,准备好第一个结果。
这里有Nw轮,所以时隙总数是Nw.(2Nw+1)。
在时隙Nw.(2Nw+1)+17(对于2048位,等于8273)准备好完全的结果。
7.利用基数R的蒙哥马利乘法
该算法适用于小值Nw,也适用于椭圆曲线。
·B=232(假定为32位的处理器字长)
·R=BNw(Nw是长整数的32位字的数目)
预先存储的常量:
·m’=-(p-1)mod R(m’是Nw32位宽)
·素数p
输入:a mod p,b mod p
输出:MonPro(a,b)=a.b.R-1 mod p
T=a.b
U=T.m’mod R
T’=T+U.p
T=T/R
if T>p then T=T-p
对于GF(2n)上的系统,所有加法都是按模2计算。这里,m’是多项式B=α32倒数。
8.计算方法
首先,计算T=a.b的完全积。这需要Nw 2次乘法。然后准备好T的第一个结果,因此我们在此之后就可以立刻开始。对于乘积T.m′,我们仅需要计算比R更小的乘积。
·在时隙17准备好乘积T[0].T[0]*(m[0]..m[Nw-1])的计算在时隙Nw 2开始,并需要Nw次乘法。
·在时隙17+Nw准备好乘积T[1].T[1]*(m[0]..m[Nw-2])的计算在时隙Nw 2+Nw开始,并需要Nw-1次乘法。
·在时隙17+2Nw准备好乘积T[2].T[2]*(m[0]..m[Nw-3])的计算在时隙Nw 2+2Nw-1开始,并需要Nw-2次乘法,等等。
·在时隙17+j.Nw准备好乘积T[j].T[j]*(m[0]..m[Nw-j-1])的计算在时隙Nw 2+(2Nw-j+1).j/2开始,并需要Nw-j次乘法,等等。
·在时隙17+(Nw-1).Nw准备好乘积T[Nw-1].T[Nw-1]*m[0]的计算在时隙Nw 2+(Nw+2).(Nw-1)/2开始,并需要1次乘法。
可以证明,对于Nw≥5,在新的乘积T[j]*m[0]开始之前,总是准备好乘积T[j]。因此,不需要等待周期。
·U[0]在时隙Nw 2+17准备好。从该时刻起,计算乘积U.p。
·最后一次乘法在时隙Nw 2+(Nw+2).(Nw-1)/2+1开始。对于Nw=5,最后一次乘法在在时隙40开始,并且U[0]在时隙42开始。因此这里就要求有两个等待周期。对于更大的值Nw,就不需要有等待周期。
·U.p的计算占用Nw 2个时隙。
·对于Nw>5,时隙总数是2.Nw 2+(Nw+2).(Nw-1)/2+1
·对于Nw=5,时隙总数是67个时隙。
·完全的结果在时隙2.Nw 2+(Nw+2).(Nw-1)/2+18准备好。
9.改进的布斯(BOOTH)算法
改进的布斯算法设计为用被乘数的两位来作部分乘法。这使部分乘法的数量减少了一半。
首先重新编码乘数Y,其中y’i可以具有值-2,-1,0,+1和+2(有符号数字符号)。
y’i=-2.yi+1+yi+yi-1(仅为i的偶数值定义)
Y=y′30.230+y′28.228+…+y′0.20
yi’=-2.yi+1+yi+yi-1;
yn=0
为了得到正确的结果,我们必须从乘积减去y0.X。
10.并行进行的减法
X=x31.231+x30.230+…x1.21+x0.20
Y=y31.231+y30.230+…y1.21+y0.20
W=w31.231+w30.230+…w1.21+w0.20
Z=X.Y+W。
在这方面,图1是流水线乘法器实施例的方框图。这里,具有星号的圆圈执行乘法运算,但具有加号标记的圆圈执行加法运算,诸如一种包括进位存储运算的加法运算。各种方框将临时保留那里指示的量。为了更清楚起见,各种相互连接示出了一道将被传送的位的位排列顺序。在右侧,一列方框用于引入必要的修正项。
左侧部分计算Z=X.Y+W+y0.X。这个末项是该算法的人为项,右侧部分与其它计算并行减去该末项。这就是本发明。
以下实施例公开了乘法是怎样建立的,但这种实现可以在细节上有所偏差。
在第一个时隙计算Z0=X.Y(1∶0)+W0并将它存储在寄存器Z0中。°X被传送到第二X寄存器,且Y(31∶2)被传送到第二Y寄存器。
在第二个时隙计算Z1=X.Y(3∶2)+Z0并将它存储在寄存器Z1中。此外,X被传送到第三X寄存器,且Y(31∶2)被传送到第三Y寄存器。
而且计算-y0*X(1∶0),并把它加到Z(1∶0),等等。
在第16个时隙计算Z15=X.Y(31∶30)+Z15,并将它存储在寄存器Z15中。
此外还计算-y0*X(31∶30),并把它加到Z(31∶30)。
现在,Z15包含了64位。
在最后的时隙(#17),较高的32位传送到Z16和Z15,并且两个修正位被加到前面的Z16值,然后输出。
当进行长整数乘法时,与X0,X1,…,XNw-1组合输入Nw次Yi。在长整数计算开始时,Z16设置为0。仅当X0.Yi+W达到输出Z时,然后才加Z16=0。
11.对于GF(2n)的蒙哥马利乘法
椭圆曲线计算也可以通过域GF(2n)来定义。
在这个域中所有的加法(这里通过“+”来表示)都是模2计算(异或)。
这个域中的多项式具有最多n-1次的幂。
所以当n=32时,X和Y的多项式定义如下(所有系数都是0或1):
X=x31.α31+x30.α30+…x1.α1+x0.α0
Y=y31.α31+y30.α30+…y1.α1+y0.α0
还有一个不可约的多项式p,被定义为:
p=pn.αn+pn-1.αn-1+…p1.α1+P0α0。
乘积P=X.Y mod p通过以下式子来计算:
(xn-1.αn-1+xn-2.αn-2+…x1.c1+x0.α0).(yn-1.αn-1+yn-2.αn-2+…y1.α1+y0.α0)mod p。
然后由多项式p来除乘积X.Y,余数就是结果。余数的幂总是小于p的幂。
X,Y和p都可用长整数来表示。
约化乘积的计算可以通过正常乘积计算来进行,并具有这样的修改,内部加法利用模2计算进行。然后除了模2加以及保留余数以外,照常规进行除法。
然而,还能够更快地进行蒙哥马利乘法。
12.蒙哥马利乘法
蒙哥马利乘法把许多素数(不可约多项式)加到(部分)乘积中,这样乘积被一个诸如α32或α160的适当因数R可除尽。对于给定多项式的二进制表示,可以考虑用232或2160代替。这里,m’定义为m’=p-1 modR,其中p-1定义为p.p-1 mod R=1
现在,通过以下修改能够应用相同的算法:
·乘法器中的加法运算是模2的。
·省略最后的减法。
这种方案的进一步细节。除了上述的以外,各种其它细节、实施例、和说明将在下面作为补充的形式提出。
13.长整数乘法器和加法器
定义:
·X=xNw-1.BNw-1+…+x2.B2+x1.B1+x0.B0
·Y=yNw-1.BNw-1+…+y2.B2+y1.B1+y0.B0
·Pi=piNw.BNw-1+…+pi2.B2+pi1.B1+pi0.B0
·P=p2Nw-1.B2Nw-1+…+p2.B2+p1.B1+p0.B0
·B=232
·m=Nw-1
长整数乘法涉及很多两个32位字的乘法。该实施例使用一种流水线32位乘法器(参见图1和4),这种乘法器在每个时隙接收三个新32位操作数(X*Y+Z)。这种乘法器速度非常快。然而,这种乘法的输出仅在17个时隙后准备好。所以最多可以有17个乘法同时计算。可是,当想要与正在进行相乘的结果相乘的时候,必须等待将该结果被准备好。这样能够引入等待周期,因此它将降低性能。
Z=X.Y+W
Z=X.{Y0.B0+Y1.B1+..YmBm}+W
Z,X和W具有大小为Nw-1的32位字。Yi具有32位宽。
W=W0.B0+W1.B1+..WmBm}
中间结果Wi=Wi1.B0+Wi2.B1+..Wi.m+1Bm
·计算P0=X.Y0+W。结果以P0=W0.B+Z0分解。
·计算P1=X.Y1+W0。结果以P1=W1.B+Z1分解。
·计算P2=X.Y2+W1。结果以P2=W2.B+Z2分解。
·…
·计算Pm=X.Ym+Wm-1。
·对于j≥m,Zj=Pm.j。
所以我们需要一个函数来计算Pi=X.Yi+Wi。
在这方面,图2是一个用于计算(X*Y+W)的方案的方框图。
Pi=X.Yi+W
这个计算是前述计算的一部分。
X和W具有大小为m=(Nw-1)的32位字。
Yi具有32位宽。
·计算S1=x0.yi+w0。S1以Z1.B+P0分解。
·计算S2=x1.yi+w1+Z1。S2以Z2.B+P1分解,等等。
·计算Sm=Xm.yi+Wm+Zm-1。Sm以Pm+1.B+Pm分解。
在图3中已经示出了相关的实施例,该图是一个用于根据(X*Y+W)执行长整数乘法的方案的方框图。
利用图1的流水线乘法器计算S=x.y+w+z,已在上文讨论。
·为了在GF(2n)上计算,加法是模2计算的。所以没有进位。
14.流水线乘法器
X=x31.231+x30.230+…x1.21+x0.20
Y=y31.231+y30.230+…y1.21+y0.20
W=w31.231+w30.230+…w1.21+w0.20
Z=X.Y+W.
左侧部分计算Z=X.Y+W+y0.X。末项是所用算法的人为项。右侧部分减去所述末项。
下面给出了一种想法,即乘法是怎样建立的,但实现可能在细节上有所偏差。
在第一个时隙中,计算Z0=X.Y(1∶0)+W0并把它存储在寄存器Z0中。X被传送到第二X寄存器并且Y(31∶2)被传送到第二Y寄存器。
在第二个时隙中,计算Z1=X.Y(3∶2)+Z0并把它存储在寄存器Z1中。X被传送到第三X寄存器并且Y(31∶2)被传送到第三Y寄存器。
此外,计算-y0*X(1∶0)并把它加到Z(1∶0)。
…
在第16个时隙中,计算Z15=X.Y(31∶30)+Z15并把它存储在寄存器Z15中。
此外,计算-y0*X(31∶30)并把它加到Z(31∶30)。现在Z15包括64位。
在最后一个时隙(#17)中,较高的32位被传送到Z16和Z15中,并且两个修正位被加到输出的Z16的前值。
进行如在第13段中描述的长整数乘法,然后与X0,X1,...,XNW-1组合输入Nw次Yi。当X0.Yi+W达到输出Z时,那么就代替加Z16的内容而不加任何内容。Z16具有第13段中Zi的函数:从一个乘法传送到下一个乘法的那个部分。
15.改进的布斯算法
首先重新编码乘法器Y,其中y’i仅可以具有值-2,-1,0,+1和+2(有符号的数字表示)。
y′i=-2.yi+1+yi+yi-1(仅对i的偶数值定义)
Y=y′30.230+y′28.228+…+y′0.20
例如当y=29dec=011101bin时,那么y′=(2
11)sd=2.24-1.22+1=29dec,其中
1表示-1。
使用的这些公式是在以前段落中公开的有关改进布斯算法的内容(第9段)。
为了得到正确的结果,我们必须从乘积y0.X中减去。
用2相乘就是左移1位被乘数。
部分乘积被以一种2根值表示法编码,其中每个乘积都可以具有值-1,0或+1。
现在以16级来计算乘积。在每级中计算y′i.X.2i的部分乘积,并把它相加到在前结果中,例如当x=53dec=110101bin和y=29(y’=(2
11)sd)时,那么
对于32位操作数,要进行15个加法。在一个普通全加器中,这花费非常长的时间,因为进位必须波动通过。为了防止这种现象,我们将使用一种无进位传送加法器。在这方面,图5示例了一种无进位传送加法器的方案。
16.冗余二进制计数法
加法器的被加数和加数都使用一种冗余二进制计数法,这种方法也是一种有有符号数字表示法。具有一个固定根2和一个数字组{
1,0,1},其中
1表示-1。一个n位数字的冗余二进制整数Y具有值yn-12n-1+yn-22n-2+…+y1.21+y0.20,其中yi可以具有值-1,0或1。
在冗余二进制计数法中可以有多种方式表示一个整数,例如[0101]SD2=[011
1]SD2=[1
101]SD2=[1
11
1]SD2=[10
11]SD2=5dec。只有‘0’具有唯一的表示:[00…0]。
从标准二进制计数法变换到冗余二进制计数法是简单的:两者都是一样的。
从冗余二进制计数法变换到标准二进制计数法通过以下减法来进行:Xbin=X+-X-,其中X+是通过用‘0’替代所有的‘
1’而从Xsd2中得到的,X-是通过用‘0’替代所有的‘1’和用‘
1’替代所有的‘1’而从Xsd2中得到的。
例如,当X=[10
1
1]SD2=5dec时,那么X+=[1000]bin=8dec和X-=[0011]bin=3dec。
通过用‘
1’替代所有的‘1’和用‘1’替代所有的‘
1’来对一个变量求反。例如,当X=[10
1
1]SD2=5dec,那么-X=[
1011]SD2=-5dec
我们将一个变量编码如下(参见表1):
X |
输出x+x- |
输入x+x- |
0 |
00 |
00 |
1 |
10 |
1x |
1 |
01 |
x1 |
表1对于GF(p)以冗余二进制计数法对X进行编码(x=任意)。从来不使用组合11。
因此,当输入X并且X=1时,比条件x+=1充分。同样,当X=
1时,也比x-=1充分。
17.无进位传送加法器
所选择的表示法是,在下一个数字吸收可能的进位,并不影响下一个进位。因此,这种加法器的速度比32位全加器快得多。
至于32*32位乘法器,有16个加法(包括在前乘法的上面最高有效字)。然后仅在末端,所述冗余二进制计数法转换成标准二进制计数法。这种转换不是自由传送的。
加法以(在概念上)2步来进行。首先计算中间和si以及中间进位ci。在下一步,两者都转换成最终和(sumi)。该中间进位可以最可能取决于在前和当前的数字值,但不取决于再早一些的值。
ci和si满足以下等式:2ci+si=xi+yi。而且ci-1和si这样选择,使得两者既不是1也不是1。
在这方面,图6所示为生成中间进位和求和量的图。
和Si=ci+si-1将不再生成一个新的进位:
·类型1,3,4和6:ci-1+si=ci-1
·类型2a,5a:ci-1≠
1,也就是0或1,所以ci-1+si是
1或0。
·类型2b,5b:ci-1≠1,也就是0或
1,所以ci-1+si是1或是0。
这通过以下实例说明:
X [10
10
100
1]sd2=87des
Y [1
1100
11
1]sd2=101des
---------+
S 0100
1110
C 1
100010
1
---------+
Sum 1
11000
100=188des
18.转换为标准二进制计数法
在最后一级,结果被转换成标准二进制计数法。X=X+-X-,其中X+由所有xi +构成,以及X-由所有的xi -构成。
因为xi +和xi -决不会同时为1,所以我们不需要全减器。因此,我们尝试一种不同的方法。
我们将从右边到左边移去所有的
1。
当不从右边借位时:
·当下一个数字是‘1’时,那么就保存该数字并且没有到左边的借位。
·当下一个数字是‘0’时,那么就保存该数字并且没有到左边的借位。
·当下一个数字是‘
1’时,那么就用‘1’替代该‘
1’并且有到左边的一个借位。
当有来自右边的借位时:
·当下一个数字是‘1’时,那么就用‘0’替代该‘1’,并且没有到左边的借位。
·当下一个数字是‘0’时,那么就用‘1’替代该‘0’,并且有到左边的一个借位。
·当下一个数字是‘
1’时,那么就用‘0’替代该‘
1’并且有到左边的一个借位。
然而,当最左的数字是‘1’和最右的数字是‘
1’时,并且它们之间的所有数字是‘0’时(10…0
1),这将产生一个非常大的延迟。
为了减小该延迟,我们把32位分成8组,每组4位。
·当最左的非零数字是‘
1’时,那么产生一个到下一个左边组的借位。
·当该组中有至少一个‘1’时,从右边组来的一个借位不传送到下一个组。
19.对于GF(2N)的乘法器逻辑
X=x31.α31+x30.α30+…x1.α1+x0.α0
Y=y31.α31+y30.α30+…y1.α1+y0.α0
W=w31.α31+w30.α30+…w1.α1+w0.α0
对于这些向量的表示,在上述公式中可以看到用‘2’来代替‘α’。
Z=X.YW。
Zi=(y2iy2i+1.α).X+Zi
在GF(2n)中没有等式用于布斯编码。
在第一个时隙中(参见图4),计算X.Y(1∶0)W并把它存储在寄存器Z0中。X被传送到第二X寄存器以及Y(31∶2)被传送到第二Y寄存器(Y)。
在第二个时隙中,计算X.Y(3∶2)Z0并把它存储在寄存器Z0中。X被传送到第二X寄存器以及Y(31∶4)被传送到第三Y寄存器(Y)。
在第16个时隙中,计算Z15=X.Y(31∶30)Z15并把它存储在寄存器Z15中。
现在Z15包括64位。
在最后一个时隙(#17)中,较高32位被传送到Z16以及Z15被加到输出的在前Z16值。
进行如在第13段中描述的长整数乘法,那么与X0,X1,...,XNW-1组合输入Nw次Yi。当X0.YiW达到输出Z时,那么代替加Z16的内容而不加任何内容。Z16具有第13段中Zi的函数:从一个乘法传送到下一个乘法的那个部分。
特别是,图4示例了一种用于在GF2n中运算的流水线乘法器实施例的方案。
加法
加法是2变量的exor。没有进位。
编码
因为我们想与GF(p)的逻辑组合所述逻辑,所以我们将使用以下冗余编码。这里X=x
+^x
-,其中^表示一种逻辑“OR”功能。
X | 输出x+x- | 输入x+x- |
0 |
00 |
0x |
1 |
10 |
1x |
1 |
10 |
X1 |
表2用于对GF(2n)以冗余二进制计数法编码X(x=任意)
20.用于GF(p)和GF(2n)的逻辑
两种乘法器级都将使用以下结构zj=ai.xj-1bi.xj
GF(p)
GFp=1
y′
i=-2.y
i+1+y
i+y
i-1(仅用于奇数i,参见以下表3)
yi+1 |
yi |
yi-1 |
y′i |
ai |
bi |
signi |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
2 |
1 |
0 |
1 |
1 |
0 |
0 |
-2 |
1 |
0 |
0 |
1 |
0 |
1 |
-1 |
0 |
1 |
0 |
1 |
1 |
0 |
-1 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
表3用于GF(p)的编码
GF(2n)
GFp=0
ai=yi-1
bi=yi
zj +=zj=ai.xj-1bi.xj
zi -=0
组合
bi=yiGFp.yi-1
zj +=(ai.xj-1bi.xj).yi+1
21.无传送进位加法
类型 |
xi |
yi |
xi-1 |
yi-1 |
f2 |
f5 |
h |
中间进位ci |
中间和si |
1 |
1x |
1x |
xx |
xx |
0 |
0 |
x |
10 |
00 |
2a |
1x00 |
001x |
x0x0 |
x0x0 |
11 |
00 |
11 |
10 |
01 |
2b |
1x1x0000 |
00001x1x |
x1xxx1xx |
xxx1xxx1 |
1111 |
0000 |
0000 |
00 |
10 |
3 |
00 |
00 |
xx |
xx |
0 |
0 |
x |
00 |
00 |
4 |
1xx1 |
x11x |
xxxx |
xxxx |
00 |
00 |
xx |
00 |
00 |
5a |
00x1 |
x100 |
x0x0 |
x0x0 |
00 |
11 |
11 |
00 |
01 |
5b |
0000x1x1 |
x1x10000 |
x1xxx1xx |
xxx1xxx1 |
0000 |
1111 |
0000 |
01 |
10 |
6 |
x1 |
x1 |
Xx |
xx |
0 |
0 |
x |
01 |
00 |
表4中间进位及和
表4与利用根据表1编码的图6类似。
si +=(f2∧f5).
h
si -=(f2∧f5).h
Si=ci-1+si.
ci-1 +ci-1 - |
si +si - |
Si +Si - |
00 |
00 |
00 |
00 |
1x |
10 |
00 |
x1 |
01 |
1x |
00 |
10 |
1x |
1x |
- |
1x |
x1 |
00 |
x1 |
00 |
01 |
x1 |
1x |
00 |
x1 |
X1 |
- |
表5总和Si
22.GF(2n)
Si=xiyi
看来如果我们取消GF(p)系统中的进位,根据GF(p)规则生成的Si则产生正确的答案,Si根据表2被编码。
组合逻辑
ci -=(xi.yi∧f5.
h).GFp
si +=(f2∧f5).
h
si -=(f2∧f5).h
23.从冗余二进制到二进制的转换输入是一个xi={
1,0,1}的向量X。输出是一个yi={0,1}的向量Y。向量X被划分为每组4位的8个组,i=4m+n(n=0..3,m=0..7)。在各组之间:
·当这个组中最左边非零数字是‘
1’时,生成组借位gm。
·当所述组没有任何‘1’时,传送组借位gm-1。
在各组中:
·当数字是‘
1’时,生成一个借位bi
·当数字不是‘1’时,传送一个借位b
i-1:b
i=b
i-1
bi-1 |
xi +xi - |
yi |
bi |
0 |
00 |
0 |
0 |
0 |
1x |
1 |
0 |
0 |
x1 |
1 |
1 |
1 |
00 |
1 |
1 |
1 |
1x |
0 |
0 |
1 |
x1 |
0 |
1 |
表6一个组中的输出和借位
对于i≠0,4,8,…,28,yi=(xi +∧xi -)bi-1
对于i=0,4,8,…,28,yi=(xi +∧xi -)g4i-1
24.GF(2n)
由于不存在借位,因此转换很简单。如果我们抑制所有的借位,那么GF(p)的电路将给出正确的答案。
组合逻辑:
对于i≠0,4,8,…,28,yi=(xi +∧xi -)(bi-1.GFp)
对于i=0,4,8,…,28,yi=(xi +∧x1 -)(g4i-1.GFp)
流水线乘法器
如图1中所示的流水线乘法器也能用于GF(2n),但是在右侧部分的-Y[0]被设置为‘0’。上面描述了所有其它改进。