AES算法中S盒的FPGA实现 II

语言 : verilog EDA
工具 : quartus
仿真 : Modelsim

  • AES算法中S盒的FPGA实现 II
  • 一、引言
  • 二、S盒的FPGA实现
    • 2.1 write_data模块的FPGA实现
    • 2.2 双端口RAM的调用
    • 2.3 顶层模块
    • 2.4 S盒实现工程的说明
  • 三、S盒FPGA实现的仿真

一、引言

在 AES算法中S盒的FPGA实现 I 中简介了S盒的解释和具体的内容, 本篇博客, 主要讲解如何在FPGA中实现S盒。

二、S盒的FPGA实现

2.1 write_data模块的FPGA实现

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)
beginif( !rst_n )Sbox_write_en_reg <= 0;else Sbox_write_en_reg <= Sbox_write_en;endalways@( posedge clk or negedge rst_n)
beginif( !rst_n ) beginstate <= 0;endelse begincase( state )IDLE  :beginif(Sbox_write_en_pos) state <= WRITE_CHOOSE;elsestate <= IDLE;endWRITE_CHOOSE :beginif(Sbox_mode == 2'b0)state <= WRITE_MODE1;else if( Sbox_mode == 2'b1)state <= WRITE_MODE2;else if( Sbox_mode == 2'd2)state <= WRITE_MODE3;else if( Sbox_mode == 2'd3)state <= WRITE_MODE4;                      elsestate <= WRITE_MODE1;   endWRITE_MODE1 :begin if( Sbox_ready_neg)state <= WRITE_FINISH;else state <= state;endWRITE_MODE2 :begin if( Sbox_ready_neg)state <= WRITE_FINISH;else state <= state;end           WRITE_MODE3 :begin if( Sbox_ready_neg)state <= WRITE_FINISH;else state <= state;endWRITE_MODE4 :begin if( Sbox_ready_neg)state <= WRITE_FINISH;else state <= state;end                    WRITE_FINISH :beginstate <= IDLE;end  default :beginstate <= IDLE;end endcaseendendreg[9:0] cnt;always@( posedge clk or negedge rst_n)
beginif( !rst_n ) beginSbox_ready <= 0;wraddr <= 0;wren <= 0;   cnt <= 0;data0  <= 0;data1  <= 0;data2  <= 0;data3  <= 0;data4  <= 0;data5  <= 0;data6  <= 0;data7  <= 0;data8  <= 0;data9  <= 0;data10 <= 0;data11 <= 0;data12 <= 0;data13 <= 0;data14 <= 0;data15 <= 0;data16 <= 0;data17 <= 0;data18 <= 0;data19 <= 0;data20 <= 0;data21 <= 0;data22 <= 0;data23 <= 0;data24 <= 0;data25 <= 0;data26 <= 0;data27 <= 0;data28 <= 0;data29 <= 0;data30 <= 0;data31 <= 0;endelse beginif(state == WRITE_CHOOSE)Sbox_ready <= 1;elseif( state == WRITE_MODE1 ) beginif(cnt == 16) begincnt <= cnt;wren <= 0;Sbox_ready <= 0;endelse beginwren <= 1;cnt <= cnt +1;endif(wren == 1) beginwraddr <= wraddr +1;data0   <= MODE1_DATA[3:0];data1   <= MODE1_DATA[7:4];  data2   <= MODE1_DATA[11:8];data3   <= MODE1_DATA[15:12];           data4   <= MODE1_DATA[19:16];data5   <= MODE1_DATA[23:20];  data6   <= MODE1_DATA[27:24];data7   <= MODE1_DATA[31:28];  data8   <= MODE1_DATA[35:32];data9   <= MODE1_DATA[39:36];  data10  <= MODE1_DATA[43:40];data11  <= MODE1_DATA[47:44];  data12  <= MODE1_DATA[51:48];data13  <= MODE1_DATA[55:52];          data14  <= MODE1_DATA[59:56];data15  <= MODE1_DATA[63:60];  data16  <= MODE1_DATA[67:64];data17  <= MODE1_DATA[71:68];  data18  <= MODE1_DATA[75:72];data19  <= MODE1_DATA[79:76];  data20  <= MODE1_DATA[83:80];data21  <= MODE1_DATA[87:84];  data22  <= MODE1_DATA[91:88];data23  <= MODE1_DATA[95:92];          data24  <= MODE1_DATA[99:96];data25  <= MODE1_DATA[103:100];    data26  <= MODE1_DATA[107:104];data27  <= MODE1_DATA[111:108];  data28  <= MODE1_DATA[115:112];data29  <= MODE1_DATA[119:116];     data30  <= MODE1_DATA[123 :120];data31  <= MODE1_DATA[127:124];           endendelse if( state == WRITE_MODE2 ) beginif(cnt == 16) begincnt <= cnt;wren <= 0;Sbox_ready <= 0;endelse beginwren <= 1;cnt <= cnt +1;endif(wren == 1) beginwraddr <= wraddr +1;data0   <= MODE2_DATA[3:0];data1   <= MODE2_DATA[7:4];   data2   <= MODE2_DATA[11:8];data3   <= MODE2_DATA[15:12];           data4   <= MODE2_DATA[19:16];data5   <= MODE2_DATA[23:20];  data6   <= MODE2_DATA[27:24];data7   <= MODE2_DATA[31:28];  data8   <= MODE2_DATA[35:32];data9   <= MODE2_DATA[39:36];  data10  <= MODE2_DATA[43:40];data11  <= MODE2_DATA[47:44];  data12  <= MODE2_DATA[51:48];data13  <= MODE2_DATA[55:52];          data14  <= MODE2_DATA[59:56];data15  <= MODE2_DATA[63:60];  data16  <= MODE2_DATA[67:64];data17  <= MODE2_DATA[71:68];  data18  <= MODE2_DATA[75:72];data19  <= MODE2_DATA[79:76];  data20  <= MODE2_DATA[83:80];data21  <= MODE2_DATA[87:84];  data22  <= MODE2_DATA[91:88];data23  <= MODE2_DATA[95:92];          data24  <= MODE2_DATA[99:96];data25  <= MODE2_DATA[103:100];    data26  <= MODE2_DATA[107:104];data27  <= MODE2_DATA[111:108];  data28  <= MODE2_DATA[115:112];data29  <= MODE2_DATA[119:116];     data30  <= MODE2_DATA[123 :120];data31  <= MODE2_DATA[127:124];           endendelse if( state == WRITE_MODE3 ) beginif(cnt == 16) begincnt <= cnt;wren <= 0;Sbox_ready <= 0;endelse beginwren <= 1;cnt <= cnt +1;endif(wren == 1) beginwraddr <= wraddr +1;data0   <= MODE3_DATA[3:0];data1   <= MODE3_DATA[7:4];   data2   <= MODE3_DATA[11:8];data3   <= MODE3_DATA[15:12];           data4   <= MODE3_DATA[19:16];data5   <= MODE3_DATA[23:20];  data6   <= MODE3_DATA[27:24];data7   <= MODE3_DATA[31:28];  data8   <= MODE3_DATA[35:32];data9   <= MODE3_DATA[39:36];  data10  <= MODE3_DATA[43:40];data11  <= MODE3_DATA[47:44];  data12  <= MODE3_DATA[51:48];data13  <= MODE3_DATA[55:52];          data14  <= MODE3_DATA[59:56];data15  <= MODE3_DATA[63:60];  data16  <= MODE3_DATA[67:64];data17  <= MODE3_DATA[71:68];  data18  <= MODE3_DATA[75:72];data19  <= MODE3_DATA[79:76];  data20  <= MODE3_DATA[83:80];data21  <= MODE3_DATA[87:84];  data22  <= MODE3_DATA[91:88];data23  <= MODE3_DATA[95:92];          data24  <= MODE3_DATA[99:96];data25  <= MODE3_DATA[103:100];    data26  <= MODE3_DATA[107:104];data27  <= MODE3_DATA[111:108];  data28  <= MODE3_DATA[115:112];data29  <= MODE3_DATA[119:116];     data30  <= MODE3_DATA[123 :120];data31  <= MODE3_DATA[127:124];           endend else if( state == WRITE_MODE4 ) beginif(cnt == 16) begincnt <= cnt;wren <= 0;Sbox_ready <= 0;endelse beginwren <= 1;cnt <= cnt +1;endif(wren == 1) beginwraddr <= wraddr +1;case(wraddr) 4'd0:begin   data0   <= MODE4_DATA0[3:0];data1   <= MODE4_DATA0[7:4]; data2   <= MODE4_DATA0[11:8];data3   <= MODE4_DATA0[15:12];         data4   <= MODE4_DATA0[19:16];data5   <= MODE4_DATA0[23:20];    data6   <= MODE4_DATA0[27:24];data7   <= MODE4_DATA0[31:28];    data8   <= MODE4_DATA0[35:32];data9   <= MODE4_DATA0[39:36];    data10  <= MODE4_DATA0[43:40];data11  <= MODE4_DATA0[47:44];    data12  <= MODE4_DATA0[51:48];data13  <= MODE4_DATA0[55:52];            data14  <= MODE4_DATA0[59:56];data15  <= MODE4_DATA0[63:60];    data16  <= MODE4_DATA0[67:64];data17  <= MODE4_DATA0[71:68];    data18  <= MODE4_DATA0[75:72];data19  <= MODE4_DATA0[79:76];    data20  <= MODE4_DATA0[83:80];data21  <= MODE4_DATA0[87:84];    data22  <= MODE4_DATA0[91:88];data23  <= MODE4_DATA0[95:92];            data24  <= MODE4_DATA0[99:96];data25  <= MODE4_DATA0[103:100];  data26  <= MODE4_DATA0[107:104];data27  <= MODE4_DATA0[111:108];    data28  <= MODE4_DATA0[115:112];data29  <= MODE4_DATA0[119:116];       data30  <= MODE4_DATA0[123 :120];data31  <= MODE4_DATA0[127:124];             end4'd1:begin   data0   <= MODE4_DATA1[3:0];data1   <= MODE4_DATA1[7:4];  data2   <= MODE4_DATA1[11:8];data3   <= MODE4_DATA1[15:12];         data4   <= MODE4_DATA1[19:16];data5   <= MODE4_DATA1[23:20];    data6   <= MODE4_DATA1[27:24];data7   <= MODE4_DATA1[31:28];    data8   <= MODE4_DATA1[35:32];data9   <= MODE4_DATA1[39:36];    data10  <= MODE4_DATA1[43:40];data11  <= MODE4_DATA1[47:44];    data12  <= MODE4_DATA1[51:48];data13  <= MODE4_DATA1[55:52];            data14  <= MODE4_DATA1[59:56];data15  <= MODE4_DATA1[63:60];    data16  <= MODE4_DATA1[67:64];data17  <= MODE4_DATA1[71:68];    data18  <= MODE4_DATA1[75:72];data19  <= MODE4_DATA1[79:76];    data20  <= MODE4_DATA1[83:80];data21  <= MODE4_DATA1[87:84];    data22  <= MODE4_DATA1[91:88];data23  <= MODE4_DATA1[95:92];            data24  <= MODE4_DATA1[99:96];data25  <= MODE4_DATA1[103:100];  data26  <= MODE4_DATA1[107:104];data27  <= MODE4_DATA1[111:108];    data28  <= MODE4_DATA1[115:112];data29  <= MODE4_DATA1[119:116];       data30  <= MODE4_DATA1[123 :120];data31  <= MODE4_DATA1[127:124];             end4'd2:begin   data0   <= MODE4_DATA2[3:0];data1   <= MODE4_DATA2[7:4];  data2   <= MODE4_DATA2[11:8];data3   <= MODE4_DATA2[15:12];         data4   <= MODE4_DATA2[19:16];data5   <= MODE4_DATA2[23:20];    data6   <= MODE4_DATA2[27:24];data7   <= MODE4_DATA2[31:28];    data8   <= MODE4_DATA2[35:32];data9   <= MODE4_DATA2[39:36];    data10  <= MODE4_DATA2[43:40];data11  <= MODE4_DATA2[47:44];    data12  <= MODE4_DATA2[51:48];data13  <= MODE4_DATA2[55:52];            data14  <= MODE4_DATA2[59:56];data15  <= MODE4_DATA2[63:60];    data16  <= MODE4_DATA2[67:64];data17  <= MODE4_DATA2[71:68];    data18  <= MODE4_DATA2[75:72];data19  <= MODE4_DATA2[79:76];    data20  <= MODE4_DATA2[83:80];data21  <= MODE4_DATA2[87:84];    data22  <= MODE4_DATA2[91:88];data23  <= MODE4_DATA2[95:92];            data24  <= MODE4_DATA2[99:96];data25  <= MODE4_DATA2[103:100];  data26  <= MODE4_DATA2[107:104];data27  <= MODE4_DATA2[111:108];    data28  <= MODE4_DATA2[115:112];data29  <= MODE4_DATA2[119:116];       data30  <= MODE4_DATA2[123 :120];data31  <= MODE4_DATA2[127:124];             end4'd3:begin   data0   <= MODE4_DATA3[3:0];data1   <= MODE4_DATA3[7:4];  data2   <= MODE4_DATA3[11:8];data3   <= MODE4_DATA3[15:12];         data4   <= MODE4_DATA3[19:16];data5   <= MODE4_DATA3[23:20];    data6   <= MODE4_DATA3[27:24];data7   <= MODE4_DATA3[31:28];    data8   <= MODE4_DATA3[35:32];data9   <= MODE4_DATA3[39:36];    data10  <= MODE4_DATA3[43:40];data11  <= MODE4_DATA3[47:44];    data12  <= MODE4_DATA3[51:48];data13  <= MODE4_DATA3[55:52];            data14  <= MODE4_DATA3[59:56];data15  <= MODE4_DATA3[63:60];    data16  <= MODE4_DATA3[67:64];data17  <= MODE4_DATA3[71:68];    data18  <= MODE4_DATA3[75:72];data19  <= MODE4_DATA3[79:76];    data20  <= MODE4_DATA3[83:80];data21  <= MODE4_DATA3[87:84];    data22  <= MODE4_DATA3[91:88];data23  <= MODE4_DATA3[95:92];            data24  <= MODE4_DATA3[99:96];data25  <= MODE4_DATA3[103:100];  data26  <= MODE4_DATA3[107:104];data27  <= MODE4_DATA3[111:108];    data28  <= MODE4_DATA3[115:112];data29  <= MODE4_DATA3[119:116];       data30  <= MODE4_DATA3[123 :120];data31  <= MODE4_DATA3[127:124];             end             4'd4:begin   data0   <= MODE4_DATA4[3:0];data1   <= MODE4_DATA4[7:4]; data2   <= MODE4_DATA4[11:8];data3   <= MODE4_DATA4[15:12];         data4   <= MODE4_DATA4[19:16];data5   <= MODE4_DATA4[23:20];    data6   <= MODE4_DATA4[27:24];data7   <= MODE4_DATA4[31:28];    data8   <= MODE4_DATA4[35:32];data9   <= MODE4_DATA4[39:36];    data10  <= MODE4_DATA4[43:40];data11  <= MODE4_DATA4[47:44];    data12  <= MODE4_DATA4[51:48];data13  <= MODE4_DATA4[55:52];            data14  <= MODE4_DATA4[59:56];data15  <= MODE4_DATA4[63:60];    data16  <= MODE4_DATA4[67:64];data17  <= MODE4_DATA4[71:68];    data18  <= MODE4_DATA4[75:72];data19  <= MODE4_DATA4[79:76];    data20  <= MODE4_DATA4[83:80];data21  <= MODE4_DATA4[87:84];    data22  <= MODE4_DATA4[91:88];data23  <= MODE4_DATA4[95:92];            data24  <= MODE4_DATA4[99:96];data25  <= MODE4_DATA4[103:100];  data26  <= MODE4_DATA4[107:104];data27  <= MODE4_DATA4[111:108];    data28  <= MODE4_DATA4[115:112];data29  <= MODE4_DATA4[119:116];       data30  <= MODE4_DATA4[123 :120];data31  <= MODE4_DATA4[127:124];             end             4'd5:begin   data0   <= MODE4_DATA5[3:0];data1   <= MODE4_DATA5[7:4]; data2   <= MODE4_DATA5[11:8];data3   <= MODE4_DATA5[15:12];         data4   <= MODE4_DATA5[19:16];data5   <= MODE4_DATA5[23:20];    data6   <= MODE4_DATA5[27:24];data7   <= MODE4_DATA5[31:28];    data8   <= MODE4_DATA5[35:32];data9   <= MODE4_DATA5[39:36];    data10  <= MODE4_DATA5[43:40];data11  <= MODE4_DATA5[47:44];    data12  <= MODE4_DATA5[51:48];data13  <= MODE4_DATA5[55:52];            data14  <= MODE4_DATA5[59:56];data15  <= MODE4_DATA5[63:60];    data16  <= MODE4_DATA5[67:64];data17  <= MODE4_DATA5[71:68];    data18  <= MODE4_DATA5[75:72];data19  <= MODE4_DATA5[79:76];    data20  <= MODE4_DATA5[83:80];data21  <= MODE4_DATA5[87:84];    data22  <= MODE4_DATA5[91:88];data23  <= MODE4_DATA5[95:92];            data24  <= MODE4_DATA5[99:96];data25  <= MODE4_DATA5[103:100];  data26  <= MODE4_DATA5[107:104];data27  <= MODE4_DATA5[111:108];    data28  <= MODE4_DATA5[115:112];data29  <= MODE4_DATA5[119:116];       data30  <= MODE4_DATA5[123 :120];data31  <= MODE4_DATA5[127:124];             end4'd6:begin   data0   <= MODE4_DATA6[3:0];data1   <= MODE4_DATA6[7:4];  data2   <= MODE4_DATA6[11:8];data3   <= MODE4_DATA6[15:12];         data4   <= MODE4_DATA6[19:16];data5   <= MODE4_DATA6[23:20];    data6   <= MODE4_DATA6[27:24];data7   <= MODE4_DATA6[31:28];    data8   <= MODE4_DATA6[35:32];data9   <= MODE4_DATA6[39:36];    data10  <= MODE4_DATA6[43:40];data11  <= MODE4_DATA6[47:44];    data12  <= MODE4_DATA6[51:48];data13  <= MODE4_DATA6[55:52];            data14  <= MODE4_DATA6[59:56];data15  <= MODE4_DATA6[63:60];    data16  <= MODE4_DATA6[67:64];data17  <= MODE4_DATA6[71:68];    data18  <= MODE4_DATA6[75:72];data19  <= MODE4_DATA6[79:76];    data20  <= MODE4_DATA6[83:80];data21  <= MODE4_DATA6[87:84];    data22  <= MODE4_DATA6[91:88];data23  <= MODE4_DATA6[95:92];            data24  <= MODE4_DATA6[99:96];data25  <= MODE4_DATA6[103:100];  data26  <= MODE4_DATA6[107:104];data27  <= MODE4_DATA6[111:108];    data28  <= MODE4_DATA6[115:112];data29  <= MODE4_DATA6[119:116];       data30  <= MODE4_DATA6[123 :120];data31  <= MODE4_DATA6[127:124];             end4'd7:begin   data0   <= MODE4_DATA7[3:0];data1   <= MODE4_DATA7[7:4];  data2   <= MODE4_DATA7[11:8];data3   <= MODE4_DATA7[15:12];         data4   <= MODE4_DATA7[19:16];data5   <= MODE4_DATA7[23:20];    data6   <= MODE4_DATA7[27:24];data7   <= MODE4_DATA7[31:28];    data8   <= MODE4_DATA7[35:32];data9   <= MODE4_DATA7[39:36];    data10  <= MODE4_DATA7[43:40];data11  <= MODE4_DATA7[47:44];    data12  <= MODE4_DATA7[51:48];data13  <= MODE4_DATA7[55:52];            data14  <= MODE4_DATA7[59:56];data15  <= MODE4_DATA7[63:60];    data16  <= MODE4_DATA7[67:64];data17  <= MODE4_DATA7[71:68];    data18  <= MODE4_DATA7[75:72];data19  <= MODE4_DATA7[79:76];    data20  <= MODE4_DATA7[83:80];data21  <= MODE4_DATA7[87:84];    data22  <= MODE4_DATA7[91:88];data23  <= MODE4_DATA7[95:92];            data24  <= MODE4_DATA7[99:96];data25  <= MODE4_DATA7[103:100];  data26  <= MODE4_DATA7[107:104];data27  <= MODE4_DATA7[111:108];    data28  <= MODE4_DATA7[115:112];data29  <= MODE4_DATA7[119:116];       data30  <= MODE4_DATA7[123 :120];data31  <= MODE4_DATA7[127:124];             end                     4'd8:begin   data0   <= MODE4_DATA8[3:0];data1   <= MODE4_DATA8[7:4]; data2   <= MODE4_DATA8[11:8];data3   <= MODE4_DATA8[15:12];         data4   <= MODE4_DATA8[19:16];data5   <= MODE4_DATA8[23:20];    data6   <= MODE4_DATA8[27:24];data7   <= MODE4_DATA8[31:28];    data8   <= MODE4_DATA8[35:32];data9   <= MODE4_DATA8[39:36];    data10  <= MODE4_DATA8[43:40];data11  <= MODE4_DATA8[47:44];    data12  <= MODE4_DATA8[51:48];data13  <= MODE4_DATA8[55:52];            data14  <= MODE4_DATA8[59:56];data15  <= MODE4_DATA8[63:60];    data16  <= MODE4_DATA8[67:64];data17  <= MODE4_DATA8[71:68];    data18  <= MODE4_DATA8[75:72];data19  <= MODE4_DATA8[79:76];    data20  <= MODE4_DATA8[83:80];data21  <= MODE4_DATA8[87:84];    data22  <= MODE4_DATA8[91:88];data23  <= MODE4_DATA8[95:92];            data24  <= MODE4_DATA8[99:96];data25  <= MODE4_DATA8[103:100];  data26  <= MODE4_DATA8[107:104];data27  <= MODE4_DATA8[111:108];    data28  <= MODE4_DATA8[115:112];data29  <= MODE4_DATA8[119:116];       data30  <= MODE4_DATA8[123 :120];data31  <= MODE4_DATA8[127:124];             end4'd9:begin   data0   <= MODE4_DATA9[3:0];data1   <= MODE4_DATA9[7:4];  data2   <= MODE4_DATA9[11:8];data3   <= MODE4_DATA9[15:12];         data4   <= MODE4_DATA9[19:16];data5   <= MODE4_DATA9[23:20];    data6   <= MODE4_DATA9[27:24];data7   <= MODE4_DATA9[31:28];    data8   <= MODE4_DATA9[35:32];data9   <= MODE4_DATA9[39:36];    data10  <= MODE4_DATA9[43:40];data11  <= MODE4_DATA9[47:44];    data12  <= MODE4_DATA9[51:48];data13  <= MODE4_DATA9[55:52];            data14  <= MODE4_DATA9[59:56];data15  <= MODE4_DATA9[63:60];    data16  <= MODE4_DATA9[67:64];data17  <= MODE4_DATA9[71:68];    data18  <= MODE4_DATA9[75:72];data19  <= MODE4_DATA9[79:76];    data20  <= MODE4_DATA9[83:80];data21  <= MODE4_DATA9[87:84];    data22  <= MODE4_DATA9[91:88];data23  <= MODE4_DATA9[95:92];            data24  <= MODE4_DATA9[99:96];data25  <= MODE4_DATA9[103:100];  data26  <= MODE4_DATA9[107:104];data27  <= MODE4_DATA9[111:108];    data28  <= MODE4_DATA9[115:112];data29  <= MODE4_DATA9[119:116];       data30  <= MODE4_DATA9[123 :120];data31  <= MODE4_DATA9[127:124];             end4'd10:begin   data0   <= MODE4_DATA10[3:0];data1   <= MODE4_DATA10[7:4];   data2   <= MODE4_DATA10[11:8];data3   <= MODE4_DATA10[15:12];           data4   <= MODE4_DATA10[19:16];data5   <= MODE4_DATA10[23:20];  data6   <= MODE4_DATA10[27:24];data7   <= MODE4_DATA10[31:28];  data8   <= MODE4_DATA10[35:32];data9   <= MODE4_DATA10[39:36];  data10  <= MODE4_DATA10[43:40];data11  <= MODE4_DATA10[47:44];  data12  <= MODE4_DATA10[51:48];data13  <= MODE4_DATA10[55:52];          data14  <= MODE4_DATA10[59:56];data15  <= MODE4_DATA10[63:60];  data16  <= MODE4_DATA10[67:64];data17  <= MODE4_DATA10[71:68];  data18  <= MODE4_DATA10[75:72];data19  <= MODE4_DATA10[79:76];  data20  <= MODE4_DATA10[83:80];data21  <= MODE4_DATA10[87:84];  data22  <= MODE4_DATA10[91:88];data23  <= MODE4_DATA10[95:92];          data24  <= MODE4_DATA10[99:96];data25  <= MODE4_DATA10[103:100];    data26  <= MODE4_DATA10[107:104];data27  <= MODE4_DATA10[111:108];  data28  <= MODE4_DATA10[115:112];data29  <= MODE4_DATA10[119:116];     data30  <= MODE4_DATA10[123 :120];data31  <= MODE4_DATA10[127:124];           end4'd11:begin   data0   <= MODE4_DATA11[3:0];data1   <= MODE4_DATA11[7:4];   data2   <= MODE4_DATA11[11:8];data3   <= MODE4_DATA11[15:12];           data4   <= MODE4_DATA11[19:16];data5   <= MODE4_DATA11[23:20];  data6   <= MODE4_DATA11[27:24];data7   <= MODE4_DATA11[31:28];  data8   <= MODE4_DATA11[35:32];data9   <= MODE4_DATA11[39:36];  data10  <= MODE4_DATA11[43:40];data11  <= MODE4_DATA11[47:44];  data12  <= MODE4_DATA11[51:48];data13  <= MODE4_DATA11[55:52];          data14  <= MODE4_DATA11[59:56];data15  <= MODE4_DATA11[63:60];  data16  <= MODE4_DATA11[67:64];data17  <= MODE4_DATA11[71:68];  data18  <= MODE4_DATA11[75:72];data19  <= MODE4_DATA11[79:76];  data20  <= MODE4_DATA11[83:80];data21  <= MODE4_DATA11[87:84];  data22  <= MODE4_DATA11[91:88];data23  <= MODE4_DATA11[95:92];          data24  <= MODE4_DATA11[99:96];data25  <= MODE4_DATA11[103:100];    data26  <= MODE4_DATA11[107:104];data27  <= MODE4_DATA11[111:108];  data28  <= MODE4_DATA11[115:112];data29  <= MODE4_DATA11[119:116];     data30  <= MODE4_DATA11[123 :120];data31  <= MODE4_DATA11[127:124];           end4'd12:begin   data0   <= MODE4_DATA12[3:0];data1   <= MODE4_DATA12[7:4];   data2   <= MODE4_DATA12[11:8];data3   <= MODE4_DATA12[15:12];           data4   <= MODE4_DATA12[19:16];data5   <= MODE4_DATA12[23:20];  data6   <= MODE4_DATA12[27:24];data7   <= MODE4_DATA12[31:28];  data8   <= MODE4_DATA12[35:32];data9   <= MODE4_DATA12[39:36];  data10  <= MODE4_DATA12[43:40];data11  <= MODE4_DATA12[47:44];  data12  <= MODE4_DATA12[51:48];data13  <= MODE4_DATA12[55:52];          data14  <= MODE4_DATA12[59:56];data15  <= MODE4_DATA12[63:60];  data16  <= MODE4_DATA12[67:64];data17  <= MODE4_DATA12[71:68];  data18  <= MODE4_DATA12[75:72];data19  <= MODE4_DATA12[79:76];  data20  <= MODE4_DATA12[83:80];data21  <= MODE4_DATA12[87:84];  data22  <= MODE4_DATA12[91:88];data23  <= MODE4_DATA12[95:92];          data24  <= MODE4_DATA12[99:96];data25  <= MODE4_DATA12[103:100];    data26  <= MODE4_DATA12[107:104];data27  <= MODE4_DATA12[111:108];  data28  <= MODE4_DATA12[115:112];data29  <= MODE4_DATA12[119:116];     data30  <= MODE4_DATA12[123 :120];data31  <= MODE4_DATA12[127:124];           end4'd13:begin   data0   <= MODE4_DATA13[3:0];data1   <= MODE4_DATA13[7:4];   data2   <= MODE4_DATA13[11:8];data3   <= MODE4_DATA13[15:12];           data4   <= MODE4_DATA13[19:16];data5   <= MODE4_DATA13[23:20];  data6   <= MODE4_DATA13[27:24];data7   <= MODE4_DATA13[31:28];  data8   <= MODE4_DATA13[35:32];data9   <= MODE4_DATA13[39:36];  data10  <= MODE4_DATA13[43:40];data11  <= MODE4_DATA13[47:44];  data12  <= MODE4_DATA13[51:48];data13  <= MODE4_DATA13[55:52];          data14  <= MODE4_DATA13[59:56];data15  <= MODE4_DATA13[63:60];  data16  <= MODE4_DATA13[67:64];data17  <= MODE4_DATA13[71:68];  data18  <= MODE4_DATA13[75:72];data19  <= MODE4_DATA13[79:76];  data20  <= MODE4_DATA13[83:80];data21  <= MODE4_DATA13[87:84];  data22  <= MODE4_DATA13[91:88];data23  <= MODE4_DATA13[95:92];          data24  <= MODE4_DATA13[99:96];data25  <= MODE4_DATA13[103:100];    data26  <= MODE4_DATA13[107:104];data27  <= MODE4_DATA13[111:108];  data28  <= MODE4_DATA13[115:112];data29  <= MODE4_DATA13[119:116];     data30  <= MODE4_DATA13[123 :120];data31  <= MODE4_DATA13[127:124];           end4'd14:begin   data0   <= MODE4_DATA14[3:0];data1   <= MODE4_DATA14[7:4];   data2   <= MODE4_DATA14[11:8];data3   <= MODE4_DATA14[15:12];           data4   <= MODE4_DATA14[19:16];data5   <= MODE4_DATA14[23:20];  data6   <= MODE4_DATA14[27:24];data7   <= MODE4_DATA14[31:28];  data8   <= MODE4_DATA14[35:32];data9   <= MODE4_DATA14[39:36];  data10  <= MODE4_DATA14[43:40];data11  <= MODE4_DATA14[47:44];  data12  <= MODE4_DATA14[51:48];data13  <= MODE4_DATA14[55:52];          data14  <= MODE4_DATA14[59:56];data15  <= MODE4_DATA14[63:60];  data16  <= MODE4_DATA14[67:64];data17  <= MODE4_DATA14[71:68];  data18  <= MODE4_DATA14[75:72];data19  <= MODE4_DATA14[79:76];  data20  <= MODE4_DATA14[83:80];data21  <= MODE4_DATA14[87:84];  data22  <= MODE4_DATA14[91:88];data23  <= MODE4_DATA14[95:92];          data24  <= MODE4_DATA14[99:96];data25  <= MODE4_DATA14[103:100];    data26  <= MODE4_DATA14[107:104];data27  <= MODE4_DATA14[111:108];  data28  <= MODE4_DATA14[115:112];data29  <= MODE4_DATA14[119:116];     data30  <= MODE4_DATA14[123 :120];data31  <= MODE4_DATA14[127:124];           end                     4'd15:begin   data0   <= MODE4_DATA15[3:0];data1   <= MODE4_DATA15[7:4];  data2   <= MODE4_DATA15[11:8];data3   <= MODE4_DATA15[15:12];           data4   <= MODE4_DATA15[19:16];data5   <= MODE4_DATA15[23:20];  data6   <= MODE4_DATA15[27:24];data7   <= MODE4_DATA15[31:28];  data8   <= MODE4_DATA15[35:32];data9   <= MODE4_DATA15[39:36];  data10  <= MODE4_DATA15[43:40];data11  <= MODE4_DATA15[47:44];  data12  <= MODE4_DATA15[51:48];data13  <= MODE4_DATA15[55:52];          data14  <= MODE4_DATA15[59:56];data15  <= MODE4_DATA15[63:60];  data16  <= MODE4_DATA15[67:64];data17  <= MODE4_DATA15[71:68];  data18  <= MODE4_DATA15[75:72];data19  <= MODE4_DATA15[79:76];  data20  <= MODE4_DATA15[83:80];data21  <= MODE4_DATA15[87:84];  data22  <= MODE4_DATA15[91:88];data23  <= MODE4_DATA15[95:92];          data24  <= MODE4_DATA15[99:96];data25  <= MODE4_DATA15[103:100];    data26  <= MODE4_DATA15[107:104];data27  <= MODE4_DATA15[111:108];  data28  <= MODE4_DATA15[115:112];data29  <= MODE4_DATA15[119:116];     data30  <= MODE4_DATA15[123 :120];data31  <= MODE4_DATA15[127:124];           end    endcaseendend   else begincnt <=0;data1 <= 0;data1   <=0;   data2   <=0;data3   <=0;            data4   <=0;data5   <=0;    data6   <=0;data7   <=0;    data8   <=0;data9   <=0;    data10  <=0;data11  <=0;    data12  <=0;data13  <=0;            data14  <=0;data15  <=0;    data16  <=0;data17  <=0;    data18  <=0;data19  <=0;    data20  <=0;data21  <=0;    data22  <=0;data23  <=0;            data24  <=0;data25  <=0;    data26  <=0;data27  <=0;    data28  <=0;data29  <=0;       data30  <=0;data31  <=0;     wraddr <= 0;wren <= 0;  endendendendmodule

2.2 双端口RAM的调用

2.3 顶层模块

module test_s_box(input          clk,input          rst_n,input[3:0]         Sbox_4_addr0,input[3:0]         Sbox_4_addr1,   input[3:0]      Sbox_4_addr2,input[3:0]         Sbox_4_addr3,input[3:0]         Sbox_4_addr4,input[3:0]         Sbox_4_addr5,input[3:0]         Sbox_4_addr6,   input[3:0]      Sbox_4_addr7,input[3:0]         Sbox_4_addr8,input[3:0]         Sbox_4_addr9,input[3:0]         Sbox_4_addr10,input[3:0]        Sbox_4_addr11,  input[3:0]      Sbox_4_addr12,input[3:0]        Sbox_4_addr13,input[3:0]        Sbox_4_addr14,input[3:0]        Sbox_4_addr15,input[3:0]        Sbox_4_addr16,  input[3:0]      Sbox_4_addr17,input[3:0]        Sbox_4_addr18,input[3:0]        Sbox_4_addr19,input[3:0]        Sbox_4_addr20,input[3:0]        Sbox_4_addr21,  input[3:0]      Sbox_4_addr22,input[3:0]        Sbox_4_addr23,input[3:0]        Sbox_4_addr24,input[3:0]        Sbox_4_addr25,input[3:0]        Sbox_4_addr26,  input[3:0]      Sbox_4_addr27,input[3:0]        Sbox_4_addr28,input[3:0]        Sbox_4_addr29,  input[3:0]      Sbox_4_addr30,input[3:0]        Sbox_4_addr31,  input[7:0]      Sbox_8_addr,        input           Sbox_8_en,input[1:0]        Sbox_mode, //  4 input          Sbox_write_en,//input          Sbox_read_en,output         Sbox_ready,output reg[7:0]       Sbox_8_Dout,    output[127:0]   Sbox_4_Dout     );wire[3:0]     data0 ;
wire[3:0]   data1 ;
wire[3:0]   data2 ;
wire[3:0]   data3 ;
wire[3:0]   data4 ;
wire[3:0]   data5 ;
wire[3:0]   data6 ;
wire[3:0]   data7 ;
wire[3:0]   data8 ;
wire[3:0]   data9 ;
wire[3:0]   data10;
wire[3:0]   data11;
wire[3:0]   data12;
wire[3:0]   data13;
wire[3:0]   data14;
wire[3:0]   data15;
wire[3:0]   data16;
wire[3:0]   data17;
wire[3:0]   data18;
wire[3:0]   data19;
wire[3:0]   data20;
wire[3:0]   data21;
wire[3:0]   data22;
wire[3:0]   data23;
wire[3:0]   data24;
wire[3:0]   data25;
wire[3:0]   data26;
wire[3:0]   data27;
wire[3:0]   data28;
wire[3:0]   data29;
wire[3:0]   data30;
wire[3:0]   data31;wire[3:0] wraddr;
wire      wren;wire[3:0]    q_out0 ;
wire[3:0]   q_out1 ;
wire[3:0]   q_out2 ;
wire[3:0]   q_out3 ;
wire[3:0]   q_out4 ;
wire[3:0]   q_out5 ;
wire[3:0]   q_out6 ;
wire[3:0]   q_out7 ;
wire[3:0]   q_out8 ;
wire[3:0]   q_out9 ;
wire[3:0]   q_out10;
wire[3:0]   q_out11;
wire[3:0]   q_out12;
wire[3:0]   q_out13;
wire[3:0]   q_out14;
wire[3:0]   q_out15;
wire[3:0]   q_out16;
wire[3:0]   q_out17;
wire[3:0]   q_out18;
wire[3:0]   q_out19;
wire[3:0]   q_out20;
wire[3:0]   q_out21;
wire[3:0]   q_out22;
wire[3:0]   q_out23;
wire[3:0]   q_out24;
wire[3:0]   q_out25;
wire[3:0]   q_out26;
wire[3:0]   q_out27;
wire[3:0]   q_out28;
wire[3:0]   q_out29;
wire[3:0]   q_out30;
wire[3:0]   q_out31;wire[7:0]   S_box_D0 ;
wire[7:0]   S_box_D1 ;
wire[7:0]   S_box_D2 ;
wire[7:0]   S_box_D3 ;
wire[7:0]   S_box_D4 ;
wire[7:0]   S_box_D5 ;
wire[7:0]   S_box_D6 ;
wire[7:0]   S_box_D7 ;
wire[7:0]   S_box_D8 ;
wire[7:0]   S_box_D9 ;
wire[7:0]   S_box_D10;
wire[7:0]   S_box_D11;
wire[7:0]   S_box_D12;
wire[7:0]   S_box_D13;
wire[7:0]   S_box_D14;
wire[7:0]   S_box_D15;wire[3:0]     ADDR0 ;
wire[3:0]   ADDR1 ;
wire[3:0]   ADDR2 ;
wire[3:0]   ADDR3 ;
wire[3:0]   ADDR4 ;
wire[3:0]   ADDR5 ;
wire[3:0]   ADDR6 ;
wire[3:0]   ADDR7 ;
wire[3:0]   ADDR8 ;
wire[3:0]   ADDR9 ;
wire[3:0]   ADDR10;
wire[3:0]   ADDR11;
wire[3:0]   ADDR12;
wire[3:0]   ADDR13;
wire[3:0]   ADDR14;
wire[3:0]   ADDR15;
wire[3:0]   ADDR16;
wire[3:0]   ADDR17;
wire[3:0]   ADDR18;
wire[3:0]   ADDR19;
wire[3:0]   ADDR20;
wire[3:0]   ADDR21;
wire[3:0]   ADDR22;
wire[3:0]   ADDR23;
wire[3:0]   ADDR24;
wire[3:0]   ADDR25;
wire[3:0]   ADDR26;
wire[3:0]   ADDR27;
wire[3:0]   ADDR28;
wire[3:0]   ADDR29;
wire[3:0]   ADDR30;
wire[3:0]   ADDR31;assign S_box_D0 =  {q_out1 ,q_out0 };assign S_box_D1 =  {q_out3 ,q_out2 };assign S_box_D2 =  {q_out5 ,q_out4 };assign S_box_D3 =  {q_out7 ,q_out6 };assign S_box_D4 =  {q_out9 ,q_out8 };assign S_box_D5 =  {q_out11,q_out10};assign S_box_D6 =  {q_out13,q_out12};assign S_box_D7 =  {q_out15,q_out14};assign S_box_D8 =  {q_out17,q_out16};assign S_box_D9 =  {q_out19,q_out18};assign S_box_D10 = {q_out21,q_out20};assign S_box_D11 = {q_out23,q_out22};assign S_box_D12 = {q_out25,q_out24};assign S_box_D13 = {q_out27,q_out26};assign S_box_D14 = {q_out29,q_out28};assign S_box_D15 = {q_out31,q_out30};assign ADDR0  = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr0 ;assign ADDR1  = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr1 ;assign ADDR2  = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr2 ;assign ADDR3  = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr3 ;assign ADDR4  = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr4 ;assign ADDR5  = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr5 ;assign ADDR6  = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr6 ;assign ADDR7  = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr7 ;assign ADDR8  = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr8 ;assign ADDR9  = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr9 ;assign ADDR10 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr10;assign ADDR11 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr11;assign ADDR12 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr12;assign ADDR13 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr13;assign ADDR14 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr14;assign ADDR15 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr15;assign ADDR16 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr16;assign ADDR17 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr17;assign ADDR18 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr18;assign ADDR19 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr19;assign ADDR20 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr20;assign ADDR21 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr21;assign ADDR22 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr22;assign ADDR23 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr23;assign ADDR24 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr24;assign ADDR25 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr25;assign ADDR26 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr26;assign ADDR27 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr27;assign ADDR28 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr28;assign ADDR29 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr29;assign ADDR30 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr30;assign ADDR31 = Sbox_8_en ? Sbox_8_addr[3:0] : Sbox_4_addr31;  //RAM INSTassign Sbox_4_Dout = {q_out31,q_out30,q_out29,q_out28,q_out27,q_out26,q_out25,q_out24,q_out23,q_out22,q_out21,q_out20,q_out19,q_out18,q_out17,q_out16,q_out15,q_out14,q_out13,q_out12,q_out11,q_out10,q_out9,q_out8,q_out7,q_out6,q_out5,q_out4,q_out3,q_out2,q_out1,q_out0};always@(*)
begincase(Sbox_8_addr[7:4])0:  Sbox_8_Dout <= S_box_D0 ;1:  Sbox_8_Dout <= S_box_D1 ;2:  Sbox_8_Dout <= S_box_D2 ;3:  Sbox_8_Dout <= S_box_D3 ;4:  Sbox_8_Dout <= S_box_D4 ;5:  Sbox_8_Dout <= S_box_D5 ;6:  Sbox_8_Dout <= S_box_D6 ;7:  Sbox_8_Dout <= S_box_D7 ; 8:  Sbox_8_Dout <= S_box_D8 ;9:  Sbox_8_Dout <= S_box_D9 ;10: Sbox_8_Dout <= S_box_D10;11: Sbox_8_Dout <= S_box_D11;12: Sbox_8_Dout <= S_box_D12;13: Sbox_8_Dout <= S_box_D13;14: Sbox_8_Dout <= S_box_D14;15: Sbox_8_Dout <= S_box_D15;  endcaseendwrite_data write_data(.clk(clk),.rst_n(rst_n),.Sbox_mode(Sbox_mode),.Sbox_write_en(Sbox_write_en),.Sbox_ready(Sbox_ready),.data0 (data0 ),.data1 (data1 ),.data2 (data2 ),.data3 (data3 ),.data4 (data4 ),.data5 (data5 ),.data6 (data6 ),.data7 (data7 ),.data8 (data8 ),.data9 (data9 ),.data10(data10),.data11(data11),.data12(data12),.data13(data13),.data14(data14),.data15(data15),.data16(data16),.data17(data17),.data18(data18),.data19(data19),.data20(data20),.data21(data21),.data22(data22),.data23(data23),.data24(data24),.data25(data25),.data26(data26),.data27(data27),.data28(data28),.data29(data29),.data30(data30),.data31(data31),.wraddr(wraddr),.wren(wren)
);reg[3:0] wraddr_reg;always@( posedge clk or negedge rst_n)
beginif( ! rst_n ) wraddr_reg <= 0;elsewraddr_reg <= wraddr  ;end   fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst0
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data0 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR0 ),
.data_out  (q_out0),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst1
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data1 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR1 ),
.data_out  (q_out1),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst2
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data2 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR2 ),
.data_out  (q_out2),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst3
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data3 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR3 ),
.data_out  (q_out3),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst4
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data4 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR4 ),
.data_out  (q_out4),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst5
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data5 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR5 ),
.data_out  (q_out5),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst6
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data6 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR6 ),
.data_out  (q_out6),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst7
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data7 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR7 ),
.data_out  (q_out7),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst8
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data8 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR8 ),
.data_out  (q_out8),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst9
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data9 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR9 ),
.data_out  (q_out9),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst10
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data10 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR10 ),
.data_out  (q_out10),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst11
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data11 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR11 ),
.data_out  (q_out11),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst12
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data12 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR12 ),
.data_out  (q_out12),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst13
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data13 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR13 ),
.data_out  (q_out13),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst14
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data14 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR14 ),
.data_out  (q_out14),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst15
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data15 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR15 ),
.data_out  (q_out15),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst16
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data16 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR16 ),
.data_out  (q_out16),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst17
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data17 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR17 ),
.data_out  (q_out17),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst18
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data18 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR18 ),
.data_out  (q_out18),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst19
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data19 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR19 ),
.data_out  (q_out19),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst20
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data20 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR20 ),
.data_out  (q_out20),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst21
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data21),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR21),
.data_out  (q_out21),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst22
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data22 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR22 ),
.data_out  (q_out22),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst23
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data23 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR23 ),
.data_out  (q_out23),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst24
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data24 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR24 ),
.data_out  (q_out24),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst25
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data25 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR25),
.data_out  (q_out25),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst26
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data26),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR26 ),
.data_out  (q_out26),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst27
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data27 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR27 ),
.data_out  (q_out27),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst28
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data28 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR28 ),
.data_out  (q_out28),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst29
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data29 ),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR29 ),
.data_out  (q_out29),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst30
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data30),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR30 ),
.data_out  (q_out30),
.rd_en     (1'b1   ));fifo_ram#(
.USER_BLOCK("TRUE"),
.ADDR_WIDTH(4),
.BASE_WIDTH(4)
) fifo_ram_inst31
(
.wr_clk    (clk  ),
.wr_rst    (!rst_n  ),
.wr_addr   (wraddr_reg ),
.data_in   (data31),
.wr_en    (wren    ),
.rd_clk   (clk  ),
.rd_rst    (!rst_n  ),
.rd_addr   (ADDR31 ),
.data_out  (q_out31),
.rd_en     (1'b1   ));endmodule

2.4 S盒实现工程的说明

主模块(test_s_box)分为两部分,一部分调用双端口RAM ip核,例化了32个位宽4bit,深度16的双端口RAM,用于存储32 个 S-Box 的总空间为 256 字节(=8×256bit)的数据。RAM的读地址为ADDR0-ADDR31,主模块中通过数据选择器实现了读地址的逻辑以及实现了输出信号Sbox_4_Dout和Sbox_8_Dout的逻辑。
RAM写地址、写使能和写数据的产生由另一部分write_data模块来实现,主要功能是通过输入不同的模式指令实现不同参数的切换,同时产生写地址、写使能和写数据输入到主模块的32个RAM中,完成不同模式下参数的写RAM,供读数据。write_data模块中,使用状态机实现输入不同的模式下,选择对应的参数,同时生成写地址、写使能和写数据。

三、S盒FPGA实现的仿真


部分仿真的输入如下:

         #100Sbox_8_addr = 8'h22;  #100Sbox_8_addr = 8'h33;#100Sbox_8_addr = 8'h44;    #100Sbox_8_addr = 8'h55;Sbox_write_en= 1;#10000Sbox_write_en = 0;

如上红框中是s盒的输出。

AES算法中S盒的FPGA实现 II相关推荐

  1. AES算法中S盒的FPGA实现

    AES算法中S盒的FPGA实现 I 语言 : verilog EDA 工具 : quartus AES算法中S盒的FPGA实现 I 一.S盒的简介 二.S盒的实现要求 三.S盒FPGA实现的具体方案 ...

  2. s盒c语言算法,AES加密算法中的S盒及其C语言实现

    摘要 详细叙述了算法中S盒的构造,并给出了其C语言实现的程序代码.S盒由有限域G F(28)上所有元素的乘法逆元及在域G F(2)上的仿射变换构成,经过S盒的非线性字节代换,密文的差分均匀性和线性偏差 ...

  3. s盒密码c语言源代码csdn,AES中S盒的c语言实现及代码

    什么是AES? AES 是一个对称分组密码算法,又称高级加密标准. AES是一个区块加密标准,用于替代原本的DES,其已然成为对称密钥加密中最流行的算法之一. 这里主要实现AES算法中最基本的S盒. ...

  4. 基于AES算法的英文文字加解密

    目录 一.理论基础 二.核心程序 三.仿真结论 一.理论基础 AES算法是一种对称加密算法,被广泛应用于数据加密和保护领域中.将介绍如何使用AES算法对英文文字进行加解密. 一.AES算法概述 AES ...

  5. 奇妙的安全旅行之AES算法

    hi,大家好,今天开始我们来介绍一下对称加密算法中的AES算法. AES简介 AES(英语:Advanced Encryption Standard,缩写:AES),即高级加密标准,在密码学中又称Ri ...

  6. AES算法相关数学知识 - 素域学习

    在AES算法中的MixColumn层中会用到伽罗瓦域中的乘法运算,而伽罗瓦域的运算涉及一些数学知识如下: 素域 有限域有时也称伽罗瓦域,它指的是由有限个元素组成的集合,在这个集合内可以执行加.减.乘和 ...

  7. python base64编码_JS和Python实现AES算法

    1. AES原理 AES算法是典型的对称加密算法,AES原理可以学习这两篇文档: 漫画:什么是AES算法:https://www.toutiao.com/i6783550080784794124/ A ...

  8. 关于AES算法及JAVA中的实现

    为什么80%的码农都做不了架构师?>>>    什么是AES 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法, ...

  9. AES算法在Wi-Fi加密中的应用

    一. Wi-Fi加密技术的发展史 Wi-Fi是一种创建于IEEE802.11标准的无线局域网技术,Wi-Fi部署区网可让客户端设备无需使用电线,降低网络部署和扩充的成本.随着技术的逐渐成熟,Wi-Fi ...

最新文章

  1. wordpress文章发布接口开发
  2. TOMCAT服务器概述
  3. 堆排序(C\C++)
  4. MySQL主键学习总结
  5. 9.1-全栈Java笔记: 容器泛型—认识Collection接口
  6. 设计模式(三)--适配器模式
  7. if js 判断成绩等级_javascript://8种方法根据分数判断等级
  8. ConTeXt 文稿的逻辑结构
  9. iOS 腾讯云IM UIKit 升级XCode11后, 调用语音(取消) 崩溃问题
  10. 1694件AI事件大盘点!2020年12月,哪些让你记忆深刻
  11. Visual Studio 2015 专业版安装方法
  12. dx逆向建模步骤_产品温度的逆向建模的系统和方法与流程
  13. php手册chm打开空白
  14. php计算第几周,php计算当前是一年或一月中第几周的函数
  15. AI识别照片是谁,人脸识别face_recognition开源项目安装使用 | 机器学习
  16. Oracle 、SqlServer 根据日期逐日、逐月递增累加、逐行累加
  17. 大华摄像头视频接入(一)
  18. 手机手写签名 php,基于canvas实现手写签名(vue)
  19. 1.1 Tekton学习笔记之基本概念
  20. 【React】React——redux

热门文章

  1. 关于 网页 链接 分享朋友圈 更换title 文字方法
  2. 计算机操作与规范,计算机操作基础与汉字规范码拼音拼形训练
  3. 解决easyui combobox赋值boolean类型的值时,经常出现的内容显示的value而不是text的bug...
  4. Mysql 索引模型 B+ 树详解
  5. mysql 按首字母进行检索数据
  6. php身份证识别ORC
  7. OpenCV玩微信小游戏星途WeGoing
  8. 前后端交互流程,如何进行交互
  9. 网上兼职编程赚钱的那点事
  10. 风控中消费信贷板块的英文词汇