如果a,b GF(P),则加法运算a+b=r (mod p),其中r满足0<r<p-1,即a+b除以p的余数,该操作成为模p加法。对于模减运算可以视为另类的模加运算,即a+(-b)=k (mod p)。本模块将模加和模减集中在同一模块中,由外部信号控制选择使用模减或者模减运算。


                                                                                                                              

信号名

方向

位宽

端口定义

clk

Input

1

时钟

reset

Input

1

复位信号

add_en

Input

1

运算使能信号

op

Input

1

模加减选择信号

a

Input

256

整数a输入

b

Input

256

整数b输入

sum

Output

256

运算结果

mod_add_done

Output

1

模加减完成标识

  代码如下:

    // op = 1, a-b mod p
// op = 0, a+b mod p module mod_add(
input clk,
input reset,
input en,
input [255:0] a,
input [255:0] b,
input op,
output reg [255:0] sum,
output reg mod_add_done
);
parameter params_p=256'd15424654874903;
//parameter params_p = 256'hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F; reg [256:0] temp1;//temp2; //the [256] is the sign bit reg [1:0] cs,ns;
parameter idle = 0;
parameter s1 = 1;
parameter s2 = 2;
parameter s3 = 3; always@(posedge clk) begin
if(reset)
cs <= idle;
else
cs <= ns;
end always@(*) begin
case(cs)
idle:
ns <= s1;
s1:
ns <= s2;
s2:
if(temp1[256])
ns <= s2;
else if(temp1 >= params_p)
ns <= s2;
else
ns <= s3;
s3:
ns <= en ? idle : s3;
endcase
end always@(*) begin
case(cs)
idle: begin
sum <= 0;
mod_add_done <= 0;
end
s1:
if(op) begin
temp1 <= a - b;
//temp2 = temp1 + params_p;
end
else begin
temp1 <= a + b;
//temp2 = temp1 - params_p;
end
s2:
if(op) begin
if(temp1[256]) begin //if temp1[256] is 1, 'a<b', 'a-b mod p' = 'params_p+(b-a)'
temp1 <= temp1 + params_p;
end
else if(temp1 >= params_p)
temp1 <= temp1 - params_p;
end
else begin
if(temp1 >= params_p) //if temp1[256] is 1, 'a<b', 'a-b mod p' = 'params_p-(b-a)'
temp1 <= temp1 - params_p;
//else
//temp2 = temp1;
end
s3: begin
sum <= temp1[255:0];
mod_add_done <= 1;
end
endcase
end endmodule

选用的曲线参数如下:https://blog.csdn.net/cccchhhh6819/article/details/100660139

testbeach:

`timescale 1ns/1ns

module mod_add_tb();

    reg clk, reset,en;
reg [255:0] a, b;
wire [255:0] sum;
reg op;
wire mod_add_done; mod_add add0(
.clk(clk),
.reset(reset),
.en(en),
.a(a),
.b(b),
.sum(sum),
.op(op),
.mod_add_done(mod_add_done)
); always #5 clk = ~clk; initial begin
clk = 0; reset = 1'b1;
en = 0; #20
reset = 1'b0;
op = 1;//P=29
a = 256'd15424654874903;
b =256'd15424654874906;
     #10000 $stop;

end endmodule

本次仿真计算的是a-b(mod p)  也即15424654874903 - 15424654874906(mod 15424654874903 )的结果,相当于是-3 mod 15424654874903 。

仿真结果如下:为15424654874900。负数模运算规则 比如-2 mod 5 = -2+5=3 。-6 mod 5 = -6+5+5=4。所有结论正常。

当然我们更关注的是整个算法消耗的资源,这里博主还没学到综合那里去,后续会跟进这部分。当然该算法应该会占用较大的资源,比较用到了两个位宽的寄存器直接相加,会延迟寄存器之间的关键路径,导致最后时钟频率跑不上去。

最新文章

  1. MVVM架构~目录
  2. mybatis 的 resulttype 和resultMap
  3. QTP重要功能总结
  4. 【HDOJ】4328 Cut the cake
  5. I/O重定向与管道
  6. 14.java.lang.EOFException
  7. (7) 引用Objective-C class library
  8. UUID 生成(源代码编译)
  9. thinkphp学习笔记3—项目编译和调试模式
  10. Pomelo的Protobuf
  11. iOS UITabView简写瀑布流
  12. re模块 - 正则表达式 疏理(一)
  13. ABBYY PDF Transformer+支持的格式
  14. Linux系统--命令行安装weblogic10.3.6
  15. [转]xml解析工具的效率比较QDomDocument、TinyXml-2、RapidXml、PugiXml
  16. Linux-目录与文件
  17. 移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?
  18. 天猫浏览型应用的CDN静态化架构演变(转)
  19. android IPC 机制 (开发艺术探索)
  20. C10K问题及解决方案

热门文章

  1. Postman团队协作开发
  2. ptm经验总结
  3. Acunetix引入了Docker支持,扫描统计信息以及将漏洞发送到AWS WAF的功能
  4. Windows内核开发-3-内核编程基础
  5. 【Mysql】InnoDB 引擎中的数据页结构
  6. 让Angular自定义组件支持form表单验证
  7. YsoSerial 工具常用Payload分析之CC3(二)
  8. TCP协议与HTTP协议区别
  9. java 日期字符串互相转换
  10. 微信小程序工具下载与安装