发明内容
本发明的目的是克服现有技术中的不足,提供一种Poseidon Hash算法实现电路及其实现方法。
为了达到上述目的,本发明是通过以下技术方案实现的:
一种Poseidon Hash算法实现电路,包括输入接口、数据圆形跑道电路A、数据圆形跑道电路B、串并转换电路、并串转换电路、输出接口,所述输入接口与数据圆形跑道电路A相连,所述输出接口、串并转换电路、并串转换电路都与数据圆形跑道电路A相连,所述串并转换电路通过数据圆形跑道电路B与并串转换电路相连,所述数据圆形跑道电路A为串行跑道,所述数据圆形跑道电路B为并行跑道,串行跑道指的是数据是串行传输的,并行跑道指的是数据是并行传输的,也就是数据分成两排并行传输。
作为优选,本发明还包括标量加电路,所述输入接口经过标量加电路与数据圆形跑道电路A相连。
作为优选,数据圆形跑道电路A包括切换开关MUXA、标量幂运算电路A、矩阵乘法电路A、圈数判断模块A、圈计数器电路A、切换开关MUXC、fifo存储器A,所述标量加电路与切换开关MUXA相连,所述切换开关MUXA经过标量幂运算电路A与矩阵乘法电路A相连,后连接到圈数判断模块A,所述输出接口、串并转换电路、圈计数器电路A都与圈数判断模块A相连,所述圈计数器电路A、并串转换电路都与切换开关MUXC相连,所述切换开关MUXC通过fifo存储器A与切换开关MUXA相连。
作为优选,所述数据圆形跑道电路B包括切换开关MUXB、标量幂运算电路B、矩阵乘法电路B、圈数判断模块B、圈计数器计数电路B、fifo存储器B,所述串并转换电路与切换开关MUXB相连,所述切换开关MUXB通过标量幂运算电路B与矩阵乘法电路B相连,所述矩阵乘法电路B、并串转换电路都与圈数判断模块B相连,所述圈数判断模块B通过圈计数器计数电路B与fifo存储器B相连,所述fifo存储器B与切换开关MUXB相连。
一种Poseidon Hash算法实现电路的实现方法,包括如下步骤:
步骤1:输入接口串行输入单维数组A[n];
步骤2:输入接口将单维数组A[n]传送给标量加电路,使得单维数组A[n]增加一个常量数据变成n+1个数据的数组A[n+1],然后将数组A[n+1]中每个数据加上一个各自的常量,得到新的一维数组B[n+1];
步骤3:标量加电路将圈数A设定为1,标量加电路将新的一维数组B[n+1]和圈数A传送给数据圆形跑道电路A,然后新的一维数组B[n+1]和圈数A在数据圆形跑道电路A中跑4圈后得到新单维数组C[n+1],然后串并转换电路从数据圆形跑道电路A串行接收新单维数组C[n+1],然后把新单维数组C[n+1]转成(n+1)/2个数据并行的数组D[n+1],并把并行的数组D[n+1]传给数据圆形跑道电路B4;
步骤4:串并转换电路将圈数B设定为1,数据圆形跑道电路B接收从串并转换电路传过来的数组D[n+1]和圈数B,然后数组D[n+1]和圈数B在数据圆形跑道电路B中跑57圈后,生成新数组G[n+1],并把新数组G[n+1]传给并串转换电路;
步骤5:并串转换电路从数据圆形跑道电路B中并行接收新数组G[n+1],并把新数组G[n+1]转换成数组F[n+1],并串转换电路将数组F[n+1]串行发送给数据圆形跑道电路A;
步骤6:并串转换电路将圈数A设定为5,数据圆形跑道电路A从并串转换电路接收数组F[n+1]和圈数A,然后数组F[n+1]和圈数A在数据圆形跑道电路A再次跑4圈后生成新的数组E[n+1],取新的数组E[n+1]中第二个数据E2传给输出接口进行输出,数组E[n+1]中的其它数据丢弃。
作为优选,新的一维数组B[n+1]和圈数A在数据圆形跑道电路A中跑4圈的步骤如下:
步骤a1:切换开关MUXA接收新的一维数组B[n+1]和圈数A;
步骤b1:切换开关MUXA将新的一维数组B[n+1]和圈数A传送给标量幂运算电路A,标量幂运算电路A对新的一维数组B[n+1]中的每个数据进行5次方运算,并再加上一个常数,生成新的数组Y[n+1],即:Yn+1=Bn+1 5+α,所述α为常数;
步骤c1:标量幂运算电路A将数组Y[n+1]和圈数A串行传给矩阵乘法电路A,然后矩阵乘法电路A将数组Y[n+1]同常数二维矩阵M[n+1][n+1]相乘,生成新的一维数组Z[n+1];
步骤d1:矩阵乘法电路A将数组Z[n+1]和圈数A传送给圈数判断模块A,然后圈数判断模块A判断圈数A是否为4,若圈数A为4,则圈数判断模块A向串并转换电路输出新单维数组C[n+1],并退出,否则圈数判断模块A将数组Z[n+1]和圈数A传送给圈计数器电路A,并且圈计数器电路A将圈数A加1,然后圈计数器电路A将数组Z[n+1]和圈数A传送给切换开关MUXC,然后切换开关MUXC将数组Z[n+1]和圈数A通过fifo存储器A传送给切换开关MUXA,并将数组Z[n+1]设定为新的一圈的数组X[n+1],然后转到步骤a。
作为优选,数组F[n+1]和圈数A在数据圆形跑道电路A再次跑4圈的步骤如下:
步骤a2:切换开关MUXA接收数组F[n+1]和圈数A;
步骤b2:切换开关MUXA将数组F[n+1]和圈数A传送给标量幂运算电路A,标量幂运算电路A对数组F[n+1]中的每个数据进行5次方运算,并再加上一个常数,生成新的数组W[n+1],即:Wn+1=Fn+1 5+β,所述β为常数;
步骤c2:标量幂运算电路A将数组W[n+1]和圈数A串行传给矩阵乘法电路A,然后矩阵乘法电路A将数组W[n+1]同常数二维矩阵M[n+1][n+1]相乘,生成新的一维数组K[n+1];
步骤d2:矩阵乘法电路A将数组K[n+1]和圈数A传送给圈数判断模块A,然后圈数判断模块A判断圈数A是否为8,若圈数A为8,则圈数判断模块A向输出接口输出,并退出,否则圈数判断模块A将数组K[n+1]和圈数A传送给圈计数器电路A,并且圈计数器电路A将圈数A加1,然后圈计数器电路A将数组K[n+1]和圈数A传送给切换开关MUXC,然后切换开关MUXC将数组K[n+1]和圈数A通过fifo存储器A传送给切换开关MUXA,并将数组K[n+1]设定为新的一圈的数组F[n+1],然后转到步骤a。
作为优选,数组D[n+1]在数据圆形跑道电路B中跑57圈的流程如下:
步骤s1:切换开关MUXB接收串并转换电路传过来的数组D[n+1]和圈数B;
步骤s2:切换开关MUXB将数组D[n+1]、圈数B发送给标量幂运算电路B,然后标量幂运算电路B对数组D[n+1]中的D[0]进行D[0]5+const计算,数组D[n+1]中其它数组数据不变,所述const为常数,从而得到新数组J[n+1];
步骤s3:标量幂运算电路B将新数组J[n+1]、圈数B发送给矩阵乘法电路B43,矩阵乘法电路B将新数组J[n+1]乘上一个N[n+1][n+1]的二维矩阵,得到新数组H[n+1],之后将新数组H[n+1]、圈数B进入圈数判断模块B;
步骤s4:圈数判断模块B判断圈数B是否为57,若是,则圈数判断模块B向并串转换电路输出且退出,否则圈数判断模块B向圈计数器计数电路B发送数组H[n+1],与此同时,圈计数器计数电路B将圈数B加1;
步骤s5:圈计数器计数电路B通过fifo存储器B向切换开关MUXB发送数组H[n+1]和圈数B,并将数组H[n+1]设定新一圈的数组D[n+1],转到步骤s1。
作为优选,N[n+1][n+1]的二维矩阵的排列为
所述V0、V1、V2…Vn-3、Vn-2、Vn-1都为常数,所述W0、W1、W2…Wn-2、Wn-1、Wn都为常数。
本发明的有益效果如下:本发明通过数据圆形跑道电路A、数据圆形跑道电路B进行流水线计算,因此加速效果明显,同时在达到加速指标的情况下,通过两条跑道的设计,减少了模乘单元的个数,降低了加速电路的复杂度,功耗低,稳定性好,计算速度远大于GPU的计算速度。
具体实施方式
下面结合说明书附图对本发明的技术方案作进一步说明:
如图1所示,一种Poseidon Hash算法实现电路,包括输入接口2、标量加电路1、数据圆形跑道电路A3、数据圆形跑道电路B4、串并转换电路5、并串转换电路6、输出接口7,所述输入接口2经过标量加电路1与数据圆形跑道电路A3相连,所述输出接口7、串并转换电路5、并串转换电路6都与数据圆形跑道电路A3相连,所述串并转换电路5通过数据圆形跑道电路B4与并串转换电路6相连,所述数据圆形跑道电路A3为串行跑道,所述数据圆形跑道电路B4为并行跑道,串行跑道指的是数据是串行传输的,并行跑道指的是数据是并行传输的,也就是数据分成两排并行传输。标量加电路1可替换为上位机,即标量加电路1的功能可在上位机实现。
如图2所示,数据圆形跑道电路A3包括切换开关MUXA37、标量幂运算电路A31、矩阵乘法电路A32、圈数判断模块A33、圈计数器电路A34、切换开关MUXC35、fifo存储器A36,所述标量加电路1与切换开关MUXA37相连,所述切换开关MUXA37经过标量幂运算电路A31与矩阵乘法电路A32相连,后连接到圈数判断模块A33,所述输出接口7、串并转换电路5、圈计数器电路A34都与圈数判断模块A33相连,所述圈计数器电路A34、并串转换电路6都与切换开关MUXC35相连,所述切换开关MUXC35通过fifo存储器A36与切换开关MUXA37相连。所述的切换开关MUXA和MUXC,都是两个输入中选择一路输出,也可以把两者在一起,变成三个输入中选择一路输出,这样的变形是本发明的保护范围之内。fifo存储器A36可以为一个,也可以为多个,这样的变形是本发明的保护范围之内。圈计数器电路A34、切换开关MUXC35、fifo存储器A36、切换开关MUXA37的位置可以任意互换,都在本发明的保护范围之内。
如图3所示,数据圆形跑道电路B4包括切换开关MUXB41、标量幂运算电路B42、矩阵乘法电路B43、圈数判断模块B44、圈计数器计数电路B45、fifo存储器B46,所述串并转换电路5与切换开关MUXB41相连,所述切换开关MUXB41通过标量幂运算电路B42与矩阵乘法电路B43相连,所述矩阵乘法电路B43、并串转换电路6都与圈数判断模块B44相连,所述圈数判断模块B44通过圈计数器计数电路B45与fifo存储器B46相连,所述fifo存储器B46与切换开关MUXB41相连。切换开关MUXB41、圈数判断模块B44、圈计数器计数电路B45、fifo存储器B46的位置可以任意互换,都在本发明的保护范围之内。
如图1、图2、图3所示,一种Poseidon Hash算法实现电路的实现方法,包括如下步骤:
步骤1:输入接口2串行输入单维数组A[n];串行输入指的是所述串行输入表示n个数据排队一个一个输入。跑道A中的数据都是串行传输的,用A[n]表示串行传输的。
步骤2:输入接口2将单维数组A[n]传送给标量加电路1,使得单维数组A[n]增加一个常量数据变成n+1个数据的数组A[n+1],然后将数组A[n+1]中每个数据加上一个各自的常量,得到新的一维数组B[n+1];每个数据加上的常量时不相同的。
步骤3:标量加电路1将圈数A设定为1,标量加电路1将新的一维数组B[n+1]和圈数A传送给数据圆形跑道电路A3,然后新的一维数组B[n+1]和圈数A在数据圆形跑道电路A3中跑4圈后得到新单维数组C[n+1],然后串并转换电路5从数据圆形跑道电路A3串行接收新单维数组C[n+1],然后把新单维数组C[n+1]转成(n+1)/2个数据并行的数组D[n+1],并把并行的数组D[n+1]传给数据圆形跑道电路B4;每一个新的一维数组B[n+1]各自都有一个同步的圈数计数器A,同时圈数计数器A随着数组B[n+1]一起在数据圆形跑道电路A上传输。所述的并行传输表示数据并排传输,若n为11时,则并行的数组D[12]为{{D0,D6},{D1,D7},{D2,D8},{D3,D9},{D4,D10},{D5,D11}}。若n=8时,则并行的数组D[9]表示为{{D0,D5},{D1,D6},{D2,D7},{D3,D8},{D4,reg}},reg表示无用数据,这是n为偶数情况。
步骤4:串并转换电路5将圈数B设定为1,数据圆形跑道电路B4接收从串并转换电路5传过来的数组D[n+1]和圈数B,然后数组D[n+1]和圈数B在数据圆形跑道电路B4中跑57圈后,生成新数组G[n+1],并把新数组G[n+1]传给并串转换电路6;每一个数组D[n+1]各自都有一个同步的圈数计数器B,同时圈数计数器B随着数组D[n+1]一起在数据圆形跑道电路B上传输。
步骤5:并串转换电路6从数据圆形跑道电路B4中并行接收新数组G[n+1],并把新数组G[n+1]转换成数组F[n+1],并串转换电路6将数组F[n+1]串行发送给数据圆形跑道电路A3;并串转换电路6的作用就是并行接收数据,再把数据重新排成一队,然后串行发送出去。
步骤6:并串转换电路6将圈数A设定为5,数据圆形跑道电路A3从并串转换电路6接收数组F[n+1]和圈数A,然后数组F[n+1]和圈数A在数据圆形跑道电路A3再次跑4圈后生成新的数组E[n+1],取新的数组E[n+1]中第二个数据E2传给输出接口7进行输出,数组E[n+1]中的其它数据丢弃。
本发明的跑道A是跑首尾各4圈,可将跑道A拆分为两条跑道,一条跑首4圈,一条跑尾4圈,这种情况也是本发明的保护范围之内。
如图2所示,新的一维数组B[n+1]和圈数A在数据圆形跑道电路A3中跑4圈的步骤如下:
步骤a1:切换开关MUXA37接收新的一维数组B[n+1]和圈数A;
步骤b1:切换开关MUXA37将新的一维数组B[n+1]和圈数A传送给标量幂运算电路A31,标量幂运算电路A31对新的一维数组B[n+1]中的每个数据进行5次方运算,并再加上一个常数,生成新的数组Y[n+1],即:Yn+1=Bn+15+α,所述α为常数;α为常数:数组B[n+1]中n+1数据都有各自的常数,同时每一圈常数都不一样,但不同的数组对应的常数是一样的。
步骤c1:标量幂运算电路A31将数组Y[n+1]和圈数A串行传给矩阵乘法电路A32,然后矩阵乘法电路A32将数组Y[n+1]同常数二维矩阵M[n+1][n+1]相乘,生成新的一维数组Z[n+1];矩阵乘法电路A32中有n+1个模乘电路,所以两个矩阵相乘要分n+1步才能完成,总其进行(n+1)*(n+1)次模乘运算。常数二维矩阵M[n+1][n+1]在第1圈、第2圈、第3圈,第5圈、第6圈、第7圈、第8圈的数值是一样的,在第4圈时用的是不同数值的常数二维矩阵M[n+1][n+1]。
步骤d1:矩阵乘法电路A32将数组Z[n+1]和圈数A传送给圈数判断模块A33,然后圈数判断模块A33判断圈数A是否为4,若圈数A为4,则圈数判断模块A33向串并转换电路5输出新单维数组C[n+1],并退出,否则圈数判断模块A33将数组Z[n+1]和圈数A传送给圈计数器电路A34,并且圈计数器电路A34将圈数A加1,然后圈计数器电路A34将数组Z[n+1]和圈数A传送给切换开关MUXC35,然后切换开关MUXC35将数组Z[n+1]和圈数A通过fifo存储器A36传送给切换开关MUXA37,并将数组Z[n+1]设定为新的一圈的数组X[n+1],然后转到步骤a。数组在数据圆形跑道电路A中传输是串行传输的,也就是分成一排传输的。
如图2所示,数组F[n+1]和圈数A在数据圆形跑道电路A3再次跑4圈的步骤如下:
步骤a2:切换开关MUXA37接收数组F[n+1]和圈数A;
步骤b2:切换开关MUXA37将数组F[n+1]和圈数A传送给标量幂运算电路A31,标量幂运算电路A31对数组F[n+1]中的每个数据进行5次方运算,并再加上一个常数,生成新的数组W[n+1],即:Wn+1=Fn+1 5+β,所述β为常数;数组F[n+1]内每个数对应的β为常数是不一样的,同时第一圈的常数也不一样。
步骤c2:标量幂运算电路A31将数组W[n+1]和圈数A串行传给矩阵乘法电路A32,然后矩阵乘法电路A32将数组W[n+1]同常数二维矩阵M[n+1][n+1]相乘,生成新的一维数组K[n+1];
步骤d2:矩阵乘法电路A32将数组K[n+1]和圈数A传送给圈数判断模块A33,然后圈数判断模块A33判断圈数A是否为8,若圈数A为8,则圈数判断模块A33向输出接口7输出,并退出,否则圈数判断模块A33将数组K[n+1]和圈数A传送给圈计数器电路A34,并且圈计数器电路A34将圈数A加1,然后圈计数器电路A34将数组K[n+1]和圈数A传送给切换开关MUXC35,然后切换开关MUXC35将数组K[n+1]和圈数A通过fifo存储器A36传送给切换开关MUXA37,并将数组K[n+1]设定为新的一圈的数组F[n+1],然后转到步骤a。
如图3所示,数组D[n+1]在数据圆形跑道电路B4中跑57圈的流程如下:步骤s1:切换开关MUXB41接收串并转换电路5传过来的数组D[n+1]和圈数B;串并转换电路5作用是串行接收从数据圆形跑道电路A发过来的D[n+1],并把数组中的数据分成两队排列,并添加圈数B。
步骤s2:切换开关MUXB41将数组D[n+1]、圈数B发送给标量幂运算电路B42,然后标量幂运算电路B42对数组D[n+1]中的D[0]进行D[0]5+const计算,数组D[n+1]中其它数组数据不变,所述const为常数,从而得到新数组J[n+1];常数const在5圈轮中的数值都不一样。
步骤s3:标量幂运算电路B42将新数组J[n+1]、圈数B发送给矩阵乘法电路B43,矩阵乘法电路B43将新数组J[n+1]乘上一个N[n+1][n+1]的二维矩阵,得到新数组H[n+1],之后将新数组H[n+1]、圈数B进入圈数判断模块B44;
步骤s4:圈数判断模块B44判断圈数B是否为57,若是,则圈数判断模块B44向并串转换电路6输出且退出,否则圈数判断模块B44向圈计数器计数电路B45发送数组H[n+1],与此同时,圈计数器计数电路B45将圈数B加1;
步骤s5:圈计数器计数电路B45通过fifo存储器B46向切换开关MUXB41发送数组H[n+1]和圈数B,并将数组H[n+1]设定新一圈的数组D[n+1],转到步骤s1。数组在数据圆形跑道电路B4中传输是并行传输,也就是分成两排传输。
N[n+1][n+1]的二维矩阵的排列为
所述V0、V1、V2…Vn-3、Vn-2、Vn-1都为常数,所述W0、W1、W2…Wn-2、Wn-1、Wn都为常数。N[n+1][n+1]的二维矩阵的排列为第一行和第一列都为常数,其余为n*n为单位矩阵,V0、V1、V2…Vn-3、Vn-2、Vn-1的数值在57圈中都不一样,W0、W1、W2…Wn-2、Wn-1、Wn的数值在57圈中都不一样。
所述的矩阵乘法电路A32实现一个一维数组Y[n+1]同二维数组M[n+1][n++]相乘,得到另一个一维数组Z[n+1]
所述数据圆形跑道电路B4包括切换开关MUXB41、标量幂运算电路B42、矩阵乘法电路B43、圈数判断模块B44、圈计数器计数电路B45、fifo存储器B46数据圆形跑道电路B4上跑的数据都是(n+1)/2个数据并行的。数据圆形跑道电路B4从串并转换电路接收的数据是并行的数组D[n+1]。并行的数组D[n+1]从切换开关MUXB41流入数据圆形跑道B中,切换开关MUXB41选择接收fifo存储器B46中传过来的圈数和并行的数组D[n+1],并把数据传给标量幂运算电路B42。标量幂运算电路B42对并行的数组D[n+1]中的D[0]进行D[0]5+const计算,其它数据不变,矩阵乘法电路B43对接收的并行的数组D[n+1]乘上一个N[n][n]的二维矩阵,之后进入圈数判断模块B44,当在数据圆形跑道电路B上跑的圈数为57时,向并串转换电路56并行输出数据,不到57圈的数据传给圈计数器计数电路B45,圈计数器计数电路B45对数据同步的圈计数器进行加1计数。之后并行的数组D[n+1]进入数据圆形跑道电路B4中的fifo存储器B46中。
Poseidon Hash算法并行度很高,很适合采用硬件电路进行加速。本发明为了让算法加速更快,采用了poseidon Hash的简便算法,中间的57轮中的矩阵运算原本要进行n*n次模乘运算,模乘运算是指求余数运算,现只要n+n-1次就行了,而头4轮和尾4轮还是原来的n*n次模乘运算。根据简便算法的特点,我们设计了双跑道电路,每条跑道中的矩阵乘法电路中的模乘单元个数是一样的,都是n个模乘单元。数据圆形跑道电路A要算n步才能输出结果,数据圆形跑道电路B只要两步就能输出结果,同时两条跑道都是流水线计算,因此加速效果明显,同时在达到加速指标的情况下,通过两条跑道的设计,减少了模乘单元的个数,降低了加速电路的复杂度。
实际应用1:
上位机通过PCIE接口电路把批量数据加载到DDR缓存中,并通知本发明的Poseidon Hash算法实现电路,之后,本发明的Poseidon Hash算法实现电路通过输入接口从DDR缓存中加载数据,算好后,通过输出接口写回DDR缓存,完成后,通知上位机可以读取结果数据,最后上位机通过PCIE接口电路读取计算结果数据。
实际应用2:
上位机通过PCIE接口电路把批量数据直接发给本发明的Poseidon Hash算法实现电路,本发明的Poseidon Hash算法实现电路通过输入接口读取上位机发过来的数据。经过计算后,本发明的Poseidon Hash算法实现电路通过输出接口把结果数据发给PCIE接口电路,PCIE接口电路再把结果数据传给上位机。
以上实际应用中采用PCIE接口作为传输数据的接口,只是为了说明方便,同理可以用USB接口、spi串行接口、以太网接口、uart串行接口等通信接口。
本发明通过数据圆形跑道电路A、数据圆形跑道电路B进行流水线计算,因此加速效果明显,同时在达到加速指标的情况下,通过两条跑道的设计,减少了模乘单元的个数,降低了加速电路的复杂度,功耗低,稳定性好,计算速度远大于GPU的计算速度。
需要注意的是,以上列举的仅是本发明的一种具体实施例。显然,本发明不限于以上实施例,还可以有许多变形,总之,本领域的普通技术人员能从本发明公开的内容直接导出或联想到的所有变形,均应认为是本发明的保护范围。