1、 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)分组后得
2、明文组与56位得密钥按位替代或交换得方法形成密文组得加密方法。 其入口参数有三个:key、data、mode。key为加密解密使用得密钥,data为加密解密得数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中得56位,这样才具有高得安全性。DES算法把64位得明文输入块变为64位得密文输出块,它所使用得密钥也就是64位,整个算法得主流程图如下: (二)、VerilogHDL实现原理 拟采用模块化设计思想,根据DES算法得流程分模块设计实现各模块,自顶
3、向下最终实现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; wi
4、re [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),
5、 、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),
6、 、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),
7、 、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),
8、 、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[
9、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],i
10、n[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] ou
11、t); 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
12、],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, i
13、nput 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'd
14、1, 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] = p
15、re_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
16、_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:
17、 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;
18、 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_
19、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],
20、 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],
21、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],pr
22、e_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, inp
23、ut [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
24、 [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(、st
25、age1_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_wir
26、e[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
27、[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
28、 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
29、[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],
30、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],So
31、utput[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
32、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_
33、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
34、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
35、 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
36、 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
37、ﻩﻩﻩﻩ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;
38、ﻩ ﻩ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
39、 ﻩﻩ ﻩ //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
40、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 ﻩ /
41、/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_
42、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_
43、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;
44、 ﻩﻩﻩ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
45、 ﻩ 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;
46、ﻩ ﻩﻩﻩ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盒得设计与实
47、现(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_ou
48、tput = 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'
49、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'd
50、3; 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






