`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 19:58:50 04/23/2009
// Design Name:
// Module Name: AES
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module AES(clk,key,dataout,datain,contral,contral1
);
input clk,contral,contral1;
input[127:0] key;
input[127:0] datain;
output[7:0] dataout;
reg[7:0] s_box[0:255];
reg[7:0] keyexp[0:175];
reg[7:0] dataout;
reg[7:0] temp1,temp2,temp3,temp4;
reg[7:0] state[15:0];
reg[7:0] Xtime2Sbox[0:255];
reg[7:0] i,j,m;
parameter rcon1='h01,
rcon2='h02,
rcon3='h04,
rcon4='h08,
rcon5='h10,
rcon6='h20,
rcon7='h40,
rcon8='h80,
rcon9='h1b,
rcon10='h36;
initial
begin
i=0;
m=0;
j=0;
Xtime2Sbox[0]=8'h00; Xtime2Sbox[1]=8'h02; Xtime2Sbox[2]=8'h04; Xtime2Sbox[3]=8'h06;
Xtime2Sbox[4]=8'h08; Xtime2Sbox[5]=8'h0a; Xtime2Sbox[6]=8'h0c; Xtime2Sbox[7]=8'h0e; /* X = 0 */
Xtime2Sbox[8]=8'h10; Xtime2Sbox[9]=8'h12; Xtime2Sbox[10]=8'h14; Xtime2Sbox[11]=8'h16;
Xtime2Sbox[12]=8'h18; Xtime2Sbox[13]=8'h1a; Xtime2Sbox[14]=8'h1c; Xtime2Sbox[15]=8'h1e;
Xtime2Sbox[16]=8'h20; Xtime2Sbox[17]=8'h22; Xtime2Sbox[18]=8'h24; Xtime2Sbox[19]=8'h26;
Xtime2Sbox[20]=8'h28; Xtime2Sbox[21]=8'h2a; Xtime2Sbox[22]=8'h2c; Xtime2Sbox[23]=8'h2e; /* X = 1 */
Xtime2Sbox[24]=8'h30; Xtime2Sbox[25]=8'h32; Xtime2Sbox[26]=8'h34; Xtime2Sbox[27]=8'h36;
Xtime2Sbox[28]=8'h38; Xtime2Sbox[29]=8'h3a; Xtime2Sbox[30]=8'h3c; Xtime2Sbox[31]=8'h3e;
Xtime2Sbox[32]=8'h40; Xtime2Sbox[33]=8'h42; Xtime2Sbox[34]=8'h44; Xtime2Sbox[35]=8'h46;
Xtime2Sbox[36]=8'h48; Xtime2Sbox[37]=8'h4a; Xtime2Sbox[38]=8'h4c; Xtime2Sbox[39]=8'h4e; /* X = 2 */
Xtime2Sbox[40]=8'h50; Xtime2Sbox[41]=8'h52; Xtime2Sbox[42]=8'h54; Xtime2Sbox[43]=8'h56;
Xtime2Sbox[44]=8'h58; Xtime2Sbox[45]=8'h5a; Xtime2Sbox[46]=8'h5c; Xtime2Sbox[47]=8'h5e;
Xtime2Sbox[48]=8'h60; Xtime2Sbox[49]=8'h62; Xtime2Sbox[50]=8'h64; Xtime2Sbox[51]=8'h66;
Xtime2Sbox[52]=8'h68; Xtime2Sbox[53]=8'h6a; Xtime2Sbox[54]=8'h6c; Xtime2Sbox[55]=8'h6e; /* X = 3*/
Xtime2Sbox[56]=8'h70; Xtime2Sbox[57]=8'h72; Xtime2Sbox[58]=8'h74; Xtime2Sbox[59]=8'h76;
Xtime2Sbox[60]=8'h78; Xtime2Sbox[61]=8'h7a; Xtime2Sbox[62]=8'h7c; Xtime2Sbox[63]=8'h7e;
Xtime2Sbox[64]=8'h80; Xtime2Sbox[65]=8'h82; Xtime2Sbox[66]=8'h84; Xtime2Sbox[67]=8'h86;
Xtime2Sbox[68]=8'h88; Xtime2Sbox[69]=8'h8a; Xtime2Sbox[70]=8'h8c; Xtime2Sbox[71]=8'h8e; /* X = 4 */
Xtime2Sbox[72]=8'h90; Xtime2Sbox[73]=8'h92; Xtime2Sbox[74]=8'h94; Xtime2Sbox[75]=8'h96;
Xtime2Sbox[76]=8'h98; Xtime2Sbox[77]=8'h9a; Xtime2Sbox[78]=8'h9c; Xtime2Sbox[79]=8'h9e;
Xtime2Sbox[80]=8'ha0; Xtime2Sbox[81]=8'ha2; Xtime2Sbox[82]=8'ha4; Xtime2Sbox[83]=8'ha6;
Xtime2Sbox[84]=8'ha8; Xtime2Sbox[85]=8'haa; Xtime2Sbox[86]=8'hac; Xtime2Sbox[87]=8'hae; /* X = 5 */
Xtime2Sbox[88]=8'hb0; Xtime2Sbox[89]=8'hb2; Xtime2Sbox[90]=8'hb4; Xtime2Sbox[91]=8'hb6;
Xtime2Sbox[92]=8'hb8; Xtime2Sbox[93]=8'hba; Xtime2Sbox[94]=8'hbc; Xtime2Sbox[95]=8'hbe;
Xtime2Sbox[96]=8'hc0; Xtime2Sbox[97]=8'hc2; Xtime2Sbox[98]=8'hc4; Xtime2Sbox[99]=8'hc6;
Xtime2Sbox[100]=8'hc8; Xtime2Sbox[101]=8'hca; Xtime2Sbox[102]=8'hcc; Xtime2Sbox[103]=8'hce;
Xtime2Sbox[104]=8'hd0; Xtime2Sbox[105]=8'hd2; Xtime2Sbox[106]=8'hd4; Xtime2Sbox[107]=8'hd6; /* X = 6 */
Xtime2Sbox[108]=8'hd8; Xtime2Sbox[109]=8'hda; Xtime2Sbox[110]=8'hdc; Xtime2Sbox[111]=8'hde;
Xtime2Sbox[112]=8'he0; Xtime2Sbox[113]=8'he2; Xtime2Sbox[114]=8'he4; Xtime2Sbox[115]=8'he6;
Xtime2Sbox[116]=8'he8; Xtime2Sbox[117]=8'hea; Xtime2Sbox[118]=8'hec; Xtime2Sbox[119]=8'hee; /* X = 7 */
Xtime2Sbox[120]=8'hf0; Xtime2Sbox[121]=8'hf2; Xtime2Sbox[122]=8'hf4; Xtime2Sbox[123]=8'hf6;
Xtime2Sbox[124]=8'hf8; Xtime2Sbox[125]=8'hfa; Xtime2Sbox[126]=8'hfc; Xtime2Sbox[127]=8'hfe;
Xtime2Sbox[128]=8'h1b; Xtime2Sbox[129]=8'h19; Xtime2Sbox[130]=8'h1f; Xtime2Sbox[131]=8'h1d;
Xtime2Sbox[132]=8'h13; Xtime2Sbox[133]=8'h11; Xtime2Sbox[134]=8'h17; Xtime2Sbox[135]=8'h15; /* X = 8 */
Xtime2Sbox[136]=8'h0b; Xtime2Sbox[137]=8'h09; Xtime2Sbox[138]=8'h0f; Xtime2Sbox[139]=8'h0d;
Xtime2Sbox[140]=8'h03; Xtime2Sbox[141]=8'h01; Xtime2Sbox[142]=8'h07; Xtime2Sbox[143]=8'h05;
Xtime2Sbox[144]=8'h3b; Xtime2Sbox[145]=8'h39; Xtime2Sbox[146]=8'h3f; Xtime2Sbox[147]=8'h3d;
Xtime2Sbox[148]=8'h33; Xtime2Sbox[149]=8'h31; Xtime2Sbox[150]=8'h37; Xtime2Sbox[151]=8'h35; /* X = 9 */
Xtime2Sbox[152]=8'h2b; Xtime2Sbox[153]=8'h29; Xtime2Sbox[154]=8'h2f; Xtime2Sbox[155]=8'h2d;
Xtime2Sbox[156]=8'h23; Xtime2Sbox[157]=8'h21; Xtime2Sbox[158]=8'h27; Xtime2Sbox[159]=8'h25;
Xtime2Sbox[160]=8'h5b; Xtime2Sbox[161]=8'h59; Xtime2Sbox[162]=8'h5f; Xtime2Sbox[163]=8'h5d;
Xtime2Sbox[164]=8'h53; Xtime2Sbox[165]=8'h51; Xtime2Sbox[166]=8'h57; Xtime2Sbox[167]=8'h55;
Xtime2Sbox[168]=8'h4b; Xtime2Sbox[169]=8'h49; Xtime2Sbox[170]=8'h4f; Xtime2Sbox[171]=8'h4d; /* X = 10 */
Xtime2Sbox[172]=8'h43; Xtime2Sbox[173]=8'h41; Xtime2Sbox[174]=8'h47; Xtime2Sbox[175]=8'h45;
Xtime2Sbox[176]=8'h7b; Xtime2Sbox[177]=8'h79; Xtime2Sbox[178]=8'h7f; Xtime2Sbox[179]=8'h7d;
Xtime2Sbox[180]=8'h73; Xtime2Sbox[181]=8'h71; Xtime2Sbox[182]=8'h77; Xtime2Sbox[183]=8'h75; /* X = 11 */
Xtime2Sbox[184]=8'h6b; Xtime2Sbox[185]=8'h69; Xtime2Sbox[186]=8'h6f; Xtime2Sbox[187]=8'h6d;
Xtime2Sbox[188]=8'h63; Xtime2Sbox[189]=8'h61; Xtime2Sbox[190]=8'h67; Xtime2Sbox[191]=8'h65;
Xtime2Sbox[192]=8'h9b; Xtime2Sbox[193]=8'h99; Xtime2Sbox[194]=8'h9f; Xtime2Sbox[195]=8'h9d;
Xtime2Sbox[196]=8'h93; Xtime2Sbox[197]=8'h91; Xtime2Sbox[198]=8'h97; Xtime2Sbox[199]=8'h95;
Xtime2Sbox[200]=8'h8b; Xtime2Sbox[201]=8'h89; Xtime2Sbox[202]=8'h8f; Xtime2Sbox[203]=8'h8d; /* X =12 */
Xtime2Sbox[204]=8'h83; Xtime2Sbox[205]=8'h81; Xtime2Sbox[206]=8'h87; Xtime2Sbox[207]=8'h85;
Xtime2Sbox[208]=8'hbb; Xtime2Sbox[209]=8'hb9; Xtime2Sbox[210]=8'hbf; Xtime2Sbox[211]=8'hbd;
Xtime2Sbox[212]=8'hb3; Xtime2Sbox[213]=8'hb1; Xtime2Sbox[214]=8'hb7; Xtime2Sbox[215]=8'hb5;
Xtime2Sbox[216]=8'hab; Xtime2Sbox[217]=8'ha9; Xtime2Sbox[218]=8'haf; Xtime2Sbox[219]=8'had; /* X = 13 */
Xtime2Sbox[220]=8'ha3; Xtime2Sbox[221]=8'ha1; Xtime2Sbox[222]=8'ha7; Xtime2Sbox[223]=8'ha5;
Xtime2Sbox[224]=8'hdb; Xtime2Sbox[225]=8'hd9; Xtime2Sbox[226]=8'hdf; Xtime2Sbox[227]=8'hdd;
Xtime2Sbox[228]=8'hd3; Xtime2Sbox[229]=8'hd1; Xtime2Sbox[230]=8'hd7; Xtime2Sbox[231]=8'hd5;
Xtime2Sbox[232]=8'hcb; Xtime2Sbox[233]=8'hc9; Xtime2Sbox[234]=8'hcf; Xtime2Sbox[235]=8'hcd; /* X = 14 */
Xtime2Sbox[236]=8'hc3; Xtime2Sbox[237]=8'hc1; Xtime2Sbox[238]=8'hc7; Xtime2Sbox[239]=8'hc5;
Xtime2Sbox[240]=8'hfb; Xtime2Sbox[241]=8'hf9; Xtime2Sbox[242]=8'hff; Xtime2Sbox[243]=8'hfd;
Xtime2Sbox[244]=8'hf3; Xtime2Sbox[245]=8'hf1; Xtime2Sbox[246]=8'hf7; Xtime2Sbox[247]=8'hf5; /* X = 15 */
Xtime2Sbox[248]=8'heb; Xtime2Sbox[249]=8'he9; Xtime2Sbox[250]=8'hef; Xtime2Sbox[251]=8'hed;
Xtime2Sbox[252]=8'he3; Xtime2Sbox[253]=8'he1; Xtime2Sbox[254]=8'he7; Xtime2Sbox[255]=8'he5;
/* S BOX */
s_box[0]=8'h63; s_box[1]=8'h7C; s_box[2]=8'h77; s_box[3]=8'h7B; /* X = 0 */
s_box[4]=8'hF2; s_box[5]=8'h6B; s_box[6]=8'h6F; s_box[7]=8'hC5;
s_box[8]=8'h30; s_box[9]=8'h01; s_box[10]=8'h67;s_box[11]=8'h2B;
s_box[12]=8'hFE;s_box[13]=8'hD7;s_box[14]=8'hAB;s_box[15]=8'h76;
s_box[16]=8'hCA; s_box[17]=8'h82; s_box[18]=8'hC9; s_box[19]=8'h7D; /* X = 1 */
s_box[20]=8'hFA; s_box[21]=8'h59; s_box[22]=8'h47