Advertisement
Guest User

Untitled

a guest
Oct 27th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 10/01/2018 06:01:15 PM
  7. // Design Name:
  8. // Module Name: main
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21.  
  22. //Memory Matrix Width and Memory Matrix Depth - Aka max chars per word and max words per line
  23. `define MMW 16
  24. `define MMD 2048
  25. `define MMWB (`MMW*8)
  26. //`define MMDB (`MMD*8)  
  27.  
  28.  
  29. module keygen(
  30.     input clock_keygen,
  31.     output reg [9:0] out_word_addr[5:0],
  32.     (* mark_debug = "true" *) /*(* dont_touch = "true" *)*/ output reg [511:0] curr_pass,
  33.     input reg ram_we[5:0],
  34.     input wire [9:0] in_word_addr_w[5:0],
  35.     input wire [511:0] in_word_w[5:0],
  36.     input reset,
  37.     output reg done
  38.     );
  39.    
  40.     reg [9:0] out_word_addr_r1[5:0];
  41.     reg [9:0] out_word_addr_r2[5:0];
  42.     reg [9:0] out_word_addr_r3[5:0];
  43.    
  44.     wire [9:0] in_word_addr_reg[5:0];
  45.     reg [9:0] in_word_addr[5:0];
  46.    
  47.     reg [9:0] in_word_cnt[5:0];
  48.     wire [`MMWB-1:0] in_word[5:0];
  49.     (* mark_debug = "true" *) reg [511:0] in_shift[5:0];
  50.     reg [7:0] cnt_to[6:0];
  51.    
  52.     initial done = 1'b0;
  53.    
  54.    
  55.     reg [255:0]pt =  256'h5be0cd191f83d9ab9b05688c510e527fa54ff53a3c6ef372bb67ae856a09e667;
  56.    
  57.     wire [`MMWB-1:0]ram_d[5:0];
  58.     genvar k;
  59.        
  60.     generate
  61.         for(k = 0; k < 6; k = k + 1) begin: BLKMEM
  62.        
  63.          
  64.           blk_mem_gen_0 block_mem_gen_0_local
  65.           (
  66.               .clka(clock_keygen),
  67.               .wea(ram_we[k]),
  68.               .addra(in_word_addr_reg[k]),
  69.               .dina(in_word_w[k]),
  70.               .douta(in_word[k])
  71.             );
  72.            
  73.            
  74.         end
  75.     endgenerate
  76.    
  77.    
  78.    
  79.     initial in_shift[0] = 0;
  80.     initial in_shift[1] = 0;
  81.     initial in_shift[2] = 0;
  82.     initial in_shift[3] = 0;
  83.     initial in_shift[4] = 0;
  84.     initial in_shift[5] = 0;    
  85.    
  86.    
  87.     assign in_word_addr_reg = reset ? in_word_addr_w : in_word_addr;
  88.    
  89.     reg [511:0] jt;
  90.    
  91.     always @ (posedge clock_keygen)
  92.     begin
  93.    
  94.         if(reset)
  95.             begin
  96.                 /*in_word_cnt[0] = 9'd1;
  97.                 in_word_cnt[1] = 9'd5;
  98.                 in_word_cnt[2] = 9'd4;
  99.                 in_word_cnt[3] = 9'd4;
  100.                 in_word_cnt[4] = 9'd4;
  101.                 in_word_cnt[5] = 9'd4;
  102.                 */
  103.                
  104.                 in_word_cnt[0] = 9'd27;
  105.                 in_word_cnt[1] = 9'd27;
  106.                 in_word_cnt[2] = 9'd27;
  107.                 in_word_cnt[3] = 9'd27;
  108.                 in_word_cnt[4] = 9'd27;
  109.                 in_word_cnt[5] = 9'd27;
  110.                
  111.                 in_word_addr[0] <= 9'd0;
  112.                 in_word_addr[1] <= 9'd0;
  113.                 in_word_addr[2] <= 9'd0;
  114.                 in_word_addr[3] <= 9'd0;
  115.                 in_word_addr[4] <= 9'd0;
  116.                 in_word_addr[5] <= 9'd0;
  117.                
  118.                  curr_pass <= 511'b0;
  119.                 /*
  120.                
  121.                 */
  122.                 done = 1'b0;
  123.             end
  124.         else
  125.             begin
  126.             if (in_word_cnt[5] == in_word_addr[5] && in_word_cnt[4] == in_word_addr[4] && in_word_cnt[3] == in_word_addr[3] && in_word_cnt[2] == in_word_addr[2] && in_word_cnt[1] == in_word_addr[1] && in_word_cnt[0] == in_word_addr[0])
  127.                 begin
  128.                     //done
  129.                    
  130.                     /*
  131.                     in_word_addr[0] <= 0;
  132.                     in_word_addr[1] <= 0;
  133.                     in_word_addr[2] <= 0;
  134.                     in_word_addr[3] <= 0;
  135.                     in_word_addr[4] <= 0;
  136.                     in_word_addr[5] <= 0;
  137.                     */
  138.                    
  139.                     done = 1'b1;
  140.                 end  
  141.             else if(in_word_cnt[5] == in_word_addr[5] && in_word_cnt[4] == in_word_addr[4] && in_word_cnt[3] == in_word_addr[3] && in_word_cnt[2] == in_word_addr[2] && in_word_cnt[1] == in_word_addr[1])
  142.                 begin
  143.                     in_word_addr[0] <= in_word_addr[0] + 1;
  144.                     in_word_addr[1] <= 0;
  145.                     in_word_addr[2] <= 0;
  146.                     in_word_addr[3] <= 0;
  147.                     in_word_addr[4] <= 0;
  148.                     in_word_addr[5] <= 0;
  149.                 end
  150.             else if(in_word_cnt[5] == in_word_addr[5] && in_word_cnt[4] == in_word_addr[4] && in_word_cnt[3] == in_word_addr[3] && in_word_cnt[2] == in_word_addr[2])
  151.                 begin
  152.                     in_word_addr[1] <= in_word_addr[1] + 1;
  153.                     in_word_addr[2] <= 0;
  154.                     in_word_addr[3] <= 0;
  155.                     in_word_addr[4] <= 0;
  156.                     in_word_addr[5] <= 0;
  157.                 end
  158.             else if(in_word_cnt[5] == in_word_addr[5] && in_word_cnt[4] == in_word_addr[4] && in_word_cnt[3] == in_word_addr[3])
  159.                 begin
  160.                     in_word_addr[2] <= in_word_addr[2] + 1;
  161.                     in_word_addr[3] <= 0;
  162.                     in_word_addr[4] <= 0;
  163.                     in_word_addr[5] <= 0;
  164.                 end
  165.             else if(in_word_cnt[5] == in_word_addr[5] && in_word_cnt[4] == in_word_addr[4])
  166.                 begin
  167.                     in_word_addr[3] <= in_word_addr[3] + 1;
  168.                     in_word_addr[4] <= 0;
  169.                     in_word_addr[5] <= 0;
  170.                 end
  171.             else if(in_word_cnt[5] == in_word_addr[5])
  172.                 begin
  173.                     in_word_addr[4] <= in_word_addr[4] + 1;
  174.                     in_word_addr[5] <= 0;
  175.                 end
  176.             else
  177.                 begin
  178.                     in_word_addr[5] <= in_word_addr[5] + 1;
  179.                 end
  180.             end
  181.    
  182.        
  183.    
  184.         cnt_to[0] = 8'd0;
  185.         cnt_to[1] = in_word[0][7:0];
  186.         cnt_to[2] = in_word[0][7:0] + in_word[1][7:0];
  187.         cnt_to[3] = in_word[0][7:0] + in_word[1][7:0] + in_word[2][7:0];
  188.         cnt_to[4] = in_word[0][7:0] + in_word[1][7:0] + in_word[2][7:0] + in_word[3][7:0];
  189.         cnt_to[5] = in_word[0][7:0] + in_word[1][7:0] + in_word[2][7:0] + in_word[3][7:0] + in_word[4][7:0];
  190.         cnt_to[6] = in_word[0][7:0] + in_word[1][7:0] + in_word[2][7:0] + in_word[3][7:0] + in_word[4][7:0] + in_word[5][7:0];
  191.  
  192.  
  193.         in_shift[0] = in_word[0][`MMWB-8:8];      
  194.         in_shift[1][(cnt_to[1] * 8) +: `MMWB-8] = in_word[1][`MMWB-1:8];  
  195.         in_shift[2][(cnt_to[2] * 8) +: `MMWB-8] = in_word[2][`MMWB-1:8];
  196.         in_shift[3][(cnt_to[3] * 8) +: `MMWB-8] = in_word[3][`MMWB-1:8];
  197.         in_shift[4][(cnt_to[4] * 8) +: `MMWB-8] = in_word[4][`MMWB-1:8];
  198.         in_shift[5][(cnt_to[5] * 8) +: `MMWB-8] = in_word[5][`MMWB-1:8];
  199.                
  200.         out_word_addr_r2 <= in_word_addr;
  201.         out_word_addr_r1 <= out_word_addr_r2;
  202.         out_word_addr <= out_word_addr_r1;
  203.        
  204.         curr_pass = (in_shift[0] | in_shift[1] | in_shift[2] | in_shift[3] | in_shift[4] | in_shift[5]) ;
  205.        
  206.     end
  207. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement