OpenCores
URL https://opencores.org/ocsvn/sc2v/sc2v/trunk

Subversion Repositories sc2v

[/] [sc2v/] [tags/] [arelease/] [examples/] [md5.v] - Rev 36

Compare with Previous | Blame | View Log

module md5(clk,reset,load_i,ready_o,newtext_i,data_i,data_o);
input clk;
input reset;
input load_i;
output ready_o;
input newtext_i;
input [127:0] data_i;
output [127:0] data_o;
 
reg ready_o;
reg [127:0] data_o;
 
reg [31:0] ar;
reg [31:0] br;
reg [31:0] cr;
reg [31:0] dr;
reg [31:0] next_ar;
reg [31:0] next_br;
reg [31:0] next_cr;
reg [31:0] next_dr;
reg [31:0] A;
reg [31:0] B;
reg [31:0] C;
reg [31:0] D;
reg [31:0] next_A;
reg [31:0] next_B;
reg [31:0] next_C;
reg [31:0] next_D;
reg next_ready_o;
reg [127:0] next_data_o;
reg [511:0] message;
reg [511:0] next_message;
reg generate_hash;
reg hash_generated;
reg next_generate_hash;
reg [2:0] getdata_state;
reg [2:0] next_getdata_state;
reg [1:0] round;
reg [1:0] next_round;
reg [5:0] round64;
reg [5:0] next_round64;
reg [43:0] t;
reg [31:0] func_out;
 
 
//reg_signal:
always @(posedge clk or negedge reset)
 
   begin
 
   if (!reset )
 
      begin
 
      ready_o  = (0);
      data_o  = (0);
      message  = (0);
 
      ar  = ('h67452301);
      br  = ('hEFCDAB89 );
      cr  = ('h98BADCFE );
      dr  = ('h10325476);
 
      getdata_state  = (0);
      generate_hash  = (0);
 
      round  = (0);
      round64  = (0);
 
      A  = ('h67452301);
      B  = ('hEFCDAB89 );
      C  = ('h98BADCFE );
      D  = ('h10325476);
 
 
      end
 
   else 
 
      begin
 
      ready_o  = (next_ready_o );
      data_o  = (next_data_o );
      message  = (next_message );
 
      ar  = (next_ar );
      br  = (next_br );
      cr  = (next_cr );
      dr  = (next_dr );
 
      A  = (next_A );
      B  = (next_B );
      C  = (next_C );
      D  = (next_D );
 
      generate_hash  = (next_generate_hash );
      getdata_state  = (next_getdata_state );
 
      round  = (next_round );
      round64  = (next_round64 );
 
 
      end
 
 
 
   end
//md5_getdata:
reg[127:0] data_o_varmd5_getdata;
reg[511:0] auxmd5_getdata;
reg[31:0] A_tmd5_getdata,B_tmd5_getdata,C_tmd5_getdata,D_tmd5_getdata;
always @(  newtext_i or   data_i or   load_i or   getdata_state or   hash_generated or   message or   func_out or   A or   B or   C or   D or   ar or   br or   cr or   dr or   generate_hash)
 
   begin
 
 
 
 
 
 
 
   next_A  = (A );
   next_B  = (B );
   next_C  = (C );
   next_D  = (D );
 
   next_generate_hash  = (0);
   next_ready_o  = (0);
   next_data_o  = (0);
 
   auxmd5_getdata =message ;
   next_message  = (message );
   next_getdata_state  = (getdata_state );
 
   if (newtext_i )
 
      begin
 
      next_A  = ('h67452301);
      next_B  = ('hEFCDAB89 );
      next_C  = ('h98BADCFE );
      next_D  = ('h10325476);
      next_getdata_state  = (0);
 
      end
 
 
 
   case(   getdata_state )
 
 
      0 :
      begin
      if (load_i )
 
         begin
 
         auxmd5_getdata [511:384]=data_i ;
         next_message  = (auxmd5_getdata );
         next_getdata_state  = (1);
 
         end
 
      end
      1 :
      begin
      if (load_i )
 
         begin
 
         auxmd5_getdata [383:256]=data_i ;
         next_message  = (auxmd5_getdata );
         next_getdata_state  = (2);
 
         end
 
      end
      2 :
      begin
      if (load_i )
 
         begin
 
         auxmd5_getdata [255:128]=data_i ;
         next_message  = (auxmd5_getdata );
         next_getdata_state  = (3);
 
         end
 
      end
      3 :
      begin
      if (load_i )
 
         begin
 
         auxmd5_getdata [127:0]=data_i ;
         next_message  = (auxmd5_getdata );
         next_getdata_state  = (4);
         next_generate_hash  = (1);
 
         end
 
      end
      4 :
      begin
      next_generate_hash  = (1);
 
      A_tmd5_getdata =dr +A ;
      B_tmd5_getdata =func_out +B ;
      C_tmd5_getdata =br +C ;
      D_tmd5_getdata =cr +D ;
 
      data_o_varmd5_getdata [127:96]=A_tmd5_getdata ;
      data_o_varmd5_getdata [95:64]=B_tmd5_getdata ;
      data_o_varmd5_getdata [63:32]=C_tmd5_getdata ;
      data_o_varmd5_getdata [31:0]=D_tmd5_getdata ;
      next_data_o  = (data_o_varmd5_getdata );
 
 
      if (hash_generated )
 
         begin
 
         next_A  = (A_tmd5_getdata );
         next_B  = (B_tmd5_getdata );
         next_C  = (C_tmd5_getdata );
         next_D  = (D_tmd5_getdata );
         next_getdata_state  = (0);
         next_ready_o  = (1);
         next_generate_hash  = (0);
 
         end
 
      end
 
      endcase
 
 
 
   end
//round64FSM:
always @(  newtext_i or   round or   round64 or   ar or   br or   cr or   dr or   generate_hash or   func_out or   getdata_state or   A or   B or   C or   D)
 
   begin
 
 
   next_ar  = (ar );
   next_br  = (br );
   next_cr  = (cr );
   next_dr  = (dr );
   next_round64  = (round64 );
   next_round  = (round );
   hash_generated  = (0);
 
   if (generate_hash !=0)
 
      begin
 
      next_ar  = (dr );
      next_br  = (func_out );
      next_cr  = (br );
      next_dr  = (cr );
 
      end
 
 
 
   case(   round64 )
 
 
      0 :
      begin
      next_round  = (0);
      if (generate_hash )
 
         begin
 
         next_round64  = (1);
 
         end
 
      end
      15      , 31      , 47 :
      begin
      next_round  = (round +1);
      next_round64  = (round64 +1);
      end
      63 :
      begin
      next_round  = (0);
      next_round64  = (0);
      hash_generated  = (1);
      end
      default:
      begin
 
      next_round64  = (round64 +1);
      end
 
      endcase
 
 
   if (newtext_i )
 
      begin
 
      next_ar  = ('h67452301);
      next_br  = ('hEFCDAB89 );
      next_cr  = ('h98BADCFE );
      next_dr  = ('h10325476);
      next_round  = (0);
      next_round64  = (0);
 
      end
 
 
   if (getdata_state ==0)
 
      begin
 
      next_ar  = (A );
      next_br  = (B );
      next_cr  = (C );
      next_dr  = (D );
 
      end
 
 
   end
//md5_rom:
always @(  round64)
 
   begin
 
 
   case(   round64 )
 
      0 :
      begin
      t  = ('hD76AA478070 );
      end
      1 :
      begin
      t  = ('hE8C7B7560C1 );
      end
      2 :
      begin
      t  = ('h242070DB112 );
      end
      3 :
      begin
      t  = ('hC1BDCEEE163 );
      end
      4 :
      begin
      t  = ('hF57C0FAF074 );
      end
      5 :
      begin
      t  = ('h4787C62A0C5 );
      end
      6 :
      begin
      t  = ('hA8304613116 );
      end
      7 :
      begin
      t  = ('hFD469501167 );
      end
      8 :
      begin
      t  = ('h698098D8078 );
      end
      9 :
      begin
      t  = ('h8B44F7AF0C9 );
      end
      10 :
      begin
      t  = ('hFFFF5BB111A );
      end
      11 :
      begin
      t  = ('h895CD7BE16B );
      end
      12 :
      begin
      t  = ('h6B90112207C );
      end
      13 :
      begin
      t  = ('hFD9871930CD );
      end
      14 :
      begin
      t  = ('hA679438E11E );
      end
      15 :
      begin
      t  = ('h49B4082116F );
      end
 
      16 :
      begin
      t  = ('hf61e2562051 );
      end
      17 :
      begin
      t  = ('hc040b340096 );
      end
      18 :
      begin
      t  = ('h265e5a510EB );
      end
      19 :
      begin
      t  = ('he9b6c7aa140 );
      end
      20 :
      begin
      t  = ('hd62f105d055 );
      end
      21 :
      begin
      t  = ('h244145309A );
      end
      22 :
      begin
      t  = ('hd8a1e6810EF );
      end
      23 :
      begin
      t  = ('he7d3fbc8144 );
      end
      24 :
      begin
      t  = ('h21e1cde6059 );
      end
      25 :
      begin
      t  = ('hc33707d609E );
      end
      26 :
      begin
      t  = ('hf4d50d870E3 );
      end
      27 :
      begin
      t  = ('h455a14ed148 );
      end
      28 :
      begin
      t  = ('ha9e3e90505D );
      end
      29 :
      begin
      t  = ('hfcefa3f8092 );
      end
      30 :
      begin
      t  = ('h676f02d90E7 );
      end
      31 :
      begin
      t  = ('h8d2a4c8a14C );
      end
 
      32 :
      begin
      t  = ('hfffa3942045 );
      end
      33 :
      begin
      t  = ('h8771f6810B8 );
      end
      34 :
      begin
      t  = ('h6d9d612210B );
      end
      35 :
      begin
      t  = ('hfde5380c17E );
      end
      36 :
      begin
      t  = ('ha4beea44041 );
      end
      37 :
      begin
      t  = ('h4bdecfa90B4 );
      end
      38 :
      begin
      t  = ('hf6bb4b60107 );
      end
      39 :
      begin
      t  = ('hbebfbc7017A );
      end
      40 :
      begin
      t  = ('h289b7ec604D );
      end
      41 :
      begin
      t  = ('heaa127fa0B0 );
      end
      42 :
      begin
      t  = ('hd4ef3085103 );
      end
      43 :
      begin
      t  = ('h4881d05176 );
      end
      44 :
      begin
      t  = ('hd9d4d039049 );
      end
      45 :
      begin
      t  = ('he6db99e50BC );
      end
      46 :
      begin
      t  = ('h1fa27cf810F );
      end
      47 :
      begin
      t  = ('hc4ac5665172 );
      end
 
      48 :
      begin
      t  = ('hf4292244060 );
      end
      49 :
      begin
      t  = ('h432aff970A7 );
      end
      50 :
      begin
      t  = ('hab9423a70FE );
      end
      51 :
      begin
      t  = ('hfc93a039155 );
      end
      52 :
      begin
      t  = ('h655b59c306C );
      end
      53 :
      begin
      t  = ('h8f0ccc920A3 );
      end
      54 :
      begin
      t  = ('hffeff47d0FA );
      end
      55 :
      begin
      t  = ('h85845dd1151 );
      end
      56 :
      begin
      t  = ('h6fa87e4f068 );
      end
      57 :
      begin
      t  = ('hfe2ce6e00AF );
      end
      58 :
      begin
      t  = ('ha30143140F6 );
      end
      59 :
      begin
      t  = ('h4e0811a115D );
      end
      60 :
      begin
      t  = ('hf7537e82064 );
      end
      61 :
      begin
      t  = ('hbd3af2350AB );
      end
      62 :
      begin
      t  = ('h2ad7d2bb0F2 );
      end
      63 :
      begin
      t  = ('heb86d391159 );
      end
 
 
      endcase
 
 
   end
//funcs:
reg[31:0] auxfuncs,fr_varfuncs,tr_varfuncs,rotate1funcs,rotate2funcs;
reg[7:0] s_varfuncs;
reg[3:0] nblockfuncs;
reg[31:0] message_varfuncs[15:0];
always @(  t or   ar or   br or   cr or   dr or   round or   message or   func_out)
 
   begin
 
 
 
 
 
 
   message_varfuncs [0]=message [511:480];
   message_varfuncs [1]=message [479:448];
   message_varfuncs [2]=message [447:416];
   message_varfuncs [3]=message [415:384];
   message_varfuncs [4]=message [383:352];
   message_varfuncs [5]=message [351:320];
   message_varfuncs [6]=message [319:288];
   message_varfuncs [7]=message [287:256];
   message_varfuncs [8]=message [255:224];
   message_varfuncs [9]=message [223:192];
   message_varfuncs [10]=message [191:160];
   message_varfuncs [11]=message [159:128];
   message_varfuncs [12]=message [127:96];
   message_varfuncs [13]=message [95:64];
   message_varfuncs [14]=message [63:32];
   message_varfuncs [15]=message [31:0];
 
   fr_varfuncs =0;
 
 
   case(   round )
 
      0 :
      begin
      fr_varfuncs =((br &cr )|(~br &dr ));
      end
      1 :
      begin
      fr_varfuncs =((br &dr )|(cr &(~dr )));
      end
      2 :
      begin
      fr_varfuncs =(br ^cr ^dr );
      end
      3 :
      begin
      fr_varfuncs =(cr ^(br |~dr ));
      end
      default:
      begin
 
      end
 
      endcase
 
 
   tr_varfuncs =t [43:12];
   s_varfuncs =t [11:4];
   nblockfuncs =t [3:0];
 
   auxfuncs =(ar +fr_varfuncs +message_varfuncs [nblockfuncs ]+tr_varfuncs );
 
//   cout <<round64 <<<<fr_varfuncs <<<<auxfuncs <<<<nblockfuncs <<<<message_varfuncs [nblockfuncs ]<<endl ;
 
   rotate1funcs =auxfuncs <<s_varfuncs ;
   rotate2funcs =auxfuncs >>(32-s_varfuncs );
   func_out  = (br +(rotate1funcs |rotate2funcs ));
 
 
   end
 
endmodule
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.