⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 des3_inv_cipher.v

📁 3des加密算法实现
💻 V
字号:
//////////////////////////////////////////////////////////////////////////                                                                    //  Abstract: Basing on opencore of the des,I construct 3des.                                                    
//            3eds mode is DES-DED mode.//
//  Module  : des3_inv_cipher                                //                                                                    //  Version : ver 01.00                                  //                                                                    //  Modification History:                                            //  Date By         Change Description                         //  ----------------------------------------------------------------- //  2008/08/06  jackie                                            
//  YYYY/MM/DD  author     Revision content                           
//                                                                    ////////////////////////////////////////////////////////////////////////
`timescale 1ns/1ns
module des3_inv_cipher(invdataout,invdone,datain,key1,key2,key3,inven,des3,rst,clk);
output  [63:0]  invdataout;
output          invdone;
input  [63:0]   datain;
input  [55:0]   key1;
input  [55:0]   key2;
input  [55:0]   key3;
input           inven;
input           des3;
input           rst;
input           clk;

parameter delay = 1'b1;

reg [3:0] cnt_1;
reg [3:0] cnt_2;
reg [3:0] cnt_3;
reg load_1;
reg load_2;
reg load_3;
reg en_delay;
reg done_1;
reg done_2;
reg done_3;
reg [63:0] des2_in;
reg [63:0] des3_in;
reg [63:0] des3_data_out;

wire [63:0] des3_out;
wire [63:0] des1_out;
wire [63:0] des2_out;
wire start;
wire [55:0] key_1;

always @(posedge clk)
  if (rst)
     en_delay <= #delay 1'b0;
  else 
     en_delay <= #delay inven;

assign start = inven&&(!en_delay); 

//E      
always @(posedge clk)
  if (rst)
     load_1 <= #delay 1'b0;      
  else if(start)
     load_1 <= #delay 1'b1;
  else if (done_1)
     load_1 <= #delay 1'b0;     
     
always @(posedge clk)
  if (rst)
     cnt_1 <= #delay 4'b0;  
  else if(load_1)
     cnt_1 <= #delay cnt_1+1;
  else
     cnt_1 <= #delay 4'b0;

always @(posedge clk)
   if (rst)
     done_1 <= #delay 1'b0;
   else if(cnt_1==14)
     done_1 <= #delay 1'b1;
   else 
     done_1 <= #delay 1'b0;

//D
always @(posedge clk)
  if (rst)
     load_2 <= #delay 1'b0;      
  else if(done_1&&des3)
     load_2 <= #delay 1'b1;
  else if (done_2)
     load_2 <= #delay 1'b0;  

always @(posedge clk)
  if (rst)
     cnt_2 <= #delay 4'b0;  
  else if(load_2)
     cnt_2 <= #delay cnt_2+1;
  else
     cnt_2 <= #delay 4'b0;

always @(posedge clk)
   if (rst)
     done_2 <= #delay 1'b0;
   else if(cnt_2==14)
     done_2 <= #delay 1'b1;
   else 
     done_2 <= #delay 1'b0;

//E
always @(posedge clk)
  if (rst)
     load_3 <= #delay 1'b0;      
  else if(done_2)
     load_3 <= #delay 1'b1;
  else if(done_3)
     load_3 <= #delay 1'b0;  

always @(posedge clk)
  if (rst)
     cnt_3 <= #delay 4'b0;  
  else if(load_3)
     cnt_3 <= #delay cnt_3+1;
  else
     cnt_3 <= #delay 4'b0;

always @(posedge clk)
   if (rst)
     done_3 <= #delay 1'b0;
   else if(cnt_3==14)
     done_3 <= #delay 1'b1;
   else 
     done_3 <= #delay 1'b0;

//data output
always @(posedge clk)
  if(rst)
      des2_in <= #delay 64'b0;
  else if(done_1) 
      des2_in <= #delay des1_out;

always @(posedge clk)
  if(rst)
      des3_in <= #delay 64'b0;
  else if(done_2) 
      des3_in <= #delay des2_out;
      
always @(posedge clk)
  if(rst)
      des3_data_out <= #delay 64'b0;
  else if(done_3) 
      des3_data_out <= #delay des3_out;      
            

//DECODE mode
des_inv_cipher inv_cipher_dut1(.desOut(des1_out), .desIn(datain), .key(key_1), .roundSel(cnt_1), .rst(rst), .clk(clk));
des_cipher cipher_dut2(.desOut(des2_out), .desIn(des2_in), .key(key2), .roundSel(cnt_2), .rst(rst), .clk(clk));
des_inv_cipher inv_cipher_dut3(.desOut(des3_out), .desIn(des3_in), .key(key1), .roundSel(cnt_3), .rst(rst), .clk(clk));

//MUX 3des or des
assign invdataout = des3 ? des3_data_out : des2_in ;
assign invdone  = des3 ? done_3:done_1;
assign key_1= des3 ? key3:key1;

endmodule 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -