module des(
input clk ,
input rstn ,
input des_mode ,
input encrypt_en ,
input decrypt_en ,
input [ 3:0] fifo_length ,
output encrypt_done ,
input [31:0] key1_hi ,
input [31:0] key1_lo ,
input [31:0] key2_hi ,
input [31:0] key2_lo ,
input [31:0] key3_hi ,
input [31:0] key3_lo ,
input [31:0] mfifo_dout ,
output mfifo_rd_en ,
output cfifo_wr_en ,
output [31:0] cfifo_din );
wire [64:1] tmp1, tmp2, tmp3;
wire [64:1] ciphertext_des1, ciphertext_des2, ciphertext_des3;
wire [48:1] k1 , k2 , k3 , k4 , k5 , k6 , k7 , k8 , k9 , k10, k11, k12, k13, k14, k15, k16;
wire [48:1] k17, k18, k19, k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k30, k31, k32;
wire [48:1] k33, k34, k35, k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47, k48;
wire [32:1] L0 , R0 ;
wire [32:1] L1 , L2 , L3 , L4 , L5 , L6 , L7 , L8 , L9 , L10, L11, L12, L13, L14, L15, L16;
wire [32:1] L17, L18, L19, L20, L21, L22, L23, L24, L25, L26, L27, L28, L29, L30, L31, L32;
wire [32:1] L33, L34, L35, L36, L37, L38, L39, L40, L41, L42, L43, L44, L45, L46, L47, L48;
wire [32:1] R1 , R2 , R3 , R4 , R5 , R6 , R7 , R8 , R9 , R10, R11, R12, R13, R14, R15, R16;
wire [32:1] R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R31, R32;
wire [32:1] R33, R34, R35, R36, R37, R38, R39, R40, R41, R42, R43, R44, R45, R46, R47, R48;
reg decrypt; // 1:加密 0 :加密
always @(posedge clk or negedge rstn)
begin
if (!rstn)
decrypt <= 1'b1 ;
else if(encrypt_en)
decrypt <= 1'b1 ;
else if(decrypt_en)
decrypt <= 1'b0 ;
else
decrypt <= 1'b1 ;
end
//**************获得密钥***********************************************//
reg [63:0] key1 ;
reg [63:0] key2 ;
reg [63:0] key3 ;
always @(posedge clk or negedge rstn)
begin
if (!rstn)
begin
key1 <= 64'h0 ;
key2 <= 64'h0 ;
key3 <= 64'h0 ;
end
else
begin
if (des_mode)//3des
begin
if (encrypt_en)//加密
begin
key1 <= {key1_hi,key1_lo} ;
key2 <= {key2_hi,key2_lo} ;
key3 <= {key3_hi,key3_lo} ;
end
else if (decrypt_en)
begin
key3 <= {key1_hi,key1_lo} ;
key2 <= {key2_hi,key2_lo} ;
key1 <= {key3_hi,key3_lo} ;
end
else
begin
key1 <= 64'h0 ;
key2 <= 64'h0 ;
key3 <= 64'h0 ;
end
end
else//des
key1 <= {key1_hi,key1_lo} ;
end
end
//**************定义整个过程中的计数器***********************************//
reg [7:0] des_cnt ;
always @ (posedge clk or negedge rstn)
begin
if (!rstn)
des_cnt <= 8'h00 ;
else if (encrypt_en || decrypt_en)
des_cnt <= des_cnt + 1'b1 ;
else des_cnt <= 8'd0;
end
//**************获得读mfifo的控制信号***********************************//
assign mfifo_rd_en = (des_cnt > 8'd0 && des_cnt < (fifo_length + 1) ) ? 1'b1 : 1'b0 ;
//**************从mfifo获得明文数据*************************************//
wire [64:1] plaintext ;
reg [63:0] plaintext_shift ;
always @(posedge clk or negedge rstn)
begin
if (!rstn)
plaintext_shift <= 64'h0 ;
else if (des_cnt > 8'd1 && des_cnt < (fifo_length + 2))
plaintext_shift <= {mfifo_dout,plaintext_shift[63:32]} ;
end
//**************获得明文移位寄存器被取出的控制信号**********************//
reg fre_rd_en ;
always @ (posedge clk or negedge rstn)
begin
if (!rstn)
fre_rd_en <= 1'b0 ;
else if (des_cnt > 8'd2 && des_cnt < (fifo_length + 3))
fre_rd_en <= ~fre_rd_en ;
else fre_rd_en <= 1'b0 ;
end
//**************获得明文***********************************************//
assign plaintext = fre_rd_en ? plaintext_shift : plaintext ;
//**************密文控制***********************************************//
assign cfifo_wr_en = des_mode ? (des_cnt > 8'd53 && des_cnt < fifo_length + 54 ) :(des_cnt > 8'd21 && des_cnt < fifo_length + 22 );
reg [63:0] ciphertext_shift ;
reg m_flag ,m_flag_shift ;
always @(posedge clk or negedge rstn)
begin
if (!rstn)
m_flag <= 1'b0 ;
else
begin
if (des_mode)
begin
if (des_cnt > 8'd51 && des_cnt < fifo_length + 52 )
m_flag <= ~ m_flag ;
else
m_flag <= 1'b0 ;
end
else
begin
if (des_cnt > 8'd19 && des_cnt < fifo_length + 20 )
m_flag <= ~m_flag ;
else
m_flag <= 1'b0 ;
end
end
end
always @(posedge clk or negedge rstn)
begin
if (!rstn)
m_flag_shift <= 1'b0 ;
else m_flag_shift <= m_flag ;
end
always @(posedge clk or negedge rstn)
begin
if (!rstn)
ciphertext_shift <= 64'h0 ;
else
begin
if (m_flag)
begin
if (des_mode)
ciphertext_shift <= ciphertext_des3 ;
else
ciphertext_shift <= ciphertext_des1 ;
end
else if (m_flag_shift)
ciphertext_shift <= {32'h0, ciphertext_shift[63:32]};
end
end
assign cfifo_din = ciphertext_shift[31:0] ;
//**************获得encrypt完成信号*************************//
assign encrypt_done = des_mode ? (des_cnt == fifo_length + 54 ) :(des_cnt == fifo_length + 22 );
//******************************************************//
//**************生成48个48位子密钥**********************//
//******************************************************//
SubkeyConverter sc1(clk, key1, decrypt, k1 , k2 , k3 , k4 , k5 , k6 , k7 , k8 , k9 , k10, k11, k12, k13, k14, k15, k16);
SubkeyConverter sc2(clk, key2, !decrypt, k17, k18, k19, k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k30, k31, k32);
SubkeyConverter sc3(clk, key3, decrypt, k33, k34, k35, k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47, k48);
//******************************************************//
//************************DES1**************************//
//******************************************************//
//DES1初级置换
assign {L0[32:1], R0[32:1]} = {
plaintext[7], plaintext[15], plaintext[23], plaintext[31], plaintext[39], plaintext[47], plaintext[55], plaintext[63],
plaintext[5], plaintext[13], plaintext[21], plaintext[29], plaintext[37], plaintext[45], plaintext[53], plaintext[61],
plaintext[3], plaintext[11], plaintext[19], plaintext[27], plaintext[35], plaintext[43], plaintext[51], plaintext[59],
plaintext[1], plaintext[9] , plaintext[17], plaintext[25], plaintext[33], plaintext[41], plaintext[49], plaintext[57],
plaintext[8], plaintext[16], plaintext[24], plaintext[32], plaintext[40], plaintext[48], plaintext[56], plaintext[64],
plaintext[6], plaintext[14], plaintext[22], plaintext[30], plaintext[38], plaintext[46], plaintext[54], plaintext[62],
plaintext[4], plaintext[12], plaintext[20], plaintext[28], plaintext[36], plaintext[44], plaintext[52], plaintext[60],
plaintext[2], plaintext[10], plaintext[18], plaintext[26], plaintext[34], plaintext[42], plaintext[50], plaintext[58]
};
//DES1的16环流水运算
round r1(clk, R0 , k1 , L0 , L1 , R1 );
round r2(clk, R1 , k2 , L1 , L2 , R2 );
round r3(clk, R2 , k3 , L2 , L3 , R3 );
round r4(clk, R3 , k4 , L3 , L4 , R4 );
round r5(clk, R4 , k5 , L4 , L5 , R5 );
round r6(clk, R5 , k6 , L5 , L6 , R6 );
round r7(clk, R6 , k7 , L6 , L7 , R7 );
round r8(clk, R7 , k8 , L7 , L8 , R8 );
round r9(clk, R8 , k9 , L8 , L9 , R9 );
round r10(clk,