蒙哥马利模乘算法在FPGA中如何优化实现

一、搞要

        Montgomery大整数乘法 在fpga中实现资源占用高,特别是DSP资源,而且一个算法包含好多个Montgomery大整数乘法,fpga中的dsp资源总是很快就耗尽。本文讲述了如何改进算法,减少dsp使用量,并优化逻辑,提高实现的最终频率。

二、原理简述

        2.1、蒙哥马利(Montgomery)模乘算法      

        Montgomery乘法是一种用于加速模运算的算法,‌其数学表达式为A*B*R^{-1} mod M,‌其中A和B是与M同位长的大数,‌R是2^{m}(‌M为位长)‌,‌R^{-1}是R相对于M的模逆,‌即满足R*R^{-1} mod M =1。‌这种算法特别适用于对奇数求模的情况,‌因为它通过使用蒙哥马利表示法,‌可以在计算过程中避免直接的除法运算,‌从而提高计算效率。‌Montgomery乘法通常用于加密算法中,‌如椭圆曲线密码学,‌以加速模乘和模逆运算

        下面涉汲到的Montgomery模乘算法都是指密码学中的大整数模乘算法,所谓的大整数得指位数达几百位的大数,例如256位的大整数。

        2.2、在fpga中如何实现Montgomery模乘法算法

        公式推导及数学原理本文不再详述。我这里就直接给出算法的实现公式。因在fpga要实现除法,耗资源,速度也慢,因而要把模乘中的除法转换成模域中的乘法,如何转换不是本文的重点。现直接给出Montgomery乘法公式。下面讲述的模乘运算基于Bn128曲线的模及模逆

模P:P=256'h73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001

模逆Q:Q=256'h3d443ab0d7bf2839181b2c170004ec0653ba5bfffffe5bfdfffffffeffffffff

       Montgomery模乘算法 C=A*B mod P在FPGA中分以下4步计算(公式推导不再详述):

1、计算中间值Ma=A*B;

2、计算中间值Mb=Ma*Q;

3、计算中间值Mc=Mb*P;

4、计算结果C=(Ma+Mc)modP;

         Montgomery模乘算法完美的去除了除法,只剩下3个大整数乘法和一个大整数模加,完全可以在fpga中实现全流水线计算。

        然而要实现这3个大整数乘法,单个模乘就要要消耗200多个DSP48资源,因而想办法改进算法,还是要进一步减少DSP48资源的使用量。

三、Montgomery模乘算法在fpga中优化方法

        Montgomery模乘算法中的模加完全是用fpga中逻辑资源实现,在这里不再详细讲述优化方法。

        三个大正数乘法的在算法方面优化改进方法如下:

        1、采用karatsuba乘法减少乘法次数;

        2、采用CSD编码乘法器算法把乘法改用加法减法逻辑实现;

        3、当A=B时,可以进行单独优化,减少逻辑资源的使用;

        4、当B=常数时,也可以进一优化,

 光采用karatsuba乘法优化,要实现三个大整数乘法要消耗DSP48资源210个左右,当采用前两种方法时,即采用karatsuba乘法+CSD编码乘法,则可以降低到180个DSP48资源左右。

        注意:以上数据都是基于xilinx fpga Virtex ultraScale+ VU19P上综合结果。

四、karatsuba乘法原理

        Karatsuba乘法是一种快速的大数乘法算法,它的原理是利用分治法将两个大数相乘。

设要计算的两个大数为A和B,分别表示为A=a*10^{n/2}+bB=c*10^{n/2}+d,其中a、b、c、d是相应位数的小数。根据乘法的分配律,可以将A * B表示为:

A*B=(a*10^{n/2}+b)*(c*10^{n/2}+d)=a*c*10^{n}+(a*d+b*c)*10^{n/2}+b*d

在上式中,a * c、b * d和(a * d + b * c)是三个乘法运算,其中(a * d + b * c)是两个小数相乘,需要计算两次。为了减少乘法的次数,Karatsuba乘法采用如下的递归思想:

  1. 将A和B都分成两部分:A=a*10^{n/2}+bB=c*10^{n/2}+d
  2. 计算a * c,b * d和(a * d + b * c)
  3. 通过减少两次大数乘法的次数来计算A * B:
    • 计算a * c的乘积,记为P1
    • 计算b * d的乘积,记为P2
    • 计算(a * d + b * c)的乘积,记为P3
    • 计算A*B=P1*10^{n}+(P3-P1-P2)*10^{n/2}+P2

通过递归地应用这个过程,可以快速计算出大数的乘积。

Karatsuba乘法的关键思想是通过分解大数,减少乘法的次数。相较于传统的乘法算法,它具有更高的效率。然而,在实际应用中,Karatsuba乘法的效率在乘数长度较小时可能并不明显,因此通常在处理大数乘法时使用。

// 输入:n位长度的正整数x和y
// 输出:x*y的结果
函数 karatsuba (x, y) {
     a和b为x的前半部分和后半部分;
     c和d是y的前半部分和后半部分;
    递归调用函数karatsuba解决q=a*c, 递归karatsuba解决p=b*d,递归karatsuba解决k=(a+b)(c+d)
    返回10的n次方*q + 10的n/2次方 * (k - q - p) + p

}

 4.1、karatsuba算法实现的verilogHDL代码分为三级嵌套

       256位乘法器分为256位,128位,64位等三级嵌套。如下图

        y_mult_64:64位乘法器采用karatsuba算法实现的代码;

        y_mult_128:128位乘法器,它包含三个y_mult_64模块;

        y_mult_256:256位乘法器,它包含三个y_mult_128模块。

        所以一个256位乘法器包含了3*3=9个64位乘法器。

4.2、 64位大整数乘法采用karatsuba算法实现的verilogHDL代码

        64位大整数乘法,采用karatsuba算法在Xilinx fpga Virtex ultraScale+ VU19P 上的实现的最后一级64位乘法代码如下:

//
// Company: 杭州幻智星科技有限公司
// Engineer: 俞工
// email: yupc123@qq.com
// Create Date: 01/25/2021 03:45:32 PM
// Design Name: Karatsuba 64位乘法器
// Module Name: y_mult_64
// Revision 0.01
//
module y_mult_64#(
            parameter AB_WIDTH = 64,
            parameter DSP_STEP = 6,
            parameter RESULT_WIDTH = AB_WIDTH*2          
        )(
                input clk,
                input      [AB_WIDTH-1:0]    a,
                input      [AB_WIDTH-1:0]    b,
                output reg [RESULT_WIDTH-1:0]  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值