顶层模块(DES_top)
IP置换模块(IP)
//IP置换
module IP(IPin,IPout);
input [1:64] IPin;
output [1:64] IPout;
wire [1:64] IPout;
assign IPout = {IPin[58],IPin[50],IPin[42],IPin[34],IPin[26],IPin[18],IPin[10],IPin[2],
IPin[60],IPin[52],IPin[44],IPin[36],IPin[28],IPin[20],IPin[12],IPin[4],
IPin[62],IPin[54],IPin[46],IPin[38],IPin[30],IPin[22],IPin[14],IPin[6],
IPin[64],IPin[56],IPin[48],IPin[40],IPin[32],IPin[24],IPin[16],IPin[8],
IPin[57],IPin[49],IPin[41],IPin[33],IPin[25],IPin[17],IPin[9],IPin[1],
IPin[59],IPin[51],IPin[43],IPin[35],IPin[27],IPin[19],IPin[11],IPin[3],
IPin[61],IPin[53],IPin[45],IPin[37],IPin[29],IPin[21],IPin[13],IPin[5],
IPin[63],IPin[55],IPin[47],IPin[39],IPin[31],IPin[23],IPin[15],IPin[7]};
endmodule
IP置换模块测试代码
`timescale 1ns/10ps
module IP_tb;
reg [1:64] IPin;
wire [1:64] IPout;
IP IP(.IPin(IPin),.IPout(IPout));
initial begin
IPin<=64'b01100011_01011100_00111011_10110101_00010111_10000001_00111000_00100110;
end
endmodule
轮函数模块(desL)
//轮运算
module desL(inR,inL,KEY,outL,outR);
input [1:32] inL,inR;
input [1:48] KEY;
output [1:32] outL, outR;
wire [1:32] t;
wire [1:32] outL,outR;
desf desf(.fin(inR),.K(KEY),.fout(t));
assign outL = inR;
assign outR = inL^t;
endmodule
F函数模块(desf)
//F函数
module desf(fin,K,fout);
input [1:32] fin;
input [1:48] K;
output [1:32] fout;
wire [1:48] m,n;
E_box E_box(.in(fin),.out(m));
assign n=m^K;
wire [1:32] c;
S_box S_box (.in(n),.out(c));
P P (.in(c),.out(fout));
endmodule
E盒置换模块(E_box)
//扩展E盒
module E_box(in,out);
input [1:32] in;
output [1:48] out;
wire [1:48] out;
assign out ={in[32],in[1],in[2],in[3],in[4],in[5],
in[4],in[5],in[6],in[7],in[8],in[9],
in[8],in[9],in[10],in[11],in[12],in[13],
in[12],in[13],in[14],in[15],in[16],in[17],
in[16],in[17],in[18],in[19],in[20],in[21],
in[20],in[21],in[22],in[23],in[24],in[25],
in[24],in[25],in[26],in[27],in[28],in[29],
in[28],in[29],in[30],in[31],in[32],in[1]};
endmodule
S盒置换模块(S_box)
//S盒
module S_box (in,out);
input [1:48] in;
output [1:32] out;
S1 S1(in[1:6],out[1:4]);
S2 S2(in[7:12],out[5:8]);
S3 S3(in[13:18],out[9:12]);
S4 S4(in[19:24],out[13:16]);
S5 S5(in[25:30],out[17:20]);
S6 S6(in[31:36],out[21:24]);
S7 S7(in[37:42],out[25:28]);
S8 S8(in[43:48],out[29:32]);
endmodule
S1
module S1(in,out);
input [1:6] in;
output [1:4] out;
reg [1:4] out;
always @ (in[1:6])
begin
case(in[1:6])
6'b000000 : out[1:4] = 4'd14;
6'b000001 : out[1:4] = 4'd0;
6'b000010 : out[1:4] = 4'd4;
6'b000011 : out[1:4] = 4'd15;
6'b000100 : out[1:4] = 4'd13;
6'b000101 : out[1:4] = 4'd7;
6'b000110 : out[1:4] = 4'd1;
6'b000111 : out[1:4] = 4'd4;
6'b001000 : out[1:4] = 4'd2;
6'b001001 : out[1:4] = 4'd14;
6'b001010 : out[1:4] = 4'd15;
6'b001011 : out[1:4] = 4'd2;
6'b001100 : out[1:4] = 4'd11;
6'b001101 : out[1:4] = 4'd13;
6'b001110 : out[1:4] = 4'd8;
6'b001111 : out[1:4] = 4'd1;
6'b010000 : out[1:4] = 4'd3;
6'b010001 : out[1:4] = 4'd10;
6'b010010 : out[1:4] = 4'd10;
6'b010011 : out[1:4] = 4'd6;
6'b010100 : out[1:4] = 4'd6;
6'b010101 : out[1:4] = 4'd12;
6'b010110 : out[1:4] = 4'd12;
6'b010111 : out[1:4] = 4'd11;
6'b011000 : out[1:4] = 4'd5;
6'b011001 : out[1:4] = 4'd9;
6'b011010 : out[1:4] = 4'd9;
6'b011011 : out[1:4] = 4'd5;
6'b011100 : out[1:4] = 4'd0;
6'b011101 : out[1:4] = 4'd3;
6'b011110 : out[1:4] = 4'd7;
6'b011111 : out[1:4] = 4'd8;
6'b100000 : out[1:4] = 4'd4;
6'b100001 : out[1:4] = 4'd15;
6'b100010 : out[1:4] = 4'd1;
6'b100011 : out[1:4] = 4'd12;
6'b100100 : out[1:4] = 4'd14;
6'b100101 : out[1:4] = 4'd8;
6'b100110 : out[1:4] = 4'd8;
6'b100111 : out[1:4] = 4'd2;
6'b101000 : out[1:4] = 4'd13;
6'b101001 : out[1:4] = 4'd4;
6'b101010 : out[1:4] = 4'd6;
6'b101011 : out[1:4] = 4'd9;
6'b101100 : out[1:4] = 4'd2;
6'b101101 : out[1:4] = 4'd1;
6'b101110 : out[1:4] = 4'd11;
6'b101111 : out[1:4] = 4'd7;
6'b110000 : out[1:4] = 4'd15;
6'b110001 : out[1:4] = 4'd5;
6'b110010 : out[1:4] = 4'd12;
6'b110011 : out[1:4] = 4'd11;
6'b110100 : out[1:4] = 4'd9;
6'b110101 : out[1:4] = 4'd3;
6'b110110 : out[1:4] = 4'd7;
6'b110111 : out[1:4] = 4'd14;
6'b111000 : out[1:4] = 4'd3;
6'b111001 : out[1:4] = 4'd10;
6'b111010 : out[1:4] = 4'd10;
6'b111011 : out[1:4] = 4'd0;
6'b111100 : out[1:4] = 4'd5;
6'b111101 : out[1:4] = 4'd6;
6'b111110 : out[1:4] = 4'd0;
6'b111111 : out[1:4] = 4'd13;
endcase
end
endmodule
S2
module S1(in,out);
input [1:6] in;
output [1:4] out;
reg [1:4] out;
always @ (in[1:6])
begin
case(in[1:6])
6'b000000 : out[1:4] = 4'd14;
6'b000001 : out[1:4] = 4'd0;
6'b000010 : out[1:4] = 4'd4;
6'b000011 : out[1:4] = 4'd15;
6'b000100 : out[1:4] = 4'd13;
6'b000101 : out[1:4] = 4'd7;
6'b000110 : out[1:4] = 4'd1;
6'b000111 : out[1:4] = 4'd4;
6'b001000 : out[1:4] = 4'd2;
6'b001001 : out[1:4] = 4'd14;
6'b001010 : out[1:4] = 4'd15;
6'b001011 : out[1:4] = 4'd2;
6'b001100 : out[1:4] = 4'd11;
6'b001101 : out[1:4] = 4'd13;
6'b001110 : out[1:4] = 4'd8;
6'b001111 : out[1:4] = 4'd1;
6'b010000 : out[1:4] = 4'd3;
6'b010001 : out[1:4] = 4'd10;
6'b010010 : out[1:4] = 4'd10;
6'b010011 : out[1:4] = 4'd6;
6'b010100 : out[1:4] = 4'd6;
6'b010101 : out[1:4] = 4'd12;
6'b010110 : out[1:4] = 4'd12;
6'b010111 : out[1:4] = 4'd11;
6'b011000 : out[1:4] = 4'd5;
6'b011001 : out[1:4] = 4'd9;
6'b011010 : out[1:4] = 4'd9;
6'b011011 : out[1:4] = 4'd5;
6'b011100 : out[1:4] = 4'd0;
6'b011101 : out[1:4] = 4'd3;
6'b011110 : out[1:4] = 4'd7;
6'b011111 : out[1:4] = 4'd8;
6'b100000 : out[1:4] = 4'd4;
6'b100001 : out[1:4] = 4'd15;
6'b100010 : out[1:4] = 4'd1;
6'b100011 : out[1:4] = 4'd12;
6'b100100 : out[1:4] = 4'd14;
6'b100101 : out[1:4] = 4'd8;
6'b100110 : out[1:4] = 4'd8;
6'b100111 : out[1:4] = 4'd2;
6'b101000 : out[1:4] = 4'd13;
6'b101001 : out[1:4] = 4'd4;
6'b101010 : out[1:4] = 4'd6;
6'b101011 : out[1:4] = 4'd9;
6'b101100 : out[1:4] = 4'd2;
6'b101101 : out[1:4] = 4'd1;
6'b101110 : out[1:4] = 4'd11;
6'b101111 : out[1:4] = 4'd7;
6'b110000 : out[1:4] = 4'd15;
6'b110001 : out[1:4] = 4'd5;
6'b110010 : out[1:4] = 4'd12;
6'b110011 : out[1:4] = 4'd11;
6'b110100 : out[1:4] = 4'd9;
6'b110101 : out[1:4] = 4'd3;
6'b110110 : out[1:4] = 4'd7;
6'b110111 : out[1:4] = 4'd14;
6'b111000 : out[1:4] = 4'd3;
6'b111001 : out[1:4] = 4'd10;
6'b111010 : out[1:4] = 4'd10;
6'b111011 : out[1:4] = 4'd0;
6'b111100 : out[1:4] = 4'd5;
6'b111101 : out[1:4] = 4'd6;
6'b111110 : out[1:4] = 4'd0;
6'b111111 : out[1:4] = 4'd13;
endcase
end
endmodule
S3
module S3(in,out);
input [1:6] in;
output [1:4] out;
reg [1:4] out;
always @ (in[1:6])
begin
case(in[1:6])
6'b000000 : out[1:4] = 4'd10;
6'b000001 : out[1:4] = 4'd13;
6'b000010 : out[1:4] = 4'd0;
6'b000011 : out[1:4] = 4'd7;
6'b000100 : out[1:4] = 4'd9;
6'b000101 : out[1:4] = 4'd0;
6'b000110 : out[1:4] = 4'd14;
6'b000111 : out[1:4] = 4'd9;
6'b001000 : out[1:4] = 4'd6;
6'b001001 : out[1:4] = 4'd3;
6'b001010 : out[1:4] = 4'd3;
6'b001011 : out[1:4] = 4'd4;
6'b001100 : out[1:4] = 4'd15;
6'b001101 : out[1:4] = 4'd6;
6'b001110 : out[1:4] = 4'd5;
6'b001111 : out[1:4] = 4'd10;
6'b010000 : out[1:4] = 4'd1;
6'b010001 : out[1:4] = 4'd2;
6'b010010 : out[1:4] = 4'd13;
6'b010011 : out[1:4] = 4'd8;
6'b010100 : out[1:4] = 4'd12;
6'b010101 : out[1:4] = 4'd5;
6'b010110 : out[1:4] = 4'd7;
6'b010111 : out[1:4] = 4'd14;
6'b011000 : out[1:4] = 4'd11;
6'b011001 : out[1:4] = 4'd12;
6'b011010 : out[1:4] = 4'd4;
6'b011011 : out[1:4] = 4'd11;
6'b011100 : out[1:4] = 4'd2;
6'b011101 : out[1:4] = 4'd15;
6'b011110 : out[1:4] = 4'd8;
6'b011111 : out[1:4] = 4'd1;
6'b100000 : out[1:4] = 4'd13;
6'b100001 : out[1:4] = 4'd1;
6'b100010 : out[1:4] = 4'd6;
6'b100011 : out[1:4] = 4'd10;
6'b100100 : out[1:4] = 4'd4;
6'b100101 : out[1:4] = 4'd13;
6'b100110 : out[1:4] = 4'd9;
6'b100111 : out[1:4] = 4'd0;
6'b101000 : out[1:4] = 4'd8;
6'b101001 : out[1:4] = 4'd6;
6'b101010 : out[1:4] = 4'd15;
6'b101011 : out[1:4] = 4'd9;
6'b101100 : out[1:4] = 4'd3;
6'b101101 : out[1:4] = 4'd8;
6'b101110 : out[1:4] = 4'd0;
6'b101111 : out[1:4] = 4'd7;
6'b110000 : out[1:4] = 4'd11;
6'b110001 : out[1:4] = 4'd4;
6'b110010 : out[1:4] = 4'd1;
6'b110011 : out[1:4] = 4'd15;
6'b110100 : out[1:4] = 4'd2;
6'b110101 : out[1:4] = 4'd14;
6'b110110 : out[1:4] = 4'd12;
6'b110111 : out[1:4] = 4'd3;
6'b111000 : out[1:4] = 4'd5;
6'b111001 : out[1:4] = 4'd11;
6'b111010 : out[1:4] = 4'd10;
6'b111011 : out[1:4] = 4'd5;
6'b111100 : out[1:4] = 4'd14;
6'b111101 : out[1:4] = 4'd2;
6'b111110 : out[1:4] = 4'd7;
6'b111111 : out[1:4] = 4'd12;
endcase
end
endmodule
S4
module S4(in,out);
input [1:6] in;
output [1:4] out;
reg [1:4] out;
always @ (in[1:6])
begin
case(in[1:6])
6'b000000 : out[1:4] = 4'd7;
6'b000001 : out[1:4] = 4'd13;
6'b000010 : out[1:4] = 4'd13;
6'b000011 : out[1:4] = 4'd8;
6'b000100 : out[1:4] = 4'd14;
6'b000101 : out[1:4] = 4'd11;
6'b000110 : out[1:4] = 4'd3;
6'b000111 : out[1:4] = 4'd5;
6'b001000 : out[1:4] = 4'd0;
6'b001001 : out[1:4] = 4'd6;
6'b001010 : out[1:4] = 4'd6;
6'b001011 : out[1:4] = 4'd15;
6'b001100 : out[1:4] = 4'd9;
6'b001101 : out[1:4] = 4'd0;
6'b001110 : out[1:4] = 4'd10;
6'b001111 : out[1:4] = 4'd3;
6'b010000 : out[1:4] = 4'd1;
6'b010001 : out[1:4] = 4'd4;
6'b010010 : out[1:4] = 4'd2;
6'b010011 : out[1:4] = 4'd7;
6'b010100 : out[1:4] = 4'd8;
6'b010101 : out[1:4] = 4'd2;
6'b010110 : out[1:4] = 4'd5;
6'b010111 : out[1:4] = 4'd12;
6'b011000 : out[1:4] = 4'd11;
6'b011001 : out[1:4] = 4'd1;
6'b011010 : out[1:4] = 4'd12;
6'b011011 : out[1:4] = 4'd10;
6'b011100 : out[1:4] = 4'd4;
6'b011101 : out[1:4] = 4'd14;
6'b011110 : out[1:4] = 4'd15;
6'b011111 : out[1:4] = 4'd9;
6'b100000 : out[1:4] = 4'd10;
6'b100001 : out[1:4] = 4'd3;
6'b100010 : out[1:4] = 4'd6;
6'b100011 : out[1:4] = 4'd15;
6'b100100 : out[1:4] = 4'd9;
6'b100101 : out[1:4] = 4'd0;
6'b100110 : out[1:4] = 4'd0;
6'b100111 : out[1:4] = 4'd6;
6'b101000 : out[1:4] = 4'd12;
6'b101001 : out[1:4] = 4'd10;
6'b101010 : out[1:4] = 4'd11;
6'b101011 : out[1:4] = 4'd1;
6'b101100 : out[1:4] = 4'd7;
6'b101101 : out[1:4] = 4'd13;
6'b101110 : out[1:4] = 4'd13;
6'b101111 : out[1:4] = 4'd8;
6'b110000 : out[1:4] = 4'd15;
6'b110001 : out[1:4] = 4'd9;
6'b110010 : out[1:4] = 4'd1;
6'b110011 : out[1:4] = 4'd4;
6'b110100 : out[1:4] = 4'd3;
6'b110101 : out[1:4] = 4'd5;
6'b110110 : out[1:4] = 4'd14;
6'b110111 : out[1:4] = 4'd11;
6'b111000 : out[1:4] = 4'd5;
6'b111001 : out[1:4] = 4'd12;
6'b111010 : out[1:4] = 4'd2;
6'b111011 : out[1:4] = 4'd7;
6'b111100 : out[1:4] = 4'd8;
6'b111101 : out[1:4] = 4'd2;
6'b111110 : out[1:4] = 4'd4;
6'b111111 : out[1:4] = 4'd14;
endcase
end
endmodule
S5
module S5(in,out);
input [1:6] in;
output [1:4] out;
reg [1:4] out;
always @ (in[1:6])
begin
case(in[1:6])
6'b000000 : out[1:4] = 4'd2;
6'b000001 : out[1:4] = 4'd14;
6'b000010 : out[1:4] = 4'd12;
6'b000011 : out[1:4] = 4'd11;
6'b000100 : out[1:4] = 4'd4;
6'b000101 : out[1:4] = 4'd2;
6'b000110 : out[1:4] = 4'd1;
6'b000111 : out[1:4] = 4'd12;
6'b001000 : out[1:4] = 4'd7;
6'b001001 : out[1:4] = 4'd4;
6'b001010 : out[1:4] = 4'd10;
6'b001011 : out[1:4] = 4'd7;
6'b001100 : out[1:4] = 4'd11;
6'b001101 : out[1:4] = 4'd13;
6'b001110 : out[1:4] = 4'd6;
6'b001111 : out[1:4] = 4'd1;
6'b010000 : out[1:4] = 4'd8;
6'b010001 : out[1:4] = 4'd5;
6'b010010 : out[1:4] = 4'd5;
6'b010011 : out[1:4] = 4'd0;
6'b010100 : out[1:4] = 4'd3;
6'b010101 : out[1:4] = 4'd15;
6'b010110 : out[1:4] = 4'd15;
6'b010111 : out[1:4] = 4'd10;
6'b011000 : out[1:4] = 4'd13;
6'b011001 : out[1:4] = 4'd3;
6'b011010 : out[1:4] = 4'd0;
6'b011011 : out[1:4] = 4'd9;
6'b011100 : out[1:4] = 4'd14;
6'b011101 : out[1:4] = 4'd8;
6'b011110 : out[1:4] = 4'd9;
6'b011111 : out[1:4] = 4'd6;
6'b100000 : out[1:4] = 4'd4;
6'b100001 : out[1:4] = 4'd11;
6'b100010 : out[1:4] = 4'd2;
6'b100011 : out[1:4] = 4'd8;
6'b100100 : out[1:4] = 4'd1;
6'b100101 : out[1:4] = 4'd12;
6'b100110 : out[1:4] = 4'd11;
6'b100111 : out[1:4] = 4'd7;
6'b101000 : out[1:4] = 4'd10;
6'b101001 : out[1:4] = 4'd1;
6'b101010 : out[1:4] = 4'd13;
6'b101011 : out[1:4] = 4'd14;
6'b101100 : out[1:4] = 4'd7;
6'b101101 : out[1:4] = 4'd2;
6'b101110 : out[1:4] = 4'd8;
6'b101111 : out[1:4] = 4'd13;
6'b110000 : out[1:4] = 4'd15;
6'b110001 : out[1:4] = 4'd6;
6'b110010 : out[1:4] = 4'd9;
6'b110011 : out[1:4] = 4'd15;
6'b110100 : out[1:4] = 4'd12;
6'b110101 : out[1:4] = 4'd0;
6'b110110 : out[1:4] = 4'd5;
6'b110111 : out[1:4] = 4'd9;
6'b111000 : out[1:4] = 4'd6;
6'b111001 : out[1:4] = 4'd10;
6'b111010 : out[1:4] = 4'd3;
6'b111011 : out[1:4] = 4'd4;
6'b111100 : out[1:4] = 4'd0;
6'b111101 : out[1:4] = 4'd5;
6'b111110 : out[1:4] = 4'd14;
6'b111111 : out[1:4] = 4'd3;
endcase
end
endmodule
S6
module S6(in,out);
input [1:6] in;
output [1:4] out;
reg [1:4] out;
always @ (in[1:6])
begin
case(in[1:6])
6'b000000 : out[1:4] = 4'd12;
6'b000001 : out[1:4] = 4'd10;
6'b000010 : out[1:4] = 4'd1;
6'b000011 : out[1:4] = 4'd15;
6'b000100 : out[1:4] = 4'd10;
6'b000101 : out[1:4] = 4'd4;
6'b000110 : out[1:4] = 4'd15;
6'b000111 : out[1:4] = 4'd2;
6'b001000 : out[1:4] = 4'd9;
6'b001001 : out[1:4] = 4'd7;
6'b001010 : out[1:4] = 4'd2;
6'b001011 : out[1:4] = 4'd12;
6'b001100 : out[1:4] = 4'd6;
6'b001101 : out[1:4] = 4'd9;
6'b001110 : out[1:4] = 4'd8;
6'b001111 : out[1:4] = 4'd5;
6'b010000 : out[1:4] = 4'd0;
6'b010001 : out[1:4] = 4'd6;
6'b010010 : out[1:4] = 4'd13;
6'b010011 : out[1:4] = 4'd1;
6'b010100 : out[1:4] = 4'd3;
6'b010101 : out[1:4] = 4'd13;
6'b010110 : out[1:4] = 4'd4;
6'b010111 : out[1:4] = 4'd14;
6'b011000 : out[1:4] = 4'd14;
6'b011001 : out[1:4] = 4'd0;
6'b011010 : out[1:4] = 4'd7;
6'b011011 : out[1:4] = 4'd11;
6'b011100 : out[1:4] = 4'd5;
6'b011101 : out[1:4] = 4'd3;
6'b011110 : out[1:4] = 4'd11;
6'b011111 : out[1:4] = 4'd8;
6'b100000 : out[1:4] = 4'd9;
6'b100001 : out[1:4] = 4'd4;
6'b100010 : out[1:4] = 4'd14;
6'b100011 : out[1:4] = 4'd3;
6'b100100 : out[1:4] = 4'd15;
6'b100101 : out[1:4] = 4'd2;
6'b100110 : out[1:4] = 4'd5;
6'b100111 : out[1:4] = 4'd12;
6'b101000 : out[1:4] = 4'd2;
6'b101001 : out[1:4] = 4'd9;
6'b101010 : out[1:4] = 4'd8;
6'b101011 : out[1:4] = 4'd5;
6'b101100 : out[1:4] = 4'd12;
6'b101101 : out[1:4] = 4'd15;
6'b101110 : out[1:4] = 4'd3;
6'b101111 : out[1:4] = 4'd10;
6'b110000 : out[1:4] = 4'd7;
6'b110001 : out[1:4] = 4'd11;
6'b110010 : out[1:4] = 4'd0;
6'b110011 : out[1:4] = 4'd14;
6'b110100 : out[1:4] = 4'd4;
6'b110101 : out[1:4] = 4'd1;
6'b110110 : out[1:4] = 4'd10;
6'b110111 : out[1:4] = 4'd7;
6'b111000 : out[1:4] = 4'd1;
6'b111001 : out[1:4] = 4'd6;
6'b111010 : out[1:4] = 4'd13;
6'b111011 : out[1:4] = 4'd0;
6'b111100 : out[1:4] = 4'd11;
6'b111101 : out[1:4] = 4'd8;
6'b111110 : out[1:4] = 4'd6;
6'b111111 : out[1:4] = 4'd13;
endcase
end
endmodule
S7
module S7(in,out);
input [1:6] in;
output [1:4] out;
reg [1:4] out;
always @ (in[1:6])
begin
case(in[1:6])
6'b000000 : out[1:4] = 4'd4;
6'b000001 : out[1:4] = 4'd13;
6'b000010 : out[1:4] = 4'd11;
6'b000011 : out[1:4] = 4'd0;
6'b000100 : out[1:4] = 4'd2;
6'b000101 : out[1:4] = 4'd11;
6'b000110 : out[1:4] = 4'd14;
6'b000111 : out[1:4] = 4'd7;
6'b001000 : out[1:4] = 4'd15;
6'b001001 : out[1:4] = 4'd4;
6'b001010 : out[1:4] = 4'd0;
6'b001011 : out[1:4] = 4'd9;
6'b001100 : out[1:4] = 4'd8;
6'b001101 : out[1:4] = 4'd1;
6'b001110 : out[1:4] = 4'd13;
6'b001111 : out[1:4] = 4'd10;
6'b010000 : out[1:4] = 4'd3;
6'b010001 : out[1:4] = 4'd14;
6'b010010 : out[1:4] = 4'd12;
6'b010011 : out[1:4] = 4'd3;
6'b010100 : out[1:4] = 4'd9;
6'b010101 : out[1:4] = 4'd5;
6'b010110 : out[1:4] = 4'd7;
6'b010111 : out[1:4] = 4'd12;
6'b011000 : out[1:4] = 4'd5;
6'b011001 : out[1:4] = 4'd2;
6'b011010 : out[1:4] = 4'd10;
6'b011011 : out[1:4] = 4'd15;
6'b011100 : out[1:4] = 4'd6;
6'b011101 : out[1:4] = 4'd8;
6'b011110 : out[1:4] = 4'd1;
6'b011111 : out[1:4] = 4'd6;
6'b100000 : out[1:4] = 4'd1;
6'b100001 : out[1:4] = 4'd6;
6'b100010 : out[1:4] = 4'd4;
6'b100011 : out[1:4] = 4'd11;
6'b100100 : out[1:4] = 4'd11;
6'b100101 : out[1:4] = 4'd13;
6'b100110 : out[1:4] = 4'd13;
6'b100111 : out[1:4] = 4'd8;
6'b101000 : out[1:4] = 4'd12;
6'b101001 : out[1:4] = 4'd1;
6'b101010 : out[1:4] = 4'd3;
6'b101011 : out[1:4] = 4'd4;
6'b101100 : out[1:4] = 4'd7;
6'b101101 : out[1:4] = 4'd10;
6'b101110 : out[1:4] = 4'd14;
6'b101111 : out[1:4] = 4'd7;
6'b110000 : out[1:4] = 4'd10;
6'b110001 : out[1:4] = 4'd9;
6'b110010 : out[1:4] = 4'd15;
6'b110011 : out[1:4] = 4'd5;
6'b110100 : out[1:4] = 4'd6;
6'b110101 : out[1:4] = 4'd0;
6'b110110 : out[1:4] = 4'd8;
6'b110111 : out[1:4] = 4'd15;
6'b111000 : out[1:4] = 4'd0;
6'b111001 : out[1:4] = 4'd14;
6'b111010 : out[1:4] = 4'd5;
6'b111011 : out[1:4] = 4'd2;
6'b111100 : out[1:4] = 4'd9;
6'b111101 : out[1:4] = 4'd3;
6'b111110 : out[1:4] = 4'd2;
6'b111111 : out[1:4] = 4'd12;
endcase
end
endmodule
S8
module S8(in,out);
input [1:6] in;
output [1:4] out;
reg [1:4] out;
always @ (in[1:6])
begin
case(in[1:6])
6'b000000 : out[1:4] = 4'd13;
6'b000001 : out[1:4] = 4'd1;
6'b000010 : out[1:4] = 4'd2;
6'b000011 : out[1:4] = 4'd15;
6'b000100 : out[1:4] = 4'd8;
6'b000101 : out[1:4] = 4'd13;
6'b000110 : out[1:4] = 4'd4;
6'b000111 : out[1:4] = 4'd8;
6'b001000 : out[1:4] = 4'd6;
6'b001001 : out[1:4] = 4'd10;
6'b001010 : out[1:4] = 4'd15;
6'b001011 : out[1:4] = 4'd3;
6'b001100 : out[1:4] = 4'd11;
6'b001101 : out[1:4] = 4'd7;
6'b001110 : out[1:4] = 4'd1;
6'b001111 : out[1:4] = 4'd4;
6'b010000 : out[1:4] = 4'd10;
6'b010001 : out[1:4] = 4'd12;
6'b010010 : out[1:4] = 4'd9;
6'b010011 : out[1:4] = 4'd5;
6'b010100 : out[1:4] = 4'd3;
6'b010101 : out[1:4] = 4'd6;
6'b010110 : out[1:4] = 4'd14;
6'b010111 : out[1:4] = 4'd11;
6'b011000 : out[1:4] = 4'd5;
6'b011001 : out[1:4] = 4'd0;
6'b011010 : out[1:4] = 4'd0;
6'b011011 : out[1:4] = 4'd14;
6'b011100 : out[1:4] = 4'd12;
6'b011101 : out[1:4] = 4'd9;
6'b011110 : out[1:4] = 4'd7;
6'b011111 : out[1:4] = 4'd2;
6'b100000 : out[1:4] = 4'd7;
6'b100001 : out[1:4] = 4'd2;
6'b100010 : out[1:4] = 4'd11;
6'b100011 : out[1:4] = 4'd1;
6'b100100 : out[1:4] = 4'd4;
6'b100101 : out[1:4] = 4'd14;
6'b100110 : out[1:4] = 4'd1;
6'b100111 : out[1:4] = 4'd7;
6'b101000 : out[1:4] = 4'd9;
6'b101001 : out[1:4] = 4'd4;
6'b101010 : out[1:4] = 4'd12;
6'b101011 : out[1:4] = 4'd10;
6'b101100 : out[1:4] = 4'd14;
6'b101101 : out[1:4] = 4'd8;
6'b101110 : out[1:4] = 4'd2;
6'b101111 : out[1:4] = 4'd13;
6'b110000 : out[1:4] = 4'd0;
6'b110001 : out[1:4] = 4'd15;
6'b110010 : out[1:4] = 4'd6;
6'b110011 : out[1:4] = 4'd12;
6'b110100 : out[1:4] = 4'd10;
6'b110101 : out[1:4] = 4'd9;
6'b110110 : out[1:4] = 4'd13;
6'b110111 : out[1:4] = 4'd0;
6'b111000 : out[1:4] = 4'd15;
6'b111001 : out[1:4] = 4'd3;
6'b111010 : out[1:4] = 4'd3;
6'b111011 : out[1:4] = 4'd5;
6'b111100 : out[1:4] = 4'd5;
6'b111101 : out[1:4] = 4'd6;
6'b111110 : out[1:4] = 4'd8;
6'b111111 : out[1:4] = 4'd11;
endcase
end
endmodule
P盒置换模块(P)
//置换运算P
module P(in,out);
input[1:32]in;
output[1:32]out;
wire [1:32] out;
assign out={in[16],in[7],in[20],in[21],
in[29],in[12],in[28],in[17],
in[1],in[15],in[23],in[26],
in[5],in[18],in[31],in[10],
in[2],in[8],in[24],in[14],
in[32],in[27],in[3],in[9],
in[19],in[13],in[30],in[6],
in[22],in[11],in[4],in[25]};
endmodule
IP逆置换模块(IP_1)
//IP逆置换
module IP_1(IP_1in,IP_1out);
input [1:64] IP_1in;
output [1:64] IP_1out;
wire [1:64] IP_1out;
assign IP_1out = {IP_1in[40],IP_1in[8],IP_1in[48],IP_1in[16],IP_1in[56],IP_1in[24],IP_1in[64],IP_1in[32],
IP_1in[39],IP_1in[7],IP_1in[47],IP_1in[15],IP_1in[55],IP_1in[23],IP_1in[63],IP_1in[31],
IP_1in[38],IP_1in[6],IP_1in[46],IP_1in[14],IP_1in[54],IP_1in[22],IP_1in[62],IP_1in[30],
IP_1in[37],IP_1in[5],IP_1in[45],IP_1in[13],IP_1in[53],IP_1in[21],IP_1in[61],IP_1in[29],
IP_1in[36],IP_1in[4],IP_1in[44],IP_1in[12],IP_1in[52],IP_1in[20],IP_1in[60],IP_1in[28],
IP_1in[35],IP_1in[3],IP_1in[43],IP_1in[11],IP_1in[51],IP_1in[19],IP_1in[59],IP_1in[27],
IP_1in[34],IP_1in[2],IP_1in[42],IP_1in[10],IP_1in[50],IP_1in[18],IP_1in[58],IP_1in[26],
IP_1in[33],IP_1in[1],IP_1in[41],IP_1in[9],IP_1in[49],IP_1in[17],IP_1in[57],IP_1in[25]};
endmodule
密钥生成模块(key_top)
module key_top(key_in,key1,key2,key3,key4,key5,key6,key7,key8,key9,key10,key11,key12,key13,key14,key15,key16);
input [1:64] key_in;
output [1:48] key1,key2,key3,key4,key5,key6,key7,key8,key9,key10,key11,key12,key13,key14,key15,key16 ;
wire [1:56] i;
wire [1:28] k1_c,k1_d,k2_c,k2_d,k3_c,k3_d,k4_c,k4_d,k5_c,k5_d,k6_c,k6_d,k7_c,k7_d,k8_c,k8_d,k9_c,k9_d,k10_c,k10_d,k11_c,k11_d,k12_c,k12_d,k13_c,k13_d,k14_c,k14_d,k15_c,k15_d,k16_c,k16_d;
key key(.in(key_in),.C0(i[1:28]),.D0(i[29:56]));
left_shiftera left_shiftera1 (.in(i[1:28]),.outM(k1_c)),
left_shiftera2 (.in(i[29:56]),.outM(k1_d)),
left_shiftera3 (.in(k1_c),.outM(k2_c)),
left_shiftera4 (.in(k1_d),.outM(k2_d)),
left_shiftera5 (.in(k8_c),.outM(k9_c)),
left_shiftera6 (.in(k8_d),.outM(k9_d)),
left_shiftera7 (.in(k15_c),.outM(k16_c)),
left_shiftera8 (.in(k15_d),.outM(k16_d));
left_shifterb left_shifterb1(.in(k2_c),.outN(k3_c)),
left_shifterb2(.in(k2_d),.outN(k3_d)),
left_shifterb3(.in(k3_c),.outN(k4_c)),
left_shifterb4(.in(k3_d),.outN(k4_d)),
left_shifterb5(.in(k4_c),.outN(k5_c)),
left_shifterb6(.in(k4_d),.outN(k5_d)),
left_shifterb7(.in(k5_c),.outN(k6_c)),
left_shifterb8(.in(k5_d),.outN(k6_d)),
left_shifterb9(.in(k6_c),.outN(k7_c)),
left_shifterb10(.in(k6_d),.outN(k7_d)),
left_shifterb11(.in(k7_c),.outN(k8_c)),
left_shifterb12(.in(k7_d),.outN(k8_d)),
left_shifterb13(.in(k9_c),.outN(k10_c)),
left_shifterb14(.in(k9_d),.outN(k10_d)),
left_shifterb15(.in(k10_c),.outN(k11_c)),
left_shifterb16(.in(k10_d),.outN(k11_d)),
left_shifterb17(.in(k11_c),.outN(k12_c)),
left_shifterb18(.in(k11_d),.outN(k12_d)),
left_shifterb19(.in(k12_c),.outN(k13_c)),
left_shifterb20(.in(k12_d),.outN(k13_d)),
left_shifterb21(.in(k13_c),.outN(k14_c)),
left_shifterb22(.in(k13_d),.outN(k14_d)),
left_shifterb23(.in(k14_c),.outN(k15_c)),
left_shifterb24(.in(k14_d),.outN(k15_d));
keys keys1(.C(k1_c),.D(k1_d),.out(key1)),
keys2(.C(k2_c),.D(k2_d),.out(key2)),
keys3(.C(k3_c),.D(k3_d),.out(key3)),
keys4(.C(k4_c),.D(k4_d),.out(key4)),
keys5(.C(k5_c),.D(k5_d),.out(key5)),
keys6(.C(k6_c),.D(k6_d),.out(key6)),
keys7(.C(k7_c),.D(k7_d),.out(key7)),
keys8(.C(k8_c),.D(k8_d),.out(key8)),
key1s9(.C(k9_c),.D(k9_d),.out(key9)),
keys10(.C(k10_c),.D(k10_d),.out(key10)),
keys11(.C(k11_c),.D(k11_d),.out(key11)),
keys12(.C(k12_c),.D(k12_d),.out(key12)),
keys13(.C(k13_c),.D(k13_d),.out(key13)),
keys14(.C(k14_c),.D(k14_d),.out(key14)),
keys15(.C(k15_c),.D(k15_d),.out(key15)),
keys16(.C(k16_c),.D(k16_d),.out(key16));
endmodule
PC_1
//置换选择1,以及将密钥分为两个部分
module key (in,C0,D0);
input [1:64] in;
output [1:28] C0,D0;
wire [1:28] C0,D0;
assign C0={in[57],in[49],in[41],in[33],in[25],in[17],in[9],
in[1],in[58],in[50],in[42],in[34],in[26],in[18],
in[10],in[2],in[59],in[51],in[43],in[35],in[27],
in[19],in[11],in[3],in[60],in[52],in[44],in[36]};
assign D0={in[63],in[55],in[47],in[39],in[31],in[33],in[15],
in[7],in[62],in[54],in[46],in[38],in[30],in[22],
in[14],in[6],in[61],in[53],in[45],in[37],in[29],
in[21],in[13],in[5],in[28],in[20],in[12],in[4]};
endmodule
移位操作
//移位寄存器(左移一位)
module left_shiftera(in,outM);
input [1:28] in;
output [1:28] outM;
wire [1:28] outM;
assign outM={in[2:28],in[1]};
endmodule
在这里插入代码片//移位操作(左移两位)
module left_shifterb(in,outN);
input [1:28] in;
output [1:28] outN;
wire [1:28] outN;
assign outN={in[3:28],in[1:2]};
endmodule
PC_2
//置换选择2,PC_2
module keys(C,D,out);
input [1:28] C,D;
output [1:48] out;
wire [1:56] in;
assign in = {C,D};
assign out = {in[14],in[17],in[11],in[24],in[1],in[5],
in[3],in[28],in[15],in[6],in[21],in[10],
in[23],in[19],in[12],in[4],in[26],in[8],
in[16],in[7],in[27],in[20],in[13],in[2],
in[41],in[52],in[31],in[37],in[47],in[55],
in[30],in[40],in[51],in[45],in[33],in[48],
in[44],in[49],in[39],in[56],in[34],in[53],
in[46],in[42],in[50],in[36],in[29],in[32]};
endmodule
本文是对https://blog.csdn.net/a4qqlht/article/details/4837906文章中的代码进行了一些修改,如果有修改不当的地方,请各位大佬批评指正。