AES算法中S盒的FPGA实现 II
语言 : EDA
工具 :
仿真 :
三、S盒FPGA实现的仿真
一、引言
在 AES算法中S盒的FPGA实现 I 中简介了S盒的解释和具体的内容java实现推荐算法实例, 本篇博客, 主要讲解如何在FPGA中实现S盒。
二、S盒的FPGA实现 2.1 模块的FPGA实现
<p><pre>module write_data(
input clk ,
input rst_n,
input[1:0] Sbox_mode,
input Sbox_write_en,
output reg Sbox_ready,
output reg[3:0] data0 ,
output reg[3:0] data1 ,
output reg[3:0] data2 ,
output reg[3:0] data3 ,
output reg[3:0] data4 ,
output reg[3:0] data5 ,
output reg[3:0] data6 ,
output reg[3:0] data7 ,
output reg[3:0] data8 ,
output reg[3:0] data9 ,
output reg[3:0] data10,
output reg[3:0] data11,
output reg[3:0] data12,
output reg[3:0] data13,
output reg[3:0] data14,
output reg[3:0] data15,
output reg[3:0] data16,
output reg[3:0] data17,
output reg[3:0] data18,
output reg[3:0] data19,
output reg[3:0] data20,
output reg[3:0] data21,
output reg[3:0] data22,
output reg[3:0] data23,
output reg[3:0] data24,
output reg[3:0] data25,
output reg[3:0] data26,
output reg[3:0] data27,
output reg[3:0] data28,
output reg[3:0] data29,
output reg[3:0] data30,
output reg[3:0] data31,
output reg[3:0] wraddr,
output reg wren
);
parameter IDLE = 3'd0;
parameter WRITE_CHOOSE = 3'd1;
parameter WRITE_MODE1 = 3'd2;
parameter WRITE_MODE2 = 3'd3;
parameter WRITE_MODE3 = 3'd4;
parameter WRITE_MODE4 = 3'd5;
parameter WRITE_FINISH = 3'd6;
parameter MODE1_DATA = 128'H02010704080F0E030D0A00090B06050C;
parameter MODE2_DATA = 128'H050806030C07020B000A090D010F0E04;
parameter MODE3_DATA = 128'H050C0607030802010B0A040D000F090E;
parameter MODE4_DATA0= 128'H76ABD7FE2B670130C56F6BF27B777C63;
parameter MODE4_DATA1= 128'HC072A49CAFA2D4ADF04759FA7DC982CA;
parameter MODE4_DATA2= 128'H1531D871F1E5A534CCF73F362693FDB7;
parameter MODE4_DATA3= 128'H75B227EBE28012079A059618C323C704;
parameter MODE4_DATA4= 128'H842FE329B3D63B52A05A6E1B1A2C8309;
parameter MODE4_DATA5= 128'HCF584C4A39BECB6A5BB1FC20ED00D153;
parameter MODE4_DATA6= 128'HA89F3C507F02F94585334D43FBAAEFD0;
parameter MODE4_DATA7= 128'HD2F3FF1021DAB6BCF5389D928F40A351;
parameter MODE4_DATA8= 128'H73195D643D7EA7C41744975FEC130CCD;
parameter MODE4_DATA9= 128'HDB0B5EDE14B8EE4688902A22DC4F8160;
parameter MODE4_DATA10=128'H79E4959162ACD3C25C2406490A3A32E0;
parameter MODE4_DATA11=128'H08AE7A65EAF4566CA94ED58D6D37C8E7;
parameter MODE4_DATA12=128'H8A8BBD4B1F74DDE8C6B4A61C2E2578BA;
parameter MODE4_DATA13=128'H9E1DC186B95735610EF6034866B53E70;
parameter MODE4_DATA14=128'HDF2B55CEE9871E9B948ED9691198F8E1;
parameter MODE4_DATA15=128'H16BB54B00F2D99416842E6BF0D89A18C;
reg Sbox_write_en_reg;
wire Sbox_write_en_pos;
reg[2:0] state;
wire Sbox_ready_neg;
assign Sbox_write_en_pos = Sbox_write_en && !Sbox_write_en_reg;
always@(posedge clk or negedge rst_n)
begin
if( !rst_n )
Sbox_write_en_reg