如果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。所有结论正常。

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

ECDSA—模加减模块的更多相关文章

  1. 【python】详解time模块功能asctime、localtime、mktime、sleep、strptime、strftime、time等函数以及时间的加减运算

    在Python中,与时间处理相关的模块有:time.datetime以及calendar.学会计算时间,对程序的调优非常重要,可以在程序中狂打时间戳,来具体判断程序中哪一块耗时最多,从而找到程序调优的 ...

  2. Java中常用加减密方式

    1.加密概述: 加密就是是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使以获得了加密的信息,但因不知解密方式,仍无法了解信息的内容.大体上又分为双向加密和单向加密. 2.单项加密 2.1.概 ...

  3. web框架实现购物车数量加减

    企业开发中经常是团队协作,每个人分配一个小的模块,比如说购物车模块,数量加减这一块人们首先想到的就是通过jquery实现,其实作为一个后端接口开发的程序猿也可以用自己更擅长的后端的逻辑代码来实现,那我 ...

  4. php小数加减精度问题,比特币计算精度问题

    php小数加减精度问题,比特币计算精度问题 在php开发时,有小数加减的场景.结果发现不能够等于预想的值,bccomp比较二个高精确度数字.语法: int bccomp(string left ope ...

  5. Jquery实现表单动态加减、ajax表单提交

    一直在搞Java后台开发,记得刚工作那一两年时间搞过前后端交互开发,用的东西也是五花八门,当时觉得做页面展示给别人看,是很有成就的事情,不过现在感觉自己跟纯前端开发比起来弱爆了,不过如果你的目标是作为 ...

  6. Android带加减的edittext

    看了网上这样自带加减的edittext写得好复杂,还有各种监听事件,我觉得没有必有.于是我自己写了一个. 我这个edittext仅仅限制整数,每次加减1. public class TestEditT ...

  7. AngularJs 通过 ocLazyLoad 实现动态(懒)加载模块和依赖

    好了,现进入正题,在 AngularJs 实现动态(懒)加载主要是依赖于3个主JS文件和一段依赖的脚本. 实现的过程主要是引用3个主要的JS文件 <script src="angula ...

  8. js实现输入框数量加减【转】

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. AngularJs 动态加载模块和依赖

    最近项目比较忙额,白天要上班,晚上回来还需要做Angular知识点的ppt给同事,毕竟年底要辞职了,项目的后续开发还是需要有人接手的,所以就占用了晚上学习的时间.本来一直不打算写这些第三方插件的学习笔 ...

随机推荐

  1. php mkdir 创建多级目录以及修改权限

    mkdir() 用法:mkdir($path,0777,true); 第一个参数:必须,代表要创建的多级目录的路径:第二个参数:设定目录的权限,默认是 0777,意味着最大可能的访问权:注意:mode ...

  2. TOSCA自动化测试工具

    TOSCA由德国公司Tricentis研发,提供英文和德语两种版本. 目前他们的网上培训课程大约是2000一套,从初级到高级,从工程师到BA,有技术,也有测试管理. TOSCA的思想是,不用会编程的测 ...

  3. C语言:float类型%d输出

    float类型%d输出 float a=7.5f; 如果用printf("%d",a);输出的是0. 但float型用%d输出是否一定是0呢,答案肯定不都是0: 为什么 7.5 用 ...

  4. c语言:解释程序和编译程序

    编译程序和解释程序是程序执行的两种不同执行方式. 编译程序:编译程序的功能是把用高级语言书写的源程序翻译成与之等价的目标程序.编译过程划分成词法分析.语法分析.语义分析.中间代码生成.代码优化和目标代 ...

  5. Java基础00-数据输入5

    1. 数据输入 1.1 数据输入概述 我们需要的数据(比如账号密码)并不是一开是就有的,而是要输入的. 1.2 Scanner使用的基本步骤 1.3 案例

  6. [003] - JavaSE面试题(三):JavaSE语法(1)

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [003] - JavaSE面试题(三):JavaSE语法(1) 第1问:& 和 & ...

  7. [iconfont_dart]帮你快速生成Icon,再也不用手动写Icon方法

    iconfont_dart iconfont to dart.Icon can be implemented by calling iconfont classname. iconfont转dart. ...

  8. Java 比较两个Word文档差异

    本文介绍使用Spire.Doc for Java的比较功能来比较两个相似Word文档的差异.需要使用的版本为3.8.8或者后续发布的新版本.可下载jar包,解压将lib文件夹下的Spire.doc.j ...

  9. SQL慢查询排查思路

    前言 平时在工作中每天都会做巡检,将前一天所有超过500ms的慢SQL排查出来 查找原因,是否能进行优化.慢慢中,在形成了一套思路方法论. 我个人认为对于排查慢SQL还是有一定的帮助 (一).是否是S ...

  10. SpringBoot之了解自动配置原理

    承接上文: import注解的使用: 作用:引用时,容器自动创建出这填写的类型的组件,默认组件的名字就是全类名. 往容器中添加两个组件 @Import({User.class, DBHelper.cl ...