Advertisement
Guest User

AES.sv

a guest
Apr 5th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /************************************************************************
  2. AES Decryption Core Logic
  3.  
  4. Dong Kai Wang, Fall 2017
  5.  
  6. For use with ECE 385 Experiment 9
  7. University of Illinois ECE Department
  8. ************************************************************************/
  9.  
  10. module AES (
  11.     input    logic CLK,
  12.     input  logic RESET,
  13.     input  logic AES_START,
  14.     output logic AES_DONE,
  15.     input  logic [127:0] AES_KEY,
  16.     input  logic [127:0] AES_MSG_ENC,
  17.     output logic [127:0] AES_MSG_DEC
  18. );
  19.  
  20.    
  21.  
  22.     // Internal logic variables
  23.     logic latch_prevent;
  24.     logic [1407:0] KeySchedule;
  25.     logic [127:0] mux_output; // input for temp_state
  26.     logic [127:0] temp_state_out; // output from temp_state reggyboi
  27.     logic [127:0] shiftyboi_out; // output from shiftyboi, goes into mux
  28.     logic [127:0] subbyboi_out; // output from subbyboi, goes into mux - this is formed from concatenating all the parts
  29.     logic [127:0] roundyboi_out; // output from roundyboi, goes into mux
  30.     logic [127:0] mixyboi_out; // output from mixyboi, goes into mux - this is formed from concatenating all the parts after 4 states.
  31.     logic [127:0] curr_roundkey; //input for roundyboi's key param
  32.    
  33.     logic [7:0] subbyboi_1_out, subbyboi_2_out, subbyboi_3_out, subbyboi_4_out, subbyboi_5_out, subbyboi_6_out, subbyboi_7_out,
  34.                     subbyboi_8_out, subbyboi_9_out, subbyboi_10_out, subbyboi_11_out, subbyboi_12_out, subbyboi_13_out, subbyboi_14_out,
  35.                     subbyboi_15_out, subbyboi_16_out;
  36.    
  37.     // InvMixColumn stuff
  38.     logic [31:0]    InvMC_reg, // Gets assigned to the relevant bits from state based on current state
  39.                         InvMC_out_1, InvMC_out_2, InvMC_out_3, InvMC_out_4, // Gets the current state's mixyboi_piece, these will all be
  40.                                                                                              // concatenated afterwards.
  41.                         mixyboi_piece;
  42.    
  43.     // Select signals for the function select mux or load enables for the InvMixColumns registers, all assigned in the state machine.
  44.     logic Enc_msg_sel, InvARK_sel, InvSR_sel, InvSB_sel, InvMC_sel, InvMC_out_1_en, InvMC_out_2_en, InvMC_out_3_en, InvMC_out_4_en;
  45.      
  46.     // Counter declaration
  47.     logic [4:0] Counter;
  48.     logic [4:0] Next_counter;
  49.    
  50.     // * ALL MODULE DECLARATIONS OF THINGS LIKE FUNCTION CALLS ARE AT THE BOTTOM OF THIS MODULE *
  51.    
  52.     // Assign state register to output. This will make the output wrong till the algorithm completes obviously
  53.     assign AES_MSG_DEC = temp_state_out;
  54.    
  55.     enum logic [6:0] {  
  56.                                 // Waiting for start signal
  57.                                 Wait,
  58.                                
  59.                                 // Start signal has been pressed
  60.                                 KeyExp_1,
  61.                                 KeyExp_2,
  62.                                 KeyExp_3,
  63.                                 KeyExp_4,
  64.                                 KeyExp_5,
  65.                                 KeyExp_6,
  66.                                 KeyExp_7, // this oughta be enough lolol
  67.                                
  68.                                 // pre-loop add round key
  69.                                 InvARK_0,
  70.                                
  71.                                 // 9 times loop
  72.                                 InvSR_1,
  73.                                 InvSB_1_1,
  74.                                 InvSB_1_2,
  75.                                 InvARK_1,
  76.                                 InvMC_1_1,
  77.                                 InvMC_1_2,
  78.                                 InvMC_1_3,
  79.                                 InvMC_1_4,
  80.                                 InvMC_1_5,
  81.                                
  82.                                 InvSR_2,
  83.                                 InvSB_2_1,
  84.                                 InvSB_2_2,
  85.                                 InvARK_2,
  86.                                 InvMC_2_1,
  87.                                 InvMC_2_2,
  88.                                 InvMC_2_3,
  89.                                 InvMC_2_4,
  90.                                 InvMC_2_5,
  91.                                
  92.                                 InvSR_3,
  93.                                 InvSB_3_1,
  94.                                 InvSB_3_2,
  95.                                 InvARK_3,
  96.                                 InvMC_3_1,
  97.                                 InvMC_3_2,
  98.                                 InvMC_3_3,
  99.                                 InvMC_3_4,
  100.                                 InvMC_3_5,
  101.                                
  102.                                 InvSR_4,
  103.                                 InvSB_4_1,
  104.                                 InvSB_4_2,
  105.                                 InvARK_4,
  106.                                 InvMC_4_1,
  107.                                 InvMC_4_2,
  108.                                 InvMC_4_3,
  109.                                 InvMC_4_4,
  110.                                 InvMC_4_5,
  111.                                
  112.                                 InvSR_5,
  113.                                 InvSB_5_1,
  114.                                 InvSB_5_2,
  115.                                 InvARK_5,
  116.                                 InvMC_5_1,
  117.                                 InvMC_5_2,
  118.                                 InvMC_5_3,
  119.                                 InvMC_5_4,
  120.                                 InvMC_5_5,
  121.                                
  122.                                 InvSR_6,
  123.                                 InvSB_6_1,
  124.                                 InvSB_6_2,
  125.                                 InvARK_6,
  126.                                 InvMC_6_1,
  127.                                 InvMC_6_2,
  128.                                 InvMC_6_3,
  129.                                 InvMC_6_4,
  130.                                 InvMC_6_5,
  131.                                
  132.                                 InvSR_7,
  133.                                 InvSB_7_1,
  134.                                 InvSB_7_2,
  135.                                 InvARK_7,
  136.                                 InvMC_7_1,
  137.                                 InvMC_7_2,
  138.                                 InvMC_7_3,
  139.                                 InvMC_7_4,
  140.                                 InvMC_7_5,
  141.                                
  142.                                 InvSR_8,
  143.                                 InvSB_8_1,
  144.                                 InvSB_8_2,
  145.                                 InvARK_8,
  146.                                 InvMC_8_1,
  147.                                 InvMC_8_2,
  148.                                 InvMC_8_3,
  149.                                 InvMC_8_4,
  150.                                 InvMC_8_5,
  151.                                
  152.                                 InvSR_9,
  153.                                 InvSB_9_1,
  154.                                 InvSB_9_2,
  155.                                 InvARK_9,
  156.                                 InvMC_9_1,
  157.                                 InvMC_9_2,
  158.                                 InvMC_9_3,
  159.                                 InvMC_9_4,
  160.                                 InvMC_9_5,
  161.                                
  162.                                 // post-loop final steps
  163.                                 InvSR_Fin,
  164.                                 InvSB_Fin_1,
  165.                                 InvSB_Fin_2,
  166.                                 InvARK_Fin,
  167.                                
  168.                                 // Final states
  169.                                 Done_1,
  170.                                 Done_2
  171.                           }   State, Next_state;   // Internal state logic
  172.    
  173.     always_ff @ (posedge CLK)
  174.     begin
  175.         if (RESET)
  176.             begin
  177.                 State <= Wait;
  178.                 Counter <= 5'b0;
  179.             end
  180.         else
  181.             begin
  182.                 State <= Next_state;
  183.                 Counter <= Next_counter;
  184.                
  185.             end
  186.     end
  187.    
  188.     always_comb
  189.     begin
  190.         // Default next state is staying at current state
  191.         Next_state = State;
  192.         Next_counter = Counter;
  193.        
  194.         // Default controls signal values
  195.         AES_DONE = 1'b0;
  196.         InvARK_sel = 1'b0;
  197.         InvSR_sel = 1'b0;
  198.         InvSB_sel = 1'b0;
  199.         InvMC_sel = 1'b0;
  200.         Enc_msg_sel = 1'b0;
  201.         latch_prevent = 1'b1;
  202.        
  203.         // Default register vals for InvMixColumns
  204.         InvMC_out_1_en = 1'b0;
  205.         InvMC_out_2_en = 1'b0;
  206.         InvMC_out_3_en = 1'b0;
  207.         InvMC_out_4_en = 1'b0;
  208.         InvMC_reg = 32'b0;
  209.         mixyboi_out = 128'b0;
  210.        
  211.         // Assign next state
  212.         unique case (State)
  213.             Wait    :
  214.                 if (AES_START)
  215.                     begin
  216.                         Next_state = KeyExp_1;
  217.                         Next_counter = 4'b0;
  218.                     end
  219.             KeyExp_1  :
  220.                 Next_state = KeyExp_2;
  221.             KeyExp_2  :
  222.                 Next_state = KeyExp_3;
  223.             KeyExp_3  :
  224.                 Next_state = KeyExp_4;
  225.             KeyExp_4  :
  226.                 Next_state = KeyExp_5;
  227.             KeyExp_5     :
  228.                 Next_state = KeyExp_6;
  229.             KeyExp_6     :
  230.                 Next_state = KeyExp_7;
  231.             KeyExp_7  :
  232.                 Next_state = InvARK_0;
  233.                
  234.             InvARK_0  : // Counter should be 0 here.
  235.                 Next_state = InvSR_1;
  236.            
  237.             InvSR_1   :
  238.                 begin
  239.                     Next_state = InvSB_1_1;
  240.                     Next_counter = Counter + 1'b1; // necessary to have a counter for ARK
  241.                 end
  242.             InvSB_1_1 :
  243.                 Next_state = InvSB_1_2;
  244.             InvSB_1_2 :
  245.                 Next_state = InvARK_1;
  246.             InvARK_1  :
  247.                 Next_state = InvMC_1_1;
  248.             InvMC_1_1 :
  249.                 Next_state = InvMC_1_2;
  250.             InvMC_1_2 :
  251.                 Next_state = InvMC_1_3;
  252.             InvMC_1_3 :
  253.                 Next_state = InvMC_1_4;
  254.             InvMC_1_4 :
  255.                 Next_state = InvMC_1_5;
  256.             InvMC_1_5 :
  257.                 Next_state = InvSR_2;
  258.            
  259.             InvSR_2   :
  260.                 begin
  261.                     Next_state = InvSB_2_1;
  262.                     Next_counter = Counter + 1'b1;
  263.                 end
  264.             InvSB_2_1 :
  265.                 Next_state = InvSB_2_2;
  266.             InvSB_2_2 :
  267.                 Next_state = InvARK_2;
  268.             InvARK_2  :
  269.                 Next_state = InvMC_2_1;
  270.             InvMC_2_1 :
  271.                 Next_state = InvMC_2_2;
  272.             InvMC_2_2 :
  273.                 Next_state = InvMC_2_3;
  274.             InvMC_2_3 :
  275.                 Next_state = InvMC_2_4;
  276.             InvMC_2_4 :
  277.                 Next_state = InvMC_2_5;
  278.             InvMC_2_5 :
  279.                 Next_state = InvSR_3;
  280.            
  281.             InvSR_3   :
  282.                 begin
  283.                     Next_state = InvSB_3_1;
  284.                     Next_counter = Counter + 1'b1;
  285.                 end
  286.             InvSB_3_1 :
  287.                 Next_state = InvSB_3_2;
  288.             InvSB_3_2 :
  289.                 Next_state = InvARK_3;
  290.             InvARK_3  :
  291.                 Next_state = InvMC_3_1;
  292.             InvMC_3_1 :
  293.                 Next_state = InvMC_3_2;
  294.             InvMC_3_2 :
  295.                 Next_state = InvMC_3_3;
  296.             InvMC_3_3 :
  297.                 Next_state = InvMC_3_4;
  298.             InvMC_3_4 :
  299.                 Next_state = InvMC_3_5;
  300.             InvMC_3_5 :
  301.                 Next_state = InvSR_4;
  302.            
  303.             InvSR_4   :
  304.                 begin
  305.                     Next_state = InvSB_4_1;
  306.                     Next_counter = Counter + 1'b1;
  307.                 end
  308.             InvSB_4_1 :
  309.                 Next_state = InvSB_4_2;
  310.             InvSB_4_2 :
  311.                 Next_state = InvARK_4;
  312.             InvARK_4  :
  313.                 Next_state = InvMC_4_1;
  314.             InvMC_4_1 :
  315.                 Next_state = InvMC_4_2;
  316.             InvMC_4_2 :
  317.                 Next_state = InvMC_4_3;
  318.             InvMC_4_3 :
  319.                 Next_state = InvMC_4_4;
  320.             InvMC_4_4 :
  321.                 Next_state = InvMC_4_5;
  322.             InvMC_4_5 :
  323.                 Next_state = InvSR_5;
  324.                
  325.             InvSR_5   :
  326.                 begin
  327.                     Next_state = InvSB_5_1;
  328.                     Next_counter = Counter + 1'b1;
  329.                 end
  330.             InvSB_5_1   :
  331.                 Next_state = InvSB_5_2;
  332.             InvSB_5_2   :
  333.                 Next_state = InvARK_5;
  334.             InvARK_5  :
  335.                 Next_state = InvMC_5_1;
  336.             InvMC_5_1 :
  337.                 Next_state = InvMC_5_2;
  338.             InvMC_5_2 :
  339.                 Next_state = InvMC_5_3;
  340.             InvMC_5_3 :
  341.                 Next_state = InvMC_5_4;
  342.             InvMC_5_4 :
  343.                 Next_state = InvMC_5_5;
  344.             InvMC_5_5 :
  345.                 Next_state = InvSR_6;
  346.            
  347.             InvSR_6   :
  348.                 begin
  349.                     Next_state = InvSB_6_1;
  350.                     Next_counter = Counter + 1'b1;
  351.                 end
  352.             InvSB_6_1 :
  353.                 Next_state = InvSB_6_2;
  354.             InvSB_6_2 :
  355.                 Next_state = InvARK_6;
  356.             InvARK_6  :
  357.                 Next_state = InvMC_6_1;
  358.             InvMC_6_1 :
  359.                 Next_state = InvMC_6_2;
  360.             InvMC_6_2 :
  361.                 Next_state = InvMC_6_3;
  362.             InvMC_6_3 :
  363.                 Next_state = InvMC_6_4;
  364.             InvMC_6_4 :
  365.                 Next_state = InvMC_6_5;
  366.             InvMC_6_5 :
  367.                 Next_state = InvSR_7;
  368.            
  369.             InvSR_7   :
  370.                 begin
  371.                     Next_state = InvSB_7_1;
  372.                     Next_counter = Counter + 1'b1;
  373.                 end
  374.             InvSB_7_1 :
  375.                 Next_state = InvSB_7_2;
  376.             InvSB_7_2 :
  377.                 Next_state = InvARK_7;
  378.             InvARK_7  :
  379.                 Next_state = InvMC_7_1;
  380.             InvMC_7_1 :
  381.                 Next_state = InvMC_7_2;
  382.             InvMC_7_2 :
  383.                 Next_state = InvMC_7_3;
  384.             InvMC_7_3 :
  385.                 Next_state = InvMC_7_4;
  386.             InvMC_7_4 :
  387.                 Next_state = InvMC_7_5;
  388.             InvMC_7_5 :
  389.                 Next_state = InvSR_8;
  390.                
  391.             InvSR_8   :
  392.                 begin
  393.                     Next_state = InvSB_8_1;
  394.                     Next_counter = Counter + 1'b1;
  395.                 end
  396.             InvSB_8_1 :
  397.                 Next_state = InvSB_8_2;
  398.             InvSB_8_2 :
  399.                 Next_state = InvARK_8;
  400.             InvARK_8  :
  401.                 Next_state = InvMC_8_1;
  402.             InvMC_8_1 :
  403.                 Next_state = InvMC_8_2;
  404.             InvMC_8_2 :
  405.                 Next_state = InvMC_8_3;
  406.             InvMC_8_3 :
  407.                 Next_state = InvMC_8_4;
  408.             InvMC_8_4 :
  409.                 Next_state = InvMC_8_5;
  410.             InvMC_8_5 :
  411.                 Next_state = InvSR_9;
  412.                
  413.             InvSR_9   :
  414.                 begin
  415.                     Next_state = InvSB_9_1;
  416.                     Next_counter = Counter + 1'b1;
  417.                 end
  418.             InvSB_9_1   :
  419.                 Next_state = InvSB_9_2;
  420.             InvSB_9_2   :
  421.                 Next_state = InvARK_9;
  422.             InvARK_9  :
  423.                 Next_state = InvMC_9_1;
  424.             InvMC_9_1 :
  425.                 Next_state = InvMC_9_2;
  426.             InvMC_9_2 :
  427.                 Next_state = InvMC_9_3;
  428.             InvMC_9_3 :
  429.                 Next_state = InvMC_9_4;
  430.             InvMC_9_4 :
  431.                 Next_state = InvMC_9_5;
  432.             InvMC_9_5 :
  433.                 Next_state = InvSR_Fin;
  434.            
  435.             InvSR_Fin :
  436.                 begin
  437.                     Next_state = InvSB_Fin_1;
  438.                     Next_counter = Counter + 1'b1;
  439.                 end
  440.             InvSB_Fin_1 :
  441.                 Next_state = InvSB_Fin_2;
  442.             InvSB_Fin_2 :
  443.                 Next_state = InvARK_Fin;
  444.             InvARK_Fin:
  445.                 Next_state = Done_1;
  446.             Done_1      :
  447.                 Next_state = Done_2;
  448.             Done_2      :
  449.                 if (!AES_START)
  450.                     Next_state = Wait;
  451.             default : ;
  452.         endcase
  453.        
  454.         case (State)
  455.             Wait            :  
  456.                 latch_prevent = 1'b1;
  457.            
  458.             KeyExp_1    :  
  459.                 Enc_msg_sel = 1'b1;
  460.             KeyExp_2    :  
  461.                 latch_prevent = 1'b1;
  462.             KeyExp_3    :  
  463.                 latch_prevent = 1'b1;
  464.             KeyExp_4    :  
  465.                 latch_prevent = 1'b1;
  466.             KeyExp_5    :  
  467.                 latch_prevent = 1'b1;
  468.             KeyExp_6        :  
  469.                 latch_prevent = 1'b1;
  470.             KeyExp_7        :  
  471.                 latch_prevent = 1'b1;
  472.            
  473.             InvARK_0  :
  474.                 InvARK_sel = 1'b1;
  475.            
  476.             InvSR_1   :
  477.                 InvSR_sel = 1'b1;  
  478.             InvSB_1_1 :
  479.                 InvSB_sel = 1'b1;
  480.             InvSB_1_2 :
  481.                 latch_prevent = 1'b1;
  482.             InvARK_1  :
  483.                 InvARK_sel = 1'b1;
  484.             InvMC_1_1 :
  485.                 begin
  486.                     InvMC_reg = temp_state_out[31:0];
  487.                     InvMC_out_1_en = 1'b1;
  488.                 end
  489.             InvMC_1_2 :
  490.                 begin
  491.                     InvMC_reg = temp_state_out[63:32];
  492.                     InvMC_out_2_en = 1'b1;
  493.                 end
  494.             InvMC_1_3 :
  495.                 begin
  496.                     InvMC_reg = temp_state_out[95:64];
  497.                     InvMC_out_3_en = 1'b1;
  498.                 end
  499.             InvMC_1_4 :
  500.                 begin
  501.                     InvMC_reg = temp_state_out[127:96];
  502.                     InvMC_out_4_en = 1'b1;
  503.                 end
  504.             InvMC_1_5 :
  505.                 begin
  506.                     InvMC_sel = 1'b1;
  507.                     mixyboi_out = {InvMC_out_4, InvMC_out_3, InvMC_out_2, InvMC_out_1};
  508.                 end
  509.                
  510.             InvSR_2   :
  511.                 InvSR_sel = 1'b1;  
  512.             InvSB_2_1 :
  513.                 InvSB_sel = 1'b1;
  514.             InvSB_2_2 :
  515.                 latch_prevent = 1'b1;
  516.             InvARK_2  :
  517.                 InvARK_sel = 1'b1;
  518.             InvMC_2_1 :
  519.                 begin
  520.                     InvMC_reg = temp_state_out[31:0];
  521.                     InvMC_out_1_en = 1'b1;
  522.                 end
  523.             InvMC_2_2 :
  524.                 begin
  525.                     InvMC_reg = temp_state_out[63:32];
  526.                     InvMC_out_2_en = 1'b1;
  527.                 end
  528.             InvMC_2_3 :
  529.                 begin
  530.                     InvMC_reg = temp_state_out[95:64];
  531.                     InvMC_out_3_en = 1'b1;
  532.                 end
  533.             InvMC_2_4 :
  534.                 begin
  535.                     InvMC_reg = temp_state_out[127:96];
  536.                     InvMC_out_4_en = 1'b1;
  537.                 end
  538.             InvMC_2_5 :
  539.                 begin
  540.                     InvMC_sel = 1'b1;
  541.                     mixyboi_out = {InvMC_out_4, InvMC_out_3, InvMC_out_2, InvMC_out_1};
  542.                 end
  543.            
  544.             InvSR_3   :
  545.                 InvSR_sel = 1'b1;  
  546.             InvSB_3_1 :
  547.                 InvSB_sel = 1'b1;
  548.             InvSB_3_2 :
  549.                 latch_prevent = 1'b1;
  550.             InvARK_3  :
  551.                 InvARK_sel = 1'b1;
  552.             InvMC_3_1 :
  553.                 begin
  554.                     InvMC_reg = temp_state_out[31:0];
  555.                     InvMC_out_1_en = 1'b1;
  556.                 end
  557.             InvMC_3_2 :
  558.                 begin
  559.                     InvMC_reg = temp_state_out[63:32];
  560.                     InvMC_out_2_en = 1'b1;
  561.                 end
  562.             InvMC_3_3 :
  563.                 begin
  564.                     InvMC_reg = temp_state_out[95:64];
  565.                     InvMC_out_3_en = 1'b1;
  566.                 end
  567.             InvMC_3_4 :
  568.                 begin
  569.                     InvMC_reg = temp_state_out[127:96];
  570.                     InvMC_out_4_en = 1'b1;
  571.                 end
  572.             InvMC_3_5 :
  573.                 begin
  574.                     InvMC_sel = 1'b1;
  575.                     mixyboi_out = {InvMC_out_4, InvMC_out_3, InvMC_out_2, InvMC_out_1};
  576.                 end
  577.            
  578.             InvSR_4   :
  579.                 InvSR_sel = 1'b1;  
  580.             InvSB_4_1 :
  581.                 InvSB_sel = 1'b1;
  582.             InvSB_4_2 :
  583.                 latch_prevent = 1'b1;
  584.             InvARK_4  :
  585.                 InvARK_sel = 1'b1;
  586.             InvMC_4_1 :
  587.                 begin
  588.                     InvMC_reg = temp_state_out[31:0];
  589.                     InvMC_out_1_en = 1'b1;
  590.                 end
  591.             InvMC_4_2 :
  592.                 begin
  593.                     InvMC_reg = temp_state_out[63:32];
  594.                     InvMC_out_2_en = 1'b1;
  595.                 end
  596.             InvMC_4_3 :
  597.                 begin
  598.                     InvMC_reg = temp_state_out[95:64];
  599.                     InvMC_out_3_en = 1'b1;
  600.                 end
  601.             InvMC_4_4 :
  602.                 begin
  603.                     InvMC_reg = temp_state_out[127:96];
  604.                     InvMC_out_4_en = 1'b1;
  605.                 end
  606.             InvMC_4_5 :
  607.                 begin
  608.                     InvMC_sel = 1'b1;
  609.                     mixyboi_out = {InvMC_out_4, InvMC_out_3, InvMC_out_2, InvMC_out_1};
  610.                 end
  611.            
  612.             InvSR_5   :
  613.                 InvSR_sel = 1'b1;  
  614.             InvSB_5_1 :
  615.                 InvSB_sel = 1'b1;
  616.             InvSB_5_2 :
  617.                 latch_prevent = 1'b1;
  618.             InvARK_5  :
  619.                 InvARK_sel = 1'b1;
  620.             InvMC_5_1 :
  621.                 begin
  622.                     InvMC_reg = temp_state_out[31:0];
  623.                     InvMC_out_1_en = 1'b1;
  624.                 end
  625.             InvMC_5_2 :
  626.                 begin
  627.                     InvMC_reg = temp_state_out[63:32];
  628.                     InvMC_out_2_en = 1'b1;
  629.                 end
  630.             InvMC_5_3 :
  631.                 begin
  632.                     InvMC_reg = temp_state_out[95:64];
  633.                     InvMC_out_3_en = 1'b1;
  634.                 end
  635.             InvMC_5_4 :
  636.                 begin
  637.                     InvMC_reg = temp_state_out[127:96];
  638.                     InvMC_out_4_en = 1'b1;
  639.                 end
  640.             InvMC_5_5 :
  641.                 begin
  642.                     InvMC_sel = 1'b1;
  643.                     mixyboi_out = {InvMC_out_4, InvMC_out_3, InvMC_out_2, InvMC_out_1};
  644.                 end
  645.            
  646.             InvSR_6   :
  647.                 InvSR_sel = 1'b1;  
  648.             InvSB_6_1 :
  649.                 InvSB_sel = 1'b1;
  650.             InvSB_6_2 :
  651.                 latch_prevent = 1'b1;
  652.             InvARK_6  :
  653.                 InvARK_sel = 1'b1;
  654.             InvMC_6_1 :
  655.                 begin
  656.                     InvMC_reg = temp_state_out[31:0];
  657.                     InvMC_out_1_en = 1'b1;
  658.                 end
  659.             InvMC_6_2 :
  660.                 begin
  661.                     InvMC_reg = temp_state_out[63:32];
  662.                     InvMC_out_2_en = 1'b1;
  663.                 end
  664.             InvMC_6_3 :
  665.                 begin
  666.                     InvMC_reg = temp_state_out[95:64];
  667.                     InvMC_out_3_en = 1'b1;
  668.                 end
  669.             InvMC_6_4 :
  670.                 begin
  671.                     InvMC_reg = temp_state_out[127:96];
  672.                     InvMC_out_4_en = 1'b1;
  673.                 end
  674.             InvMC_6_5 :
  675.                 begin
  676.                     InvMC_sel = 1'b1;
  677.                     mixyboi_out = {InvMC_out_4, InvMC_out_3, InvMC_out_2, InvMC_out_1};
  678.                 end
  679.            
  680.             InvSR_7   :
  681.                 InvSR_sel = 1'b1;  
  682.             InvSB_7_1 :
  683.                 InvSB_sel = 1'b1;
  684.             InvSB_7_2 :
  685.                 latch_prevent = 1'b1;
  686.             InvARK_7  :
  687.                 InvARK_sel = 1'b1;
  688.             InvMC_7_1 :
  689.                 begin
  690.                     InvMC_reg = temp_state_out[31:0];
  691.                     InvMC_out_1_en = 1'b1;
  692.                 end
  693.             InvMC_7_2 :
  694.                 begin
  695.                     InvMC_reg = temp_state_out[63:32];
  696.                     InvMC_out_2_en = 1'b1;
  697.                 end
  698.             InvMC_7_3 :
  699.                 begin
  700.                     InvMC_reg = temp_state_out[95:64];
  701.                     InvMC_out_3_en = 1'b1;
  702.                 end
  703.             InvMC_7_4 :
  704.                 begin
  705.                     InvMC_reg = temp_state_out[127:96];
  706.                     InvMC_out_4_en = 1'b1;
  707.                 end
  708.             InvMC_7_5 :
  709.                 begin
  710.                     InvMC_sel = 1'b1;
  711.                     mixyboi_out = {InvMC_out_4, InvMC_out_3, InvMC_out_2, InvMC_out_1};
  712.                 end
  713.            
  714.             InvSR_8   :
  715.                 InvSR_sel = 1'b1;  
  716.             InvSB_8_1 :
  717.                 InvSB_sel = 1'b1;
  718.             InvSB_8_2 :
  719.                 latch_prevent = 1'b1;
  720.             InvARK_8  :
  721.                 InvARK_sel = 1'b1;
  722.             InvMC_8_1 :
  723.                 begin
  724.                     InvMC_reg = temp_state_out[31:0];
  725.                     InvMC_out_1_en = 1'b1;
  726.                 end
  727.             InvMC_8_2 :
  728.                 begin
  729.                     InvMC_reg = temp_state_out[63:32];
  730.                     InvMC_out_2_en = 1'b1;
  731.                 end
  732.             InvMC_8_3 :
  733.                 begin
  734.                     InvMC_reg = temp_state_out[95:64];
  735.                     InvMC_out_3_en = 1'b1;
  736.                 end
  737.             InvMC_8_4 :
  738.                 begin
  739.                     InvMC_reg = temp_state_out[127:96];
  740.                     InvMC_out_4_en = 1'b1;
  741.                 end
  742.             InvMC_8_5 :
  743.                 begin
  744.                     InvMC_sel = 1'b1;
  745.                     mixyboi_out = {InvMC_out_4, InvMC_out_3, InvMC_out_2, InvMC_out_1};
  746.                 end
  747.            
  748.             InvSR_9   :
  749.                 InvSR_sel = 1'b1;  
  750.             InvSB_9_1 :
  751.                 InvSB_sel = 1'b1;
  752.             InvSB_9_2 :
  753.                 latch_prevent = 1'b1;
  754.             InvARK_9  :
  755.                 InvARK_sel = 1'b1;
  756.             InvMC_9_1 :
  757.                 begin
  758.                     InvMC_reg = temp_state_out[31:0];
  759.                     InvMC_out_1_en = 1'b1;
  760.                 end
  761.             InvMC_9_2 :
  762.                 begin
  763.                     InvMC_reg = temp_state_out[63:32];
  764.                     InvMC_out_2_en = 1'b1;
  765.                 end
  766.             InvMC_9_3 :
  767.                 begin
  768.                     InvMC_reg = temp_state_out[95:64];
  769.                     InvMC_out_3_en = 1'b1;
  770.                 end
  771.             InvMC_9_4 :
  772.                 begin
  773.                     InvMC_reg = temp_state_out[127:96];
  774.                     InvMC_out_4_en = 1'b1;
  775.                 end
  776.             InvMC_9_5 :
  777.                 begin
  778.                     InvMC_sel = 1'b1;
  779.                     mixyboi_out = {InvMC_out_4, InvMC_out_3, InvMC_out_2, InvMC_out_1}; // concatenating it all together from most to least
  780.                                                                                                               // significant!
  781.                 end
  782.            
  783.             InvSR_Fin :
  784.                 InvSR_sel = 1'b1;
  785.             InvSB_Fin_1 :
  786.                 InvSB_sel = 1'b1;
  787.             InvSB_Fin_2 :
  788.                 latch_prevent = 1'b1;
  789.             InvARK_Fin:
  790.                 InvARK_sel = 1'b1;
  791.            
  792.             Done_1    :
  793.                 latch_prevent = 1'b1;
  794.             Done_2   :
  795.                 AES_DONE = 1'b1;
  796.         endcase
  797.     end
  798.  
  799.     // Inverse Function Declarations
  800.     InvShiftRows shiftyboi(.data_in(temp_state_out), .data_out(shiftyboi_out));
  801.    
  802.     InvMixColumns mixyboi(.in(InvMC_reg), .out(mixyboi_piece));
  803.    
  804.     InvAddRoundKey roundyboi(.inny_boi(temp_state_out), .key(curr_roundkey), .outty_boi(roundyboi_out));
  805.    
  806.     // This dumbass function only takes 8 bits at a time, need to pass all 128 of temp_state in so i guess i have to have 16 of these shits
  807.     InvSubBytes subbyboi_1(.clk(CLK), .in(temp_state_out[7:0]), .out(subbyboi_1_out));
  808.     InvSubBytes subbyboi_2(.clk(CLK), .in(temp_state_out[15:8]), .out(subbyboi_2_out));
  809.     InvSubBytes subbyboi_3(.clk(CLK), .in(temp_state_out[23:16]), .out(subbyboi_3_out));
  810.     InvSubBytes subbyboi_4(.clk(CLK), .in(temp_state_out[31:24]), .out(subbyboi_4_out));
  811.     InvSubBytes subbyboi_5(.clk(CLK), .in(temp_state_out[39:32]), .out(subbyboi_5_out));
  812.     InvSubBytes subbyboi_6(.clk(CLK), .in(temp_state_out[47:40]), .out(subbyboi_6_out));
  813.     InvSubBytes subbyboi_7(.clk(CLK), .in(temp_state_out[55:48]), .out(subbyboi_7_out));
  814.     InvSubBytes subbyboi_8(.clk(CLK), .in(temp_state_out[63:56]), .out(subbyboi_8_out));
  815.     InvSubBytes subbyboi_9(.clk(CLK), .in(temp_state_out[71:64]), .out(subbyboi_9_out));
  816.     InvSubBytes subbyboi_10(.clk(CLK), .in(temp_state_out[79:72]), .out(subbyboi_10_out));
  817.     InvSubBytes subbyboi_11(.clk(CLK), .in(temp_state_out[87:80]), .out(subbyboi_11_out));
  818.     InvSubBytes subbyboi_12(.clk(CLK), .in(temp_state_out[95:88]), .out(subbyboi_12_out));
  819.     InvSubBytes subbyboi_13(.clk(CLK), .in(temp_state_out[103:96]), .out(subbyboi_13_out));
  820.     InvSubBytes subbyboi_14(.clk(CLK), .in(temp_state_out[111:104]), .out(subbyboi_14_out));
  821.     InvSubBytes subbyboi_15(.clk(CLK), .in(temp_state_out[119:112]), .out(subbyboi_15_out));
  822.     InvSubBytes subbyboi_16(.clk(CLK), .in(temp_state_out[127:120]), .out(subbyboi_16_out));
  823.     assign subbyboi_out = {subbyboi_16_out, subbyboi_15_out, subbyboi_14_out, subbyboi_13_out, subbyboi_12_out, subbyboi_11_out, subbyboi_10_out,
  824.                                   subbyboi_9_out, subbyboi_8_out, subbyboi_7_out, subbyboi_6_out, subbyboi_5_out, subbyboi_4_out,
  825.                                   subbyboi_3_out, subbyboi_2_out, subbyboi_1_out};
  826.    
  827.     // Key Expansion declaration
  828.     KeyExpansion expandyboi(.clk(CLK), .Cipherkey(AES_KEY), .KeySchedule);
  829.    
  830.     // Mux for picking which function is the input to temp_state
  831.     one_hot_6 data_reg_mux (
  832.                             .Din1(roundyboi_out), // roundyboi output
  833.                             .Din2(shiftyboi_out), // shiftyboi output
  834.                             .Din3(subbyboi_out), // subbyboi output
  835.                             .Din4(mixyboi_out), // mixyboi output
  836.                             .Din5(AES_MSG_ENC), // original encoded message
  837.                             .Din6(temp_state_out), // No function, give temp_state its old value.
  838.                             .sel1(InvARK_sel),
  839.                             .sel2(InvSR_sel),
  840.                             .sel3(InvSB_sel),
  841.                             .sel4(InvMC_sel),
  842.                             .sel5(Enc_msg_sel),
  843.                             .Dout(mux_output) // writes to state reg
  844.                           );
  845.        
  846.     // Mux for picking the right roundkey for InvAddRoundKey
  847.     mux11 roundkey_select (
  848.                                         .Din1(KeySchedule[127:0]),
  849.                                         .Din2(KeySchedule[255:128]),
  850.                                         .Din3(KeySchedule[383:256]),
  851.                                         .Din4(KeySchedule[511:384]),
  852.                                         .Din5(KeySchedule[639:512]),
  853.                                         .Din6(KeySchedule[767:640]),
  854.                                         .Din7(KeySchedule[895:768]),
  855.                                         .Din8(KeySchedule[1023:896]),
  856.                                         .Din9(KeySchedule[1151:1024]),
  857.                                         .Din10(KeySchedule[1279:1152]),
  858.                                         .Din11(KeySchedule[1407:1280]),
  859.                                         .Counter,
  860.                                         .Dout(curr_roundkey)
  861.                                         );
  862.    
  863.     // data register declaration
  864.     reg_128 temp_state(
  865.                             .Clk(CLK),
  866.                             .Reset(RESET),
  867.                             .D(mux_output),
  868.                             .Dout(temp_state_out)
  869.                             );
  870.                            
  871.     // InvMC_reg 1-4 declarations here
  872.     reg_32_ld mixcolreg1(
  873.                                 .Clk(CLK),
  874.                                 .Reset(RESET),
  875.                                 .Load(InvMC_out_1_en),
  876.                                 .D(mixyboi_piece),
  877.                                 .Dout(InvMC_out_1)
  878.                                 );
  879.     reg_32_ld mixcolreg2(
  880.                                 .Clk(CLK),
  881.                                 .Reset(RESET),
  882.                                 .Load(InvMC_out_2_en),
  883.                                 .D(mixyboi_piece),
  884.                                 .Dout(InvMC_out_2)
  885.                                 );
  886.     reg_32_ld mixcolreg3(
  887.                                 .Clk(CLK),
  888.                                 .Reset(RESET),
  889.                                 .Load(InvMC_out_3_en),
  890.                                 .D(mixyboi_piece),
  891.                                 .Dout(InvMC_out_3)
  892.                                 );
  893.     reg_32_ld mixcolreg4(
  894.                                 .Clk(CLK),
  895.                                 .Reset(RESET),
  896.                                 .Load(InvMC_out_4_en),
  897.                                 .D(mixyboi_piece),
  898.                                 .Dout(InvMC_out_4)
  899.                                 );
  900.    
  901. endmodule
  902.  
  903.  
  904. // OTHER MODULE DEFINITIONS
  905.  
  906. // one hot mux, used for picking current function
  907. module one_hot_6 (input logic [127:0] Din1,
  908.                      input logic [127:0] Din2,
  909.                      input logic [127:0] Din3,
  910.                      input logic [127:0] Din4,
  911.                      input logic [127:0] Din5,
  912.                      input logic [127:0] Din6, // this comes from the data register itself
  913.                      input logic sel1, sel2, sel3, sel4, sel5,
  914.                      output logic [127:0] Dout
  915.                     );
  916.     always_comb begin
  917.         if (sel1)
  918.             Dout = Din1;
  919.         else if (sel2)
  920.             Dout = Din2;
  921.         else if (sel3)
  922.             Dout = Din3;
  923.         else if (sel4)
  924.             Dout = Din4;
  925.         else if (sel5)
  926.             Dout = Din5;
  927.         else
  928.             Dout = Din6; //no function is being done, give the data register its old value.
  929.     end
  930. endmodule
  931.  
  932. // Used for the state register
  933. module reg_128 (input  logic Clk, Reset,
  934.               input  logic [127:0]  D,
  935.               output logic [127:0]  Dout);
  936.  
  937.     always_ff @ (posedge Clk)
  938.     begin
  939.          if (Reset) // notice, this is a sycnrhonous reset, which is recommended on the FPGA
  940.               Dout <= 128'b0;
  941.          else
  942.               Dout <= D;
  943.     end
  944. endmodule
  945.  
  946. // one hot mux with 11 signals, used for InvAddRoundKey's key parameter
  947. module mux11 (
  948.                          input logic [127:0] Din1,
  949.                          input logic [127:0] Din2,
  950.                          input logic [127:0] Din3,
  951.                          input logic [127:0] Din4,
  952.                          input logic [127:0] Din5,
  953.                          input logic [127:0] Din6,
  954.                          input logic [127:0] Din7,
  955.                          input logic [127:0] Din8,
  956.                          input logic [127:0] Din9,
  957.                          input logic [127:0] Din10,
  958.                          input logic [127:0] Din11,
  959.                          input logic [4:0] Counter,
  960.                          output logic [127:0] Dout
  961.                       );
  962.     always_comb begin
  963.         case (Counter)
  964.             4'd0 :
  965.                 Dout = Din1;
  966.             4'd1 :
  967.                 Dout = Din2;
  968.             4'd2 :
  969.                 Dout = Din3;
  970.             4'd3 :
  971.                 Dout = Din4;
  972.             4'd4 :
  973.                 Dout = Din5;
  974.             4'd5 :
  975.                 Dout = Din6;
  976.             4'd6 :
  977.                 Dout = Din7;
  978.             4'd7 :
  979.                 Dout = Din8;
  980.             4'd8 :
  981.                 Dout = Din9;
  982.             4'd9 :
  983.                 Dout = Din10;
  984.             4'd10 :
  985.                 Dout = Din11;
  986.             default :
  987.                 Dout = 128'bX;
  988.         endcase
  989.     end
  990. endmodule
  991.  
  992. // This other register is able to load, this is useful for the mixcolumns registers that need to hold their values after a state
  993. module reg_32_ld (
  994.                         input logic Clk, Reset, Load,
  995.                         input  logic [31:0]  D,
  996.                         output logic [31:0]  Dout
  997.                         );
  998.  
  999.     always_ff @ (posedge Clk)
  1000.     begin
  1001.          if (Reset) //notice, this is a sycnrhonous reset, which is recommended on the FPGA
  1002.               Dout <= 32'b0;
  1003.          else if (Load)
  1004.               Dout <= D;
  1005.     end
  1006. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement