资源描述
EDA试验报告
一、实验项目名称
DES算法
二、实验目得与要求
1、掌握DES得原理与设计方法。
2、了解QuartusII硬件电路设计流程,学会利用Modelsim进行仿真。
3、加深对自顶向下设计与分模块化得了解,学会模块化得设计方法。
三、实验步骤
(一)、DES算法原理
DES算法为密码体制中得对称密码体制,又被称为美国数据加密标准,就是1972年美国IBM公司研制得对称密码体制加密算法。 明文按64位进行分组,密钥长64位,密钥事实上就是56位参与DES运算(第8、16、24、32、40、48、56、64位就是校验位, 使得每个密钥都有奇数个1)分组后得明文组与56位得密钥按位替代或交换得方法形成密文组得加密方法。
其入口参数有三个:key、data、mode。key为加密解密使用得密钥,data为加密解密得数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中得56位,这样才具有高得安全性。DES算法把64位得明文输入块变为64位得密文输出块,它所使用得密钥也就是64位,整个算法得主流程图如下:
(二)、VerilogHDL实现原理
拟采用模块化设计思想,根据DES算法得流程分模块设计实现各模块,自顶向下最终实现DES加密算法。
各模块功能及实现如下所示:
1、整体结构框架搭建,实现总体功能
module DES(input clk,
input des_enable,
input reset,
input des_mode,
input [1:64] data_i,
input [1:64] key_i,
output wire [1:64] data_o,
output ready_o);
wire [3:0] inter_num_curr;
wire [1:32] R_i_var, L_i_var;
wire [1:56] Key_i_var_out;
wire [1:64] data_o_var_t;
wire [1:32] R_i, L_i;
wire [1:32] R_o, L_o;
wire [1:56] Key_o;
wire [1:28] C0, D0;
IP IP1(、in(data_i),
、L_i_var(L_i_var),
、R_i_var(R_i_var));
IP_ni IP_ni(、in(data_o_var_t),
、out(data_o));
pc_1 pc_1(、key_i(key_i),
、C0(C0),
、D0(D0));
//F(R,K)
des_f des_f1(、clk(clk),
、reset(reset),
、des_mode(des_mode),
、inter_num_i(inter_num_curr),
、R_i(R_i),
、L_i(L_i),
、Key_i(Key_i_var_out),
、R_o(R_o), 、L_o(L_o),
、Key_o(Key_o));
//contral 16 F(R,K)
contrl contrl1(、data_o_var_t(data_o_var_t),
、inter_num_curr(inter_num_curr),
、Key_i_var_out(Key_i_var_out),
、R_i(R_i),
、L_i(L_i),
、ready_o(ready_o),
、L_o(L_o),
、R_o(R_o),
、R_i_var(R_i_var),
、L_i_var(L_i_var),
、Key_o(Key_o),
、C0(C0),
、D0(D0),
、clk(clk),
、reset(reset),
、des_enable(des_enable));
endmodule
module IP(input [1:64] in,
output [1:32] L_i_var,
output [1:32] R_i_var);
assign {L_i_var, R_i_var} =
{in[58],in[50],in[42],in[34],in[26],in[18],in[10],in[2],
in[60],in[52],in[44],in[36],in[28],in[20],in[12],in[4],
ﻩ ﻩin[62],in[54],in[46],in[38],in[30],in[22],in[14],in[6],
ﻩin[64],in[56],in[48],in[40],in[32],in[24],in[16],in[8],
ﻩﻩ in[57],in[49],in[41],in[33],in[25],in[17],in[9],in[1],
ﻩ in[59],in[51],in[43],in[35],in[27],in[19],in[11],in[3],
ﻩﻩin[61],in[53],in[45],in[37],in[29],in[21],in[13],in[5],
ﻩﻩ in[63],in[55],in[47],in[39],in[31],in[23],in[15],in[7]};
endmodule
module IP_ni(input [1:64] in,
output [1:64] out);
assign out =
{in[40],in[8],in[48],in[16],in[56],in[24],in[64],in[32],
in[39],in[7],in[47],in[15],in[55],in[23],in[63],in[31],
in[38],in[6],in[46],in[14],in[54],in[22],in[62],in[30],
in[37],in[5],in[45],in[13],in[53],in[21],in[61],in[29],
in[36],in[4],in[44],in[12],in[52],in[20],in[60],in[28],
in[35],in[3],in[43],in[11],in[51],in[19],in[59],in[27],
in[34],in[2],in[42],in[10],in[50],in[18],in[58],in[26],
in[33],in[1],in[41],in[9],in[49],in[17],in[57],in[25]};
endmodule
3、圈子秘钥得生成
module key_get(input [1:56] pre_key,
input des_mode,
input [3:0] inter_num,
output wire [1:48] new_key,
output reg [1:56] out_key);
reg pre_key_0, pre_key_1;
reg [1:56] pre_key_var;
always (*)
begin
if(des_mode == 1'b0)
begin
case(inter_num)
4'd0, 4'd1, 4'd8, 4'd15:
begin
pre_key_var = pre_key;
pre_key_0 = pre_key_var[1];
pre_key_var[1:28] = pre_key_var[1:28] << 1;
pre_key_var[28] = pre_key_0;
pre_key_0 = pre_key_var[29];
pre_key_var[29:56] = pre_key_var[29:56] << 1;
pre_key_var[56] = pre_key_0;
end 4'd2, 4'd3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd9, 4'd10, 4'd11,
4'd12,
4'd13, 4'd14:
begin
pre_key_var = pre_key;
{pre_key_1, pre_key_0} = pre_key_var[1:2];
pre_key_var[1:28] = pre_key_var[1:28] << 2;
pre_key_var[27:28] = {pre_key_1, pre_key_0};
{pre_key_1, pre_key_0} = pre_key_var[29:30];
pre_key_var[29:56] = pre_key_var[29:56] << 2;
pre_key_var[55:56] = {pre_key_1, pre_key_0};
end
endcase
end
else
begin
case(inter_num)
4'd0: pre_key_var = pre_key;
4'd1, 4'd8, 4'd15:
begin
pre_key_var = pre_key;
pre_key_0 = pre_key_var[28];
pre_key_var[1:28] = pre_key_var[1:28] >> 1;
pre_key_var[1] = pre_key_0;
pre_key_0 = pre_key_var[56];
pre_key_var[29:56] = pre_key_var[29:56] >> 1;
pre_key_var[29] = pre_key_0;
end
default:
begin
pre_key_var = pre_key;
{pre_key_1, pre_key_0} = pre_key_var[27:28];
pre_key_var[1:28] = pre_key_var[1:28] >> 2;
pre_key_var[1:2] = {pre_key_1, pre_key_0};
{pre_key_1, pre_key_0} = pre_key_var[55:56];
pre_key_var[29:56] = pre_key_var[29:56] >> 2;
pre_key_var[29:30] = {pre_key_1, pre_key_0};
end
endcase
end
out_key = pre_key_var;
end
assign new_key =
ﻩ {pre_key_var[14],pre_key_var[17],pre_key_var[11],pre_key_var[24],pre_key_var[1],pre_key_var[5],
pre_key_var[3],pre_key_var[28],pre_key_var[15],pre_key_var[6],pre_key_var[21],pre_key_var[10],
ﻩ ﻩﻩﻩpre_key_var[23],pre_key_var[19],pre_key_var[12],pre_key_var[4],pre_key_var[26],pre_key_var[8],
ﻩpre_key_var[16],pre_key_var[7],pre_key_var[27],pre_key_var[20],pre_key_var[13],pre_key_var[2],
ﻩﻩﻩ ﻩpre_key_var[41],pre_key_var[52],pre_key_var[31],pre_key_var[37],pre_key_var[47],pre_key_var[55],
ﻩﻩﻩﻩﻩpre_key_var[30],pre_key_var[40],pre_key_var[51],pre_key_var[45],pre_key_var[33],pre_key_var[48],
pre_key_var[44],pre_key_var[49],pre_key_var[39],pre_key_var[56],pre_key_var[34],pre_key_var[53],
ﻩﻩ ﻩpre_key_var[46],pre_key_var[42],pre_key_var[50],pre_key_var[36],pre_key_var[29],pre_key_var[32]};
endmodule
3、f函数得实现
module des_f(input clk,
input reset,
input des_mode,
input [3:0] inter_num_i,
input [1:32] R_i,
input [1:32] L_i,
input [1:56] Key_i,
output reg [1:32] R_o,
output reg [1:32] L_o,
output reg [1:56] Key_o);
reg [1:32] next_R;
//reg [31:0] R_i_var;
wire [1:48] expandedR;
reg [1:56] pre_key;
reg [1:48] new_key_tmp;
reg [3:0] inter_num;
wire [1:32] p;
reg [1:48] address_s;
reg [1:32] Soutput;
wire [1:32] Soutput_wire;
wire [1:48] new_key;
wire [1:56] out_key;
key_get key_get(、pre_key(pre_key), 、des_mode(des_mode), 、inter_num(inter_num), 、new_key(new_key), 、out_key(out_key));
s1 sbox1(、stage1_input(address_s[1:6]), 、stage1_output(Soutput_wire[1:4]));
s2 sbox2(、stage1_input(address_s[7:12]), 、stage1_output(Soutput_wire[5:8]));
s3 sbox3(、stage1_input(address_s[13:18]), 、stage1_output(Soutput_wire[9:12]));
s4 sbox4(、stage1_input(address_s[19:24]), 、stage1_output(Soutput_wire[13:16]));
s5 sbox5(、stage1_input(address_s[25:30]), 、stage1_output(Soutput_wire[17:20]));
s6 sbox6(、stage1_input(address_s[31:36]), 、stage1_output(Soutput_wire[21:24]));
s7 sbox7(、stage1_input(address_s[37:42]), 、stage1_output(Soutput_wire[25:28]));
s8 sbox8(、stage1_input(address_s[43:48]), 、stage1_output(Soutput_wire[29:32]));
always (posedge clk or negedge reset)
begin
if(reset == 1'b0)
begin
R_o <= 32'd0;
L_o <= 32'd0;
Key_o <= 56'd0;
end
else
begin
Key_o <= out_key;
if(inter_num == 4'b1111)
begin
R_o <= R_i;
L_o <= next_R;
end
else
begin
R_o <= next_R;
L_o <= R_i; end
end
end
assign expandedR =
ﻩ{R_i[32],R_i[1],R_i[2],R_i[3],R_i[4],R_i[5],
ﻩﻩ ﻩ R_i[4],R_i[5],R_i[6],R_i[7],R_i[8],R_i[9],
ﻩﻩR_i[8],R_i[9],R_i[10],R_i[11],R_i[12],R_i[13],
ﻩﻩﻩ R_i[12],R_i[13],R_i[14],R_i[15],R_i[16],R_i[17],
ﻩﻩ ﻩR_i[16],R_i[17],R_i[18],R_i[19],R_i[20],R_i[21],
ﻩﻩ ﻩ R_i[20],R_i[21],R_i[22],R_i[23],R_i[24],R_i[25],
ﻩ ﻩR_i[24],R_i[25],R_i[26],R_i[27],R_i[28],R_i[29],
ﻩR_i[28],R_i[29],R_i[30],R_i[31],R_i[32],R_i[1]};
assign p = {ﻩSoutput[16],Soutput[7],Soutput[20],Soutput[21],
ﻩ ﻩﻩﻩSoutput[29],Soutput[12],Soutput[28],Soutput[17],
ﻩﻩ ﻩ Soutput[1],Soutput[15],Soutput[23],Soutput[26],
ﻩ ﻩSoutput[5],Soutput[18],Soutput[31],Soutput[10],
ﻩ ﻩﻩ Soutput[2],Soutput[8],Soutput[24],Soutput[14],
ﻩ ﻩSoutput[32],Soutput[27],Soutput[3],Soutput[9],
ﻩﻩ ﻩSoutput[19],Soutput[13],Soutput[30],Soutput[6],
ﻩﻩSoutput[22],Soutput[11],Soutput[4],Soutput[25]};
always (*)
ﻩ begin
ﻩﻩpre_key = Key_i;
inter_num = inter_num_i;
ﻩ new_key_tmp = new_key;
ﻩﻩ address_s = new_key_tmp ^ expandedR;
ﻩﻩﻩSoutput = Soutput_wire;
ﻩ ﻩ//??????????
ﻩﻩnext_R = (L_i^p);
ﻩend
endmodule
5、迭代控制程序得设计与代码
module contrl(output [1:64] data_o_var_t,
output reg [3:0] inter_num_curr,
ﻩﻩ output reg [1:56] Key_i_var_out,
ﻩ ﻩ output reg [1:32] R_i, L_i,
ﻩ ﻩﻩ output reg ready_o,
ﻩ ﻩﻩ input [1:32] L_o,
ﻩ input [1:32] R_o,
ﻩ input [1:32] R_i_var, L_i_var,
ﻩﻩ input [1:56] Key_o,
ﻩﻩ input [1:28] C0, D0,
ﻩ ﻩ input clk, reset, des_enable);
reg [3:0] inter_num_next;
assign data_o_var_t = (ready_o == 1'b1)?{L_o,R_o}:64'hzzzzzzzzzzzzzzzz;
ﻩalways (posedge clk or negedge reset)
ﻩ ﻩif(reset == 1'b0)
ﻩ ﻩﻩbegin
ﻩ ﻩinter_num_next <= 4'd0;
ﻩ ﻩﻩinter_num_curr <= 4'd0;
ﻩﻩﻩ ﻩready_o <= 1'b0;
ﻩ end
ﻩ ﻩelse if(des_enable)
ﻩ begin
ﻩ ﻩﻩif(ready_o == 1'b0)
ﻩﻩﻩﻩﻩ inter_num_curr <= inter_num_next;
ﻩ end
always (posedge clk or negedge reset)
ﻩﻩbegin
ﻩ if(reset == 1'b0) ready_o <= 1'b0;
ﻩ else if(inter_num_curr == 4'd15) ready_o <= 1'b1;
ﻩﻩﻩelse ready_o <= 1'b0;
ﻩend
ﻩalways (*)
ﻩﻩbegin
case(inter_num_curr)
ﻩ 4'd0:begin
ﻩﻩﻩﻩ//ready_o = 1'b0;
ﻩﻩ R_i = R_i_var;
ﻩ L_i = L_i_var;
ﻩﻩ ﻩ Key_i_var_out = {C0, D0};
ﻩ ﻩﻩ inter_num_next = 4'd1;
ﻩ end
ﻩﻩﻩﻩ4'd1: begin
ﻩﻩﻩ//ready_o = 1'b0;
ﻩ ﻩ R_i = R_o;
ﻩ L_i = L_o;
ﻩKey_i_var_out = Key_o;
ﻩﻩ inter_num_next = 4'd2;
ﻩﻩ end
ﻩﻩﻩ 4'd2: begin
ﻩﻩ //ready_o = 1'b0;
ﻩ ﻩR_i = R_o;
ﻩ ﻩﻩ L_i = L_o;
ﻩ ﻩKey_i_var_out = Key_o;
ﻩ ﻩ inter_num_next = 4'd3;
ﻩﻩﻩﻩend
ﻩ 4'd3: begin
ﻩ ﻩﻩ//ready_o = 1'b0;
ﻩ ﻩﻩ R_i = R_o;
ﻩ ﻩﻩﻩ L_i = L_o;
ﻩﻩ Key_i_var_out = Key_o;
ﻩ ﻩ ﻩﻩinter_num_next = 4'd4;
ﻩﻩ ﻩ end
4'd4: begin
ﻩﻩ ﻩ //ready_o = 1'b0;
ﻩ ﻩﻩ R_i = R_o;
ﻩﻩﻩﻩL_i = L_o;
ﻩ ﻩ Key_i_var_out = Key_o;
ﻩ ﻩ inter_num_next = 4'd5;
ﻩﻩﻩﻩﻩend
ﻩﻩ ﻩ4'd5: begin
ﻩ ﻩ //ready_o = 1'b0;
ﻩﻩﻩﻩﻩ R_i = R_o;
ﻩﻩ ﻩL_i = L_o;
ﻩ Key_i_var_out = Key_o;
ﻩﻩ inter_num_next = 4'd6;
ﻩ end
ﻩ 4'd6: begin
ﻩ ﻩﻩ//ready_o = 1'b0;
ﻩ ﻩR_i = R_o;
ﻩ ﻩ L_i = L_o;
ﻩ ﻩ Key_i_var_out = Key_o;
ﻩﻩ ﻩ inter_num_next = 4'd7;
ﻩ end
ﻩﻩ ﻩ4'd7: begin
ﻩ //ready_o = 1'b0;
ﻩﻩ ﻩR_i = R_o;
ﻩ ﻩL_i = L_o;
ﻩ ﻩ ﻩ Key_i_var_out = Key_o;
ﻩ ﻩ inter_num_next = 4'd8;
ﻩ ﻩﻩ end
ﻩﻩﻩﻩ4'd8: begin
ﻩ ﻩﻩ//ready_o = 1'b0;
ﻩ ﻩ R_i = R_o;
ﻩ ﻩ ﻩL_i = L_o;
ﻩ ﻩﻩﻩKey_i_var_out = Key_o;
ﻩ ﻩﻩinter_num_next = 4'd9;
ﻩﻩﻩ ﻩ end
ﻩﻩ 4'd9: begin
ﻩ ﻩ//ready_o = 1'b0;
ﻩ R_i = R_o;
L_i = L_o;
ﻩ ﻩﻩ Key_i_var_out = Key_o;
ﻩﻩ ﻩﻩinter_num_next = 4'd10;
ﻩﻩﻩ end
ﻩﻩ ﻩ4'd10: begin
ﻩ ﻩ//ready_o = 1'b0;
ﻩ ﻩ ﻩR_i = R_o;
ﻩﻩﻩ ﻩﻩL_i = L_o;
ﻩﻩ ﻩﻩKey_i_var_out = Key_o;
ﻩ ﻩﻩinter_num_next = 4'd11;
ﻩ ﻩﻩend
ﻩ ﻩ4'd11: begin
ﻩ ﻩ//ready_o = 1'b0;
ﻩ ﻩ R_i = R_o;
ﻩﻩﻩﻩ L_i = L_o;
ﻩﻩ ﻩﻩﻩKey_i_var_out = Key_o;
ﻩﻩﻩinter_num_next = 4'd12;
ﻩﻩend
ﻩ 4'd12: begin
ﻩ ﻩ //ready_o = 1'b0;
ﻩﻩ ﻩ ﻩR_i = R_o;
ﻩﻩ ﻩ L_i = L_o;
ﻩ Key_i_var_out = Key_o;
ﻩﻩﻩﻩ inter_num_next = 4'd13;
ﻩﻩﻩﻩﻩend
ﻩ ﻩ4'd13: begin
ﻩ //ready_o = 1'b0;
ﻩ R_i = R_o;
ﻩﻩ ﻩ L_i = L_o;
ﻩ Key_i_var_out = Key_o;
ﻩ inter_num_next = 4'd14;
ﻩ ﻩﻩ ﻩend
ﻩ 4'd14: begin
ﻩ //ready_o = 1'b0;
ﻩﻩﻩﻩ ﻩR_i = R_o;
ﻩﻩ L_i = L_o;
ﻩﻩﻩﻩﻩKey_i_var_out = Key_o;
ﻩ ﻩﻩﻩinter_num_next = 4'd15;
ﻩﻩﻩﻩﻩﻩend
ﻩﻩﻩ 4'd15:if(ready_o == 1'b0)
ﻩﻩ ﻩbegin
ﻩﻩ ﻩ ﻩ R_i = R_o;
ﻩ L_i = L_o;
ﻩﻩﻩﻩ Key_i_var_out = Key_o;
ﻩ ﻩ//ready_o = 1'b1;
ﻩﻩ end
ﻩ endcase
ﻩ end
endmodule
6、S盒得设计与实现(S1)
module s1(stage1_input,stage1_output);
input [5:0] stage1_input;
output [3:0] stage1_output;
reg [3:0] stage1_output;
//BIT5 and BIT0 is ?
//BIT4~1 is ?
always ( stage1_input)
begin
case(stage1_input) //synopsys full_case parallel_case
0: stage1_output = 4'd14;
1: stage1_output = 4'd0;
2: stage1_output = 4'd4;
3: stage1_output = 4'd15;
4: stage1_output = 4'd13;
5: stage1_output = 4'd7;
6: stage1_output = 4'd1;
7: stage1_output = 4'd4;
8: stage1_output = 4'd2;
9: stage1_output = 4'd14;
10: stage1_output = 4'd15;
11: stage1_output = 4'd2;
12: stage1_output = 4'd11;
13: stage1_output = 4'd13;
14: stage1_output = 4'd8;
15: stage1_output = 4'd1;
16: stage1_output = 4'd3;
17: stage1_output = 4'd10;
18: stage1_output = 4'd10;
19: stage1_output = 4'd6;
20: stage1_output = 4'd6;
21: stage1_output = 4'd12;
22: stage1_output = 4'd12;
60: stage1_output = 4'd5;
61: stage1_output = 4'd
展开阅读全文