2024年2月27日发(作者:宗华容)
摘要
本文是在理解伽罗瓦域乘法器工作原理的基础上,设计一个伽罗瓦域乘法器,并通过verilog硬件描述语言,用Modelsim,Synplify软件对其进行仿真,综合。
关键词:伽罗瓦域 乘法器 Verilog 仿真 综合
Abstract
This article is in understanding the working principle of Galois field multiplier
based on the design of a Galois field multiplier, and through the verilog hardware
descriptionlanguage, with Modelsim, Synplify software from simulation, synthesis.
Key words: Galois Field Multiplier Simulation synthesis
目录
摘要.......................................................................................................................................................................... 1
2
正文.......................................................................................................................................................................... 4
一、课题及设计要求..................................................................................................................................... 4
a)课题内容..................................................................................................................................................... 4
b)设计要求..................................................................................................................................................... 4
二、伽罗瓦域背景介绍............................................................................................................................... 4
a)域和伽罗瓦
域........................................................................................................................................... 4
b)伽罗瓦域两种操作——加法与乘法............................................................................................. 4
三、算法描述..................................................................................................................................................... 4
四、设计过程..................................................................................................................................................... 6
a)过程描述..................................................................................................................................................... 6
b)程序流程图............................................................................................................................................... 7
五、verilog源代码........................................................................................................................................ 8
a)主程序.......................................................................................................................................................... 8
b)测试程序.................................................................................................................................................. 11
六、modelsim仿真结果......................................................................................................................... 12
a)仿真后主要信号、变量的波形..................................................................................................... 12
b)mul_128模块的输入信号和输出信号...................................................................................... 13
c)dina和dinb输入和dout输出....................................................................................................... 13
d)验证参数.................................................................................................................................................. 13
七、综合............................................................................................................................................................ 15
八、现有伽罗瓦域乘法器实现方法优劣比较............................................................................
15
九、总结............................................................................................................................................................ 15
a)体会心得.................................................................................................................................................. 15
b)建议............................................................................................................................................................
16
致谢....................................................................................................................................................................... 17
参考文献............................................................................................................................................................ 18
正文
一、课题及设计要求
a) 课题内容
伽罗瓦域GF(2)乘法器是Ghash算法(一种用于加解密系统散列算法)的核心部件,其速度^128与硬件开销决定着整个Ghash模块的整体性能。本题目的最终目的是:完成伽罗瓦域GF(2)乘法器的设计。
b) 设计要求
1) 用verilog语言进行编程,语法要符合可综合设计的要求;
2) 用modelsim完成系统功能仿真;
3) 用synplify 或ISE进行综合;
4) 完成设计报告。(设计报告中要对现有的几种伽罗瓦域GF(2较,分析优劣)
二、伽罗瓦域背景介绍
^128^128)乘法器实现方法进行比
a) 域和伽罗瓦域
F是至少含有两个元素的集合,对F定义了两种运算“+”和“*”,并且满足以下三条件的代数系统
b) 伽罗瓦域两种操作——加法与乘法
这两种操作都是针对二元的操作。GF(2)是最小的有限域,它只含有两个域元素——0和1。加法和乘法都进行模2操作,因此加法等效与逻辑异或,而乘法等效于逻辑与。有限域可以用非可约多项式 来定义,令 GF(2m)是 的根,即 。则称 为多项式基或标准基,GF(2m)中的每个元素都可以根据多项式基来表示。比如,对于 ,,可以表示为 ,其中 即为基下的坐标。假设 , ,则 。
三、算法描述
Arash Reyhani-Masoleh等人[1]提出了一种新的算法,具体为多项式基乘法公式,该公式可以有效减少实现乘法所需的门数,提高乘法器的速度,因此我们选择该算法作为比特并行乘法器的算法。
对于有限域GF(2)乘法C=A·B,Arash Reyhani-Masoleh等人证明,乘积C的坐标可以通过一个带矩阵Q的方程计算出来。该方程为: ,其中 是 的根, ,而T表示矩阵的转置。矩阵Q的准确定义与证明可以在[1]中找到,矩阵Q仅取决非可约多项式 。Ghash的多项式 。下面我们直接给出GF(2)中的矩阵Q。
对于域GF(2),矩阵L如下:
(1)
对于域GF(2),矩阵U如下:
(2)
由(1)(2)可知,在已知输入A的情况下,可以很容易地得到矩阵L,U,因此,根据 ,我们即可算出有限域乘法的乘积。
使用上述公式实现多项式基乘法,并令 , ,则 ,其实现结构图(1)如示:
图1 有限域乘法器结构图
BTX:Binary Tree of XORs IB:Interconnection Bus
结构图分为两部分:IP-network和Q-network。IP-network一共由m个模块组成,分别表示为 ,主要作用是根据 , ,求出向量 , 。对于 ,模块 包括两个内部运算单元,即 和 。最后一个模块 只包含一个运算单元,即 。
如图1所示, , 是Q-network的输入, 是输出。Q-network包括m个BTX。BTXi 中XOR门的个数等于矩阵Q中第i列中1的个数。我们知道,连接总线(IB)的条数是固定,且其值为m-1。在图1中,一共由3条总线,A,B和IB,线的总数为:3m-1。
四、设计过程
a) 过程描述
伽罗瓦域乘法器的核心是这个公式:
所以,我们要做的工作就是如何实现一步一步地按照这个公式把输入的两个128位并行数据计算得出结果。
mm128m
根据背景介绍里面的算法描述,我们知道,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 #50 clk=~clk; 实现;
2,复位操作可以使在initial里面加入以下语句:
rst<=1;
#20 rst<=0;
#60 rst<=1;
3,使能位置高电平,通过#60 en<=1; 实现;
4,dina和dinb的输入。
b) 程序流程图
五、Verilog源代码
a) 主程序
module mul_128(clk, //时钟信号,方波
rst, //复位信号,低电平有效
en, //使能信号,高电平有效
dina, //a输入口
dinb, //b输入
dout, //输出端口
ready_o); //输出有效端,高电平有效
input clk,rst,en; //输入信号
input [127:0] dina,dinb;
output ready_o; //输出信号
output [127:0] dout;
reg [127:0] dout;
reg [127:0] dina_old,dinb_old; //保存上一次输入的a和b的值,防止重复计算
reg ready_o;
reg [127:0] L[127:0],QtU[127:0],LQtU[127:0]; //伽罗瓦域乘法器实现过程中的中间变量
reg [127:0] U[126:0],Q[126:0];
reg [126:0] Qt[127:0];
reg [127:0] temp,temp1,temp2;
reg [126:0] temp4;
integer i,j,k; //循环变量
integer flag; //标志位,表示本次输入的a和b与上次的相同
always@(dina) //a端一旦有输入,就立即计算出a对应的L矩阵
begin
L[127][127:0]=dina[127:0];
for(i=0;i<127;i=i+1)
L[126-i][127:0]=L[127-i][127:0]<<1;
End
always@(dina) //a端一旦有输入,就立即计算出a对应的U矩
begin
U[0][127:0]=dina[127:0]>>1;
for(j=1;j<127;j=j+1)
U[j][127:0]=U[j-1][127:0]>>1;
end
always@(posedge clk) //每个时钟上升沿检测a和b输入端
begin
if(~rst) //在程序最开始,是复位信号有效,进行一定初始化
begin
for(i=0;i<127;i=i+1)
begin
Qt[i][126:0]=0;
QtU[i][127:0]=0;
LQtU[i][127:0]=0;
end
QtU[127][127:0]=0;
LQtU[127][127:0]=0;
dout[127:0]=0;
temp[127:0]=0;
temp1[127:0]=0;
temp2[127:0]=0;
temp4[126:0]=0;
ready_o=0;
Q[0][127:0]=128'he1000000;//计算Q矩阵所有值
for(i=1;i<121;i=i+1) Q[i][127:0]=Q[i-1][127:0]>>1;
Q[121][127:0]=128'he1000070;
Q[122][127:0]=Q[121][127:0]>>1;
Q[123][127:0]=Q[122][127:0]>>1;
Q[124][127:0]=Q[123][127:0]>>1;
Q[125][127:0]=Q[124][127:0]>>1;
Q[126][127:0]=128'he6000003;
for(i=0;i<128;i=i+1) //计算Q矩阵的转置
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:0];
end
end
end
else if(en) //使能信号高电平有效
begin
flag=0; //使标志位置0,如果此次输入与上次不一致,则flag=1
if(((dina!==dina_old))||(dinb!==dinb_old)) flag=1;
if(flag==1) //此次输入的a和b的值与上次不同
begin
temp[127:0]=0; //一些初始化语句
temp1[127:0]=0;
temp2[127:0]=0;
temp4[126:0]=0;
for(i=0;i<128;i=i+1) //计算Q的转置Qt矩阵与U矩阵的乘积QtU
begin
temp4[126:0]=Qt[i][126:0];
for(j=0;j<128;j=j+1)
begin
for(k=0;k<127;k=k+1)
begin
temp[127:0]=U[k][127:0];
temp1[127-j]=temp1[127-j]^(temp4[126-k]&temp[127-j]);
end;
if (j==127) QtU[i][127:0]=temp1[127:0];
end
end
temp[127:0]=0; //一些初始化语句
temp1[127:0]=0;
temp2[127:0]=0;
temp4[126:0]=0;
for(i=0;i<128;i=i+1) //计算QtU与L的和LQtU
begin
temp[127:0]=L[i][127:0];
temp1[127:0]=QtU[i][127:0];
for(j=0;j<128;j=j+1)
begin
temp2[j]=temp[j]^temp1[j];
if(j==127)
LQtU[i][127:0]=temp2[127:0];
end
end
temp[127:0]=0; //一些初始化语句
temp1[127:0]=0;
temp2[127:0]=0;
temp4[126:0]=0;
temp[127:0]=dinb[127:0];
for(i=0;i<128;i=i+1) //计算LQtU与dinb的乘积,即为a和b的乘积dout
begin
temp1[127:0]=LQtU[i][127:0];
for(j=0;j<128;j=j+1)
temp2[127-i]=temp2[127-i]^(temp1[127-j]&temp[127-j]);
end
dout[127:0]=temp2[127:0];
dina_old[127:0]=dina[127:0]; //dina_old获取本次输入的a的值
dinb_old[127:0]=dinb[127:0]; //dinb_old获取本次输入的b的值
ready_o=1; //计算出结果后,把dout送到线上,并用ready_o高电平表示数据有效
end
end
end
endmodule
b) 测试程序
module test_mul_128();
reg clk,rst,en; //时钟信号、复位信号、使能信号
reg [127:0] dina,dinb; //两个128位的并行输入端
wire [127:0] dout; //128位并行输出端
wire ready_o; //输出有效端
mul_128
mul(.clk(clk),.rst(rst),.en(en),.dina(dina),.dinb(dinb),.dout(dout),.ready_o(ready_o)); //调用mul_128模块
initial //初始化语句块
begin
clk<=0; //时钟初始化为低电平
en<=0; //使能信号端初始化为低电平
rst<=1; //复位信号端初始化为高电平
#20 rst<=0; //20ns后,复位信号置高电平
#60 rst<=1; en<=1; //60ns后,复位信号置低电平,使能信号置高电平
#100 dina<=128'b0; //100ns后,a口输入0
dinb<=128'b0; //b口输入0
#200 dina<=128'h42831ec2217774244b7221b784d0d49c; //200ns后,a口输入第二个数据
dinb<=128'hb83b533708bf535d0aa6e52980d53b78; //b口输入第二个数据
#200 dina<=128'h90000012; //200ns后,a口输入第三个数据
dinb<=128'h00000002; // b口输入第三个数据
#400 $stop; //400ns后,停止仿真
end
always #50 clk=~clk; //每隔50ns,时钟信号翻转一次,形成周期性方波
endmodule
六、modelsim仿真结果
a) 仿真后主要信号、变量的波形
b) mul_128模块的输入信号和输出信号
由图可以看出,最开始的时候rst置低电平进行复位操作,然后为高电平,同时使能信号
en也变高,表示现在可以接受输入了。dina和dinb最开始输入全是0,dout大概延迟一个时钟周期之后输出,同时ready_o信号变为高电平,表明dout线上的数据时dina和dinb的伽罗瓦域乘积。
c) dina和dinb输入
dina<=128'h42831ec2217774244b7221b784d0d49c;
dinb<=128'hb83b533708bf535d0aa6e52980d53b78;
输出dout:dout = 128'h9e2213794cbee38902b8e6ae8cd41a9f。
得到的值与理论计算值相等,表明程序应该是正确的。(理论计算值是使用matlab编写的一段GF(2^128)域内的乘法运算,由于matlab自带维度低的伽罗瓦域乘法、并且矩阵运算及其方便,所以编写m=128的有限域乘法的算法比较容易)
输入为:
dina<=128'h90000012;
dinb<=128'h000000002;
输出:
dout = 128'h200000a3。
依然是与理论计算值相等。
d) 验证参数
为检验结果的正确性,取一些中间参数的值进行验证
1) Q[126:0][127:0]的值
Q值与理论值相等
2) Q的转置Qt[127:0][126:0]的值
Qt值与理论值相等
3) dina_old, dinb_old信号的波形图
有图可以看出每次计算出dout的值之后,dina_old和dinb_old都成功地立即获得了当前的dina和dinb,为了与下次输入的dina和dinb相比较,当二者相等的时候程序不进行计算,只是保持原来的输出。
4) 说明
其他的一些中间变量,比如 L、 U、 temp等等,由于光看波形不好验证是否正确,所以我没有把这些信号的波形拿来验证,只取了一些简单的来验证。当然,最主要的是输出dout
正确,那中间的过程不出意外应该是没有问题的,所以也就不必去一一验证了。
七、综合
没有得出综合结果。
八、现有伽罗瓦域乘法器实现方法优劣比较
GF(2m)域乘法运算实现有多种分类方法,按照参加运算的域元素的表示方式来看,由于有限域每个元素由肌位矢量表示,常用的基有三种:标准基
另外,近些年又出现了各种新的乘法实现结构,如采用脉动阵列实现乘法运算,具有规则性、高速等特点,又有避免脉动阵列缺点的半脉动阵列乘法嚣。目前大多数应用采用的有限域乘法实现方法有以下几种:
1.查表法。这种方法将有限域的每个元素用本原元的幂表示,并在ROM中存储每个元素的对数及反对数,有限域中任意两个元素的乘积可通过查表获得。这种乘法器随着位数的增加面积也迅速增大。
2.线性反馈移位寄存器法。有限域中的任意两个元素的乘积可由线性反馈移位寄存器电路获得。这种方法实现的乘法器电路简单、面积小,但速度馒(需要辫个时钟周期,m为乘法器的位数1。
3.Massey-Omura法。这种乘法器采用有限域中的正规基表示乘数和被乘数,乘积项的每一个分量可用同一个函数表示,也称为正规基乘法器。该乘法器对有限域元素的平方运算及指数运算非常有效,但实现面积较大,需要将有限域中的元素用特殊的基表示,且与有限域中的本原多项式选择有关。
4.Bedekamp位串法。这种乘法器的乘数用标准基表示,被乘数和乘积项用对偶基表示,乘法器只需移位和异或运算,以前主要用在RS编码器中,即一个常数元素与交量的乘法,该乘法器在目前所有已实现的乘法器中面积最小,但需要棚个时钟周期才能完成计算,且需要基与基之间的转换。
5.脉动阵列和半脉动乘法器。脉动阵列结卡句实现具有高速规则的特点,适合具有迭代性质算法的VLSI实现。已有基于脉动阵列的有限域乘法器。后来又出现了半脉动阵列的乘法器。这类实现方法都是针对本原多项式可以编程的有限域乘法器,并且它的结构规整,是一种并行结构的乘法器。
6.先乘再取模乘法器。这种乘法器是根据有限域乘法定义直接得来的。实现域的大小和本原多项式都可编程的乘法器是比较难的,但是针对特定本原多项式,它是可以通过子项共享的方式来减少硬件。
7.Mastrovito乘法器。这是Mastrovito于1991年在其博士论文中提出来的。它的基本方程是C=M*B,其中M是与被乘数和本原多项式有关的一个m*m矩阵,也可通过子项共享的方法对硬件实现进行改进。该乘法器也是针对特殊本原多项式,针对域的大小和本原多项式都可以编程的乘法器一股不能用这种方法。
九、总结
2024年2月27日发(作者:宗华容)
摘要
本文是在理解伽罗瓦域乘法器工作原理的基础上,设计一个伽罗瓦域乘法器,并通过verilog硬件描述语言,用Modelsim,Synplify软件对其进行仿真,综合。
关键词:伽罗瓦域 乘法器 Verilog 仿真 综合
Abstract
This article is in understanding the working principle of Galois field multiplier
based on the design of a Galois field multiplier, and through the verilog hardware
descriptionlanguage, with Modelsim, Synplify software from simulation, synthesis.
Key words: Galois Field Multiplier Simulation synthesis
目录
摘要.......................................................................................................................................................................... 1
2
正文.......................................................................................................................................................................... 4
一、课题及设计要求..................................................................................................................................... 4
a)课题内容..................................................................................................................................................... 4
b)设计要求..................................................................................................................................................... 4
二、伽罗瓦域背景介绍............................................................................................................................... 4
a)域和伽罗瓦
域........................................................................................................................................... 4
b)伽罗瓦域两种操作——加法与乘法............................................................................................. 4
三、算法描述..................................................................................................................................................... 4
四、设计过程..................................................................................................................................................... 6
a)过程描述..................................................................................................................................................... 6
b)程序流程图............................................................................................................................................... 7
五、verilog源代码........................................................................................................................................ 8
a)主程序.......................................................................................................................................................... 8
b)测试程序.................................................................................................................................................. 11
六、modelsim仿真结果......................................................................................................................... 12
a)仿真后主要信号、变量的波形..................................................................................................... 12
b)mul_128模块的输入信号和输出信号...................................................................................... 13
c)dina和dinb输入和dout输出....................................................................................................... 13
d)验证参数.................................................................................................................................................. 13
七、综合............................................................................................................................................................ 15
八、现有伽罗瓦域乘法器实现方法优劣比较............................................................................
15
九、总结............................................................................................................................................................ 15
a)体会心得.................................................................................................................................................. 15
b)建议............................................................................................................................................................
16
致谢....................................................................................................................................................................... 17
参考文献............................................................................................................................................................ 18
正文
一、课题及设计要求
a) 课题内容
伽罗瓦域GF(2)乘法器是Ghash算法(一种用于加解密系统散列算法)的核心部件,其速度^128与硬件开销决定着整个Ghash模块的整体性能。本题目的最终目的是:完成伽罗瓦域GF(2)乘法器的设计。
b) 设计要求
1) 用verilog语言进行编程,语法要符合可综合设计的要求;
2) 用modelsim完成系统功能仿真;
3) 用synplify 或ISE进行综合;
4) 完成设计报告。(设计报告中要对现有的几种伽罗瓦域GF(2较,分析优劣)
二、伽罗瓦域背景介绍
^128^128)乘法器实现方法进行比
a) 域和伽罗瓦域
F是至少含有两个元素的集合,对F定义了两种运算“+”和“*”,并且满足以下三条件的代数系统
b) 伽罗瓦域两种操作——加法与乘法
这两种操作都是针对二元的操作。GF(2)是最小的有限域,它只含有两个域元素——0和1。加法和乘法都进行模2操作,因此加法等效与逻辑异或,而乘法等效于逻辑与。有限域可以用非可约多项式 来定义,令 GF(2m)是 的根,即 。则称 为多项式基或标准基,GF(2m)中的每个元素都可以根据多项式基来表示。比如,对于 ,,可以表示为 ,其中 即为基下的坐标。假设 , ,则 。
三、算法描述
Arash Reyhani-Masoleh等人[1]提出了一种新的算法,具体为多项式基乘法公式,该公式可以有效减少实现乘法所需的门数,提高乘法器的速度,因此我们选择该算法作为比特并行乘法器的算法。
对于有限域GF(2)乘法C=A·B,Arash Reyhani-Masoleh等人证明,乘积C的坐标可以通过一个带矩阵Q的方程计算出来。该方程为: ,其中 是 的根, ,而T表示矩阵的转置。矩阵Q的准确定义与证明可以在[1]中找到,矩阵Q仅取决非可约多项式 。Ghash的多项式 。下面我们直接给出GF(2)中的矩阵Q。
对于域GF(2),矩阵L如下:
(1)
对于域GF(2),矩阵U如下:
(2)
由(1)(2)可知,在已知输入A的情况下,可以很容易地得到矩阵L,U,因此,根据 ,我们即可算出有限域乘法的乘积。
使用上述公式实现多项式基乘法,并令 , ,则 ,其实现结构图(1)如示:
图1 有限域乘法器结构图
BTX:Binary Tree of XORs IB:Interconnection Bus
结构图分为两部分:IP-network和Q-network。IP-network一共由m个模块组成,分别表示为 ,主要作用是根据 , ,求出向量 , 。对于 ,模块 包括两个内部运算单元,即 和 。最后一个模块 只包含一个运算单元,即 。
如图1所示, , 是Q-network的输入, 是输出。Q-network包括m个BTX。BTXi 中XOR门的个数等于矩阵Q中第i列中1的个数。我们知道,连接总线(IB)的条数是固定,且其值为m-1。在图1中,一共由3条总线,A,B和IB,线的总数为:3m-1。
四、设计过程
a) 过程描述
伽罗瓦域乘法器的核心是这个公式:
所以,我们要做的工作就是如何实现一步一步地按照这个公式把输入的两个128位并行数据计算得出结果。
mm128m
根据背景介绍里面的算法描述,我们知道,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 #50 clk=~clk; 实现;
2,复位操作可以使在initial里面加入以下语句:
rst<=1;
#20 rst<=0;
#60 rst<=1;
3,使能位置高电平,通过#60 en<=1; 实现;
4,dina和dinb的输入。
b) 程序流程图
五、Verilog源代码
a) 主程序
module mul_128(clk, //时钟信号,方波
rst, //复位信号,低电平有效
en, //使能信号,高电平有效
dina, //a输入口
dinb, //b输入
dout, //输出端口
ready_o); //输出有效端,高电平有效
input clk,rst,en; //输入信号
input [127:0] dina,dinb;
output ready_o; //输出信号
output [127:0] dout;
reg [127:0] dout;
reg [127:0] dina_old,dinb_old; //保存上一次输入的a和b的值,防止重复计算
reg ready_o;
reg [127:0] L[127:0],QtU[127:0],LQtU[127:0]; //伽罗瓦域乘法器实现过程中的中间变量
reg [127:0] U[126:0],Q[126:0];
reg [126:0] Qt[127:0];
reg [127:0] temp,temp1,temp2;
reg [126:0] temp4;
integer i,j,k; //循环变量
integer flag; //标志位,表示本次输入的a和b与上次的相同
always@(dina) //a端一旦有输入,就立即计算出a对应的L矩阵
begin
L[127][127:0]=dina[127:0];
for(i=0;i<127;i=i+1)
L[126-i][127:0]=L[127-i][127:0]<<1;
End
always@(dina) //a端一旦有输入,就立即计算出a对应的U矩
begin
U[0][127:0]=dina[127:0]>>1;
for(j=1;j<127;j=j+1)
U[j][127:0]=U[j-1][127:0]>>1;
end
always@(posedge clk) //每个时钟上升沿检测a和b输入端
begin
if(~rst) //在程序最开始,是复位信号有效,进行一定初始化
begin
for(i=0;i<127;i=i+1)
begin
Qt[i][126:0]=0;
QtU[i][127:0]=0;
LQtU[i][127:0]=0;
end
QtU[127][127:0]=0;
LQtU[127][127:0]=0;
dout[127:0]=0;
temp[127:0]=0;
temp1[127:0]=0;
temp2[127:0]=0;
temp4[126:0]=0;
ready_o=0;
Q[0][127:0]=128'he1000000;//计算Q矩阵所有值
for(i=1;i<121;i=i+1) Q[i][127:0]=Q[i-1][127:0]>>1;
Q[121][127:0]=128'he1000070;
Q[122][127:0]=Q[121][127:0]>>1;
Q[123][127:0]=Q[122][127:0]>>1;
Q[124][127:0]=Q[123][127:0]>>1;
Q[125][127:0]=Q[124][127:0]>>1;
Q[126][127:0]=128'he6000003;
for(i=0;i<128;i=i+1) //计算Q矩阵的转置
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:0];
end
end
end
else if(en) //使能信号高电平有效
begin
flag=0; //使标志位置0,如果此次输入与上次不一致,则flag=1
if(((dina!==dina_old))||(dinb!==dinb_old)) flag=1;
if(flag==1) //此次输入的a和b的值与上次不同
begin
temp[127:0]=0; //一些初始化语句
temp1[127:0]=0;
temp2[127:0]=0;
temp4[126:0]=0;
for(i=0;i<128;i=i+1) //计算Q的转置Qt矩阵与U矩阵的乘积QtU
begin
temp4[126:0]=Qt[i][126:0];
for(j=0;j<128;j=j+1)
begin
for(k=0;k<127;k=k+1)
begin
temp[127:0]=U[k][127:0];
temp1[127-j]=temp1[127-j]^(temp4[126-k]&temp[127-j]);
end;
if (j==127) QtU[i][127:0]=temp1[127:0];
end
end
temp[127:0]=0; //一些初始化语句
temp1[127:0]=0;
temp2[127:0]=0;
temp4[126:0]=0;
for(i=0;i<128;i=i+1) //计算QtU与L的和LQtU
begin
temp[127:0]=L[i][127:0];
temp1[127:0]=QtU[i][127:0];
for(j=0;j<128;j=j+1)
begin
temp2[j]=temp[j]^temp1[j];
if(j==127)
LQtU[i][127:0]=temp2[127:0];
end
end
temp[127:0]=0; //一些初始化语句
temp1[127:0]=0;
temp2[127:0]=0;
temp4[126:0]=0;
temp[127:0]=dinb[127:0];
for(i=0;i<128;i=i+1) //计算LQtU与dinb的乘积,即为a和b的乘积dout
begin
temp1[127:0]=LQtU[i][127:0];
for(j=0;j<128;j=j+1)
temp2[127-i]=temp2[127-i]^(temp1[127-j]&temp[127-j]);
end
dout[127:0]=temp2[127:0];
dina_old[127:0]=dina[127:0]; //dina_old获取本次输入的a的值
dinb_old[127:0]=dinb[127:0]; //dinb_old获取本次输入的b的值
ready_o=1; //计算出结果后,把dout送到线上,并用ready_o高电平表示数据有效
end
end
end
endmodule
b) 测试程序
module test_mul_128();
reg clk,rst,en; //时钟信号、复位信号、使能信号
reg [127:0] dina,dinb; //两个128位的并行输入端
wire [127:0] dout; //128位并行输出端
wire ready_o; //输出有效端
mul_128
mul(.clk(clk),.rst(rst),.en(en),.dina(dina),.dinb(dinb),.dout(dout),.ready_o(ready_o)); //调用mul_128模块
initial //初始化语句块
begin
clk<=0; //时钟初始化为低电平
en<=0; //使能信号端初始化为低电平
rst<=1; //复位信号端初始化为高电平
#20 rst<=0; //20ns后,复位信号置高电平
#60 rst<=1; en<=1; //60ns后,复位信号置低电平,使能信号置高电平
#100 dina<=128'b0; //100ns后,a口输入0
dinb<=128'b0; //b口输入0
#200 dina<=128'h42831ec2217774244b7221b784d0d49c; //200ns后,a口输入第二个数据
dinb<=128'hb83b533708bf535d0aa6e52980d53b78; //b口输入第二个数据
#200 dina<=128'h90000012; //200ns后,a口输入第三个数据
dinb<=128'h00000002; // b口输入第三个数据
#400 $stop; //400ns后,停止仿真
end
always #50 clk=~clk; //每隔50ns,时钟信号翻转一次,形成周期性方波
endmodule
六、modelsim仿真结果
a) 仿真后主要信号、变量的波形
b) mul_128模块的输入信号和输出信号
由图可以看出,最开始的时候rst置低电平进行复位操作,然后为高电平,同时使能信号
en也变高,表示现在可以接受输入了。dina和dinb最开始输入全是0,dout大概延迟一个时钟周期之后输出,同时ready_o信号变为高电平,表明dout线上的数据时dina和dinb的伽罗瓦域乘积。
c) dina和dinb输入
dina<=128'h42831ec2217774244b7221b784d0d49c;
dinb<=128'hb83b533708bf535d0aa6e52980d53b78;
输出dout:dout = 128'h9e2213794cbee38902b8e6ae8cd41a9f。
得到的值与理论计算值相等,表明程序应该是正确的。(理论计算值是使用matlab编写的一段GF(2^128)域内的乘法运算,由于matlab自带维度低的伽罗瓦域乘法、并且矩阵运算及其方便,所以编写m=128的有限域乘法的算法比较容易)
输入为:
dina<=128'h90000012;
dinb<=128'h000000002;
输出:
dout = 128'h200000a3。
依然是与理论计算值相等。
d) 验证参数
为检验结果的正确性,取一些中间参数的值进行验证
1) Q[126:0][127:0]的值
Q值与理论值相等
2) Q的转置Qt[127:0][126:0]的值
Qt值与理论值相等
3) dina_old, dinb_old信号的波形图
有图可以看出每次计算出dout的值之后,dina_old和dinb_old都成功地立即获得了当前的dina和dinb,为了与下次输入的dina和dinb相比较,当二者相等的时候程序不进行计算,只是保持原来的输出。
4) 说明
其他的一些中间变量,比如 L、 U、 temp等等,由于光看波形不好验证是否正确,所以我没有把这些信号的波形拿来验证,只取了一些简单的来验证。当然,最主要的是输出dout
正确,那中间的过程不出意外应该是没有问题的,所以也就不必去一一验证了。
七、综合
没有得出综合结果。
八、现有伽罗瓦域乘法器实现方法优劣比较
GF(2m)域乘法运算实现有多种分类方法,按照参加运算的域元素的表示方式来看,由于有限域每个元素由肌位矢量表示,常用的基有三种:标准基
另外,近些年又出现了各种新的乘法实现结构,如采用脉动阵列实现乘法运算,具有规则性、高速等特点,又有避免脉动阵列缺点的半脉动阵列乘法嚣。目前大多数应用采用的有限域乘法实现方法有以下几种:
1.查表法。这种方法将有限域的每个元素用本原元的幂表示,并在ROM中存储每个元素的对数及反对数,有限域中任意两个元素的乘积可通过查表获得。这种乘法器随着位数的增加面积也迅速增大。
2.线性反馈移位寄存器法。有限域中的任意两个元素的乘积可由线性反馈移位寄存器电路获得。这种方法实现的乘法器电路简单、面积小,但速度馒(需要辫个时钟周期,m为乘法器的位数1。
3.Massey-Omura法。这种乘法器采用有限域中的正规基表示乘数和被乘数,乘积项的每一个分量可用同一个函数表示,也称为正规基乘法器。该乘法器对有限域元素的平方运算及指数运算非常有效,但实现面积较大,需要将有限域中的元素用特殊的基表示,且与有限域中的本原多项式选择有关。
4.Bedekamp位串法。这种乘法器的乘数用标准基表示,被乘数和乘积项用对偶基表示,乘法器只需移位和异或运算,以前主要用在RS编码器中,即一个常数元素与交量的乘法,该乘法器在目前所有已实现的乘法器中面积最小,但需要棚个时钟周期才能完成计算,且需要基与基之间的转换。
5.脉动阵列和半脉动乘法器。脉动阵列结卡句实现具有高速规则的特点,适合具有迭代性质算法的VLSI实现。已有基于脉动阵列的有限域乘法器。后来又出现了半脉动阵列的乘法器。这类实现方法都是针对本原多项式可以编程的有限域乘法器,并且它的结构规整,是一种并行结构的乘法器。
6.先乘再取模乘法器。这种乘法器是根据有限域乘法定义直接得来的。实现域的大小和本原多项式都可编程的乘法器是比较难的,但是针对特定本原多项式,它是可以通过子项共享的方式来减少硬件。
7.Mastrovito乘法器。这是Mastrovito于1991年在其博士论文中提出来的。它的基本方程是C=M*B,其中M是与被乘数和本原多项式有关的一个m*m矩阵,也可通过子项共享的方法对硬件实现进行改进。该乘法器也是针对特殊本原多项式,针对域的大小和本原多项式都可以编程的乘法器一股不能用这种方法。
九、总结