Advertisement
Guest User

Untitled

a guest
Oct 27th, 2018
107
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. /*
  95.         This first chunk of code updates the "read pointer" position of the data being read. It shouldn't be causing the problem.
  96. */
  97.  
  98.         if(reset)
  99.             begin
  100.                 in_word_cnt[0] = 9'd27;
  101.                 in_word_cnt[1] = 9'd27;
  102.                 in_word_cnt[2] = 9'd27;
  103.                 in_word_cnt[3] = 9'd27;
  104.                 in_word_cnt[4] = 9'd27;
  105.                 in_word_cnt[5] = 9'd27;
  106.                
  107.                 in_word_addr[0] <= 9'd0;
  108.                 in_word_addr[1] <= 9'd0;
  109.                 in_word_addr[2] <= 9'd0;
  110.                 in_word_addr[3] <= 9'd0;
  111.                 in_word_addr[4] <= 9'd0;
  112.                 in_word_addr[5] <= 9'd0;
  113.                
  114.                  curr_pass <= 511'b0;
  115.                 done = 1'b0;
  116.             end
  117.         else
  118.             begin
  119.             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])
  120.                 begin
  121.                     //done
  122.                    
  123.                    
  124.                     done = 1'b1;
  125.                 end  
  126.             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])
  127.                 begin
  128.                     in_word_addr[0] <= in_word_addr[0] + 1;
  129.                     in_word_addr[1] <= 0;
  130.                     in_word_addr[2] <= 0;
  131.                     in_word_addr[3] <= 0;
  132.                     in_word_addr[4] <= 0;
  133.                     in_word_addr[5] <= 0;
  134.                 end
  135.             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])
  136.                 begin
  137.                     in_word_addr[1] <= in_word_addr[1] + 1;
  138.                     in_word_addr[2] <= 0;
  139.                     in_word_addr[3] <= 0;
  140.                     in_word_addr[4] <= 0;
  141.                     in_word_addr[5] <= 0;
  142.                 end
  143.             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])
  144.                 begin
  145.                     in_word_addr[2] <= in_word_addr[2] + 1;
  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])
  151.                 begin
  152.                     in_word_addr[3] <= in_word_addr[3] + 1;
  153.                     in_word_addr[4] <= 0;
  154.                     in_word_addr[5] <= 0;
  155.                 end
  156.             else if(in_word_cnt[5] == in_word_addr[5])
  157.                 begin
  158.                     in_word_addr[4] <= in_word_addr[4] + 1;
  159.                     in_word_addr[5] <= 0;
  160.                 end
  161.             else
  162.                 begin
  163.                     in_word_addr[5] <= in_word_addr[5] + 1;
  164.                 end
  165.             end
  166.    
  167. /*
  168.         This calculates the byte offset for everyone of the 6 input words (the first offset will be zero, the second offset will be the same as the length of the first word and so on)
  169. */        
  170.    
  171.         cnt_to[0] = 8'd0;
  172.         cnt_to[1] = in_word[0][7:0];
  173.         cnt_to[2] = in_word[0][7:0] + in_word[1][7:0];
  174.         cnt_to[3] = in_word[0][7:0] + in_word[1][7:0] + in_word[2][7:0];
  175.         cnt_to[4] = in_word[0][7:0] + in_word[1][7:0] + in_word[2][7:0] + in_word[3][7:0];
  176.         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];
  177.         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];
  178. /*
  179.         This uses the above offsets to shift the input word as needed to a temporary in_shift register
  180. */
  181.  
  182.         in_shift[0] = in_word[0][`MMWB-8:8];      
  183.         in_shift[1][(cnt_to[1] * 8) +: `MMWB-8] = in_word[1][`MMWB-1:8];  
  184.         in_shift[2][(cnt_to[2] * 8) +: `MMWB-8] = in_word[2][`MMWB-1:8];
  185.         in_shift[3][(cnt_to[3] * 8) +: `MMWB-8] = in_word[3][`MMWB-1:8];
  186.         in_shift[4][(cnt_to[4] * 8) +: `MMWB-8] = in_word[4][`MMWB-1:8];
  187.         in_shift[5][(cnt_to[5] * 8) +: `MMWB-8] = in_word[5][`MMWB-1:8];
  188.                
  189. /*
  190.         The output will be a logic and of all of the temporary in_shifts
  191. */
  192.         curr_pass = (in_shift[0] | in_shift[1] | in_shift[2] | in_shift[3] | in_shift[4] | in_shift[5]) ;
  193.        
  194.     end
  195. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement