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

Subversion Repositories aes_highthroughput_lowarea

[/] [aes_highthroughput_lowarea/] [trunk/] [verilog/] [rtl/] [mix_columns.v] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 motilito
//---------------------------------------------------------------------------------------
2
//
3
//      mix_columns modules file (converted from mix_columns functions)
4
//
5
//      Description:
6
//              This file includes all functions implemented in the mix_columns.v original file 
7
//              but implemented as modules. 
8
//
9
//  Author(s):
10
//      - Moti Litochevski
11
//
12
//---------------------------------------------------------------------------------------
13
 
14
// (multiply 2)
15
module xtimes (
16
        in, out
17
);
18
 
19
input   [7:0]    in;
20
output  [7:0]    out;
21
 
22
wire [3:0] xt;
23
 
24
assign xt[3] = in[7];
25
assign xt[2] = in[7];
26
assign xt[1] = 1'b0;
27
assign xt[0] = in[7];
28
 
29
assign out[7:5] = in[6:4];
30
assign out[4:1] = xt[3:0] ^ in[3:0];
31
assign out[0]   = in[7];
32
 
33
endmodule
34
//---------------------------------------------------------------------------------------
35
// multiply 3
36
module MUL3 (
37
        in, out
38
);
39
 
40
input   [7:0]    in;
41
output  [7:0]    out;
42
 
43
wire [7:0] xt;
44
 
45
xtimes xt_u (.in(in), .out(xt));
46
 
47
assign out = xt ^ in;
48
 
49
endmodule
50
//---------------------------------------------------------------------------------------
51
// multiply E
52
module MULE (
53
        in, out
54
);
55
 
56
input   [7:0]    in;
57
output  [7:0]    out;
58
 
59
wire [7:0] xt1, xt2, xt3;
60
 
61
xtimes xt_u1 (.in(in), .out(xt1));
62
xtimes xt_u2 (.in(xt1), .out(xt2));
63
xtimes xt_u3 (.in(xt2), .out(xt3));
64
 
65
assign out = xt3 ^ xt2 ^ xt1;
66
 
67
endmodule
68
//---------------------------------------------------------------------------------------
69
// multiply B
70
module MULB (
71
        in, out
72
);
73
 
74
input   [7:0]    in;
75
output  [7:0]    out;
76
 
77
wire [7:0] xt1, xt2, xt3;
78
 
79
xtimes xt_u1 (.in(in), .out(xt1));
80
xtimes xt_u2 (.in(xt1), .out(xt2));
81
xtimes xt_u3 (.in(xt2), .out(xt3));
82
 
83
assign out = xt3 ^ xt1 ^ in;
84
 
85
endmodule
86
//---------------------------------------------------------------------------------------
87
// multiply D
88
module MULD (
89
        in, out
90
);
91
 
92
input   [7:0]    in;
93
output  [7:0]    out;
94
 
95
wire [7:0] xt1, xt2, xt3;
96
 
97
xtimes xt_u1 (.in(in), .out(xt1));
98
xtimes xt_u2 (.in(xt1), .out(xt2));
99
xtimes xt_u3 (.in(xt2), .out(xt3));
100
 
101
assign out = xt3 ^ xt2 ^ in;
102
 
103
endmodule
104
//---------------------------------------------------------------------------------------
105
// multiply 9
106
module MUL9 (
107
        in, out
108
);
109
 
110
input   [7:0]    in;
111
output  [7:0]    out;
112
 
113
wire [7:0] xt1, xt2, xt3;
114
 
115
xtimes xt_u1 (.in(in), .out(xt1));
116
xtimes xt_u2 (.in(xt1), .out(xt2));
117
xtimes xt_u3 (.in(xt2), .out(xt3));
118
 
119
assign out = xt3 ^ in;
120
 
121
endmodule
122
//---------------------------------------------------------------------------------------
123
module byte_mix_columns (
124
        a, b, c, d, out
125
);
126
 
127
input   [7:0]    a, b, c, d;
128
output  [7:0]    out;
129
 
130
wire [7:0] mul2, mul3;
131
 
132
xtimes xt_u (.in(a), .out(mul2));
133
MUL3 mul3_u (.in(b), .out(mul3));
134
 
135
assign out = mul2 ^ mul3 ^ c ^ d;
136
 
137
endmodule
138
//---------------------------------------------------------------------------------------
139
module inv_byte_mix_columns (
140
        a, b, c, d, out
141
);
142
 
143
input   [7:0]    a, b, c, d;
144
output  [7:0]    out;
145
 
146
wire [7:0] mule, mulb, muld, mul9;
147
 
148
MULE mule_u (.in(a), .out(mule));
149
MULB mulb_u (.in(b), .out(mulb));
150
MULD muld_u (.in(c), .out(muld));
151
MUL9 mul9_u (.in(d), .out(mul9));
152
 
153
assign out = mule ^ mulb ^ muld ^ mul9;
154
 
155
endmodule
156
//---------------------------------------------------------------------------------------
157
// Mix Columns for encryption word
158
module word_mix_columns (
159
        in, out
160
);
161
 
162
input   [31:0]   in;
163
output  [31:0]   out;
164
 
165
wire [7:0] si0,si1,si2,si3;
166
wire [7:0] so0,so1,so2,so3;
167
 
168
assign si0[7:0] = in[31:24];
169
assign si1[7:0] = in[23:16];
170
assign si2[7:0] = in[15:8];
171
assign si3[7:0] = in[7:0];
172
 
173
byte_mix_columns so0_u (.a(si0), .b(si1), .c(si2), .d(si3), .out(so0));
174
byte_mix_columns so1_u (.a(si1), .b(si2), .c(si3), .d(si0), .out(so1));
175
byte_mix_columns so2_u (.a(si2), .b(si3), .c(si0), .d(si1), .out(so2));
176
byte_mix_columns so3_u (.a(si3), .b(si0), .c(si1), .d(si2), .out(so3));
177
 
178
assign out = {so0, so1, so2, so3};
179
 
180
endmodule
181
//---------------------------------------------------------------------------------------
182
// inverse Mix Columns for decryption word
183
module inv_word_mix_columns (
184
        in, out
185
);
186
 
187
input   [31:0]   in;
188
output  [31:0]   out;
189
 
190
wire [7:0] si0,si1,si2,si3;
191
wire [7:0] so0,so1,so2,so3;
192
 
193
assign si0 = in[31:24];
194
assign si1 = in[23:16];
195
assign si2 = in[15:8];
196
assign si3 = in[7:0];
197
 
198
inv_byte_mix_columns so0_u (.a(si0), .b(si1), .c(si2), .d(si3), .out(so0));
199
inv_byte_mix_columns so1_u (.a(si1), .b(si2), .c(si3), .d(si0), .out(so1));
200
inv_byte_mix_columns so2_u (.a(si2), .b(si3), .c(si0), .d(si1), .out(so2));
201
inv_byte_mix_columns so3_u (.a(si3), .b(si0), .c(si1), .d(si2), .out(so3));
202
 
203
assign out = {so0, so1, so2, so3};
204
 
205
endmodule
206
//---------------------------------------------------------------------------------------
207
// Mix columns size: 4 words
208
module mix_columns (
209
        in, out
210
);
211
 
212
input   [127:0]  in;
213
output  [127:0]  out;
214
 
215
wire [31:0] so0,so1,so2,so3;
216
 
217
word_mix_columns so0_u (.in(in[127:96]), .out(so0));
218
word_mix_columns so1_u (.in(in[95:64]),  .out(so1));
219
word_mix_columns so2_u (.in(in[63:32]),  .out(so2));
220
word_mix_columns so3_u (.in(in[31:0]),   .out(so3));
221
 
222
assign out = {so0, so1, so2, so3};
223
 
224
endmodule
225
//---------------------------------------------------------------------------------------
226
// Inverse Mix columns size: 4 words
227
module inv_mix_columns (
228
        in, out
229
);
230
 
231
input   [127:0]  in;
232
output  [127:0]  out;
233
 
234
wire [31:0] so0,so1,so2,so3;
235
 
236
inv_word_mix_columns so0_u (.in(in[127:96]), .out(so0));
237
inv_word_mix_columns so1_u (.in(in[95:64]),  .out(so1));
238
inv_word_mix_columns so2_u (.in(in[63:32]),  .out(so2));
239
inv_word_mix_columns so3_u (.in(in[31:0]),   .out(so3));
240
 
241
assign out = {so0, so1, so2, so3};
242
 
243
endmodule
244
//---------------------------------------------------------------------------------------

powered by: WebSVN 2.1.0

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