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

Subversion Repositories tiny_aes

[/] [tiny_aes/] [trunk/] [rtl/] [aes_256.v] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 homer.hsin
/*
2
 * Copyright 2012, Homer Hsing <homer.hsing@gmail.com>
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 * http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16
 
17
module aes_256 (clk, state, key, out);
18
    input          clk;
19
    input  [127:0] state;
20
    input  [255:0] key;
21
    output [127:0] out;
22
    reg    [127:0] s0;
23
    reg    [255:0] k0, k0a, k1;
24
    wire   [127:0] s1, s2, s3, s4, s5, s6, s7, s8,
25
                   s9, s10, s11, s12, s13;
26
    wire   [255:0] k2, k3, k4, k5, k6, k7, k8,
27
                   k9, k10, k11, k12, k13;
28
    wire   [127:0] k0b, k1b, k2b, k3b, k4b, k5b, k6b, k7b, k8b,
29
                   k9b, k10b, k11b, k12b, k13b;
30
 
31
    always @ (posedge clk)
32
      begin
33
        s0 <= state ^ key[255:128];
34
        k0 <= key;
35
        k0a <= k0;
36
        k1 <= k0a;
37
      end
38
 
39
    assign k0b = k0a[127:0];
40
 
41
    expand_key_type_A_256
42
        a1 (clk, k1, 8'h1, k2, k1b),
43
        a3 (clk, k3, 8'h2, k4, k3b),
44
        a5 (clk, k5, 8'h4, k6, k5b),
45
        a7 (clk, k7, 8'h8, k8, k7b),
46
        a9 (clk, k9, 8'h10, k10, k9b),
47
        a11 (clk, k11, 8'h20, k12, k11b),
48
        a13 (clk, k13, 8'h40,    , k13b);
49
 
50
    expand_key_type_B_256
51
        a2 (clk, k2, k3, k2b),
52
        a4 (clk, k4, k5, k4b),
53
        a6 (clk, k6, k7, k6b),
54
        a8 (clk, k8, k9, k8b),
55
        a10 (clk, k10, k11, k10b),
56
        a12 (clk, k12, k13, k12b);
57
 
58 6 homer.hsin
    one_round
59
         r1 (clk, s0, k0b, s1),
60
         r2 (clk, s1, k1b, s2),
61
         r3 (clk, s2, k2b, s3),
62
         r4 (clk, s3, k3b, s4),
63
         r5 (clk, s4, k4b, s5),
64
         r6 (clk, s5, k5b, s6),
65
         r7 (clk, s6, k6b, s7),
66
         r8 (clk, s7, k7b, s8),
67
         r9 (clk, s8, k8b, s9),
68
        r10 (clk, s9, k9b, s10),
69
        r11 (clk, s10, k10b, s11),
70
        r12 (clk, s11, k11b, s12),
71
        r13 (clk, s12, k12b, s13);
72
 
73
    final_round
74 5 homer.hsin
        rf (clk, s13, k13b, out);
75
endmodule
76
 
77
/* expand k0,k1,k2,k3 for every two clock cycles */
78
module expand_key_type_A_256 (clk, in, rcon, out_1, out_2);
79
    input              clk;
80
    input      [255:0] in;
81
    input      [7:0]   rcon;
82
    output reg [255:0] out_1;
83
    output     [127:0] out_2;
84
    wire       [31:0]  k0, k1, k2, k3, k4, k5, k6, k7,
85
                       v0, v1, v2, v3;
86
    reg        [31:0]  k0a, k1a, k2a, k3a, k4a, k5a, k6a, k7a;
87
    wire       [31:0]  k0b, k1b, k2b, k3b, k4b, k5b, k6b, k7b, k8a;
88
 
89
    assign {k0, k1, k2, k3, k4, k5, k6, k7} = in;
90
 
91
    assign v0 = {k0[31:24] ^ rcon, k0[23:0]};
92
    assign v1 = v0 ^ k1;
93
    assign v2 = v1 ^ k2;
94
    assign v3 = v2 ^ k3;
95
 
96
    always @ (posedge clk)
97
        {k0a, k1a, k2a, k3a, k4a, k5a, k6a, k7a} <= {v0, v1, v2, v3, k4, k5, k6, k7};
98
 
99
    S4
100
        S4_0 (clk, {k7[23:0], k7[31:24]}, k8a);
101
 
102
    assign k0b = k0a ^ k8a;
103
    assign k1b = k1a ^ k8a;
104
    assign k2b = k2a ^ k8a;
105
    assign k3b = k3a ^ k8a;
106
    assign {k4b, k5b, k6b, k7b} = {k4a, k5a, k6a, k7a};
107
 
108
    always @ (posedge clk)
109
        out_1 <= {k0b, k1b, k2b, k3b, k4b, k5b, k6b, k7b};
110
 
111
    assign out_2 = {k0b, k1b, k2b, k3b};
112
endmodule
113
 
114
/* expand k4,k5,k6,k7 for every two clock cycles */
115
module expand_key_type_B_256 (clk, in, out_1, out_2);
116
    input              clk;
117
    input      [255:0] in;
118
    output reg [255:0] out_1;
119
    output     [127:0] out_2;
120
    wire       [31:0]  k0, k1, k2, k3, k4, k5, k6, k7,
121
                       v5, v6, v7;
122
    reg        [31:0]  k0a, k1a, k2a, k3a, k4a, k5a, k6a, k7a;
123
    wire       [31:0]  k0b, k1b, k2b, k3b, k4b, k5b, k6b, k7b, k8a;
124
 
125
    assign {k0, k1, k2, k3, k4, k5, k6, k7} = in;
126
 
127
    assign v5 = k4 ^ k5;
128
    assign v6 = v5 ^ k6;
129
    assign v7 = v6 ^ k7;
130
 
131
    always @ (posedge clk)
132
        {k0a, k1a, k2a, k3a, k4a, k5a, k6a, k7a} <= {k0, k1, k2, k3, k4, v5, v6, v7};
133
 
134
    S4
135
        S4_0 (clk, k3, k8a);
136
 
137
    assign {k0b, k1b, k2b, k3b} = {k0a, k1a, k2a, k3a};
138
    assign k4b = k4a ^ k8a;
139
    assign k5b = k5a ^ k8a;
140
    assign k6b = k6a ^ k8a;
141
    assign k7b = k7a ^ k8a;
142
 
143
    always @ (posedge clk)
144
        out_1 <= {k0b, k1b, k2b, k3b, k4b, k5b, k6b, k7b};
145
 
146
    assign out_2 = {k4b, k5b, k6b, k7b};
147
endmodule
148
 

powered by: WebSVN 2.1.0

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