Line 12... |
Line 12... |
//// - Luo Dongjun, dongjun_luo@hotmail.com ////
|
//// - Luo Dongjun, dongjun_luo@hotmail.com ////
|
//// ////
|
//// ////
|
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
module key_exp (
|
module key_exp (
|
clk,
|
clk,
|
reset_n,
|
reset,
|
key_in,
|
key_in,
|
key_mode,
|
key_mode,
|
key_start,
|
key_start,
|
wr,
|
wr,
|
wr_addr,
|
wr_addr,
|
wr_data,
|
wr_data,
|
key_ready
|
key_ready
|
);
|
);
|
|
|
input clk;
|
input clk;
|
input reset_n;
|
input reset;
|
input [255:0] key_in; // initial key value
|
input [255:0] key_in; // initial key value
|
input [1:0] key_mode; // 0:128, 1:192, 2:256
|
input [1:0] key_mode; // 0:128, 1:192, 2:256
|
input key_start;// start key expansion
|
input key_start;// start key expansion
|
output wr; // key expansion ram interface
|
output wr; // key expansion ram interface
|
output [4:0] wr_addr;
|
output [4:0] wr_addr;
|
Line 62... |
Line 62... |
GENKEY_256 = 2'b11;
|
GENKEY_256 = 2'b11;
|
|
|
assign max_round_p1[3:0] = (key_mode == 2'b00) ? 4'd11 : (key_mode == 2'b01 ? 4'd13 : 4'd15);
|
assign max_round_p1[3:0] = (key_mode == 2'b00) ? 4'd11 : (key_mode == 2'b01 ? 4'd13 : 4'd15);
|
|
|
// rcon generation
|
// rcon generation
|
always @ (posedge clk or negedge reset_n)
|
always @ (posedge clk or posedge reset)
|
begin
|
begin
|
if (!reset_n)
|
if (reset)
|
begin
|
begin
|
rcon[31:0] <= 32'h01000000;
|
rcon[31:0] <= 32'h01000000;
|
rcon_is_1b <= 1'b0;
|
rcon_is_1b <= 1'b0;
|
end
|
end
|
else if (key_start)
|
else if (key_start)
|
Line 95... |
Line 95... |
|
|
/*****************************************************************************/
|
/*****************************************************************************/
|
// State machine for Key expansion
|
// State machine for Key expansion
|
//
|
//
|
//
|
//
|
always @ (posedge clk or negedge reset_n)
|
always @ (posedge clk or posedge reset)
|
begin
|
begin
|
if (!reset_n)
|
if (reset)
|
begin
|
begin
|
state[1:0] <= IDLE;
|
state[1:0] <= IDLE;
|
pstate[1:0] <= IDLE;
|
pstate[1:0] <= IDLE;
|
end
|
end
|
else
|
else
|
Line 144... |
Line 144... |
end
|
end
|
endcase
|
endcase
|
end
|
end
|
|
|
// round counter: 10/12/14
|
// round counter: 10/12/14
|
always @ (posedge clk or negedge reset_n)
|
always @ (posedge clk or posedge reset)
|
begin
|
begin
|
if (!reset_n)
|
if (reset)
|
round[3:0] <= 1'b0;
|
round[3:0] <= 1'b0;
|
else if (nstate[1:0] == IDLE)
|
else if (nstate[1:0] == IDLE)
|
round[3:0] <= 4'b0;
|
round[3:0] <= 4'b0;
|
else if (state[1:0] == START)
|
else if (state[1:0] == START)
|
round[3:0] <= round[3:0] + 1'b1;
|
round[3:0] <= round[3:0] + 1'b1;
|
end
|
end
|
|
|
always @ (posedge clk or negedge reset_n)
|
always @ (posedge clk or posedge reset)
|
begin
|
begin
|
if (!reset_n)
|
if (reset)
|
begin
|
begin
|
sbox_in_valid <= 1'b0;
|
sbox_in_valid <= 1'b0;
|
sbox_in[31:0] <= 32'b0;
|
sbox_in[31:0] <= 32'b0;
|
end
|
end
|
else if (state[1:0] == START) // rotword
|
else if (state[1:0] == START) // rotword
|
Line 180... |
Line 180... |
end
|
end
|
else
|
else
|
sbox_in_valid <= 1'b0;
|
sbox_in_valid <= 1'b0;
|
end
|
end
|
|
|
always @ (posedge clk or negedge reset_n)
|
always @ (posedge clk or posedge reset)
|
begin
|
begin
|
if (!reset_n)
|
if (reset)
|
valid[4:0] <= 5'b0;
|
valid[4:0] <= 5'b0;
|
else
|
else
|
valid[4:0] <= {valid[3:0],sbox_in_valid};
|
valid[4:0] <= {valid[3:0],sbox_in_valid};
|
end
|
end
|
assign sbox_out_valid = valid[1];
|
assign sbox_out_valid = valid[1];
|
|
|
sbox u_0(.clk(clk),.reset_n(reset_n),.enable(1'b1),.din(sbox_in[7:0]),.ende(1'b0),.en_dout(sbox_out[7:0]),.de_dout());
|
sbox u_0(.clk(clk),.reset(reset),.enable(1'b1),.din(sbox_in[7:0]),.ende(1'b0),.en_dout(sbox_out[7:0]),.de_dout());
|
sbox u_1(.clk(clk),.reset_n(reset_n),.enable(1'b1),.din(sbox_in[15:8]),.ende(1'b0),.en_dout(sbox_out[15:8]),.de_dout());
|
sbox u_1(.clk(clk),.reset(reset),.enable(1'b1),.din(sbox_in[15:8]),.ende(1'b0),.en_dout(sbox_out[15:8]),.de_dout());
|
sbox u_2(.clk(clk),.reset_n(reset_n),.enable(1'b1),.din(sbox_in[23:16]),.ende(1'b0),.en_dout(sbox_out[23:16]),.de_dout());
|
sbox u_2(.clk(clk),.reset(reset),.enable(1'b1),.din(sbox_in[23:16]),.ende(1'b0),.en_dout(sbox_out[23:16]),.de_dout());
|
sbox u_3(.clk(clk),.reset_n(reset_n),.enable(1'b1),.din(sbox_in[31:24]),.ende(1'b0),.en_dout(sbox_out[31:24]),.de_dout());
|
sbox u_3(.clk(clk),.reset(reset),.enable(1'b1),.din(sbox_in[31:24]),.ende(1'b0),.en_dout(sbox_out[31:24]),.de_dout());
|
|
|
/*****************************************************************************/
|
/*****************************************************************************/
|
// key expansion calculation
|
// key expansion calculation
|
//
|
//
|
//
|
//
|
Line 209... |
Line 209... |
assign w4_next2[31:0] = sbox_out[31:0] ^ w4[31:0];
|
assign w4_next2[31:0] = sbox_out[31:0] ^ w4[31:0];
|
assign w5_next2[31:0] = w4_next2[31:0]^w5[31:0];
|
assign w5_next2[31:0] = w4_next2[31:0]^w5[31:0];
|
assign w6_next[31:0] = w5_next2[31:0]^w6[31:0];
|
assign w6_next[31:0] = w5_next2[31:0]^w6[31:0];
|
assign w7_next[31:0] = w6_next[31:0]^w7[31:0];
|
assign w7_next[31:0] = w6_next[31:0]^w7[31:0];
|
|
|
always @ (posedge clk or negedge reset_n)
|
always @ (posedge clk or posedge reset)
|
begin
|
begin
|
if (!reset_n)
|
if (reset)
|
begin
|
begin
|
{w0[31:0],w1[31:0],w2[31:0],w3[31:0],w4[31:0],w5[31:0],w6[31:0],w7[31:0]} <= 256'b0;
|
{w0[31:0],w1[31:0],w2[31:0],w3[31:0],w4[31:0],w5[31:0],w6[31:0],w7[31:0]} <= 256'b0;
|
end
|
end
|
else if (key_start)
|
else if (key_start)
|
begin
|
begin
|
Line 263... |
Line 263... |
|
|
assign wr_data1[63:0] = wr_256 ?{w4[31:0],w5[31:0]} : {w0[31:0],w1[31:0]};
|
assign wr_data1[63:0] = wr_256 ?{w4[31:0],w5[31:0]} : {w0[31:0],w1[31:0]};
|
assign wr_data2[63:0] = wr_256 ?{w6[31:0],w7[31:0]} : {w2[31:0],w3[31:0]};
|
assign wr_data2[63:0] = wr_256 ?{w6[31:0],w7[31:0]} : {w2[31:0],w3[31:0]};
|
assign wr_data3[63:0] = {w4[31:0],w5[31:0]};
|
assign wr_data3[63:0] = {w4[31:0],w5[31:0]};
|
|
|
always @ (posedge clk or negedge reset_n)
|
always @ (posedge clk or posedge reset)
|
begin
|
begin
|
if (!reset_n)
|
if (reset)
|
wr_256 <= 1'b0;
|
wr_256 <= 1'b0;
|
else if (key_start)
|
else if (key_start)
|
wr_256 <= 1'b0;
|
wr_256 <= 1'b0;
|
else if (sbox_out_valid && (state[1:0] == GENKEY_256))
|
else if (sbox_out_valid && (state[1:0] == GENKEY_256))
|
wr_256 <= 1'b1;
|
wr_256 <= 1'b1;
|
else if (sbox_out_valid)
|
else if (sbox_out_valid)
|
wr_256 <= 1'b0;
|
wr_256 <= 1'b0;
|
end
|
end
|
|
|
always @ (posedge clk or negedge reset_n)
|
always @ (posedge clk or posedge reset)
|
begin
|
begin
|
if (!reset_n)
|
if (reset)
|
{key_start_L3,key_start_L2,key_start_L} <= 3'b0;
|
{key_start_L3,key_start_L2,key_start_L} <= 3'b0;
|
else
|
else
|
{key_start_L3,key_start_L2,key_start_L} <= {key_start_L2,key_start_L,key_start};
|
{key_start_L3,key_start_L2,key_start_L} <= {key_start_L2,key_start_L,key_start};
|
end
|
end
|
|
|
always @ (posedge clk or negedge reset_n)
|
always @ (posedge clk or posedge reset)
|
begin
|
begin
|
if (!reset_n)
|
if (reset)
|
wr <= 1'b0;
|
wr <= 1'b0;
|
else
|
else
|
wr <= wr1 || wr2 || wr3 || init_wr1 || init_wr2 || init_wr3 || init_wr4;
|
wr <= wr1 || wr2 || wr3 || init_wr1 || init_wr2 || init_wr3 || init_wr4;
|
end
|
end
|
|
|
always @ (posedge clk or negedge reset_n)
|
always @ (posedge clk or posedge reset)
|
begin
|
begin
|
if (!reset_n)
|
if (reset)
|
begin
|
begin
|
wr_data[63:0] <= 64'b0;
|
wr_data[63:0] <= 64'b0;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
Line 316... |
Line 316... |
else if (wr3)
|
else if (wr3)
|
wr_data[63:0] <= wr_data3[63:0];
|
wr_data[63:0] <= wr_data3[63:0];
|
end
|
end
|
end
|
end
|
|
|
always @ (posedge clk or negedge reset_n)
|
always @ (posedge clk or posedge reset)
|
begin
|
begin
|
if (!reset_n)
|
if (reset)
|
wr_addr[4:0] <= 5'b0;
|
wr_addr[4:0] <= 5'b0;
|
else if (key_start)
|
else if (key_start)
|
wr_addr[4:0] <= 5'd0;
|
wr_addr[4:0] <= 5'd0;
|
else if (wr)
|
else if (wr)
|
wr_addr[4:0] <= wr_addr[4:0] + 1'b1;
|
wr_addr[4:0] <= wr_addr[4:0] + 1'b1;
|
end
|
end
|
|
|
always @ (posedge clk or negedge reset_n)
|
always @ (posedge clk or posedge reset)
|
begin
|
begin
|
if (!reset_n)
|
if (reset)
|
key_ready <= 1'b0;
|
key_ready <= 1'b0;
|
else if (key_start)
|
else if (key_start)
|
key_ready <= 1'b0;
|
key_ready <= 1'b0;
|
else if (wr_addr[4:1] == max_round_p1[3:0])
|
else if (wr_addr[4:1] == max_round_p1[3:0])
|
key_ready <= 1'b1;
|
key_ready <= 1'b1;
|