顶层代码 `
include "timescale.v"
module aes_top(clk, rst, kld, sel,ld, done, key, text_in, text_out );
input clk, rst;
input kld, ld,sel;
output
done;
input [127:0]
input [127:0]
output
key;
text_in;
text_out;
[127:0]
reg[31:0] wk0, wk1, wk2, wk3;
wire [31:0]
w0, w1, w2, w3;
reg
reg
reg
text_in_r;
text_out;
[127:0]
[127:0]
[31:0] w_k0,w_k1,w_k2,w_k3;
reg
reg
reg
reg
[7:0] sa00, sa01, sa02, sa03;
[7:0] sa10, sa11, sa12, sa13;
[7:0] sa20, sa21, sa22, sa23;
[7:0] sa30, sa31, sa32, sa33;
wire [7:0] sa00_next, sa01_next, sa02_next, sa03_next;
wire [7:0] sa10_next, sa11_next, sa12_next, sa13_next;
wire [7:0] sa20_next, sa21_next, sa22_next, sa23_next;
wire [7:0] sa30_next, sa31_next, sa32_next, sa33_next;
wire [7:0] sa00_sub, sa01_sub, sa02_sub, sa03_sub;
wire [7:0] sa10_sub, sa11_sub, sa12_sub, sa13_sub;
wire [7:0] sa20_sub, sa21_sub, sa22_sub, sa23_sub;
wire [7:0] sa30_sub, sa31_sub, sa32_sub, sa33_sub;
wire [7:0] sa00_sr, sa01_sr, sa02_sr, sa03_sr;
wire [7:0] sa10_sr, sa11_sr, sa12_sr, sa13_sr;
wire [7:0] sa20_sr, sa21_sr, sa22_sr, sa23_sr;
wire [7:0] sa30_sr, sa31_sr, sa32_sr, sa33_sr;
wire [7:0] sa00_ark, sa01_ark, sa02_ark, sa03_ark;
wire [7:0] sa10_ark, sa11_ark, sa12_ark, sa13_ark;
wire [7:0] sa20_ark, sa21_ark, sa22_ark, sa23_ark;
wire [7:0] sa30_ark, sa31_ark, sa32_ark, sa33_ark;
[3:0] dcnt;
ld_r, done;
reg
reg
reg
//shangsheng 'go'
always @(posedge clk)
go=0;
if(!rst)
else
if(sel)
else
if(done)
go <= #1 1'b0;
go <= #1 1'b1;
go <= #1 1'b0;
always @(posedge clk)
if(!rst)
else
if(done)
else
if(ld)
dcnt <= #1 4'h0;
dcnt <= #1 4'h0;
dcnt <= #1 4'h1;
else
if(go)
dcnt <= #1 dcnt + 4'h1;
always @(posedge clk)
done <= #1 (dcnt==4'hb) & !ld;
always @(posedge clk)
//read
if(ld) text_in_r <= #1 text_in;
ld_r <= #1 ld;
sa33 <= #1 ld_r ? text_in_r[007:000] ^ w3[07:00] : sa33_next;
sa23 <= #1 ld_r ? text_in_r[015:008] ^ w3[15:08] : sa23_next;
sa13 <= #1 ld_r ? text_in_r[023:016] ^ w3[23:16] : sa13_next;
sa03 <= #1 ld_r ? text_in_r[031:024] ^ w3[31:24] : sa03_next;
sa32 <= #1 ld_r ? text_in_r[039:032] ^ w2[07:00] : sa32_next;
sa22 <= #1 ld_r ? text_in_r[047:040] ^ w2[15:08] : sa22_next;
sa12 <= #1 ld_r ? text_in_r[055:048] ^ w2[23:16] : sa12_next;
sa02 <= #1 ld_r ? text_in_r[063:056] ^ w2[31:24] : sa02_next;
sa31 <= #1 ld_r ? text_in_r[071:064] ^ w1[07:00] : sa31_next;
sa21 <= #1 ld_r ? text_in_r[079:072] ^ w1[15:08] : sa21_next;
sa11 <= #1 ld_r ? text_in_r[087:080] ^ w1[23:16] : sa11_next;
sa01 <= #1 ld_r ? text_in_r[095:088] ^ w1[31:24] : sa01_next;
sa30 <= #1 ld_r ? text_in_r[103:096] ^ w0[07:00] : sa30_next;
sa20 <= #1 ld_r ? text_in_r[111:104] ^ w0[15:08] : sa20_next;
sa10 <= #1 ld_r ? text_in_r[119:112] ^ w0[23:16] : sa10_next;
sa00 <= #1 ld_r ? text_in_r[127:120] ^ w0[31:24] : sa00_next;
always @(posedge clk)
//ld 为 1 时 text_in 与初始密钥异或, ld 为 0 时等于 saxx_next
always @(posedge clk)
always @(posedge clk)
always @(posedge clk)
always @(posedge clk)
always @(posedge clk)
always @(posedge clk)
always @(posedge clk)
always @(posedge clk)
always @(posedge clk)
always @(posedge clk)
always @(posedge clk)
always @(posedge clk)
always @(posedge clk)
always @(posedge clk)
always @(posedge clk)
always @(posedge clk)
// 's' replace and
assign sa00_sr = sa00_sub;
assign sa01_sr = sa01_sub;
assign sa02_sr = sa02_sub;
assign sa03_sr = sa03_sub;
assign sa10_sr = !go ? sa13_sub:sa11_sub;
assign sa11_sr = !go ? sa10_sub:sa12_sub;
assign sa12_sr = !go ? sa11_sub:sa13_sub;
assign sa13_sr = !go ? sa12_sub:sa10_sub;
assign sa20_sr = !go ? sa22_sub:sa22_sub;
assign sa21_sr = !go ? sa23_sub:sa23_sub;
assign sa22_sr = !go ? sa20_sub:sa20_sub;
assign sa23_sr = !go ? sa21_sub:sa21_sub;
assign sa30_sr = !go ? sa31_sub:sa33_sub;
assign sa31_sr = !go ? sa32_sub:sa30_sub;
assign sa32_sr = !go ? sa33_sub:sa31_sub;
assign sa33_sr = !go ? sa30_sub:sa32_sub;
//hun he bian huan
assign {sa00_ark, sa10_ark, sa20_ark, sa30_ark}
inv_mix_col(sa00_sr,sa10_sr,sa20_sr,sa30_sr);
assign {sa01_ark, sa11_ark, sa21_ark, sa31_ark}
inv_mix_col(sa01_sr,sa11_sr,sa21_sr,sa31_sr);
assign {sa02_ark, sa12_ark, sa22_ark, sa32_ark}
inv_mix_col(sa02_sr,sa12_sr,sa22_sr,sa32_sr);
assign {sa03_ark, sa13_ark, sa23_ark, sa33_ark}
inv_mix_col(sa03_sr,sa13_sr,sa23_sr,sa33_sr);
//next cipter
assign sa00_next = go ? sa00_ark ^ w0[31:24]:sa00_ark ^ wk0[31:24];
assign sa01_next = go ? sa01_ark ^ w1[31:24]:sa01_ark ^ wk1[31:24];
assign sa02_next = go ? sa02_ark ^ w2[31:24]:sa02_ark ^ wk2[31:24];
assign sa03_next = go ? sa03_ark ^ w3[31:24]:sa03_ark ^ wk3[31:24];
= go ? mix_col(sa00_sr,sa10_sr,sa20_sr,sa30_sr):
= go ? mix_col(sa01_sr,sa11_sr,sa21_sr,sa31_sr):
= go ? mix_col(sa02_sr,sa12_sr,sa22_sr,sa32_sr):
= go ? mix_col(sa03_sr,sa13_sr,sa23_sr,sa33_sr):
assign sa10_next = go ? sa10_ark ^ w0[23:16]:sa10_ark ^ wk0[23:16];
assign sa11_next = go ? sa11_ark ^ w1[23:16]:sa11_ark ^ wk1[23:16];
assign sa12_next = go ? sa12_ark ^ w2[23:16]:sa12_ark ^ wk2[23:16];
assign sa13_next = go ? sa13_ark ^ w3[23:16]:sa13_ark ^ wk3[23:16];
assign sa20_next = go ? sa20_ark ^ w0[15:08]:sa20_ark ^ wk0[15:08];
assign sa21_next = go ? sa21_ark ^ w1[15:08]:sa21_ark ^ wk1[15:08];
assign sa22_next = go ? sa22_ark ^ w2[15:08]:sa22_ark ^ wk2[15:08];
assign sa23_next = go ? sa23_ark ^ w3[15:08]:sa23_ark ^ wk3[15:08];
assign sa30_next = go ? sa30_ark ^ w0[07:00]:sa30_ark ^ wk0[07:00];
assign sa31_next = go ? sa31_ark ^ w1[07:00]:sa31_ark ^ wk1[07:00];
assign sa32_next = go ? sa32_ark ^ w2[07:00]:sa32_ark ^ wk2[07:00];
assign sa33_next = go ? sa33_ark ^ w3[07:00]:sa33_ark ^ wk3[07:00];
// output
always @(posedge clk) text_out[127:120] <=#1 go ? sa00_sr ^ w0[31:24]:sa00_sr ^ wk0[31:24];
always @(posedge clk) text_out[095:088] <=#1 go ? sa01_sr ^ w1[31:24]:sa01_sr ^ wk1[31:24];
always @(posedge clk) text_out[063:056] <=#1 go ? sa02_sr ^ w2[31:24]:sa02_sr ^ wk2[31:24];
always @(posedge clk) text_out[031:024] <=#1 go ? sa03_sr ^ w3[31:24]:sa03_sr ^ wk3[31:24];
always @(posedge clk) text_out[119:112] <=#1 go ? sa10_sr ^ w0[23:16]:sa10_sr ^ wk0[23:16];
always @(posedge clk) text_out[087:080] <=#1 go ? sa11_sr ^ w1[23:16]:sa11_sr ^ wk1[23:16];
always @(posedge clk) text_out[055:048] <=#1 go ? sa12_sr ^ w2[23:16]:sa12_sr ^ wk2[23:16];
always @(posedge clk) text_out[023:016] <=#1 go ? sa13_sr ^ w3[23:16]:sa13_sr ^ wk3[23:16];
always @(posedge clk) text_out[111:104] <=#1 go ? sa20_sr ^ w0[15:08]:sa20_sr ^ wk0[15:08];
always @(posedge clk) text_out[079:072] <=#1 go ? sa21_sr ^ w1[15:08]:sa21_sr ^ wk1[15:08];
always @(posedge clk) text_out[047:040] <=#1 go ? sa22_sr ^ w2[15:08]:sa22_sr ^ wk2[15:08];
always @(posedge clk) text_out[015:008] <=#1 go ? sa23_sr ^ w3[15:08]:sa23_sr ^ wk3[15:08];
always @(posedge clk) text_out[103:096] <=#1 go ? sa30_sr ^ w0[07:00]:sa30_sr ^ wk0[07:00];
always @(posedge clk) text_out[071:064] <=#1 go ? sa31_sr ^ w1[07:00]:sa31_sr ^ wk1[07:00];
always @(posedge clk) text_out[039:032] <=#1 go ? sa32_sr ^ w2[07:00]:sa32_sr ^ wk2[07:00];
always @(posedge clk) text_out[007:000] <=#1 go ? sa33_sr ^ w3[07:00]:sa33_sr ^ wk3[07:00];
reg
reg
reg
reg
[127:0]
[3:0] kcnt;
kb[10:0];
kdone;
kb_ld;
always @(posedge clk)
kcnt <= #1 4'ha;
if(!rst)
else
if(kld)
else
if(kb_ld) kcnt <= #1 kcnt - 4'h1;
kcnt <= #1 4'ha;
always @(posedge clk)
kb_ld <= #1 1'b0;
if(!rst)
else
if(kld)
else
if(kcnt==4'h0) kb_ld <= #1 1'b0;
kb_ld <= #1 1'b1;
kdone <= #1 (kcnt==4'h0) & !kld;
if(kb_ld) kb[kcnt] <= #1 inv_mix_col(w3, w2, w1, w0);
{w_k3,w_k2,w_k1,w_k0} <= #1 kb[dcnt];
always @(posedge clk)
always @(posedge clk)
always @(posedge clk)
always
{wk3[31:24],wk2[31:24],wk1[31:24],wk0[31:24]}<=inv_mix_col(w_k3[31:24],w_k2[31:24],w_k1[31:24],w_k0
[31:24]);
always
{wk3[23:16],wk2[23:16],wk1[23:16],wk0[23:16]}<=inv_mix_col(w_k3[23:16],w_k2[23:16],w_k1[23:16],w_k0
[23:16]);
@(posedge
@(posedge
clk)
clk)
always
{wk3[15:8],wk2[15:8],wk1[15:8],wk0[15:8]}<=inv_mix_col(w_k3[15:8],w_k2[15:8],w_k1[15:8],w_k0[15:8]);
always
{wk3[7:0],wk2[7:0],wk1[7:0],wk0[7:0]}<=inv_mix_col(w_k3[7:0],w_k2[7:0],w_k1[7:0],w_k0[7:0]);
aes_key_expand_128 u0(
@(posedge
@(posedge
clk)
clk)
.clk(
.kld(
.key(
.wo_0(
.wo_1(
.wo_2(
.wo_3(
clk
kld
key
),
),
),
w0
w1
w2
w3
),
),
),
));
.s(go),
.s(go),
.a( sa00 ),
.a( sa01 ),
sa00_sub ));
sa01_sub ));
.d(
.d(
.d( sa02_sub ));
.d( sa03_sub ));
.d( sa10_sub ));
.d( sa11_sub ));
.d( sa12_sub ));
.d( sa13_sub ));
.d( sa20_sub ));
.d( sa21_sub ));
.d( sa22_sub ));
.d( sa23_sub ));
.d( sa30_sub ));
.d( sa31_sub ));
.d( sa32_sub ));
.d( sa33_sub ));
//逆 s 盒代替
sbox us00(
sbox us01(
sbox us02( .s(go), .a( sa02 ),
sbox us03( .s(go), .a( sa03 ),
sbox us10( .s(go), .a( sa10 ),
sbox us11( .s(go), .a( sa11 ),
sbox us12( .s(go), .a( sa12 ),
sbox us13( .s(go), .a( sa13 ),
sbox us20( .s(go), .a( sa20 ),
sbox us21( .s(go), .a( sa21 ),
sbox us22( .s(go), .a( sa22 ),
sbox us23( .s(go), .a( sa23 ),
sbox us30( .s(go), .a( sa30 ),
sbox us31( .s(go), .a( sa31 ),
sbox us32( .s(go), .a( sa32 ),
sbox us33( .s(go), .a( sa33 ),
//hun he bian huan han shu
function [31:0] mix_col;
input [7:0] s0,s1,s2,s3;
reg
begin
mix_col[31:24]=xtime(s0)^xtime(s1)^s1^s2^s3;
mix_col[23:16]=s0^xtime(s1)^xtime(s2)^s2^s3;
mix_col[15:08]=s0^s1^xtime(s2)^xtime(s3)^s3;
mix_col[07:00]=xtime(s0)^s0^s1^s2^xtime(s3);
end
endfunction
[7:0] s0_o,s1_o,s2_o,s3_o;
function [7:0] xtime;
input [7:0] b; xtime={b[6:0],1'b0}^(8'h1b&{8{b[7]}});
endfunction
//逆列混合变换函数
function [31:0] inv_mix_col;
input [7:0] s0,s1,s2,s3;
begin
inv_mix_col[31:24]=pmul_e(s0)^pmul_b(s1)^pmul_d(s2)^pmul_9(s3);
inv_mix_col[23:16]=pmul_9(s0)^pmul_e(s1)^pmul_b(s2)^pmul_d(s3);
inv_mix_col[15:08]=pmul_d(s0)^pmul_9(s1)^pmul_e(s2)^pmul_b(s3);
inv_mix_col[07:00]=pmul_b(s0)^pmul_d(s1)^pmul_9(s2)^pmul_e(s3);
end
endfunction
function [7:0] pmul_e;
input [7:0] b;
reg [7:0] two,four,eight;
begin
two=xtime(b);four=xtime(two);eight=xtime(four);pmul_e=eight^four^two;
end
endfunction
function [7:0] pmul_9;
input [7:0] b;
reg [7:0] two,four,eight;
begin
two=xtime(b);four=xtime(two);eight=xtime(four);pmul_9=eight^b;
end
endfunction
function [7:0] pmul_d;
input [7:0] b;
reg [7:0] two,four,eight;
begin
two=xtime(b);four=xtime(two);eight=xtime(four);pmul_d=eight^four^b;
end
endfunction
function [7:0] pmul_b;
input [7:0] b;
reg [7:0] two,four,eight;
begin
two=xtime(b);four=xtime(two);eight=xtime(four);pmul_b=eight^two^b;
end
endfunction
endmodule
S 盒
module sbox(s,a,d);
input
input
output
reg [7:0] d;
[7:0] a;
s;
[7:0] d;
always @(a)
if(s)
case(a)
8'h00: d=8'h52;
8'h01: d=8'h09;
8'h02: d=8'h6a;
8'h03: d=8'hd5;
8'h04: d=8'h30;
8'h05: d=8'h36;
8'h06: d=8'ha5;
8'h07: d=8'h38;
8'h08: d=8'hbf;
8'h09: d=8'h40;
8'h0a: d=8'ha3;
8'h0b: d=8'h9e;
8'h0c: d=8'h81;
8'h0d: d=8'hf3;
8'h0e: d=8'hd7;
8'h0f: d=8'hfb;
8'h10: d=8'h7c;
8'h11: d=8'he3;
8'h12: d=8'h39;
8'h13: d=8'h82;
8'h14: d=8'h9b;
8'h15: d=8'h2f;
8'h16: d=8'hff;
8'h17: d=8'h87;
8'h18: d=8'h34;
8'h19: d=8'h8e;
8'h1a: d=8'h43;
8'h1b: d=8'h44;
8'h1c: d=8'hc4;
8'h1d: d=8'hde;
8'h1e: d=8'he9;
8'h1f: d=8'hcb;
8'h20: d=8'h54;
8'h21: d=8'h7b;
8'h22: d=8'h94;
8'h23: d=8'h32;
8'h24: d=8'ha6;
8'h25: d=8'hc2;
8'h26: d=8'h23;
8'h27: d=8'h3d;
8'h28: d=8'hee;
8'h29: d=8'h4c;
8'h2a: d=8'h95;
8'h2b: d=8'h0b;
8'h2c: d=8'h42;
8'h2d: d=8'hfa;
8'h2e: d=8'hc3;
8'h2f: d=8'h4e;
8'h30: d=8'h08;
8'h31: d=8'h2e;
8'h32: d=8'ha1;
8'h33: d=8'h66;
8'h34: d=8'h28;
8'h35: d=8'hd9;
8'h36: d=8'h24;
8'h37: d=8'hb2;
8'h38: d=8'h76;
8'h39: d=8'h5b;
8'h3a: d=8'ha2;
8'h3b: d=8'h49;
8'h3c: d=8'h6d;
8'h3d: d=8'h8b;
8'h3e: d=8'hd1;
8'h3f: d=8'h25;
8'h40: d=8'h72;
8'h41: d=8'hf8;
8'h42: d=8'hf6;
8'h43: d=8'h64;
8'h44: d=8'h86;
8'h45: d=8'h68;
8'h46: d=8'h98;
8'h47: d=8'h16;
8'h48: d=8'hd4;
8'h49: d=8'ha4;
8'h4a: d=8'h5c;
8'h4b: d=8'hcc;
8'h4c: d=8'h5d;
8'h4d: d=8'h65;
8'h4e: d=8'hb6;
8'h4f: d=8'h92;
8'h50: d=8'h6c;
8'h51: d=8'h70;
8'h52: d=8'h48;
8'h53: d=8'h50;
8'h54: d=8'hfd;
8'h55: d=8'hed;
8'h56: d=8'hb9;
8'h57: d=8'hda;
8'h58: d=8'h5e;
8'h59: d=8'h15;
8'h5a: d=8'h46;
8'h5b: d=8'h57;
8'h5c: d=8'ha7;
8'h5d: d=8'h8d;
8'h5e: d=8'h9d;
8'h5f: d=8'h84;
8'h60: d=8'h90;
8'h61: d=8'hd8;
8'h62: d=8'hab;
8'h63: d=8'h00;
8'h64: d=8'h8c;
8'h65: d=8'hbc;
8'h66: d=8'hd3;
8'h67: d=8'h0a;
8'h68: d=8'hf7;
8'h69: d=8'he4;
8'h6a: d=8'h58;
8'h6b: d=8'h05;
8'h6c: d=8'hb8;
8'h6d: d=8'hb3;
8'h6e: d=8'h45;
8'h6f: d=8'h06;
8'h70: d=8'hd0;
8'h71: d=8'h2c;
8'h72: d=8'h1e;
8'h73: d=8'h8f;
8'h74: d=8'hca;
8'h75: d=8'h3f;
8'h76: d=8'h0f;
8'h77: d=8'h02;
8'h78: d=8'hc1;
8'h79: d=8'haf;
8'h7a: d=8'hbd;
8'h7b: d=8'h03;
8'h7c: d=8'h01;
8'h7d: d=8'h13;
8'h7e: d=8'h8a;
8'h7f: d=8'h6b;
8'h80: d=8'h3a;
8'h81: d=8'h91;
8'h82: d=8'h11;
8'h83: d=8'h41;
8'h84: d=8'h4f;
8'h85: d=8'h67;
8'h86: d=8'hdc;
8'h87: d=8'hea;
8'h88: d=8'h97;
8'h89: d=8'hf2;
8'h8a: d=8'hcf;
8'h8b: d=8'hce;
8'h8c: d=8'hf0;
8'h8d: d=8'hb4;
8'h8e: d=8'he6;
8'h8f: d=8'h73;
8'h90: d=8'h96;
8'h91: d=8'hac;
8'h92: d=8'h74;
8'h93: d=8'h22;
8'h94: d=8'he7;
8'h95: d=8'had;
8'h96: d=8'h35;
8'h97: d=8'h85;
8'h98: d=8'he2;
8'h99: d=8'hf9;
8'h9a: d=8'h37;
8'h9b: d=8'he8;
8'h9c: d=8'h1c;
8'h9d: d=8'h75;
8'h9e: d=8'hdf;
8'h9f: d=8'h6e;
8'ha0: d=8'h47;
8'ha1: d=8'hf1;