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

Subversion Repositories aes_128_192_256

[/] [aes_128_192_256/] [web_uploads/] [aes_dec.vhdl] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 root
--------------------------------------------------------------------------------
2
-- Organization:      www.opendsp.pl
3
-- Engineer:          Jerzy Gbur
4
--
5
-- Create Date:    2006-06-18 18:44:02
6
-- Design Name:    AES_128_192_256
7
-- Module Name:    aes_dec
8
-- Project Name:
9
-- Target Device:
10
-- Tool versions:
11
-- Description:
12
--            State Table index
13
--            ---------------------
14
--            |  0 |  4 |  8 | 12 |
15
--            ---------------------
16
--            |  1 |  5 |  9 | 13 |
17
--            ---------------------
18
--            |  2 |  6 | 10 | 14 |
19
--            ---------------------
20
--            |  3 |  7 | 11 | 15 |
21
--            ---------------------
22
-- Dependencies:
23
--
24
-- Revision:
25
-- Revision 0.01 - File Created
26
-- Additional Comments:
27
--
28
--------------------------------------------------------------------------------
29
-- http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
30
 
31
library IEEE;
32
use IEEE.STD_LOGIC_1164.ALL;
33
use IEEE.STD_LOGIC_ARITH.ALL;
34
use IEEE.STD_LOGIC_UNSIGNED.ALL;
35
 
36
library WORK;
37
use WORK.aes_pkg.ALL;
38
 
39
entity aes_dec is
40
   generic
41
                  (
42
                  KEY_SIZE             :  in    integer range 0 to 2 := 2            -- 0-128; 1-192; 2-256
43
                  );
44
   port
45
                  (
46
                  DATA_I               :  in    std_logic_vector(7 downto 0);
47
                  VALID_DATA_I         :  in    std_logic;
48
                  KEY_I                :  in    std_logic_vector(7 downto 0);
49
                  VALID_KEY_I          :  in    std_logic;
50
                  RESET_I              :  in    std_logic;
51
                  CLK_I                :  in    std_logic;
52
                  CE_I                 :  in    std_logic;
53
 
54
                  KEY_READY_O          :  out   std_logic;
55
 
56
                  VALID_O              :  out   std_logic;
57
                  DATA_O               :  out   std_logic_vector(7 downto 0)
58
                  );
59
 
60
end aes_dec;
61
 
62
architecture Behavioral of aes_dec is
63
 
64
   signal         rom_INV_SBOX         :  type_SBOX;
65
 
66
   signal         v_CNT4               :  std_logic_vector(1 downto 0);
67
 
68
   signal         STATE_TABLE1         :  type_STATE_TABLE;
69
 
70
   signal         t_STATE_RAM0         :  type_STATE_RAM;
71
 
72
 
73
   signal         v_KEY_COLUMN         :  std_logic_vector(31 downto 0);
74
   signal         v_DATA_COLUMN        :  std_logic_vector(31 downto 0);
75
 
76
 
77
   signal         FF_VALID_DATA        :  std_logic;
78
   signal         v_KEY_NUMB           :  std_logic_vector(5 downto 0);
79
   signal         v_INV_KEY_NUMB       :  std_logic_vector(5 downto 0);
80
 
81
   signal         i_MAX_ROUND          :  integer range 0 to 14;
82
   signal         i_ROUND              :  integer range 0 to 14;
83
 
84
   signal         SRAM_WREN0           :  std_logic;
85
 
86
   signal         GET_KEY              :  std_logic;
87
   signal         FF_GET_KEY           :  std_logic;
88
 
89
   signal         CALCULATION          :  std_logic;
90
   signal         LAST_ROUND           :  std_logic;
91
   signal         i_RAM_ADDR_RD0       :  integer range 0 to 3;
92
   signal         i_RAM_ADDR_WR0       :  integer range 0 to 3;
93
   signal         v_RAM_OUT0           :  std_logic_vector(31 downto 0);
94
   signal         v_RAM_IN0            :  std_logic_vector(31 downto 0);
95
   signal         v_CALCULATION_CNTR   :  std_logic_vector(7 downto 0);
96
 
97
   type           type_temp            is array (0 to 15) of std_logic_vector(7 downto 0);
98
   signal         SC_2                 :  type_temp;
99
   signal         SC_4                 :  type_temp;
100
   signal         SC_8                 :  type_temp;
101
   signal         TMP_STATE            :  type_temp;
102
 
103
 
104
begin
105
 
106
i_MAX_ROUND <= 8     when  KEY_SIZE = 0 else
107
               10    when  KEY_SIZE = 1 else
108
               12    when  KEY_SIZE = 2 else
109
               8;
110
 
111
--****************************************************************************--
112
--* Key production                                                           *--
113
--****************************************************************************--
114
 
115
KEXP0:
116
   key_expansion
117
      GENERIC MAP
118
                  (
119
                  KEY_SIZE             => KEY_SIZE
120
                  )
121
      PORT MAP    (
122
                  KEY_I                => KEY_I,
123
                  VALID_KEY_I          => VALID_KEY_I,
124
 
125
                  CLK_I                => CLK_I,
126
                  RESET_I              => RESET_I,
127
                  CE_I                 => CE_I,
128
 
129
                  DONE_O               => KEY_READY_O,
130
                  GET_KEY_I            => GET_KEY,
131
                  KEY_NUMB_I           => v_INV_KEY_NUMB,
132
                  KEY_EXP_O            => v_KEY_COLUMN
133
                  );
134
 
135
v_INV_KEY_NUMB <= v_KEY_NUMB(5 downto 2) & not v_KEY_NUMB(1) & not v_KEY_NUMB(0);
136
 
137
--****************************************************************************--
138
--* Incomming data                                                           *--
139
--****************************************************************************--
140
 
141
P0001:
142
   process(CLK_I)
143
   begin
144
      if rising_edge(CLK_I) then
145
         if VALID_DATA_I = '1' then
146
            if v_CNT4 = "00" then
147
               v_DATA_COLUMN(7 downto 0) <= DATA_I;
148
            elsif v_CNT4 = "01" then
149
               v_DATA_COLUMN(15 downto 8) <= DATA_I;
150
            elsif v_CNT4 = "10" then
151
               v_DATA_COLUMN(23 downto 16) <= DATA_I;
152
            elsif v_CNT4 = "11" then
153
               v_DATA_COLUMN(31 downto 24) <= DATA_I;
154
            end if;
155
         end if;
156
      end if;
157
   end process;
158
 
159
P0002:
160
   process (CLK_I)
161
   begin
162
      if rising_edge(CLK_I) then
163
         if CE_I = '1' then
164
            if VALID_DATA_I = '1' then
165
               v_CNT4 <= v_CNT4 + 1;
166
            else
167
               v_CNT4 <= "00";
168
            end if;
169
         end if;
170
      end if;
171
   end process;
172
 
173
--****************************************************************************--
174
--* Get Key                                                                  *--
175
--****************************************************************************--
176
 
177
P0003:
178
   process(CLK_I)
179
   begin
180
      if rising_edge(CLK_I) then
181
         if VALID_DATA_I = '1' and v_CNT4 = "10" then
182
            GET_KEY <= '1';
183
         elsif v_CALCULATION_CNTR = x"04" or v_CALCULATION_CNTR = x"05" or v_CALCULATION_CNTR = x"06" or v_CALCULATION_CNTR = x"07" then
184
            GET_KEY <= '1';
185
         else
186
            GET_KEY <= '0';
187
         end if;
188
      end if;
189
   end process;
190
 
191
--****************************************************************************--
192
--* Address for 32bit words of KEY                                           *--
193
--****************************************************************************--
194
 
195
P0004:
196
   process(CLK_I)
197
   begin
198
      if rising_edge(CLK_I) then
199
         if RESET_I = '1' then
200
            if KEY_SIZE = 0 then
201
               v_KEY_NUMB <= "101011";
202
            elsif KEY_SIZE = 1 then
203
               v_KEY_NUMB <= "110011";
204
            elsif KEY_SIZE = 2 then
205
               v_KEY_NUMB <= "111011";
206
            end if;
207
         elsif CE_I = '1' then
208
            if VALID_DATA_I = '1' and FF_VALID_DATA = '0' then
209
               if KEY_SIZE = 0 then
210
                  v_KEY_NUMB <= "101011";
211
               elsif KEY_SIZE = 1 then
212
                  v_KEY_NUMB <= "110011";
213
               elsif KEY_SIZE = 2 then
214
                  v_KEY_NUMB <= "111011";
215
               end if;
216
            elsif GET_KEY = '1' then
217
               v_KEY_NUMB <= v_KEY_NUMB - 1;
218
            end if;
219
         end if;
220
      end if;
221
   end process;
222
 
223
 
224
--****************************************************************************--
225
--* Rom - invert TABLE                                                       *--
226
--****************************************************************************--
227
 
228
rom_INV_SBOX <= c_SBOX_INV;
229
 
230
--****************************************************************************--
231
--* State RAM                                                                *--
232
--****************************************************************************--
233
ST_RAM0:
234
   process(CLK_I)
235
   begin
236
      if rising_edge(CLK_I) then
237
         -- WRITTING ADDERSS
238
         if RESET_I = '1' then
239
            i_RAM_ADDR_WR0 <= 0;
240
            i_RAM_ADDR_RD0 <= 0;
241
         elsif CE_I = '1' then
242
            if VALID_DATA_I = '1' and FF_VALID_DATA = '0' then
243
               i_RAM_ADDR_WR0 <= 0;
244
            elsif SRAM_WREN0 = '1' then
245
               if i_RAM_ADDR_WR0 = 3 then
246
                  i_RAM_ADDR_WR0 <= 0;
247
               else
248
                  i_RAM_ADDR_WR0 <=  i_RAM_ADDR_WR0 + 1;
249
               end if;
250
            end if;
251
         end if;
252
         -- RAM
253
         if CE_I = '1' then
254
            if SRAM_WREN0 = '1' then
255
               t_STATE_RAM0(i_RAM_ADDR_WR0) <= v_RAM_IN0;
256
            end if;
257
            v_RAM_OUT0 <=  t_STATE_RAM0(i_RAM_ADDR_RD0);
258
         end if;
259
 
260
         if CE_I = '1' then
261
            FF_GET_KEY     <= GET_KEY;
262
            SRAM_WREN0     <= FF_GET_KEY;
263
         end if;
264
         -- READING ADDRESS
265
         if CE_I = '1' then
266
            if v_CALCULATION_CNTR = x"01" or v_CALCULATION_CNTR = x"02" or v_CALCULATION_CNTR = x"03" then
267
               i_RAM_ADDR_RD0 <= i_RAM_ADDR_RD0 + 1;
268
            elsif v_CALCULATION_CNTR = x"00" then
269
               i_RAM_ADDR_RD0 <= 0;
270
            end if;
271
         end if;
272
 
273
      end if;
274
   end process;
275
 
276
--****************************************************************************--
277
--* v_RAM_IN0                                                                *--
278
--****************************************************************************--
279
 
280
P0005:
281
   process(CLK_I)
282
   begin
283
      if rising_edge(CLK_I) then
284
         if RESET_I = '1' then
285
            v_RAM_IN0 <= (others => '0');
286
         elsif CE_I = '1' then
287
            FF_VALID_DATA <= VALID_DATA_I;
288
            if FF_VALID_DATA = '1' and v_CNT4 = "00" then
289
               v_RAM_IN0 <= v_KEY_COLUMN xor v_DATA_COLUMN;
290
            elsif LAST_ROUND = '0' then
291
 
292
               if v_CALCULATION_CNTR = x"06" then
293
                  v_RAM_IN0(7 downto 0)   <= SC_2(0) xor SC_4(0) xor SC_8(0)                          --E
294
                                             xor SC_2(1) xor SC_8(1) xor TMP_STATE(1)                  --B
295
                                             xor SC_4(2) xor SC_8(2) xor TMP_STATE(2)                  --D
296
                                             xor SC_8(3)             xor TMP_STATE(3);                 --9
297
                  v_RAM_IN0(15 downto 8)  <= SC_8(0) xor TMP_STATE(0)                              --9
298
                                             xor SC_8(1) xor SC_4(1) xor SC_2(1)                          --E
299
                                             xor SC_8(2) xor SC_2(2) xor TMP_STATE(2)                  --B
300
                                             xor SC_8(3) xor SC_4(3) xor TMP_STATE(3);                 --D
301
                  v_RAM_IN0(23 downto 16) <= SC_8(0) xor SC_4(0) xor TMP_STATE(0)                  --D
302
                                             xor SC_8(1) xor TMP_STATE(1)                              --9
303
                                             xor SC_8(2) xor SC_4(2) xor SC_2(2)                          --E
304
                                             xor SC_8(3) xor SC_2(3) xor TMP_STATE(3);                 --B
305
                  v_RAM_IN0(31 downto 24) <= SC_8(0) xor SC_2(0) xor TMP_STATE(0)                  --B
306
                                             xor SC_8(1) xor SC_4(1) xor TMP_STATE(1)                  --D
307
                                             xor SC_8(2) xor TMP_STATE(2)                              --9
308
                                             xor SC_8(3) xor SC_4(3) xor SC_2(3);                         --E
309
               elsif v_CALCULATION_CNTR = x"07" then
310
                  v_RAM_IN0(7 downto 0)   <= SC_2(4) xor SC_4(4) xor SC_8(4)                          --E
311
                                             xor SC_2(5) xor SC_8(5) xor TMP_STATE(5)                  --B
312
                                             xor SC_4(6) xor SC_8(6) xor TMP_STATE(6)                  --D
313
                                             xor SC_8(7)             xor TMP_STATE(7);                 --9
314
                  v_RAM_IN0(15 downto 8)  <= SC_8(4) xor TMP_STATE(4)                              --9
315
                                             xor SC_8(5) xor SC_4(5) xor SC_2(5)                          --E
316
                                             xor SC_8(6) xor SC_2(6) xor TMP_STATE(6)                  --B
317
                                             xor SC_8(7) xor SC_4(7) xor TMP_STATE(7);                 --D
318
                  v_RAM_IN0(23 downto 16) <= SC_8(4) xor SC_4(4) xor TMP_STATE(4)                  --D
319
                                             xor SC_8(5) xor TMP_STATE(5)                              --9
320
                                             xor SC_8(6) xor SC_4(6) xor SC_2(6)                          --E
321
                                             xor SC_8(7) xor SC_2(7) xor TMP_STATE(7);                 --B
322
                  v_RAM_IN0(31 downto 24) <= SC_8(4) xor SC_2(4) xor TMP_STATE(4)                  --B
323
                                             xor SC_8(5) xor SC_4(5) xor TMP_STATE(5)                  --D
324
                                             xor SC_8(6) xor TMP_STATE(6)                              --9
325
                                             xor SC_8(7) xor SC_4(7) xor SC_2(7);                         --E
326
               elsif v_CALCULATION_CNTR = x"08" then
327
                  v_RAM_IN0(7 downto 0)   <= SC_2(8) xor SC_4(8) xor SC_8(8)                          --E
328
                                             xor SC_2(9) xor SC_8(9) xor TMP_STATE(9)                  --B
329
                                             xor SC_4(10) xor SC_8(10) xor TMP_STATE(10)                  --D
330
                                             xor SC_8(11)             xor TMP_STATE(11);                 --9
331
                  v_RAM_IN0(15 downto 8)  <= SC_8(8)  xor TMP_STATE(8)                              --9
332
                                             xor SC_8(9)  xor SC_4(9) xor SC_2(9)                          --E
333
                                             xor SC_8(10) xor SC_2(10) xor TMP_STATE(10)                  --B
334
                                             xor SC_8(11) xor SC_4(11) xor TMP_STATE(11);                 --D
335
                  v_RAM_IN0(23 downto 16) <= SC_8(8)  xor SC_4(8) xor TMP_STATE(8)                  --D
336
                                             xor SC_8(9)  xor TMP_STATE(9)                              --9
337
                                             xor SC_8(10) xor SC_4(10) xor SC_2(10)                          --E
338
                                             xor SC_8(11) xor SC_2(11) xor TMP_STATE(11);                 --B
339
                  v_RAM_IN0(31 downto 24) <= SC_8(8)  xor SC_2(8) xor TMP_STATE(8)                  --B
340
                                             xor SC_8(9)  xor SC_4(9) xor TMP_STATE(9)                  --D
341
                                             xor SC_8(10) xor TMP_STATE(10)                              --9
342
                                             xor SC_8(11) xor SC_4(11) xor SC_2(11);                         --E
343
               elsif v_CALCULATION_CNTR = x"09" then
344
                  v_RAM_IN0(7 downto 0)   <= SC_2(12) xor SC_4(12) xor SC_8(12)                          --E
345
                                             xor SC_2(13) xor SC_8(13) xor TMP_STATE(13)                  --B
346
                                             xor SC_4(14) xor SC_8(14) xor TMP_STATE(14)                  --D
347
                                             xor SC_8(15)             xor TMP_STATE(15);                 --9
348
                  v_RAM_IN0(15 downto 8)  <= SC_8(12) xor TMP_STATE(12)                              --9
349
                                             xor SC_8(13) xor SC_4(13) xor SC_2(13)                          --E
350
                                             xor SC_8(14) xor SC_2(14) xor TMP_STATE(14)                  --B
351
                                             xor SC_8(15) xor SC_4(15) xor TMP_STATE(15);                 --D
352
                  v_RAM_IN0(23 downto 16) <= SC_8(12) xor SC_4(12) xor TMP_STATE(12)                  --D
353
                                             xor SC_8(13) xor TMP_STATE(13)                              --9
354
                                             xor SC_8(14) xor SC_4(14) xor SC_2(14)                          --E
355
                                             xor SC_8(15) xor SC_2(15) xor TMP_STATE(15);                 --B
356
                  v_RAM_IN0(31 downto 24) <= SC_8(12) xor SC_2(12) xor TMP_STATE(12)                  --B
357
                                             xor SC_8(13) xor SC_4(13) xor TMP_STATE(13)                  --D
358
                                             xor SC_8(14) xor TMP_STATE(14)                              --9
359
                                             xor SC_8(15) xor SC_4(15) xor SC_2(15);                         --E
360
               end if;
361
 
362
            end if;
363
         end if;
364
      end if;
365
   end process;
366
 
367
G0001:
368
for i in 0 to 3 generate
369
   G0002:
370
   for j in 0 to 3 generate
371
      TMP_STATE(i*4+j) <= STATE_TABLE1(i*4+j) xor v_KEY_COLUMN(j*8+7 downto j*8);
372
   end generate;
373
end generate;
374
 
375
-- TMP_STATE(0)  <= STATE_TABLE1(0)  xor v_KEY_COLUMN(7 downto  0);
376
-- TMP_STATE(1)  <= STATE_TABLE1(1)  xor v_KEY_COLUMN(15 downto 8);
377
-- TMP_STATE(2)  <= STATE_TABLE1(2)  xor v_KEY_COLUMN(23 downto 16);
378
-- TMP_STATE(3)  <= STATE_TABLE1(3)  xor v_KEY_COLUMN(31 downto 24);
379
-- TMP_STATE(4)  <= STATE_TABLE1(4)  xor v_KEY_COLUMN(7 downto  0);    
380
-- TMP_STATE(5)  <= STATE_TABLE1(5)  xor v_KEY_COLUMN(15 downto 8);    
381
-- TMP_STATE(6)  <= STATE_TABLE1(6)  xor v_KEY_COLUMN(23 downto 16);   
382
-- TMP_STATE(7)  <= STATE_TABLE1(7)  xor v_KEY_COLUMN(31 downto 24);
383
-- TMP_STATE(8)  <= STATE_TABLE1(8)  xor v_KEY_COLUMN(7 downto  0);    
384
-- TMP_STATE(9)  <= STATE_TABLE1(9)  xor v_KEY_COLUMN(15 downto 8);    
385
-- TMP_STATE(10) <= STATE_TABLE1(10) xor v_KEY_COLUMN(23 downto 16);   
386
-- TMP_STATE(11) <= STATE_TABLE1(11) xor v_KEY_COLUMN(31 downto 24);
387
-- TMP_STATE(12) <= STATE_TABLE1(12) xor v_KEY_COLUMN(7 downto  0);    
388
-- TMP_STATE(13) <= STATE_TABLE1(13) xor v_KEY_COLUMN(15 downto 8);    
389
-- TMP_STATE(14) <= STATE_TABLE1(14) xor v_KEY_COLUMN(23 downto 16);   
390
-- TMP_STATE(15) <= STATE_TABLE1(15) xor v_KEY_COLUMN(31 downto 24);
391
 
392
 
393
G0000:
394
for i in 0 to 15 generate
395
 
396
   SC_2(i) <= (x"1B" xor (TMP_STATE(i)(6 downto 0) & "0")) when TMP_STATE(i)(7) = '1' else (TMP_STATE(i)(6 downto 0) & "0");
397
   SC_4(i) <= (x"1B" xor (SC_2(i)(6 downto 0) & "0")) when SC_2(i)(7) = '1' else (SC_2(i)(6 downto 0) & "0");
398
   SC_8(i) <= (x"1B" xor (SC_4(i)(6 downto 0) & "0")) when SC_4(i)(7) = '1' else (SC_4(i)(6 downto 0) & "0");
399
 
400
end generate;
401
 
402
--****************************************************************************--
403
--* CALCULATION                                                              *--
404
--****************************************************************************--
405
 
406
P0006:
407
   process(CLK_I)
408
   begin
409
      if rising_edge(CLK_I) then
410
         if RESET_I = '1' then
411
            CALCULATION <= '0';
412
         elsif CE_I = '1' then
413
 
414
            if FF_VALID_DATA = '1' and VALID_DATA_I = '0' then
415
               CALCULATION <= '1';
416
            elsif LAST_ROUND = '1' and v_CALCULATION_CNTR = x"16" then
417
               CALCULATION <= '0';
418
            end if;
419
 
420
         end if;
421
      end if;
422
   end process;
423
 
424
P0007:
425
   process(CLK_I)
426
   begin
427
      if rising_edge(CLK_I) then
428
         if RESET_I = '1' then
429
            v_CALCULATION_CNTR <= (others => '0');
430
            LAST_ROUND <= '0';
431
            i_ROUND <= 0;
432
         elsif CE_I = '1' then
433
            if CALCULATION = '1' then
434
               if v_CALCULATION_CNTR = x"09" and LAST_ROUND = '0' then
435
                  v_CALCULATION_CNTR <= (others => '0');
436
                  i_ROUND <= i_ROUND + 1;
437
 
438
                  if i_ROUND = i_MAX_ROUND then
439
                     LAST_ROUND <= '1';
440
                  end if;
441
               elsif v_CALCULATION_CNTR = x"16" and LAST_ROUND = '1' then
442
                  v_CALCULATION_CNTR <= (others => '0');
443
                  i_ROUND <= i_ROUND + 1;
444
 
445
               else
446
                  v_CALCULATION_CNTR <= v_CALCULATION_CNTR + 1;
447
               end if;
448
            else
449
               v_CALCULATION_CNTR <= (others => '0');
450
               i_ROUND <= 0;
451
               LAST_ROUND <= '0';
452
            end if;
453
         end if;
454
      end if;
455
   end process;
456
 
457
--****************************************************************************--
458
--* STATE_TABLE1                                                             *--
459
--****************************************************************************--
460
 
461
P0008:
462
   process (CLK_I)
463
   begin
464
      if rising_edge(CLK_I) then
465
         -- InvShiftRows
466
         if v_CALCULATION_CNTR = x"02" then
467
            STATE_TABLE1(0)   <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(7 downto 0)));
468
            STATE_TABLE1(5)   <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(15 downto 8)));
469
            STATE_TABLE1(10)  <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(23 downto 16)));
470
            STATE_TABLE1(15)  <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(31 downto 24)));
471
         elsif v_CALCULATION_CNTR = x"03" then
472
            STATE_TABLE1(4)   <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(7 downto 0)));
473
            STATE_TABLE1(9)   <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(15 downto 8)));
474
            STATE_TABLE1(14)  <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(23 downto 16)));
475
            STATE_TABLE1(3)   <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(31 downto 24)));
476
         elsif v_CALCULATION_CNTR = x"04" then
477
            STATE_TABLE1(8)   <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(7 downto 0)));
478
            STATE_TABLE1(13)  <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(15 downto 8)));
479
            STATE_TABLE1(2)   <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(23 downto 16)));
480
            STATE_TABLE1(7)   <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(31 downto 24)));
481
         elsif v_CALCULATION_CNTR = x"05" then
482
            STATE_TABLE1(12)  <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(7 downto 0)));
483
            STATE_TABLE1(1)   <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(15 downto 8)));
484
            STATE_TABLE1(6)   <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(23 downto 16)));
485
            STATE_TABLE1(11)  <= rom_INV_SBOX(conv_integer(v_RAM_OUT0(31 downto 24)));
486
         end if;
487
 
488
         if LAST_ROUND = '1' then
489
 
490
            if v_CALCULATION_CNTR = x"06" then
491
 
492
               STATE_TABLE1(0)   <= v_KEY_COLUMN(7 downto 0)   xor STATE_TABLE1(0);
493
               STATE_TABLE1(1)   <= v_KEY_COLUMN(15 downto 8)  xor STATE_TABLE1(1);
494
               STATE_TABLE1(2)   <= v_KEY_COLUMN(23 downto 16) xor STATE_TABLE1(2);
495
               STATE_TABLE1(3)   <= v_KEY_COLUMN(31 downto 24) xor STATE_TABLE1(3);
496
            elsif v_CALCULATION_CNTR = x"07" then
497
               DATA_O   <= STATE_TABLE1(0);
498
               VALID_O  <= '1';
499
 
500
               STATE_TABLE1(4)   <= v_KEY_COLUMN(7 downto 0)   xor STATE_TABLE1(4);
501
               STATE_TABLE1(5)   <= v_KEY_COLUMN(15 downto 8)  xor STATE_TABLE1(5);
502
               STATE_TABLE1(6)   <= v_KEY_COLUMN(23 downto 16) xor STATE_TABLE1(6);
503
               STATE_TABLE1(7)   <= v_KEY_COLUMN(31 downto 24) xor STATE_TABLE1(7);
504
            elsif v_CALCULATION_CNTR = x"08" then
505
               DATA_O   <= STATE_TABLE1(1);
506
               VALID_O  <= '1';
507
 
508
               STATE_TABLE1(8)   <= v_KEY_COLUMN(7 downto 0)   xor STATE_TABLE1(8);
509
               STATE_TABLE1(9)   <= v_KEY_COLUMN(15 downto 8)  xor STATE_TABLE1(9);
510
               STATE_TABLE1(10)  <= v_KEY_COLUMN(23 downto 16) xor STATE_TABLE1(10);
511
               STATE_TABLE1(11)  <= v_KEY_COLUMN(31 downto 24) xor STATE_TABLE1(11);
512
            elsif v_CALCULATION_CNTR = x"09" then
513
               DATA_O   <= STATE_TABLE1(2);
514
               VALID_O  <= '1';
515
 
516
               STATE_TABLE1(12)  <= v_KEY_COLUMN(7 downto 0)   xor STATE_TABLE1(12);
517
               STATE_TABLE1(13)  <= v_KEY_COLUMN(15 downto 8)  xor STATE_TABLE1(13);
518
               STATE_TABLE1(14)  <= v_KEY_COLUMN(23 downto 16) xor STATE_TABLE1(14);
519
               STATE_TABLE1(15)  <= v_KEY_COLUMN(31 downto 24) xor STATE_TABLE1(15);
520
            elsif v_CALCULATION_CNTR = x"0A" then
521
               DATA_O   <= STATE_TABLE1(3);
522
               VALID_O  <= '1';
523
            elsif v_CALCULATION_CNTR = x"0B" then
524
               DATA_O   <= STATE_TABLE1(4);
525
               VALID_O  <= '1';
526
            elsif v_CALCULATION_CNTR = x"0C" then
527
               DATA_O   <= STATE_TABLE1(5);
528
               VALID_O  <= '1';
529
            elsif v_CALCULATION_CNTR = x"0D" then
530
               DATA_O   <= STATE_TABLE1(6);
531
               VALID_O  <= '1';
532
            elsif v_CALCULATION_CNTR = x"0E" then
533
               DATA_O   <= STATE_TABLE1(7);
534
               VALID_O  <= '1';
535
            elsif v_CALCULATION_CNTR = x"0F" then
536
               DATA_O   <= STATE_TABLE1(8);
537
               VALID_O  <= '1';
538
            elsif v_CALCULATION_CNTR = x"10" then
539
               DATA_O   <= STATE_TABLE1(9);
540
               VALID_O  <= '1';
541
            elsif v_CALCULATION_CNTR = x"11" then
542
               DATA_O   <= STATE_TABLE1(10);
543
               VALID_O  <= '1';
544
            elsif v_CALCULATION_CNTR = x"12" then
545
               DATA_O   <= STATE_TABLE1(11);
546
               VALID_O  <= '1';
547
            elsif v_CALCULATION_CNTR = x"13" then
548
               DATA_O   <= STATE_TABLE1(12);
549
               VALID_O  <= '1';
550
            elsif v_CALCULATION_CNTR = x"14" then
551
               DATA_O   <= STATE_TABLE1(13);
552
               VALID_O  <= '1';
553
            elsif v_CALCULATION_CNTR = x"15" then
554
               DATA_O   <= STATE_TABLE1(14);
555
               VALID_O  <= '1';
556
            elsif v_CALCULATION_CNTR = x"16" then
557
               DATA_O   <= STATE_TABLE1(15);
558
               VALID_O  <= '1';
559
            else
560
               DATA_O   <= x"00";
561
               VALID_O  <= '0';
562
            end if;
563
         else
564
            VALID_O  <= '0';
565
         end if;
566
 
567
      end if;
568
   end process;
569
 
570
end Behavioral;

powered by: WebSVN 2.1.0

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