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

Subversion Repositories aes_decry_ip_128bit

[/] [aes_decry_ip_128bit/] [trunk/] [rtl/] [AES_decrypter.vhd] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 ghegde
--************************************************************
2
--Copyright 2015, Ganesh Hegde < ghegde@opencores.org >      
3
--                                                           
4
--This source file may be used and distributed without  
5
--restriction provided that this copyright statement is not 
6
--removed from the file and that any derivative work contains
7
--the original copyright notice and the associated disclaimer.
8
--
9
--This source is distributed in the hope that it will be
10
--useful, but WITHOUT ANY WARRANTY; without even the implied
11
--warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12
--PURPOSE.  See the GNU Lesser General Public License for more
13
--details.
14
--
15
--You should have received a copy of the GNU Lesser General
16
--Public License along with this source; if not, download it
17
--from http://www.opencores.org/lgpl.shtml
18
--
19
--*************************************************************
20
 
21
--*************************************************************
22
--Top level entity for AES decryption IP.
23
--*************************************************************
24
 
25
library ieee;
26
use ieee.std_logic_1164.all;
27
use ieee.numeric_std.all;
28
 
29
entity AES_decrypter is
30
        port(
31
                  cipher: in std_logic_vector(127 downto 0); --Cipher text
32
                  text_out: out std_logic_vector(127 downto 0); -- Decrypted output      
33
                  key: in std_logic_vector(127 downto 0); --Cipher Key
34
                  k_valid,c_valid: in std_logic;--Asserted when either key, cipher is valid
35
                  ready:out std_logic;--Asserted high when IP is ready to accept the data(key or Cipher)
36
                  out_valid: out std_logic;--out_valid:Asserted high when decrypted cipher is on the bus.(IMP : **Output is valid only for one cycle)
37
                  clk,reset: in std_logic
38
                );
39
end AES_decrypter;
40
 
41
architecture beh_AES_decrypter of AES_decrypter is
42
 
43
   component key_scheduler
44
   port(
45
     key_in  : in std_logic_vector(127 downto 0);--Decryption Key
46
         key_out : out std_logic_vector(127 downto 0);
47
         valid_in : in std_logic;--Should be high when input key is valid
48
         key_ready : out std_logic;--Asserted high when key_scheduler generated all the keys
49
         round: in std_logic_vector(3 downto 0);--Which round key to access
50
         clk,reset: in std_logic
51
    );
52
   end component;
53
 
54
   component one_round_decrypt
55
   port(
56
          cipher : in std_logic_vector(127 downto 0);
57
                  text_out: out std_logic_vector(127 downto 0);
58
                  round_key: in std_logic_vector(127 downto 0)
59
       );
60
   end component;
61
 
62
   component InvSub_addRk
63
   port(
64
        state_in : in std_logic_vector(127 downto 0);
65
        state_out : out std_logic_vector(127 downto 0);
66
                key : in std_logic_vector(127 downto 0)
67
         );
68
   end component;
69
 
70
   type state is (IDLE,KEYGEN,GETKY0,ROUND,FINALR,DELAY);
71
   signal state_reg,state_n: state;
72
   signal round_reg:unsigned(3 downto 0);
73
 
74
   signal KS_key_ready:std_logic;
75
   signal KS_key_out:std_logic_vector(127 downto 0);
76
   signal KS_round:unsigned(3 downto 0);
77
 
78
   signal one_round_out:std_logic_vector(127 downto 0);
79
 
80
   signal cipher_reg,cipher_n,cipher_round0: std_logic_vector(127 downto 0);
81
begin
82
   key_scheduler_inst:key_scheduler
83
   port map(key_in=>key,key_out=>KS_key_out,valid_in=>k_valid,key_ready=>KS_key_ready,round=>std_logic_vector(KS_round),clk=>clk,reset=>reset);
84
 
85
   one_round_decrypt_inst:one_round_decrypt
86
   port map(cipher=>cipher_reg,text_out=>one_round_out,round_key=>KS_key_out);
87
 
88
   InvSub_addRk_inst:InvSub_addRk
89
   port map(state_in=>cipher_reg,state_out=>text_out,key=>KS_key_out);
90
 
91
--State register logic
92
   process(clk,reset)
93
   begin
94
      if(reset='1') then
95
                state_reg <= IDLE;
96
                round_reg<=(others=>'0');
97
                cipher_reg<=(others=>'0');
98
           elsif(clk ' event and clk='1') then
99
                state_reg <= state_n;
100
                round_reg<=KS_round+1;
101
                cipher_reg<=cipher_n;
102
                end if;
103
   end process;
104
 
105
--Next state logic
106
        process(state_reg,c_valid,KS_key_ready,k_valid,round_reg)
107
        begin
108
           case state_reg is
109
              when IDLE =>
110
                      if(k_valid='1') then
111
                             state_n <= KEYGEN;
112
                          else
113
                             state_n <= IDLE;
114
                          end if;
115
                  when KEYGEN =>
116
                      if(KS_key_ready='1') then
117
                            state_n <= GETKY0;--Unnecessary delay here??????
118
                          else
119
                            state_n <= KEYGEN;
120
                          end if;
121
                  when GETKY0 =>
122
                                if(c_valid='1') then
123
                                   state_n<=DELAY;
124
                                else
125
                   state_n<=GETKY0;
126
                                end if;
127
                  when DELAY =>
128
                       state_n <= ROUND;
129
 
130
                  when ROUND=>
131
                           if(round_reg="1010") then
132
                              state_n<=FINALR;
133
                           else
134
                              state_n<=ROUND;
135
                           end if;
136
          when FINALR=>
137
               state_n<=GETKY0;
138
           end case;
139
        end process;
140
 
141
        cipher_round0 <= KS_key_out xor cipher;
142
 
143
        with state_reg select
144
        KS_round <= "0000" when GETKY0,
145
                    round_reg when DELAY,
146
                                round_reg when ROUND,
147
                                "1010" when others;
148
 
149
        with state_reg select
150
        cipher_n <= cipher_round0 when DELAY,
151
                    one_round_out when others;
152
 
153
        out_valid<='1' when state_reg=FINALR else
154
                   '0';
155
 
156
    ready<='1' when state_reg=GETKY0 or state_reg=IDLE else
157
                   '0' ;
158
end beh_AES_decrypter;

powered by: WebSVN 2.1.0

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