伽罗瓦域gf(2^128)乘法器的设计Word下载.doc

上传人:wj 文档编号:626516 上传时间:2023-04-29 格式:DOC 页数:33 大小:824KB
下载 相关 举报
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第1页
第1页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第2页
第2页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第3页
第3页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第4页
第4页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第5页
第5页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第6页
第6页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第7页
第7页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第8页
第8页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第9页
第9页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第10页
第10页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第11页
第11页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第12页
第12页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第13页
第13页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第14页
第14页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第15页
第15页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第16页
第16页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第17页
第17页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第18页
第18页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第19页
第19页 / 共33页
伽罗瓦域gf(2^128)乘法器的设计Word下载.doc_第20页
第20页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

伽罗瓦域gf(2^128)乘法器的设计Word下载.doc

《伽罗瓦域gf(2^128)乘法器的设计Word下载.doc》由会员分享,可在线阅读,更多相关《伽罗瓦域gf(2^128)乘法器的设计Word下载.doc(33页珍藏版)》请在冰点文库上搜索。

伽罗瓦域gf(2^128)乘法器的设计Word下载.doc

4.1.6计算QtU和L的和LQtU 14

4.1.7计算LQtU和dinb的乘积:

14

4.2测试模块 14

4.2.1initial块 14

4.2.2always块 15

5ModelSim仿真 15

5.1仿真步骤 15

5.1.1 创建工程 15

5.1.2 添加verilog文件 16

5.1.3 编译工程 18

5.1.4 仿真运行 18

5.2波形分析 21

5.2.1仿真后主要信号、变量的波形图 21

5.2.2mul_128模块的输入信号和输出信号 21

5.2.3dina和dinb输入 21

5.2.4Q[126:

0][127:

0]的值 22

5.2.5Q的转置Qt[127:

0][126:

5.2.6dina_old,dinb_old信号的波形图 23

5.2.7说明 23

6综合 23

6.1综合步骤 23

6.2结果分析 24

7源码与注释 24

7.1主程序 24

7.2测试程序 27

8几种乘法器的比较 28

8.1Montgomery乘法器 28

8.2Mastrovito乘法器 28

8.3Karatsuba乘法器 29

8.4正规基乘法器 30

9致谢与心得 30

9.1组内分工 30

9.2心得 31

9.3致谢 33

10参考文献 33

1题目

1.1内容

本题目的最终目的是:

完成伽罗瓦域GF(2^128)乘法器的设计。

1.2设计要求

1)用verilog语言进行编程,语法要符合可综合设计的要求;

2)用modelsim完成系统功能仿真;

3)用synplify或ISE进行综合;

4)完成设计报告。

(设计报告中要对现有的几种伽罗瓦域GF(2^128)乘法器实现方法进行比较,分析优劣)

2背景介绍

2.1伽罗瓦域

有限域(或伽罗华域)包含有限个元素,并定义了两种操作——加法与乘法,这两种操作都是针对二元的操作。

GF

(2)是最小的有限域,它只含有两个域元素——0和1。

加法和乘法都进行模2操作,因此加法等效与逻辑异或,而乘法等效于逻辑与。

有限域可以用非可约多项式来定义,令GF(2m)是的根,即。

则称为多项式基或标准基,GF(2m)中的每个元素都可以根据多项式基来表示。

比如,对于,,可以表示为,其中即为基下的坐标。

假设,,则。

2.2GCM加密解密

2.2.1加密

令n和u表示一对特殊的非负整数,因此,明文的总位数为:

(n-1)128+u,1≤u≤128.明文包括n个位字符串,最后一个字符串的位数是u位,其他字符串都是128位。

这些字符串分别表示为:

P1,P2,……,Pn-1,P+n,,我们称这些位字符串为数据块,即使最后一个位字符串可能不是一个完整的数据块。

类似的,密文分别表示为:

C1,C2,……,Cn-1,C+n,最后一块数据块C+n的位数为u。

冗余验证数据A分别表示为A1,A2,……,Am-1,A+m,最后一个位字符串A+m可能不是整块且长度为v,m和v表示一对特殊的非负整数,因此A的总位数为:

(m-1)128+v,1≤v≤128。

验证加密操作定义如下:

连续计数值由函数incr()产生。

把该函数变量值最右边32位当做非负整数,并且最低有效位在右边,加法操作主要是针对这最右边的32位。

准确地说,incr(F||I)的值为F||I+1mod232)。

函数GHASH的定义是GHASH(H,A,C)=Xm+n+1,A和C的格式如前所述,变量Xi,i=0,……,m+n+1,定义如下:

2.2.2解密

验证解密操作与加密操作相类似,不同的是算散列值和加密的顺序颠倒了。

具体定义如下面方程所示:

比较由解密操作计算出的标签T′与标签T。

如果两者相等(包括长度和值),那么密文将被返回。

否则,返回特殊标识符FALL。

2.3ArashReyhani-Masoleh算法

对于有限域GF(2m)乘法C=A·

B,ArashReyhani-Masoleh等人证明,乘积C的坐标可以通过一个带矩阵Q的方程计算出来。

该方程为:

,其中是的根,,而T表示矩阵的转置。

矩阵Q的准确定义与证明可以在[1]中找到,矩阵Q仅取决非可约多项式。

Ghash的多项式。

下面我们直接给出GF(2128)中的矩阵Q。

对于域GF(2m),矩阵L如下:

(1)

对于域GF(2m),矩阵U如下:

(2)

(1)

(2)可知,在已知输入A的情况下,可以很容易地得到矩阵L,U,因此,根据,我们即可算出有限域乘法的乘积。

3设计思路

3.1初步构想

伽罗瓦域乘法器的核心是这个公式:

所以,我们要做的工作就是如何实现一步一步地按照这个公式把输入的两个128位并行数据计算得出结果。

根据背景介绍里面的算法描述,我们知道,Q矩阵是只与GF(2^m)中的m有关,而本文的m是固定的,为128,所以,Q矩阵的所有值都是固定了的。

那么,我们可以在初始化语句里面就把Q矩阵计算出来。

另外,考虑到计算的时候用的是Q矩阵的转置,那么,在初始化程序断里面就可以把Qt也一并求出来。

还是根据算法描述可以知道,L矩阵和U矩阵是只与输入的dina有关,那么,我们可以设置一个always语句,检测dina的输入,任何时候只要dina有输入,那么程序就立即计算出对应的L矩阵和U矩阵。

当然,还需要编写一段复位语句,使程序的所有变量、参数等等复位。

另外,由于仿真一般最开始都是先复位,也相当于初始化,那么,可以把计算Q和Qt两个矩阵的代码放到复位语句块里面。

考虑到为了降低芯片的计算量,我们可以是在每个时钟周期的上升沿检测复位信号rst和使能信号en,当复位信号rst为低电平的时候,进行复位操作,如果不是低电平,再检测使能信号en,如果en为高电平(表明允许计算)才继续下一步。

这时可以设置一个标志位flag,以检测本次的输入与上次的输入是否一样(假设相等的时候flag=0),如果flag==0,表明上次输入的dina和dinb与本次的相等,那么,也不继续进行下面的运算;

只有当flag==1时,才进行伽罗瓦域乘法。

根据,我们应该先计算Qt与U的乘积QtU,然后计算QtU和L的和LQtU,最后计算LQtU和dinb的乘积,即为dina和dinb的伽罗瓦域乘积。

同时,考虑到verilog不支持类似于C语言的二维数组这种数据类型,只能使用存储器类型,即,不能对存储器的每一个字节单独操作,那么,必须使用一些中间变量来获取存储器的值,计算出结果之后再写回到存储器,这部分会占程序的大部分,而且很容易出错。

由以上分析可知,只有在每个时钟周期的上升沿时候,检测到(rst==0)&

&

(en==1)&

(flag==1)的时候,才计算dina和dinb的伽罗瓦域乘积。

计算出dout之后,置ready_o为高电平,表明dout线上的信号为有效值。

最后,由于这仿真的波形比较复杂,手工设置输入信号太麻烦,也达不到要求,所以,我们需要编写一段testbench文件来测试主程序。

Testbench文件应该达到以下要求:

1,标准的时钟方波信号,可以通过always#50clk=~clk;

实现;

2,复位操作可以使在initial里面加入以下语句:

rst<

=1;

#20rst<

=0;

#60rst<

3,使能位置高电平,通过#60en<

4,dina和dinb的输入。

3.2程序流程图

根据初步构想,我画出以下的程序流程图,简单地描述程序的运行状态。

4功能模块

4.1乘法器主程序

4.1.1计算Q矩阵

Q[0][127:

0]=128'

he1000000000000000000000000000000;

for(i=1;

i<

121;

i=i+1)Q[i][127:

0]=Q[i-1][127:

0]>

>

1;

Q[121][127:

he1000000000000000000000000000070;

Q[122][127:

0]=Q[121][127:

Q[123][127:

0]=Q[122][127:

Q[124][127:

0]=Q[123][127:

Q[125][127:

0]=Q[124][127:

Q[126][127:

he6080000000000000000000000000003;

4.1.2计算Q矩阵的转置Qt

for(i=0;

128;

i=i+1)

begin

for(j=0;

j<

127;

j=j+1)

begin

temp[127:

0]=Q[j][127:

0];

temp4[126-j]=temp[127-i];

if(j==126)Qt[i][126:

0]=temp4[126:

end

end

4.1.3计算L矩阵

always@(dina)

begin

L[127][127:

0]=dina[127:

for(i=0;

i=i+1)

L[126-i][127:

0]=L[127-i][127:

0]<

<

end

4.1.4计算U矩阵

always@(dina)

U[0][127:

for(j=1;

U[j][127:

0]=U[j-1][127:

4.1.5计算Qt与U的乘积QtU

for(i=0;

temp4[126:

0]=Qt[i][126:

for(j=0;

j=j+1)

begin

for(k=0;

k<

k=k+1)

begin

temp[127:

0]=U[k][127:

temp1[127-j]=temp1[127-j]^(temp4[126-k]&

temp[127-j]);

end

if(j==127)QtU[i][127:

0]=temp1[127:

end

4.1.6计算QtU和L的和LQtU

for(i=0;

0]=L[i][127:

temp1[127:

0]=QtU[i][127:

temp2[j]=temp[j]^temp1[j];

if(j==127)LQtU[i][127:

0]=temp2[127:

0]=LQtU[i][127:

temp2[127-i]=temp2[127-i]^(temp1[127-j]&

4.2测试模块

4.2.1initial块

initial

begin

clk<

=0;

en<

rst<

=1;

dout[127:

#20rst<

#60rst<

en<

#100dina<

=128'

b0;

dinb<

#200dina<

h4283_1ec2_2177_7424_4b72_21b7_84d0_d49c;

hb83b533708bf535d0aa6e52980d53b78;

#70dout<

h9e2213794cbee38902b8e6ae8cd41a9f;

#130dina<

h90000000000000000000000000000012;

h00000000000000000000000000000002;

h200000000000000000000000000000a3;

#260$stop;

end

4.2.2always块

always

#50clk=~clk;

5ModelSim仿真

5.1仿真步骤

Modelsim仿真四部曲分别是:

创建工程、添加Verilog代码文件、编译、仿真。

下面简单给出这四步:

5.1.1 创建工程

选择fileà

newà

project,出现如图3-2所示的对话框。

输入projectname和希望的路径;

输入libraryname,缺省是work

5.1.2 添加verilog文件

这一步的目的是将verilog文件添加到创建好的工程中。

要添加的文件可以是先前已经用UltraEdit编写好存放于电脑某个目录下的,也可以现在输入。

输入的工具可以是Modelsim自带的代码输入工具,但最受欢迎的是UltraEdit。

选择“AddExistingFile”:

添加verilog文件:

选择Browse在你想仿真源码的地方全部选择工程文件(包括测试模块文件和功能模块文件)

然后选择打开,出现下面界面

选择ok

出现下面界面

如果需要加入工程的文件已经完成就选择close,否则重复上面步骤,继续加入文件。

5.1.3 编译工程

编译所有功能模块和测试模块,选择Compile中的CompileAll,如图3-6所示。

如果编译失败,双击错误信息可以直接转到出错代码处。

5.1.4 仿真运行

首先是调用设计,选择Simulate>

StartSimulate

选择testbench文件,此处为test_mul_128,点击“OK”

单击右键,选择将所有信号(或你希望观察的信号)添加到wave窗口中

选择simulate>

run>

runall,出现如下波形:

5.2波形分析

5.2.1仿真后主要信号、变量的波形图

5.2.2mul_128模块的输入信号和输出信号

由图可以看出,最开始的时候rst置低电平进行复位操作,然后为高电平,同时使能信号en也变高,表示现在可以接受输入了。

dina和dinb最开始输入全是0,dout大概延迟一个时钟周期之后输出,同时ready_o信号变为高电平,表明dout线上的数据时dina和dinb的伽罗瓦域乘积。

5.2.3dina和dinb输入

dina<

h42831ec2217774244b7221b784d0d49c;

dinb<

时的输出dout:

dout=128'

h9e2213794cbee38902b8e6ae8cd41a9f。

得到的值与理论计算值相等,表明程序应该是正确的。

(理论计算值是使用matlab编写的一段GF(2^128)域内的乘法运算,由于matlab自带维度低的伽罗瓦域乘法、并且矩阵运算及其方便,所以编写m=128的有限域乘法的算法比较容易)

这是输入为:

dina<

h000000000000000000000000000000002;

dout=128'

h200000000000000000000000000000a3。

依然是与理论计算值相等。

0]的值

通过验证一些截图给出的15组Q的值,可知Q与理论值相等。

通过验证给出的15组Qt的值可以知道Qt与理论值相等。

5.2.6dina_old,dinb_old信号的波形图

有图可以看出每次计算出dout的值之后,dina_old和dinb_old都成功地立即获得了当前的dina和dinb,为了与下次输入的dina和dinb相比较,当二者相等的时候程序不进行计算,只是保持原来的输出。

5.2.7说明

其他的一些中间变量,比如L、U、temp等等,由于光看波形不好验证是否正确,所以我没有把这些信号的波形拿来验证,只取了一些简单的来验证。

当然,最主要的是输出dout正确,那中间的过程不出意外应该是没有问题的,所以也就不必去一一验证了。

6综合

6.1综合步骤

(由于时间问题、程序编写不规范等等问题,最终没有完成综合)

6.2结果分析

估计是一大片一大片的门门门门门门门门门门门门门门门门门门……

7源码与注释

7.1主程序

主程序:

mul_128(clk,rst,en,dina,dinb,dout,ready_o)

/*

乘法器主程序

输入两个128位并行数a和b、以及功能信号,可得到乘法结果c

*/

modulemul_128(clk,//时钟信号,方波

rst,//复位信号,低电平有效

en,//使能信号,高电平有效

dina,//a输入口

dinb,//b输入口

dout,//输出端口

ready_o);

//输出有效端,高电平有效

inputclk,rst,en;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2