实现的Montgomery大数相乘,如图所示; 供上一级ModExpPoweringladder 使用。 所谓的蒙哥马利形式即为模n的余数表示形式,只有当操作数转换为蒙哥马利形式时,才能使用此算法执行模乘。计算之后,操作数需要转换回正常表示。由于这些前、后计算步骤,蒙哥马利乘法并不比常规模乘快。但是,重复使用MonPro的情况下相比可以显著提高速度。当r是2的幂次时,除法可以用移位代替,余数的计算简化为位运算。n0为顶层模块中计算完成后給入的,其公式如下: MonPro 模块共 8 个端口, 6 进 2 出, inp 轮流输入两个乘数, outp 输出积。 端口名称 位宽 方向 描述 clk Input 同 ModExpPowering 时钟 reset Input 重置位 start Input 启动标志位 n0_data 64 Input 第一组 n n_data 64 Input 存储器給入 n inp 64 Intput 两乘数轮流由此输入 state 5 Output 显示状态机运行状态 outp 64 Output 乘积输出 MonPro 模块端口定义 MonPro模块为ModExpPowering的次级调用,包含一个有10个状态的有限状态机,首先通过端口inp依次读入64位的乘数x与y,z则会初始化为0。 第一步通过例化MulAdd模块计算 ; 第二步把v的最低权重位记为,这里为64位,计算得到64位 中间量m; 第三步MulAdd模块计算 , 紧接着第四步完成 , ... ... 运算64次之后移位约减,得到32轮中的第一轮64位输出结果z;下面继续从第一步开始做循环32次,即可得到完整的2048位Montgomery输出。