基于FPGA的des算法

1.开发要求

1.利用开发版按键输入数据,LCD12864显示数据 

2.利用vivado编写代码,利用ila  ip核做逻辑分析仪,电脑上显示算法结果

3.LCD12864一行只能显示16个字符,总共4行,前三行分别显示,密钥,明文,密文

2.编写流程

1.先做3个模块 按键输入模块  数据处理模块  LCD12864显示驱动模块

2.在数据处理模块里嵌入一个des算法模块

3.完成项目设计

3.代码展示

1.按键处理模块

通过行列扫描,输出键号,使能

  module Array_KeyBoard(   
    input                     clk       ,
    input                     rstn      ,
    input            [3:0]    col       ,
    output    reg    [3:0]    row       ,
    output           [15:0]   key_pulse ,
    output    reg             key_en    ,
    output    reg    [3:0]    key_data    
);
    
localparam            STATE0 = 2'b00;
localparam            STATE1 = 2'b01;
localparam            STATE2 = 2'b10;
localparam            STATE3 = 2'b11;

parameter            CNT_200HZ = 60000;
/*
因使用4x4矩阵按键,通过扫描方法实现,所以这里使用状态机实现,共分为4种状态
在其中的某一状态时间里,对应的4个按键相当于独立按键,可按独立按键的周期采样法采样
周期采样时每隔20ms采样一次,对应这里状态机每隔20ms循环一次,每个状态对应5ms时间
*/

//计数器计数分频实现5ms周期信号clk_200hz
reg    [15:0]    key_out   ;
reg        [15:0]        cnt;
reg                    clk_200hz;
always@(posedge clk or negedge rstn) begin  //复位时计数器cnt清零,clk_200hz信号起始电平为低电平
    if(!rstn) begin
        cnt <= 16'd0;
        clk_200hz <= 1'b0;
    end else begin
        if(cnt >= ((CNT_200HZ>>1) - 1)) begin  //数字逻辑中右移1位相当于除2
            cnt <= 16'd0;
            clk_200hz <= ~clk_200hz;  //clk_200hz信号取反
        end else begin
            cnt <= cnt + 1'b1;
            clk_200hz <= clk_200hz;
        end
    end
end

reg        [1:0]        c_state;
//状态机根据clk_200hz信号在4个状态间循环,每个状态对矩阵按键的行接口单行有效
always@(posedge clk_200hz or negedge rstn) begin
    if(!rstn) begin
        c_state <= STATE0;
        row <= 4'b1110;
    end else begin
        case(c_state)
            //状态c_state跳转及对应状态下矩阵按键的row输出
            STATE0: begin c_state <= STATE1; row <= 4'b1101; end
            STATE1: begin c_state <= STATE2; row <= 4'b1011; end
            STATE2: begin c_state <= STATE3; row <= 4'b0111; end
            STATE3: begin c_state <= STATE0; row <= 4'b1110; end
            default:begin c_state <= STATE0; row <= 4'b1110; end
        endcase
    end
end

reg    [15:0]    key,key_r;
//因为每个状态中单行有效,通过对列接口的电平状态采样得到对应4个按键的状态,依次循环
always@(negedge clk_200hz or negedge rstn) begin
    if(!rstn) begin
        key_out <= 16'hffff; key_r <= 16'hffff; key <= 16'hffff; 
    end else begin
        case(c_state)
            //采集当前状态的列数据赋值给对应的寄存器位
            //对键盘采样数据进行判定,连续两次采样低电平判定为按键按下
            STATE0: begin key_out[ 3: 0] <= key_r[ 3: 0]|key[ 3: 0]; key_r[ 3: 0] <= key[ 3: 0]; key[ 3: 0] <= col; end
            STATE1: begin key_out[ 7: 4] <= key_r[ 7: 4]|key[ 7: 4]; key_r[ 7: 4] <= key[ 7: 4]; key[ 7: 4] <= col; end
            STATE2: begin key_out[11: 8] <= key_r[11: 8]|key[11: 8]; key_r[11: 8] <= key[11: 8]; key[11: 8] <= col; end
            STATE3: begin key_out[15:12] <= key_r[15:12]|key[15:12]; key_r[15:12] <= key[15:12]; key[15:12] <= col; end
            default:begin key_out <= 16'hffff; key_r <= 16'hffff; key <= 16'hffff; end
        endcase
    end
end

reg        [15:0]        key_out_r;
//Register low_sw_r, lock low_sw to next clk
always @ ( posedge clk  or  negedge rstn )
    if (!rstn) key_out_r <= 16'hffff;
    else  key_out_r <= key_out;   //将前一刻的值延迟锁存

//wire    [15:0]         key_pulse;
//Detect the negedge of low_sw, generate pulse
assign key_pulse= key_out_r & ( ~key_out);   //通过前后两个时刻的值判断

always@(posedge clk or negedge rstn)
    begin
        if(!rstn)begin
            key_en   <= 0;
            key_data <= 0;
        end else begin  
            case(key_pulse)
                16'b0000_0000_0000_0001:begin key_en<=1; key_data<=1;    end
                16'b0000_0000_0000_0010:begin key_en<=1; key_data<=2;    end
                16'b0000_0000_0000_0100:begin key_en<=1; key_data<=3;    end
                16'b0000_0000_0000_1000:begin key_en<=1; key_data<=4'hA; end//shift键,切换字母和数字输出
                16'b0000_0000_0001_0000:begin key_en<=1; key_data<=4;    end
                16'b0000_0000_0010_0000:begin key_en<=1; key_data<=5;    end
                16'b0000_0000_0100_0000:begin key_en<=1; key_data<=6;    end
                16'b0000_0000_1000_0000:begin key_en<=1; key_data<=4'hB; end//del键,删除
                16'b0000_0001_0000_0000:begin key_en<=1; key_data<=7;    end
                16'b0000_0010_0000_0000:begin key_en<=1; key_data<=8;    end
                16'b0000_0100_0000_0000:begin key_en<=1; key_data<=9;    end
                16'b0000_1000_0000_0000:begin key_en<=1; key_data<=4'hC; end
                16'b0001_0000_0000_0000:begin key_en<=1; key_data<=4'hE; end
                16'b0010_0000_0000_0000:begin key_en<=1; key_data<=0;    end
                16'b0100_0000_0000_0000:begin key_en<=1; key_data<=4'hF; end//换行+输入输出使能
                16'h1000_0000_0000_0000:begin key_en<=1; key_data<=4'hD; end
                default:begin
                    key_en   <= 0;
                end
            endcase
        end 
    end
endmodule

最后面是按键功能

分别是0-9,shift ,enter,del,按键

2.数据处理模块

将键号数据处理成LCD12864和des算法模块所需要数据

//数据处理模块
module control(
    input               clk      ,
    input               clk_100M ,
    input               clk_100M_180 ,
    input               rstn     ,
    input               key_en   ,
    input      [3:0]    key_data ,
    output reg [7:0]    data1_1  ,
    output reg [7:0]    data1_2  ,
    output reg [7:0]    data1_3  ,
    output reg [7:0]    data1_4  ,
    output reg [7:0]    data1_5  ,
    output reg [7:0]    data1_6  ,
    output reg [7:0]    data1_7  ,
    output reg [7:0]    data1_8  ,
    output reg [7:0]    data1_9  ,
    output reg [7:0]    data1_10 ,
    output reg [7:0]    data1_11 ,
    output reg [7:0]    data1_12 ,
    output reg [7:0]    data1_13 ,
    output reg [7:0]    data1_14 ,
    output reg [7:0]    data1_15 ,
    output reg [7:0]    data1_16 ,
    output reg          flag1    ,
    output reg [7:0]    data2_1  ,
    output reg [7:0]    data2_2  ,
    output reg [7:0]    data2_3  ,
    output reg [7:0]    data2_4  ,
    output reg [7:0]    data2_5  ,
    output reg [7:0]    data2_6  ,
    output reg [7:0]    data2_7  ,
    output reg [7:0]    data2_8  ,
    output reg [7:0]    data2_9  ,
    output reg [7:0]    data2_10 ,
    output reg [7:0]    data2_11 ,
    output reg [7:0]    data2_12 ,
    output reg [7:0]    data2_13 ,
    output reg [7:0]    data2_14 ,
    output reg [7:0]    data2_15 ,
    output reg [7:0]    data2_16 ,
    output reg          flag2    ,
    output reg [7:0]    data3_1  ,
    output reg [7:0]    data3_2  ,
    output reg [7:0]    data3_3  ,
    output reg [7:0]    data3_4  ,
    output reg [7:0]    data3_5  ,
    output reg [7:0]    data3_6  ,
    output reg [7:0]    data3_7  ,
    output reg [7:0]    data3_8  ,
    output reg [7:0]    data3_9  ,
    output reg [7:0]    data3_10 ,
    output reg [7:0]    data3_11 ,
    output reg [7:0]    data3_12 ,
    output reg [7:0]    data3_13 ,
    output reg [7:0]    data3_14 ,
    output reg [7:0]    data3_15 ,
    output reg [7:0]    data3_16 ,
    output reg          flag3     
);
reg qie;
always@(posedge clk or negedge rstn)
    begin
        if(!rstn)begin
            qie <= 0;
        end else if(key_en && key_data==4'hA)begin
            qie <= !qie;
        end else begin
            qie <= qie;
        end
    end
reg [3:0] state;//换行状态
always@(posedge clk or negedge rstn)
    begin
        if(!rstn)begin
            state <= 0;
        end else begin
            case(state)
                0:begin
                    if(key_en && key_data==4'hF)begin
                        state <= state+1;
                    end else begin
                        state <= 0;
                    end
                end
                1:begin
                    if(key_en && key_data==4'hF)begin
                        state <= 0;
                    end else begin
                        state <= state;
                    end
                end
                2:begin
                    if(key_en && key_data==4'hF)begin
                        state <= 0;
                    end else begin
                        state <= state;
                    end
                end
                default:
                    state <= 0;
            endcase
        end 
    end
    //第一行输出
always@(posedge clk or negedge rstn)
    begin
        if(!rstn)begin
            flag1 <= 0;
        end else if(key_en && key_data==4'hF && state==0)begin
            flag1 <= 1;
        end else begin
            flag1 <= 0;
        end
    end
    //第二行输出
always@(posedge clk or negedge rstn)
    begin
        if(!rstn)begin
            flag2 <= 0;
        end else if(key_en && key_data==4'hF && state==1)begin
            flag2 <= 1;
        end else begin
            flag2 <= 0;
        end
    end
    //第三行输出
always@(posedge clk or negedge rstn)
    begin
        if(!rstn)begin
            flag3 <= 0;
        end else if(key_en && key_data==4'hF && state==2)begin
            flag3 <= 1;
        end else begin
            flag3 <= 0;
        end
    end
reg [4:0] addr;//shiift和del
always@(posedge clk or negedge rstn)
    begin
        if(!rstn)begin
            addr <= 0;
        end else if(key_en && key_data==4'hF)begin
            addr <= 0;
        end else if(key_en && key_data<4'hA)begin
            if(addr >= 16)begin
                addr <= 16;
            end else begin
                addr <= addr+1;
            end
        end else if(addr>0 && key_en && key_data==4'hB)begin
            addr <= addr-1;
        end else begin
            addr <= addr;
        end
    end
reg [7:0] data1[15:0];
reg [3:0] dataA[15:0];
reg [4:0] i;
//字母和数字数据处理
always@(posedge clk or negedge rstn)
    begin
        if(!rstn)begin
            for(i=0;i<16;i=i+1)begin
                data1[i] <= 0;
                dataA[i] <= 0;
            end
        end else if(key_en && key_data<4'hA && state==0)begin
            data1[0] <= qie ? 8'h20+key_data : 8'h10+key_data;
            dataA[0] <= qie ? 9+key_data : key_data;
            for(i=1;i<16;i=i+1)begin
                data1[i] <= data1[i-1];
                dataA[i] <= dataA[i-1];
            end
        end else if(addr>0 && key_en && key_data==4'hB && state==0)begin
            for(i=1;i<16;i=i+1)begin
                data1[i-1] <= data1[i];
                dataA[i-1] <= dataA[i];
            end
            data1[15] <= 0;
            dataA[15] <= 0;
        end
    end
reg [7:0] data2[15:0];
reg [3:0] dataB[15:0];
reg [4:0] j;
always@(posedge clk or negedge rstn)
    begin
        if(!rstn)begin
            for(j=0;j<16;j=j+1)begin
                data2[j] <= 0;
                dataB[j] <= 0;
            end
        end else if(key_en && key_data<4'hA && state==1)begin
            data2[0] <= qie ? 8'h20+key_data : 8'h10+key_data;
            dataB[0] <= qie ? 9+key_data : key_data;
            for(j=1;j<16;j=j+1)begin
                data2[j] <= data2[j-1];
                dataB[j] <= dataB[j-1];
            end
        end else if(addr>0 && key_en && key_data==4'hB && state==1)begin
            for(j=1;j<16;j=j+1)begin
                data2[j-1] <= data2[j];
                dataB[j-1] <= dataB[j];
            end
            data2[15] <= 0;
            dataB[15] <= 0;
        end
    end
reg [7:0] data3[15:0];
reg [3:0] dataC[15:0];
reg [4:0] k;
always@(posedge clk or negedge rstn)
    begin
        if(!rstn)begin
            for(k=0;k<16;k=k+1)begin
                data3[k] <= 0;
                dataC[k] <= 0;
            end
        end else if(key_en && key_data<4'hA && state==2)begin
            data3[0] <= qie ? 8'h20+key_data : 8'h10+key_data;
            dataC[0] <= qie ? 9+key_data : key_data;
            for(k=1;k<16;k=k+1)begin
                data3[k] <= data3[k-1];
                dataC[k] <= dataC[k-1];
            end
        end else if(addr>0 && key_en && key_data==4'hB && state==2)begin
            for(k=1;k<16;k=k+1)begin
                data3[k-1] <= data3[k];
                dataC[k-1] <= dataC[k];
            end
            data3[15] <= 0;
            dataC[15] <= 0;
        end
    end
always@(posedge clk)
    begin
        data1_1   <= data1[15];
        data1_2   <= data1[14];
        data1_3   <= data1[13];
        data1_4   <= data1[12];
        data1_5   <= data1[11];
        data1_6   <= data1[10];
        data1_7   <= data1[9 ];
        data1_8   <= data1[8 ];
        data1_9   <= data1[7 ];
        data1_10  <= data1[6 ];
        data1_11  <= data1[5 ];
        data1_12  <= data1[4 ];
        data1_13  <= data1[3 ];
        data1_14  <= data1[2 ];
        data1_15  <= data1[1 ];
        data1_16  <= data1[0 ];

        data2_1   <= data2[15];
        data2_2   <= data2[14];
        data2_3   <= data2[13];
        data2_4   <= data2[12];
        data2_5   <= data2[11];
        data2_6   <= data2[10];
        data2_7   <= data2[9 ];
        data2_8   <= data2[8 ];
        data2_9   <= data2[7 ];
        data2_10  <= data2[6 ];
        data2_11  <= data2[5 ];
        data2_12  <= data2[4 ];
        data2_13  <= data2[3 ];
        data2_14  <= data2[2 ];
        data2_15  <= data2[1 ];
        data2_16  <= data2[0 ];
    end
reg   [3:0] dataA_1 ;
reg   [3:0] dataA_2 ;
reg   [3:0] dataA_3 ;
reg   [3:0] dataA_4 ;
reg   [3:0] dataA_5 ;
reg   [3:0] dataA_6 ;
reg   [3:0] dataA_7 ;
reg   [3:0] dataA_8 ;
reg   [3:0] dataA_9 ;
reg   [3:0] dataA_10;
reg   [3:0] dataA_11;
reg   [3:0] dataA_12;
reg   [3:0] dataA_13;
reg   [3:0] dataA_14;
reg   [3:0] dataA_15;
reg   [3:0] dataA_16;
reg   [3:0] dataB_1 ;
reg   [3:0] dataB_2 ;
reg   [3:0] dataB_3 ;
reg   [3:0] dataB_4 ;
reg   [3:0] dataB_5 ;
reg   [3:0] dataB_6 ;
reg   [3:0] dataB_7 ;
reg   [3:0] dataB_8 ;
reg   [3:0] dataB_9 ;
reg   [3:0] dataB_10;
reg   [3:0] dataB_11;
reg   [3:0] dataB_12;
reg   [3:0] dataB_13;
reg   [3:0] dataB_14;
reg   [3:0] dataB_15;
reg   [3:0] dataB_16;
reg   [3:0] dataC_1 ;
reg   [3:0] dataC_2 ;
reg   [3:0] dataC_3 ;
reg   [3:0] dataC_4 ;
reg   [3:0] dataC_5 ;
reg   [3:0] dataC_6 ;
reg   [3:0] dataC_7 ;
reg   [3:0] dataC_8 ;
reg   [3:0] dataC_9 ;
reg   [3:0] dataC_10;
reg   [3:0] dataC_11;
reg   [3:0] dataC_12;
reg   [3:0] dataC_13;
reg   [3:0] dataC_14;
reg   [3:0] dataC_15;
reg   [3:0] dataC_16;
always@(posedge clk)
    begin
        dataA_1   <= dataA[15];
        dataA_2   <= dataA[14];
        dataA_3   <= dataA[13];
        dataA_4   <= dataA[12];
        dataA_5   <= dataA[11];
        dataA_6   <= dataA[10];
        dataA_7   <= dataA[9 ];
        dataA_8   <= dataA[8 ];
        dataA_9   <= dataA[7 ];
        dataA_10  <= dataA[6 ];
        dataA_11  <= dataA[5 ];
        dataA_12  <= dataA[4 ];
        dataA_13  <= dataA[3 ];
        dataA_14  <= dataA[2 ];
        dataA_15  <= dataA[1 ];
        dataA_16  <= dataA[0 ];
        dataB_1   <= dataB[15];
        dataB_2   <= dataB[14];
        dataB_3   <= dataB[13];
        dataB_4   <= dataB[12];
        dataB_5   <= dataB[11];
        dataB_6   <= dataB[10];
        dataB_7   <= dataB[9 ];
        dataB_8   <= dataB[8 ];
        dataB_9   <= dataB[7 ];
        dataB_10  <= dataB[6 ];
        dataB_11  <= dataB[5 ];
        dataB_12  <= dataB[4 ];
        dataB_13  <= dataB[3 ];
        dataB_14  <= dataB[2 ];
        dataB_15  <= dataB[1 ];
        dataB_16  <= dataB[0 ];
        dataC_1   <= dataC[15];
        dataC_2   <= dataC[14];
        dataC_3   <= dataC[13];
        dataC_4   <= dataC[12];
        dataC_5   <= dataC[11];
        dataC_6   <= dataC[10];
        dataC_7   <= dataC[9 ];
        dataC_8   <= dataC[8 ];
        dataC_9   <= dataC[7 ];
        dataC_10  <= dataC[6 ];
        dataC_11  <= dataC[5 ];
        dataC_12  <= dataC[4 ];
        dataC_13  <= dataC[3 ];
        dataC_14  <= dataC[2 ];
        dataC_15  <= dataC[1 ];
        dataC_16  <= dataC[0 ];
    end

wire          i_flag   ;
wire [63:0]   i_key    ;
wire          i_key_en ;
wire          o_key_ok ;
wire [63:0]   i_din    ;
wire          i_din_en ;
wire [63:0]   o_dout   ;
wire          o_dout_en;  
//按键输入数据处理后给des
assign i_key    = {dataA_1,dataA_2,dataA_3,dataA_4,dataA_5,dataA_6,dataA_7,dataA_8,dataA_9,dataA_10,dataA_11,dataA_12,dataA_13,dataA_14,dataA_15,dataA_16};
assign i_key_en = flag1;
assign i_din    = {dataB_1,dataB_2,dataB_3,dataB_4,dataB_5,dataB_6,dataB_7,dataB_8,dataB_9,dataB_10,dataB_11,dataB_12,dataB_13,dataB_14,dataB_15,dataB_16};
assign i_din_en = flag2;
//链接des模块
des_core des_core_u(
    .clk        (clk      ),  //input           clk      ,
    .rst        (!rstn    ),  //input           rst      ,
    .i_flag     (1        ),  //input           i_flag   ,  //1-encrypt,0-decrypt
    .i_key      (i_key    ),  //input  [63:0]   i_key    ,
    .i_key_en   (i_key_en ),  //input           i_key_en ,  //1-key init start
    .o_key_ok   (o_key_ok ),  //output          o_key_ok ,  //1-key init done
    .i_din      (i_din    ),  //input  [63:0]   i_din    ,
    .i_din_en   (i_din_en ),  //input           i_din_en ,
    .o_dout     (o_dout   ),  //output [63:0]   o_dout   ,
    .o_dout_en  (o_dout_en)   //output          o_dout_en
);
//DES处理后给LCD12864的数据处理
always@(posedge clk or negedge rstn)
    begin
        if(!rstn)begin
            data3_1   <= 0;
            data3_2   <= 0;
            data3_3   <= 0;
            data3_4   <= 0;
            data3_5   <= 0;
            data3_6   <= 0;
            data3_7   <= 0;
            data3_8   <= 0;
            data3_9   <= 0;
            data3_10  <= 0;
            data3_11  <= 0;
            data3_12  <= 0;
            data3_13  <= 0;
            data3_14  <= 0;
            data3_15  <= 0;
            data3_16  <= 0;
        end else if(o_dout_en)begin
            data3_1   <= (o_dout[63:60] > 9) ? 8'h17+o_dout[63:60] : 8'h10+o_dout[63:60];
            data3_2   <= (o_dout[59:56] > 9) ? 8'h17+o_dout[59:56] : 8'h10+o_dout[59:56];
            data3_3   <= (o_dout[55:52] > 9) ? 8'h17+o_dout[55:52] : 8'h10+o_dout[55:52];
            data3_4   <= (o_dout[51:48] > 9) ? 8'h17+o_dout[51:48] : 8'h10+o_dout[51:48];
            data3_5   <= (o_dout[47:44] > 9) ? 8'h17+o_dout[47:44] : 8'h10+o_dout[47:44];
            data3_6   <= (o_dout[43:40] > 9) ? 8'h17+o_dout[43:40] : 8'h10+o_dout[43:40];
            data3_7   <= (o_dout[39:36] > 9) ? 8'h17+o_dout[39:36] : 8'h10+o_dout[39:36];
            data3_8   <= (o_dout[35:32] > 9) ? 8'h17+o_dout[35:32] : 8'h10+o_dout[35:32];
            data3_9   <= (o_dout[31:28] > 9) ? 8'h17+o_dout[31:28] : 8'h10+o_dout[31:28];
            data3_10  <= (o_dout[27:24] > 9) ? 8'h17+o_dout[27:24] : 8'h10+o_dout[27:24];
            data3_11  <= (o_dout[23:20] > 9) ? 8'h17+o_dout[23:20] : 8'h10+o_dout[23:20];
            data3_12  <= (o_dout[19:16] > 9) ? 8'h17+o_dout[19:16] : 8'h10+o_dout[19:16];
            data3_13  <= (o_dout[15:12] > 9) ? 8'h17+o_dout[15:12] : 8'h10+o_dout[15:12];
            data3_14  <= (o_dout[11:8]  > 9) ? 8'h17+o_dout[11:8]  : 8'h10+o_dout[11:8] ;
            data3_15  <= (o_dout[7:4]   > 9) ? 8'h17+o_dout[7:4]   : 8'h10+o_dout[7:4]  ;
            data3_16  <= (o_dout[3:0]   > 9) ? 8'h17+o_dout[3:0]   : 8'h10+o_dout[3:0]  ;
        end     
    end
 ila_0 your_instance_name (
	.clk(clk_100M), 
	.probe0(o_dout),
	.probe1(i_din),
	.probe2(i_key),
	.probe3(o_dout_en)
);
 

 在这里面有2个连接的模块,分别是ila和des算法模块

3.LCD12864显示驱动模块

将数据处理成3个使能和8个数据,给硬件显示

module lcd12864(
    input               clk            ,
    input               rstn           ,
    input       [7:0]   data1_1        ,
    input       [7:0]   data1_2        ,
    input       [7:0]   data1_3        ,
    input       [7:0]   data1_4        ,
    input       [7:0]   data1_5        ,
    input       [7:0]   data1_6        ,
    input       [7:0]   data1_7        ,
    input       [7:0]   data1_8        ,
    input       [7:0]   data1_9        ,
    input       [7:0]   data1_10       ,
    input       [7:0]   data1_11       ,
    input       [7:0]   data1_12       ,
    input       [7:0]   data1_13       ,
    input       [7:0]   data1_14       ,
    input       [7:0]   data1_15       ,
    input       [7:0]   data1_16       ,
    input       [7:0]   data2_1        ,
    input       [7:0]   data2_2        ,
    input       [7:0]   data2_3        ,
    input       [7:0]   data2_4        ,
    input       [7:0]   data2_5        ,
    input       [7:0]   data2_6        ,
    input       [7:0]   data2_7        ,
    input       [7:0]   data2_8        ,
    input       [7:0]   data2_9        ,
    input       [7:0]   data2_10       ,
    input       [7:0]   data2_11       ,
    input       [7:0]   data2_12       ,
    input       [7:0]   data2_13       ,
    input       [7:0]   data2_14       ,
    input       [7:0]   data2_15       ,
    input       [7:0]   data2_16       ,
    input       [7:0]   data3_1        ,
    input       [7:0]   data3_2        ,
    input       [7:0]   data3_3        ,
    input       [7:0]   data3_4        ,
    input       [7:0]   data3_5        ,
    input       [7:0]   data3_6        ,
    input       [7:0]   data3_7        ,
    input       [7:0]   data3_8        ,
    input       [7:0]   data3_9        ,
    input       [7:0]   data3_10       ,
    input       [7:0]   data3_11       ,
    input       [7:0]   data3_12       ,
    input       [7:0]   data3_13       ,
    input       [7:0]   data3_14       ,
    input       [7:0]   data3_15       ,
    input       [7:0]   data3_16       ,
    output              lcd_rs         , 
    output              lcd_rw         , 
    output              lcd_en         , 
    output      [7:0]   lcd_data        
);   

reg        clk_lcd;                                         
reg [16:0] cnt    ;                                                      
always @(posedge clk or negedge rstn)
    begin
        if(!rstn)begin 
            cnt     <= 17'b0;
            clk_lcd <= 0;
        end else if(cnt == 17'd7999)begin
            cnt     <= 17'd0;
            clk_lcd <= !clk_lcd;
        end else begin
            cnt <= cnt +1'b1;
        end
    end                  
reg [8:0] state_lcd; 
parameter IDLE              = 4'd0;
parameter CMD_WIDTH         = 4'd1;
parameter CMD_SET           = 4'd2;
parameter CMD_CURSOR        = 4'd3;
parameter CMD_CLEAR         = 4'd4;
parameter CMD_ACCESS        = 4'd5;
parameter CMD_DDRAM         = 4'd6;
parameter DATA_WRITE        = 4'd7;
parameter STOP              = 4'd8;

reg       lcd_rs_r;
reg [5:0] cnt_time;
reg [7:0] lcd_data_r;
reg [7:0] data_buff;

assign lcd_rs   = lcd_rs_r;
assign lcd_rw   = 1'b0; 
assign lcd_en   = clk_lcd;  
assign lcd_data = lcd_data_r;

always @(posedge clk_lcd or negedge rstn)
    begin
        if(!rstn)
        begin
            lcd_rs_r   <= 1'b0;
            state_lcd  <= IDLE;
            lcd_data_r <= 8'bzzzzzzzz;       
            cnt_time   <= 6'd0;
        end
        else 
        begin
            case(state_lcd)
                IDLE:  
                begin  
                    lcd_rs_r   <= 1'b0;
                    cnt_time   <= 6'd0;
                    state_lcd  <= CMD_WIDTH;
                    lcd_data_r <= 8'bzzzzzzzz;  
                end
                CMD_WIDTH:                    
                begin
                    lcd_rs_r   <= 1'b0;
                    state_lcd  <= CMD_SET;    
                    lcd_data_r <= 8'h30;                  
                end
                CMD_SET:
                begin
                    lcd_rs_r   <= 1'b0;
                    state_lcd  <= CMD_CURSOR;
                    lcd_data_r <= 8'h30;             
                end
                CMD_CURSOR:
                begin
                    lcd_rs_r   <= 1'b0;
                    state_lcd  <= CMD_CLEAR;
                    lcd_data_r <= 8'h0c;      
                end
                CMD_CLEAR:
                begin
                    lcd_rs_r   <= 1'b0;
                    state_lcd  <= CMD_ACCESS;
                    lcd_data_r <= 8'h01;          
                end
                CMD_ACCESS:
                begin
                    lcd_rs_r   <= 1'b0;
                    state_lcd  <= CMD_DDRAM;
                    lcd_data_r <= 8'h06;    
                end
                CMD_DDRAM:                  
                begin
                    lcd_rs_r  <= 1'b0;
                    state_lcd <= DATA_WRITE;
                    case (cnt_time)
                        6'd0:  lcd_data_r <= 8'h80;
                        6'd16: lcd_data_r <= 8'h90;
                        6'd32: lcd_data_r <= 8'h88;
                        6'd48: lcd_data_r <= 8'h98;
                    endcase
                end
                DATA_WRITE:                               
                begin
                    lcd_rs_r <= 1'b1;
                    cnt_time <= cnt_time + 1'b1;
                    lcd_data_r <= data_buff;
                    case (cnt_time)
                        6'd15: state_lcd <= CMD_DDRAM;
                        6'd31: state_lcd <= CMD_DDRAM;
                        6'd47: state_lcd <= CMD_DDRAM;
                        6'd63: state_lcd <= STOP;
                        default:
                            state_lcd <= DATA_WRITE;
                    endcase
                end
                STOP:
                begin
                    lcd_rs_r <= 1'b0;
                    state_lcd <= CMD_DDRAM;
                    lcd_data_r <= 8'h80;                
                    cnt_time <= 6'd0;
                end
                default: 
                    state_lcd <= IDLE;
            endcase
        end
    end
    
always @(posedge clk) 
    begin
        case (cnt_time)
             6'd0:  data_buff <= 8'h20 + data1_1 ;
             6'd1:  data_buff <= 8'h20 + data1_2 ;
             6'd2:  data_buff <= 8'h20 + data1_3 ;
             6'd3:  data_buff <= 8'h20 + data1_4 ;
             6'd4:  data_buff <= 8'h20 + data1_5 ;
             6'd5:  data_buff <= 8'h20 + data1_6 ;
             6'd6:  data_buff <= 8'h20 + data1_7 ;
             6'd7:  data_buff <= 8'h20 + data1_8 ;
             6'd8:  data_buff <= 8'h20 + data1_9 ;
             6'd9:  data_buff <= 8'h20 + data1_10;
            6'd10:  data_buff <= 8'h20 + data1_11;
            6'd11:  data_buff <= 8'h20 + data1_12;
            6'd12:  data_buff <= 8'h20 + data1_13;
            6'd13:  data_buff <= 8'h20 + data1_14;
            6'd14:  data_buff <= 8'h20 + data1_15;
            6'd15:  data_buff <= 8'h20 + data1_16;
            
            6'd16:  data_buff <= 8'h20 + data2_1 ;
            6'd17:  data_buff <= 8'h20 + data2_2 ;
            6'd18:  data_buff <= 8'h20 + data2_3 ;
            6'd19:  data_buff <= 8'h20 + data2_4 ;
            6'd20:  data_buff <= 8'h20 + data2_5 ;
            6'd21:  data_buff <= 8'h20 + data2_6 ;
            6'd22:  data_buff <= 8'h20 + data2_7 ;
            6'd23:  data_buff <= 8'h20 + data2_8 ;
            6'd24:  data_buff <= 8'h20 + data2_9 ;
            6'd25:  data_buff <= 8'h20 + data2_10;
            6'd26:  data_buff <= 8'h20 + data2_11;
            6'd27:  data_buff <= 8'h20 + data2_12;
            6'd28:  data_buff <= 8'h20 + data2_13;
            6'd29:  data_buff <= 8'h20 + data2_14;
            6'd30:  data_buff <= 8'h20 + data2_15;
            6'd31:  data_buff <= 8'h20 + data2_16;
            
            6'd32:  data_buff <= 8'h20 + data3_1 ;
            6'd33:  data_buff <= 8'h20 + data3_2 ;
            6'd34:  data_buff <= 8'h20 + data3_3 ;
            6'd35:  data_buff <= 8'h20 + data3_4 ;
            6'd36:  data_buff <= 8'h20 + data3_5 ;
            6'd37:  data_buff <= 8'h20 + data3_6 ;
            6'd38:  data_buff <= 8'h20 + data3_7 ;
            6'd39:  data_buff <= 8'h20 + data3_8 ;
            6'd40:  data_buff <= 8'h20 + data3_9 ;
            6'd41:  data_buff <= 8'h20 + data3_10;
            6'd42:  data_buff <= 8'h20 + data3_11;
            6'd43:  data_buff <= 8'h20 + data3_12;
            6'd44:  data_buff <= 8'h20 + data3_13;
            6'd45:  data_buff <= 8'h20 + data3_14;
            6'd46:  data_buff <= 8'h20 + data3_15;
            6'd47:  data_buff <= 8'h20 + data3_16;
            
            6'd48:  data_buff <= " ";
            6'd49:  data_buff <= " ";
            6'd50:  data_buff <= " ";
            6'd51:  data_buff <= " ";
            6'd52:  data_buff <= " ";
            6'd53:  data_buff <= " ";
            6'd54:  data_buff <= " ";
            6'd55:  data_buff <= " ";
            6'd56:  data_buff <= " ";
            6'd57:  data_buff <= " ";
            6'd58:  data_buff <= " ";
            6'd59:  data_buff <= " ";
            6'd60:  data_buff <= " ";
            6'd61:  data_buff <= " ";
            6'd62:  data_buff <= " ";
            6'd63:  data_buff <= " ";

            default :  data_buff <= " ";
        endcase
    end
endmodule 

4.des算法模块

这个模块原理不过多解释,网上很多,下面直接展示代码,

代码较多,需要源代码可以加我私聊

//des
module des_core(
    input           clk      ,
    input           rst      ,
    input           i_flag   ,  //1-encrypt,0-decrypt
    input  [63:0]   i_key    ,//
    input           i_key_en ,  //1-key init start
	output 			o_key_ok ,  //1-key init done
    input  [63:0]   i_din    ,
    input           i_din_en ,
    output [63:0]   o_dout   ,
    output          o_dout_en
);
 
	wire  [48*16-1:0] s_exkey;
 
	//key expand
	des_keyex u_keyex(
	.clk		(clk		),
	.rst		(rst		),
	.i_key		(i_key		),
	.i_key_en	(i_key_en	),
	.o_exkey	(s_exkey	),
	.o_key_ok	(o_key_ok	)	
	);

	//data encrypt or decrypt
	des_dpc u_dpc(
	.clk		(clk		),
	.rst		(rst		),	
	.i_flag		(i_flag		),
	.i_keyex	(s_exkey	),
    .i_din		(i_din		),
    .i_din_en	(i_din_en	),
    .o_dout		(o_dout		),
    .o_dout_en	(o_dout_en	)
	);	

 
endmodule
//des密钥模块
module des_keyex(
	input 				clk,
	input 				rst,
	input 	[63:0]	 	i_key,		//密钥数据
	input 				i_key_en,	//密钥数据输入使能,数据完全给1
	output 	[48*16-1:0]	o_exkey,  	//round key
	output 				o_key_ok  	//密钥输出使能
	);
	
	localparam DLY = 0;
	
	wire 	[55:0]	s_key;
	wire 	[55:0]	s_lskey;
	reg  	[55:0]	r_key;
	reg		[767:0]	r_exkey;
	reg 	[3:0]	r_count;
	reg 			r_key_ok;
	wire 			s_busy;
	wire 	[47:0]	s_exk;
	
	//parity bit drop//parity bit drop
//奇偶校验位下降
	function [55:0]	PBD;
		input [63:0] D;
		begin		
			PBD[55] = D[64-57];
			PBD[54] = D[64-49];
			PBD[53] = D[64-41];
			PBD[52] = D[64-33];
			PBD[51] = D[64-25];
			PBD[50] = D[64-17];
			PBD[49] = D[64- 9];
			PBD[48] = D[64- 1];
			PBD[47] = D[64-58];
			PBD[46] = D[64-50];
			PBD[45] = D[64-42];
			PBD[44] = D[64-34];
			PBD[43] = D[64-26];
			PBD[42] = D[64-18];
			PBD[41] = D[64-10];
			PBD[40] = D[64- 2];
			PBD[39] = D[64-59];
			PBD[38] = D[64-51];
			PBD[37] = D[64-43];
			PBD[36] = D[64-35];
			PBD[35] = D[64-27];
			PBD[34] = D[64-19];
			PBD[33] = D[64-11];
			PBD[32] = D[64- 3];
			PBD[31] = D[64-60];
			PBD[30] = D[64-52];
			PBD[29] = D[64-44];
			PBD[28] = D[64-36];
			PBD[27] = D[64-63];
			PBD[26] = D[64-55];
			PBD[25] = D[64-47];
			PBD[24] = D[64-39];
			PBD[23] = D[64-31];
			PBD[22] = D[64-23];
			PBD[21] = D[64-15];
			PBD[20] = D[64- 7];
			PBD[19] = D[64-62];
			PBD[18] = D[64-54];
			PBD[17] = D[64-46];
			PBD[16] = D[64-38];
			PBD[15] = D[64-30];
			PBD[14] = D[64-22];
			PBD[13] = D[64-14];
			PBD[12] = D[64- 6];
			PBD[11] = D[64-61];
			PBD[10] = D[64-53];
			PBD[ 9] = D[64-45];
			PBD[ 8] = D[64-37];		
			PBD[ 7] = D[64-29];
			PBD[ 6] = D[64-21];
			PBD[ 5] = D[64-13];
			PBD[ 4] = D[64- 5];
			PBD[ 3] = D[64-28];
			PBD[ 2] = D[64-20];
			PBD[ 1] = D[64-12];
			PBD[ 0] = D[64- 4];					
		end
	endfunction
	
	//round left shift左移
	function [27:0] ROL;
		input [27:0] D;
		input [1:0] S;
		begin
			ROL = (S==2'd1) ? {D[26:0],D[27]} : {D[25:0],D[27:26]};
		end
	endfunction
	
	//CHN: 压缩排列
	function [47:0] CEX;
		input [55:0] D;
		begin
			CEX[47] = D[56-14];
			CEX[46] = D[56-17];
			CEX[45] = D[56-11];
			CEX[44] = D[56-24];
			CEX[43] = D[56- 1];
			CEX[42] = D[56- 5];
			CEX[41] = D[56- 3];
			CEX[40] = D[56-28];
			CEX[39] = D[56-15];
			CEX[38] = D[56- 6];
			CEX[37] = D[56-21];
			CEX[36] = D[56-10];
			CEX[35] = D[56-23];
			CEX[34] = D[56-19];
			CEX[33] = D[56-12];
			CEX[32] = D[56- 4];
			CEX[31] = D[56-26];
			CEX[30] = D[56- 8];
			CEX[29] = D[56-16];
			CEX[28] = D[56- 7];
			CEX[27] = D[56-27];
			CEX[26] = D[56-20];
			CEX[25] = D[56-13];
			CEX[24] = D[56- 2];
			CEX[23] = D[56-41];
			CEX[22] = D[56-52];
			CEX[21] = D[56-31];
			CEX[20] = D[56-37];
			CEX[19] = D[56-47];
			CEX[18] = D[56-55];
			CEX[17] = D[56-30];
			CEX[16] = D[56-40];
			CEX[15] = D[56-51];
			CEX[14] = D[56-45];
			CEX[13] = D[56-33];
			CEX[12] = D[56-48];
			CEX[11] = D[56-44];
			CEX[10] = D[56-49];
			CEX[ 9] = D[56-39];
			CEX[ 8] = D[56-56];		
			CEX[ 7] = D[56-34];
			CEX[ 6] = D[56-53];
			CEX[ 5] = D[56-46];
			CEX[ 4] = D[56-42];
			CEX[ 3] = D[56-50];
			CEX[ 2] = D[56-36];
			CEX[ 1] = D[56-29];
			CEX[ 0] = D[56-32];		
		end
	endfunction	
	
	assign s_key = i_key_en ? PBD(i_key) : r_key;
	//left shift 1|2 bits左移1/2位
	assign s_lskey = ((r_count==4'd0)||(r_count==4'd1)||(r_count==4'd8)||(r_count==4'd15)) ? {ROL(s_key[55:28],1),ROL(s_key[27:0],1)} : {ROL(s_key[55:28],2),ROL(s_key[27:0],2)};
	assign s_exk = CEX(s_lskey);
	
	always@(posedge clk) begin
		if(rst)
			r_key <= #DLY 56'b0;
		else if(s_busy)
			r_key <= #DLY s_lskey;
	end	
	
	always@(posedge clk) begin
		if(rst) begin
			r_exkey <= #DLY 768'b0;
		end else if(s_busy)begin
			r_exkey <= #DLY {r_exkey[48*15-1:0],s_exk};
		end
	end	
	
	always@(posedge clk) begin
		if(rst)
			r_count <= #DLY 4'd0;
		else if(i_key_en)
			r_count <= #DLY 4'd1;
		else if(r_count!=4'd0)
			r_count <= #DLY r_count + 4'd1;
	end

	assign o_exkey = r_exkey;

	assign s_busy = ((r_count!=5'd0)||(i_key_en==1'b1)) ? 1'b1 : 1'b0;
	
	always@(posedge clk or posedge rst) begin
		if(rst)
			r_key_ok <= #DLY 1'b0;
		else if(r_count==4'd15)
			r_key_ok <= #DLY 1'b1;
		else begin
			r_key_ok <= #DLY 1'b0;
		end
			
	end
	
	// assign o_key_ok = r_key_ok&(~i_key_en);//输出使能
		assign o_key_ok = r_key_ok;
	
endmodule
//des加解密模块
//接收处理后的密钥,明文数据,输出密文数据
module des_dpc(
	input			clk,
	input			rst,
	input 			i_flag,
	input  [767:0] i_keyex,//密钥
    input  [63:0]   i_din,//明文
    input           i_din_en,//明文输入确认使能
    output [63:0]   o_dout,//密文数据
    output          o_dout_en//密文输出使能
);

	localparam DLY = 0;
	
	reg  [3:0]	r_count;	
	reg  [47:0]	r_ka;
	wire [31:0]	s_y;
	wire [31:0]	s_z;
	wire [47:0] s_za;
	wire [31:0] s_zb,s_zc;
	reg  [31:0]	r_y,r_z;
	wire [63:0] s_din;
	
	//initial permutation
	function [63:0]	IEX;
		input [63:0] D;
		begin	
			IEX[63] = D[64-58];
			IEX[62] = D[64-50];
			IEX[61] = D[64-42];
			IEX[60] = D[64-34];
			IEX[59] = D[64-26];
			IEX[58] = D[64-18];
			IEX[57] = D[64-10];
			IEX[56] = D[64- 2];		
			IEX[55] = D[64-60];
			IEX[54] = D[64-52];
			IEX[53] = D[64-44];
			IEX[52] = D[64-36];
			IEX[51] = D[64-28];
			IEX[50] = D[64-20];
			IEX[49] = D[64-12];
			IEX[48] = D[64- 4];
			IEX[47] = D[64-62];
			IEX[46] = D[64-54];
			IEX[45] = D[64-46];
			IEX[44] = D[64-38];
			IEX[43] = D[64-30];
			IEX[42] = D[64-22];
			IEX[41] = D[64-14];
			IEX[40] = D[64- 6];
			IEX[39] = D[64-64];
			IEX[38] = D[64-56];
			IEX[37] = D[64-48];
			IEX[36] = D[64-40];
			IEX[35] = D[64-32];
			IEX[34] = D[64-24];
			IEX[33] = D[64-16];
			IEX[32] = D[64- 8];
			IEX[31] = D[64-57];
			IEX[30] = D[64-49];
			IEX[29] = D[64-41];
			IEX[28] = D[64-33];
			IEX[27] = D[64-25];
			IEX[26] = D[64-17];
			IEX[25] = D[64- 9];
			IEX[24] = D[64- 1];
			IEX[23] = D[64-59];
			IEX[22] = D[64-51];
			IEX[21] = D[64-43];
			IEX[20] = D[64-35];
			IEX[19] = D[64-27];
			IEX[18] = D[64-19];
			IEX[17] = D[64-11];
			IEX[16] = D[64- 3];
			IEX[15] = D[64-61];
			IEX[14] = D[64-53];
			IEX[13] = D[64-45];
			IEX[12] = D[64-37];
			IEX[11] = D[64-29];
			IEX[10] = D[64-21];
			IEX[ 9] = D[64-13];
			IEX[ 8] = D[64- 5];		
			IEX[ 7] = D[64-63];
			IEX[ 6] = D[64-55];
			IEX[ 5] = D[64-47];
			IEX[ 4] = D[64-39];
			IEX[ 3] = D[64-31];
			IEX[ 2] = D[64-23];
			IEX[ 1] = D[64-15];
			IEX[ 0] = D[64- 7];					
		end
	endfunction
	
	//last permutation
	function [63:0]	LEX;
		input [63:0] D;
		begin	
			LEX[63] = D[64-40];
			LEX[62] = D[64- 8];
			LEX[61] = D[64-48];
			LEX[60] = D[64-16];
			LEX[59] = D[64-56];
			LEX[58] = D[64-24];
			LEX[57] = D[64-64];
			LEX[56] = D[64-32];		
			LEX[55] = D[64-39];
			LEX[54] = D[64- 7];
			LEX[53] = D[64-47];
			LEX[52] = D[64-15];
			LEX[51] = D[64-55];
			LEX[50] = D[64-23];
			LEX[49] = D[64-63];
			LEX[48] = D[64-31];
			LEX[47] = D[64-38];
			LEX[46] = D[64- 6];
			LEX[45] = D[64-46];
			LEX[44] = D[64-14];
			LEX[43] = D[64-54];
			LEX[42] = D[64-22];
			LEX[41] = D[64-62];
			LEX[40] = D[64-30];
			LEX[39] = D[64-37];
			LEX[38] = D[64- 5];
			LEX[37] = D[64-45];
			LEX[36] = D[64-13];
			LEX[35] = D[64-53];
			LEX[34] = D[64-21];
			LEX[33] = D[64-61];
			LEX[32] = D[64-29];
			LEX[31] = D[64-36];
			LEX[30] = D[64- 4];
			LEX[29] = D[64-44];
			LEX[28] = D[64-12];
			LEX[27] = D[64-52];
			LEX[26] = D[64-20];
			LEX[25] = D[64-60];
			LEX[24] = D[64-28];
			LEX[23] = D[64-35];
			LEX[22] = D[64- 3];
			LEX[21] = D[64-43];
			LEX[20] = D[64-11];
			LEX[19] = D[64-51];
			LEX[18] = D[64-19];
			LEX[17] = D[64-59];
			LEX[16] = D[64-27];
			LEX[15] = D[64-34];
			LEX[14] = D[64- 2];
			LEX[13] = D[64-42];
			LEX[12] = D[64-10];
			LEX[11] = D[64-50];
			LEX[10] = D[64-18];
			LEX[ 9] = D[64-58];
			LEX[ 8] = D[64-26];		
			LEX[ 7] = D[64-33];
			LEX[ 6] = D[64- 1];
			LEX[ 5] = D[64-41];
			LEX[ 4] = D[64- 9];
			LEX[ 3] = D[64-49];
			LEX[ 2] = D[64-17];
			LEX[ 1] = D[64-57];
			LEX[ 0] = D[64-25];					
		end
	endfunction

	function [47:0] KEX;
		input [31:0] D;
		begin
			//part8
			KEX[6*7+5] = D[0];
			KEX[6*7+4:6*7+1] = D[4*7+3:4*7];
			KEX[6*7+0] = D[4*7-1];
			//part7
			KEX[6*6+5] = D[4*6+4];
			KEX[6*6+4:6*6+1] = D[4*6+3:4*6];
			KEX[6*6+0] = D[4*6-1];	
			//part6
			KEX[6*5+5] = D[4*5+4];
			KEX[6*5+4:6*5+1] = D[4*5+3:4*5];
			KEX[6*5+0] = D[4*5-1];	
			//part5
			KEX[6*4+5] = D[4*4+4];
			KEX[6*4+4:6*4+1] = D[4*4+3:4*4];
			KEX[6*4+0] = D[4*4-1];	
			//part4
			KEX[6*3+5] = D[4*3+4];
			KEX[6*3+4:6*3+1] = D[4*3+3:4*3];
			KEX[6*3+0] = D[4*3-1];	
			//part3
			KEX[6*2+5] = D[4*2+4];
			KEX[6*2+4:6*2+1] = D[4*2+3:4*2];
			KEX[6*2+0] = D[4*2-1];	
			//part2
			KEX[6*1+5] = D[4*1+4];
			KEX[6*1+4:6*1+1] = D[4*1+3:4*1];
			KEX[6*1+0] = D[4*1-1];	
			//part1
			KEX[6*0+5] = D[4*0+4];
			KEX[6*0+4:6*0+1] = D[4*0+3:4*0];
			KEX[6*0+0] = D[31];				
		end
	endfunction
	
	function [31:0]	DEX;
		input [31:0] D;
		begin
			DEX[31] = D[32-16];
			DEX[30] = D[32- 7];
			DEX[29] = D[32-20];
			DEX[28] = D[32-21];
			DEX[27] = D[32-29];
			DEX[26] = D[32-12];
			DEX[25] = D[32-28];
			DEX[24] = D[32-17];
			DEX[23] = D[32- 1];
			DEX[22] = D[32-15];
			DEX[21] = D[32-23];
			DEX[20] = D[32-26];
			DEX[19] = D[32- 5];
			DEX[18] = D[32-18];
			DEX[17] = D[32-31];
			DEX[16] = D[32-10];
			DEX[15] = D[32- 2];
			DEX[14] = D[32- 8];
			DEX[13] = D[32-24];
			DEX[12] = D[32-14];
			DEX[11] = D[32-32];
			DEX[10] = D[32-27];
			DEX[ 9] = D[32- 3];
			DEX[ 8] = D[32- 9];		
			DEX[ 7] = D[32-19];
			DEX[ 6] = D[32-13];
			DEX[ 5] = D[32-30];
			DEX[ 4] = D[32- 6];
			DEX[ 3] = D[32-22];
			DEX[ 2] = D[32-11];
			DEX[ 1] = D[32- 4];
			DEX[ 0] = D[32-25];				
		end
	endfunction
	
	always@(posedge clk or posedge rst) begin
		if(rst) 
			r_count <= #DLY 3'b0;
		else if(i_din_en)
			r_count <= #DLY 3'd1;
		else if(r_count!=4'd0)
			r_count <= #DLY r_count + 4'd1;
	end
	
	always@(*) begin
		if(i_flag) begin  //encrypt
			case(r_count)
				4'd00: r_ka = i_keyex[48*16-1:48*15];
				4'd01: r_ka = i_keyex[48*15-1:48*14];
				4'd02: r_ka = i_keyex[48*14-1:48*13];
				4'd03: r_ka = i_keyex[48*13-1:48*12];
				4'd04: r_ka = i_keyex[48*12-1:48*11];
				4'd05: r_ka = i_keyex[48*11-1:48*10];
				4'd06: r_ka = i_keyex[48*10-1:48* 9];
				4'd07: r_ka = i_keyex[48* 9-1:48* 8];
				4'd08: r_ka = i_keyex[48* 8-1:48* 7];
				4'd09: r_ka = i_keyex[48* 7-1:48* 6];
				4'd10: r_ka = i_keyex[48* 6-1:48* 5];
				4'd11: r_ka = i_keyex[48* 5-1:48* 4];
				4'd12: r_ka = i_keyex[48* 4-1:48* 3];
				4'd13: r_ka = i_keyex[48* 3-1:48* 2];
				4'd14: r_ka = i_keyex[48* 2-1:48* 1];
				4'd15: r_ka = i_keyex[48* 1-1:48* 0];				
			endcase
		end else begin  //decrypt
			case(r_count)
				4'd15: r_ka = i_keyex[48*16-1:48*15];
				4'd14: r_ka = i_keyex[48*15-1:48*14];
				4'd13: r_ka = i_keyex[48*14-1:48*13];
				4'd12: r_ka = i_keyex[48*13-1:48*12];
				4'd11: r_ka = i_keyex[48*12-1:48*11];
				4'd10: r_ka = i_keyex[48*11-1:48*10];
				4'd09: r_ka = i_keyex[48*10-1:48* 9];
				4'd08: r_ka = i_keyex[48* 9-1:48* 8];
				4'd07: r_ka = i_keyex[48* 8-1:48* 7];
				4'd06: r_ka = i_keyex[48* 7-1:48* 6];
				4'd05: r_ka = i_keyex[48* 6-1:48* 5];
				4'd04: r_ka = i_keyex[48* 5-1:48* 4];
				4'd03: r_ka = i_keyex[48* 4-1:48* 3];
				4'd02: r_ka = i_keyex[48* 3-1:48* 2];
				4'd01: r_ka = i_keyex[48* 2-1:48* 1];
				4'd00: r_ka = i_keyex[48* 1-1:48* 0];		
			endcase		
		end
	end
	
	assign s_din = IEX(i_din);
	
	assign s_y = (r_count==3'd0) ? s_din[63:32]:r_y;  //left
	assign s_z = (r_count==3'd0) ? s_din[31:0]:r_z ;  //right
	
	assign s_za = KEX(s_z)^r_ka;
	
	des_sbox1 u_sbox1(.din(s_za[6*8-1:6*7]),.dout(s_zb[4*8-1:4*7]));
	des_sbox2 u_sbox2(.din(s_za[6*7-1:6*6]),.dout(s_zb[4*7-1:4*6]));
	des_sbox3 u_sbox3(.din(s_za[6*6-1:6*5]),.dout(s_zb[4*6-1:4*5]));
	des_sbox4 u_sbox4(.din(s_za[6*5-1:6*4]),.dout(s_zb[4*5-1:4*4]));
	des_sbox5 u_sbox5(.din(s_za[6*4-1:6*3]),.dout(s_zb[4*4-1:4*3]));
	des_sbox6 u_sbox6(.din(s_za[6*3-1:6*2]),.dout(s_zb[4*3-1:4*2]));
	des_sbox7 u_sbox7(.din(s_za[6*2-1:6*1]),.dout(s_zb[4*2-1:4*1]));
	des_sbox8 u_sbox8(.din(s_za[6*1-1:6*0]),.dout(s_zb[4*1-1:4*0]));
	
	assign s_zc = DEX(s_zb)^s_y;
	
	always@(posedge clk) begin
		r_y <= #DLY s_z;
		r_z <= #DLY s_zc;
	end	
	
	assign o_dout = (r_count==4'd15) ? LEX({s_zc,s_z}):0;//密文数据
	
	assign o_dout_en = (r_count==4'd15) ? 1'b1:1'b0;//密文输出使能
	
endmodule
`timescale 1ns / 1ps

module des_sbox1(
    input   [5:0]   din,
    output  [3:0]   dout
    );
	
    reg [3:0] r_dout;
    assign dout = r_dout;
	//
    always@(din) begin
        case({din[5],din[0],din[4:1]})
			//line 0
            6'h00 : r_dout = 4'd14;
            6'h01 : r_dout = 4'd04;
            6'h02 : r_dout = 4'd13;
            6'h03 : r_dout = 4'd01;
            6'h04 : r_dout = 4'd02;
            6'h05 : r_dout = 4'd15;
            6'h06 : r_dout = 4'd11;
            6'h07 : r_dout = 4'd08;
            6'h08 : r_dout = 4'd03;
            6'h09 : r_dout = 4'd10;
            6'h0a : r_dout = 4'd06;
            6'h0b : r_dout = 4'd12;
            6'h0c : r_dout = 4'd05;
            6'h0d : r_dout = 4'd09;
            6'h0e : r_dout = 4'd00;
            6'h0f : r_dout = 4'd07;
			//line 1
            6'h10 : r_dout = 4'd00;
            6'h11 : r_dout = 4'd15;
            6'h12 : r_dout = 4'd07;
            6'h13 : r_dout = 4'd04;
            6'h14 : r_dout = 4'd14;
            6'h15 : r_dout = 4'd02;
            6'h16 : r_dout = 4'd13;
            6'h17 : r_dout = 4'd01;
            6'h18 : r_dout = 4'd10;
            6'h19 : r_dout = 4'd06;
            6'h1a : r_dout = 4'd12;
            6'h1b : r_dout = 4'd11;
            6'h1c : r_dout = 4'd09;
            6'h1d : r_dout = 4'd05;
            6'h1e : r_dout = 4'd03;
            6'h1f : r_dout = 4'd08;		
			//line 2
            6'h20 : r_dout = 4'd04;
            6'h21 : r_dout = 4'd01;
            6'h22 : r_dout = 4'd14;
            6'h23 : r_dout = 4'd08;
            6'h24 : r_dout = 4'd13;
            6'h25 : r_dout = 4'd06;
            6'h26 : r_dout = 4'd02;
            6'h27 : r_dout = 4'd11;
            6'h28 : r_dout = 4'd15;
            6'h29 : r_dout = 4'd12;
            6'h2a : r_dout = 4'd09;
            6'h2b : r_dout = 4'd07;
            6'h2c : r_dout = 4'd03;
            6'h2d : r_dout = 4'd10;
            6'h2e : r_dout = 4'd05;
            6'h2f : r_dout = 4'd00;	
			//line 3
            6'h30 : r_dout = 4'd15;
            6'h31 : r_dout = 4'd12;
            6'h32 : r_dout = 4'd08;
            6'h33 : r_dout = 4'd02;
            6'h34 : r_dout = 4'd04;
            6'h35 : r_dout = 4'd09;
            6'h36 : r_dout = 4'd01;
            6'h37 : r_dout = 4'd07;
            6'h38 : r_dout = 4'd05;
            6'h39 : r_dout = 4'd11;
            6'h3a : r_dout = 4'd03;
            6'h3b : r_dout = 4'd14;
            6'h3c : r_dout = 4'd10;
            6'h3d : r_dout = 4'd00;
            6'h3e : r_dout = 4'd06;
            6'h3f : r_dout = 4'd13;		
        endcase
    end

endmodule
`timescale 1ns / 1ps

module des_sbox2(
    input   [5:0]   din,
    output  [3:0]   dout
    );
	
    reg [3:0] r_dout;
    assign dout = r_dout;
	//
    always@(din) begin
        case({din[5],din[0],din[4:1]})
			//line 0
            6'h00 : r_dout = 4'd15;
            6'h01 : r_dout = 4'd01;
            6'h02 : r_dout = 4'd08;
            6'h03 : r_dout = 4'd14;
            6'h04 : r_dout = 4'd06;
            6'h05 : r_dout = 4'd11;
            6'h06 : r_dout = 4'd03;
            6'h07 : r_dout = 4'd04;
            6'h08 : r_dout = 4'd09;
            6'h09 : r_dout = 4'd07;
            6'h0a : r_dout = 4'd02;
            6'h0b : r_dout = 4'd13;
            6'h0c : r_dout = 4'd12;
            6'h0d : r_dout = 4'd00;
            6'h0e : r_dout = 4'd05;
            6'h0f : r_dout = 4'd10;
			//line 1
            6'h10 : r_dout = 4'd03;
            6'h11 : r_dout = 4'd13;
            6'h12 : r_dout = 4'd04;
            6'h13 : r_dout = 4'd07;
            6'h14 : r_dout = 4'd15;
            6'h15 : r_dout = 4'd02;
            6'h16 : r_dout = 4'd08;
            6'h17 : r_dout = 4'd14;
            6'h18 : r_dout = 4'd12;
            6'h19 : r_dout = 4'd00;
            6'h1a : r_dout = 4'd01;
            6'h1b : r_dout = 4'd10;
            6'h1c : r_dout = 4'd06;
            6'h1d : r_dout = 4'd09;
            6'h1e : r_dout = 4'd11;
            6'h1f : r_dout = 4'd05;		
			//line 2
            6'h20 : r_dout = 4'd00;
            6'h21 : r_dout = 4'd14;
            6'h22 : r_dout = 4'd07;
            6'h23 : r_dout = 4'd11;
            6'h24 : r_dout = 4'd10;
            6'h25 : r_dout = 4'd04;
            6'h26 : r_dout = 4'd13;
            6'h27 : r_dout = 4'd01;
            6'h28 : r_dout = 4'd05;
            6'h29 : r_dout = 4'd08;
            6'h2a : r_dout = 4'd12;
            6'h2b : r_dout = 4'd06;
            6'h2c : r_dout = 4'd09;
            6'h2d : r_dout = 4'd03;
            6'h2e : r_dout = 4'd02;
            6'h2f : r_dout = 4'd15;	
			//line 3
            6'h30 : r_dout = 4'd13;
            6'h31 : r_dout = 4'd08;
            6'h32 : r_dout = 4'd10;
            6'h33 : r_dout = 4'd01;
            6'h34 : r_dout = 4'd03;
            6'h35 : r_dout = 4'd15;
            6'h36 : r_dout = 4'd04;
            6'h37 : r_dout = 4'd02;
            6'h38 : r_dout = 4'd11;
            6'h39 : r_dout = 4'd06;
            6'h3a : r_dout = 4'd07;
            6'h3b : r_dout = 4'd12;
            6'h3c : r_dout = 4'd00;
            6'h3d : r_dout = 4'd05;
            6'h3e : r_dout = 4'd14;
            6'h3f : r_dout = 4'd09;		
        endcase
    end

endmodule
`timescale 1ns / 1ps

module des_sbox3(
    input   [5:0]   din,
    output  [3:0]   dout
    );
	
    reg [3:0] r_dout;
    assign dout = r_dout;
	//
    always@(din) begin
        case({din[5],din[0],din[4:1]})
			//line 0
            6'h00 : r_dout = 4'd10;
            6'h01 : r_dout = 4'd00;
            6'h02 : r_dout = 4'd09;
            6'h03 : r_dout = 4'd14;
            6'h04 : r_dout = 4'd06;
            6'h05 : r_dout = 4'd03;
            6'h06 : r_dout = 4'd15;
            6'h07 : r_dout = 4'd05;
            6'h08 : r_dout = 4'd01;
            6'h09 : r_dout = 4'd13;
            6'h0a : r_dout = 4'd12;
            6'h0b : r_dout = 4'd07;
            6'h0c : r_dout = 4'd11;
            6'h0d : r_dout = 4'd04;
            6'h0e : r_dout = 4'd02;
            6'h0f : r_dout = 4'd08;
			//line 1
            6'h10 : r_dout = 4'd13;
            6'h11 : r_dout = 4'd07;
            6'h12 : r_dout = 4'd00;
            6'h13 : r_dout = 4'd09;
            6'h14 : r_dout = 4'd03;
            6'h15 : r_dout = 4'd04;
            6'h16 : r_dout = 4'd06;
            6'h17 : r_dout = 4'd10;
            6'h18 : r_dout = 4'd02;
            6'h19 : r_dout = 4'd08;
            6'h1a : r_dout = 4'd05;
            6'h1b : r_dout = 4'd14;
            6'h1c : r_dout = 4'd12;
            6'h1d : r_dout = 4'd11;
            6'h1e : r_dout = 4'd15;
            6'h1f : r_dout = 4'd01;		
			//line 2
            6'h20 : r_dout = 4'd13;
            6'h21 : r_dout = 4'd06;
            6'h22 : r_dout = 4'd04;
            6'h23 : r_dout = 4'd09;
            6'h24 : r_dout = 4'd08;
            6'h25 : r_dout = 4'd15;
            6'h26 : r_dout = 4'd03;
            6'h27 : r_dout = 4'd00;
            6'h28 : r_dout = 4'd11;
            6'h29 : r_dout = 4'd01;
            6'h2a : r_dout = 4'd02;
            6'h2b : r_dout = 4'd12;
            6'h2c : r_dout = 4'd05;
            6'h2d : r_dout = 4'd10;
            6'h2e : r_dout = 4'd14;
            6'h2f : r_dout = 4'd07;	
			//line 3
            6'h30 : r_dout = 4'd01;
            6'h31 : r_dout = 4'd10;
            6'h32 : r_dout = 4'd13;
            6'h33 : r_dout = 4'd00;
            6'h34 : r_dout = 4'd06;
            6'h35 : r_dout = 4'd09;
            6'h36 : r_dout = 4'd08;
            6'h37 : r_dout = 4'd07;
            6'h38 : r_dout = 4'd04;
            6'h39 : r_dout = 4'd15;
            6'h3a : r_dout = 4'd14;
            6'h3b : r_dout = 4'd03;
            6'h3c : r_dout = 4'd11;
            6'h3d : r_dout = 4'd05;
            6'h3e : r_dout = 4'd02;
            6'h3f : r_dout = 4'd12;		
        endcase
    end

endmodule
`timescale 1ns / 1ps

module des_sbox4(
    input   [5:0]   din,
    output  [3:0]   dout
    );
	
    reg [3:0] r_dout;
    assign dout = r_dout;
	//
    always@(din) begin
        case({din[5],din[0],din[4:1]})
			//line 0
            6'h00 : r_dout = 4'd07;
            6'h01 : r_dout = 4'd13;
            6'h02 : r_dout = 4'd14;
            6'h03 : r_dout = 4'd03;
            6'h04 : r_dout = 4'd00;
            6'h05 : r_dout = 4'd06;
            6'h06 : r_dout = 4'd09;
            6'h07 : r_dout = 4'd10;
            6'h08 : r_dout = 4'd01;
            6'h09 : r_dout = 4'd02;
            6'h0a : r_dout = 4'd08;
            6'h0b : r_dout = 4'd05;
            6'h0c : r_dout = 4'd11;
            6'h0d : r_dout = 4'd12;
            6'h0e : r_dout = 4'd04;
            6'h0f : r_dout = 4'd15;
			//line 1
            6'h10 : r_dout = 4'd13;
            6'h11 : r_dout = 4'd08;
            6'h12 : r_dout = 4'd11;
            6'h13 : r_dout = 4'd05;
            6'h14 : r_dout = 4'd06;
            6'h15 : r_dout = 4'd15;
            6'h16 : r_dout = 4'd00;
            6'h17 : r_dout = 4'd03;
            6'h18 : r_dout = 4'd04;
            6'h19 : r_dout = 4'd07;
            6'h1a : r_dout = 4'd02;
            6'h1b : r_dout = 4'd12;
            6'h1c : r_dout = 4'd01;
            6'h1d : r_dout = 4'd10;
            6'h1e : r_dout = 4'd14;
            6'h1f : r_dout = 4'd09;		
			//line 2
            6'h20 : r_dout = 4'd10;
            6'h21 : r_dout = 4'd06;
            6'h22 : r_dout = 4'd09;
            6'h23 : r_dout = 4'd00;
            6'h24 : r_dout = 4'd12;
            6'h25 : r_dout = 4'd11;
            6'h26 : r_dout = 4'd07;
            6'h27 : r_dout = 4'd13;
            6'h28 : r_dout = 4'd15;
            6'h29 : r_dout = 4'd01;
            6'h2a : r_dout = 4'd03;
            6'h2b : r_dout = 4'd14;
            6'h2c : r_dout = 4'd05;
            6'h2d : r_dout = 4'd02;
            6'h2e : r_dout = 4'd08;
            6'h2f : r_dout = 4'd04;	
			//line 3
            6'h30 : r_dout = 4'd03;
            6'h31 : r_dout = 4'd15;
            6'h32 : r_dout = 4'd00;
            6'h33 : r_dout = 4'd06;
            6'h34 : r_dout = 4'd10;
            6'h35 : r_dout = 4'd01;
            6'h36 : r_dout = 4'd13;
            6'h37 : r_dout = 4'd08;
            6'h38 : r_dout = 4'd09;
            6'h39 : r_dout = 4'd04;
            6'h3a : r_dout = 4'd05;
            6'h3b : r_dout = 4'd11;
            6'h3c : r_dout = 4'd12;
            6'h3d : r_dout = 4'd07;
            6'h3e : r_dout = 4'd02;
            6'h3f : r_dout = 4'd14;		
        endcase
    end

endmodule
`timescale 1ns / 1ps

module des_sbox5(
    input   [5:0]   din,
    output  [3:0]   dout
    );
	
    reg [3:0] r_dout;
    assign dout = r_dout;
	//
    always@(din) begin
        case({din[5],din[0],din[4:1]})
			//line 0
            6'h00 : r_dout = 4'd02;
            6'h01 : r_dout = 4'd12;
            6'h02 : r_dout = 4'd04;
            6'h03 : r_dout = 4'd01;
            6'h04 : r_dout = 4'd07;
            6'h05 : r_dout = 4'd10;
            6'h06 : r_dout = 4'd11;
            6'h07 : r_dout = 4'd06;
            6'h08 : r_dout = 4'd08;
            6'h09 : r_dout = 4'd05;
            6'h0a : r_dout = 4'd03;
            6'h0b : r_dout = 4'd15;
            6'h0c : r_dout = 4'd13;
            6'h0d : r_dout = 4'd00;
            6'h0e : r_dout = 4'd14;
            6'h0f : r_dout = 4'd09;
			//line 1
            6'h10 : r_dout = 4'd14;
            6'h11 : r_dout = 4'd11;
            6'h12 : r_dout = 4'd02;
            6'h13 : r_dout = 4'd12;
            6'h14 : r_dout = 4'd04;
            6'h15 : r_dout = 4'd07;
            6'h16 : r_dout = 4'd13;
            6'h17 : r_dout = 4'd01;
            6'h18 : r_dout = 4'd05;
            6'h19 : r_dout = 4'd00;
            6'h1a : r_dout = 4'd15;
            6'h1b : r_dout = 4'd10;
            6'h1c : r_dout = 4'd03;
            6'h1d : r_dout = 4'd09;
            6'h1e : r_dout = 4'd08;
            6'h1f : r_dout = 4'd06;		
			//line 2
            6'h20 : r_dout = 4'd04;
            6'h21 : r_dout = 4'd02;
            6'h22 : r_dout = 4'd01;
            6'h23 : r_dout = 4'd11;
            6'h24 : r_dout = 4'd10;
            6'h25 : r_dout = 4'd13;
            6'h26 : r_dout = 4'd07;
            6'h27 : r_dout = 4'd08;
            6'h28 : r_dout = 4'd15;
            6'h29 : r_dout = 4'd09;
            6'h2a : r_dout = 4'd12;
            6'h2b : r_dout = 4'd05;
            6'h2c : r_dout = 4'd06;
            6'h2d : r_dout = 4'd03;
            6'h2e : r_dout = 4'd00;
            6'h2f : r_dout = 4'd14;	
			//line 3
            6'h30 : r_dout = 4'd11;
            6'h31 : r_dout = 4'd08;
            6'h32 : r_dout = 4'd12;
            6'h33 : r_dout = 4'd07;
            6'h34 : r_dout = 4'd01;
            6'h35 : r_dout = 4'd14;
            6'h36 : r_dout = 4'd02;
            6'h37 : r_dout = 4'd13;
            6'h38 : r_dout = 4'd06;
            6'h39 : r_dout = 4'd15;
            6'h3a : r_dout = 4'd00;
            6'h3b : r_dout = 4'd09;
            6'h3c : r_dout = 4'd10;
            6'h3d : r_dout = 4'd04;
            6'h3e : r_dout = 4'd05;
            6'h3f : r_dout = 4'd03;		
        endcase
    end

endmodule
`timescale 1ns / 1ps

module des_sbox6(
    input   [5:0]   din,
    output  [3:0]   dout
    );
	
    reg [3:0] r_dout;
    assign dout = r_dout;
	//
    always@(din) begin
        case({din[5],din[0],din[4:1]})
			//line 0
            6'h00 : r_dout = 4'd12;
            6'h01 : r_dout = 4'd01;
            6'h02 : r_dout = 4'd10;
            6'h03 : r_dout = 4'd15;
            6'h04 : r_dout = 4'd09;
            6'h05 : r_dout = 4'd02;
            6'h06 : r_dout = 4'd06;
            6'h07 : r_dout = 4'd08;
            6'h08 : r_dout = 4'd00;
            6'h09 : r_dout = 4'd13;
            6'h0a : r_dout = 4'd03;
            6'h0b : r_dout = 4'd04;
            6'h0c : r_dout = 4'd14;
            6'h0d : r_dout = 4'd07;
            6'h0e : r_dout = 4'd05;
            6'h0f : r_dout = 4'd11;
			//line 1
            6'h10 : r_dout = 4'd10;
            6'h11 : r_dout = 4'd15;
            6'h12 : r_dout = 4'd04;
            6'h13 : r_dout = 4'd02;
            6'h14 : r_dout = 4'd07;
            6'h15 : r_dout = 4'd12;
            6'h16 : r_dout = 4'd09;
            6'h17 : r_dout = 4'd05;
            6'h18 : r_dout = 4'd06;
            6'h19 : r_dout = 4'd01;
            6'h1a : r_dout = 4'd13;
            6'h1b : r_dout = 4'd14;
            6'h1c : r_dout = 4'd00;
            6'h1d : r_dout = 4'd11;
            6'h1e : r_dout = 4'd03;
            6'h1f : r_dout = 4'd08;		
			//line 2
            6'h20 : r_dout = 4'd09;
            6'h21 : r_dout = 4'd14;
            6'h22 : r_dout = 4'd15;
            6'h23 : r_dout = 4'd05;
            6'h24 : r_dout = 4'd02;
            6'h25 : r_dout = 4'd08;
            6'h26 : r_dout = 4'd12;
            6'h27 : r_dout = 4'd03;
            6'h28 : r_dout = 4'd07;
            6'h29 : r_dout = 4'd00;
            6'h2a : r_dout = 4'd04;
            6'h2b : r_dout = 4'd10;
            6'h2c : r_dout = 4'd01;
            6'h2d : r_dout = 4'd13;
            6'h2e : r_dout = 4'd11;
            6'h2f : r_dout = 4'd06;	
			//line 3
            6'h30 : r_dout = 4'd04;
            6'h31 : r_dout = 4'd03;
            6'h32 : r_dout = 4'd02;
            6'h33 : r_dout = 4'd12;
            6'h34 : r_dout = 4'd09;
            6'h35 : r_dout = 4'd05;
            6'h36 : r_dout = 4'd15;
            6'h37 : r_dout = 4'd10;
            6'h38 : r_dout = 4'd11;
            6'h39 : r_dout = 4'd14;
            6'h3a : r_dout = 4'd01;
            6'h3b : r_dout = 4'd07;
            6'h3c : r_dout = 4'd06;
            6'h3d : r_dout = 4'd00;
            6'h3e : r_dout = 4'd08;
            6'h3f : r_dout = 4'd13;		
        endcase
    end

endmodule
`timescale 1ns / 1ps

module des_sbox7(
    input   [5:0]   din,
    output  [3:0]   dout
    );
	
    reg [3:0] r_dout;
    assign dout = r_dout;
	//
    always@(din) begin
        case({din[5],din[0],din[4:1]})
			//line 0
            6'h00 : r_dout = 4'd04;
            6'h01 : r_dout = 4'd11;
            6'h02 : r_dout = 4'd02;
            6'h03 : r_dout = 4'd14;
            6'h04 : r_dout = 4'd15;
            6'h05 : r_dout = 4'd00;
            6'h06 : r_dout = 4'd08;
            6'h07 : r_dout = 4'd13;
            6'h08 : r_dout = 4'd03;
            6'h09 : r_dout = 4'd12;
            6'h0a : r_dout = 4'd09;
            6'h0b : r_dout = 4'd07;
            6'h0c : r_dout = 4'd05;
            6'h0d : r_dout = 4'd10;
            6'h0e : r_dout = 4'd06;
            6'h0f : r_dout = 4'd01;
			//line 1
            6'h10 : r_dout = 4'd13;
            6'h11 : r_dout = 4'd00;
            6'h12 : r_dout = 4'd11;
            6'h13 : r_dout = 4'd07;
            6'h14 : r_dout = 4'd04;
            6'h15 : r_dout = 4'd09;
            6'h16 : r_dout = 4'd01;
            6'h17 : r_dout = 4'd10;
            6'h18 : r_dout = 4'd14;
            6'h19 : r_dout = 4'd03;
            6'h1a : r_dout = 4'd05;
            6'h1b : r_dout = 4'd12;
            6'h1c : r_dout = 4'd02;
            6'h1d : r_dout = 4'd15;
            6'h1e : r_dout = 4'd08;
            6'h1f : r_dout = 4'd06;		
			//line 2
            6'h20 : r_dout = 4'd01;
            6'h21 : r_dout = 4'd04;
            6'h22 : r_dout = 4'd11;
            6'h23 : r_dout = 4'd13;
            6'h24 : r_dout = 4'd12;
            6'h25 : r_dout = 4'd03;
            6'h26 : r_dout = 4'd07;
            6'h27 : r_dout = 4'd14;
            6'h28 : r_dout = 4'd10;
            6'h29 : r_dout = 4'd15;
            6'h2a : r_dout = 4'd06;
            6'h2b : r_dout = 4'd08;
            6'h2c : r_dout = 4'd00;
            6'h2d : r_dout = 4'd05;
            6'h2e : r_dout = 4'd09;
            6'h2f : r_dout = 4'd02;	
			//line 3
            6'h30 : r_dout = 4'd06;
            6'h31 : r_dout = 4'd11;
            6'h32 : r_dout = 4'd13;
            6'h33 : r_dout = 4'd08;
            6'h34 : r_dout = 4'd01;
            6'h35 : r_dout = 4'd04;
            6'h36 : r_dout = 4'd10;
            6'h37 : r_dout = 4'd07;
            6'h38 : r_dout = 4'd09;
            6'h39 : r_dout = 4'd05;
            6'h3a : r_dout = 4'd00;
            6'h3b : r_dout = 4'd15;
            6'h3c : r_dout = 4'd14;
            6'h3d : r_dout = 4'd02;
            6'h3e : r_dout = 4'd03;
            6'h3f : r_dout = 4'd12;		
        endcase
    end

endmodule
`timescale 1ns / 1ps

module des_sbox8(
    input   [5:0]   din,
    output  [3:0]   dout
    );
	
    reg [3:0] r_dout;
    assign dout = r_dout;
	//
    always@(din) begin
        case({din[5],din[0],din[4:1]})
			//line 0
            6'h00 : r_dout = 4'd13;
            6'h01 : r_dout = 4'd02;
            6'h02 : r_dout = 4'd08;
            6'h03 : r_dout = 4'd04;
            6'h04 : r_dout = 4'd06;
            6'h05 : r_dout = 4'd15;
            6'h06 : r_dout = 4'd11;
            6'h07 : r_dout = 4'd01;
            6'h08 : r_dout = 4'd10;
            6'h09 : r_dout = 4'd09;
            6'h0a : r_dout = 4'd03;
            6'h0b : r_dout = 4'd14;
            6'h0c : r_dout = 4'd05;
            6'h0d : r_dout = 4'd00;
            6'h0e : r_dout = 4'd12;
            6'h0f : r_dout = 4'd07;
			//line 1
            6'h10 : r_dout = 4'd01;
            6'h11 : r_dout = 4'd15;
            6'h12 : r_dout = 4'd13;
            6'h13 : r_dout = 4'd08;
            6'h14 : r_dout = 4'd10;
            6'h15 : r_dout = 4'd03;
            6'h16 : r_dout = 4'd07;
            6'h17 : r_dout = 4'd04;
            6'h18 : r_dout = 4'd12;
            6'h19 : r_dout = 4'd05;
            6'h1a : r_dout = 4'd06;
            6'h1b : r_dout = 4'd11;
            6'h1c : r_dout = 4'd00;
            6'h1d : r_dout = 4'd14;
            6'h1e : r_dout = 4'd09;
            6'h1f : r_dout = 4'd02;		
			//line 2
            6'h20 : r_dout = 4'd07;
            6'h21 : r_dout = 4'd11;
            6'h22 : r_dout = 4'd04;
            6'h23 : r_dout = 4'd01;
            6'h24 : r_dout = 4'd09;
            6'h25 : r_dout = 4'd12;
            6'h26 : r_dout = 4'd14;
            6'h27 : r_dout = 4'd02;
            6'h28 : r_dout = 4'd00;
            6'h29 : r_dout = 4'd06;
            6'h2a : r_dout = 4'd10;
            6'h2b : r_dout = 4'd13;
            6'h2c : r_dout = 4'd15;
            6'h2d : r_dout = 4'd03;
            6'h2e : r_dout = 4'd05;
            6'h2f : r_dout = 4'd08;	
			//line 3
            6'h30 : r_dout = 4'd02;
            6'h31 : r_dout = 4'd01;
            6'h32 : r_dout = 4'd14;
            6'h33 : r_dout = 4'd07;
            6'h34 : r_dout = 4'd04;
            6'h35 : r_dout = 4'd10;
            6'h36 : r_dout = 4'd08;
            6'h37 : r_dout = 4'd13;
            6'h38 : r_dout = 4'd15;
            6'h39 : r_dout = 4'd12;
            6'h3a : r_dout = 4'd09;
            6'h3b : r_dout = 4'd00;
            6'h3c : r_dout = 4'd03;
            6'h3d : r_dout = 4'd05;
            6'h3e : r_dout = 4'd06;
            6'h3f : r_dout = 4'd11;		
        endcase
    end

endmodule

以上是des算法模块

在des算法模块里有密钥计算,明文加密2个模块,明文加密里面有8个小模块

5.top

module top(
    input                     sysclkin       ,
    input                     button      ,
    input           [3:0]    col       ,
    output          [3:0]    row       ,
    output                    lcd_rs    , 
    output                    lcd_rw    , 
    output                    lcd_en    , 
    output          [7:0]    lcd_data   
);
 wire clk_100M;
 wire clk_100M_180;

 //========clk_wiz_0========
clk_wiz_0 clk_wiz_0_0
(
    .clk_out1(clk_100M),     // output clk_out1
    .clk_in1(sysclkin)        // input clk_in1
);


wire   [15:0]   key_pulse;
wire            key_en   ;
wire   [7:0]    key_data ;
wire   [7:0]    data1_1  ;
wire   [7:0]    data1_2  ;
wire   [7:0]    data1_3  ;
wire   [7:0]    data1_4  ;
wire   [7:0]    data1_5  ;
wire   [7:0]    data1_6  ;
wire   [7:0]    data1_7  ;
wire   [7:0]    data1_8  ;
wire   [7:0]    data1_9  ;
wire   [7:0]    data1_10 ;
wire   [7:0]    data1_11 ;
wire   [7:0]    data1_12 ;
wire   [7:0]    data1_13 ;
wire   [7:0]    data1_14 ;
wire   [7:0]    data1_15 ;
wire   [7:0]    data1_16 ;
wire   [7:0]    data2_1  ;
wire   [7:0]    data2_2  ;
wire   [7:0]    data2_3  ;
wire   [7:0]    data2_4  ;
wire   [7:0]    data2_5  ;
wire   [7:0]    data2_6  ;
wire   [7:0]    data2_7  ;
wire   [7:0]    data2_8  ;
wire   [7:0]    data2_9  ;
wire   [7:0]    data2_10 ;
wire   [7:0]    data2_11 ;
wire   [7:0]    data2_12 ;
wire   [7:0]    data2_13 ;
wire   [7:0]    data2_14 ;
wire   [7:0]    data2_15 ;
wire   [7:0]    data2_16 ;
wire   [7:0]    data3_1  ;
wire   [7:0]    data3_2  ;
wire   [7:0]    data3_3  ;
wire   [7:0]    data3_4  ;
wire   [7:0]    data3_5  ;
wire   [7:0]    data3_6  ;
wire   [7:0]    data3_7  ;
wire   [7:0]    data3_8  ;
wire   [7:0]    data3_9  ;
wire   [7:0]    data3_10 ;
wire   [7:0]    data3_11 ;
wire   [7:0]    data3_12 ;
wire   [7:0]    data3_13 ;
wire   [7:0]    data3_14 ;
wire   [7:0]    data3_15 ;
wire   [7:0]    data3_16 ;
wire            flag1    ;
wire            flag2    ;
wire            flag3    ;
Array_KeyBoard Array_KeyBoard_u(
    .clk        (sysclkin      ),  //input                     clk       ,
    .rstn       (button     ),  //input                     rstn      ,
    .col        (col      ),  //input            [3:0]    col       ,
    .row        (row      ),  //output    reg    [3:0]    row       ,
    .key_pulse  (key_pulse),  //output           [15:0]   key_pulse ,
    .key_en     (key_en   ),  //output    reg             key_en    ,
    .key_data   (key_data )   //output    reg    [3:0]    key_data    
);
control control_u(
    .clk_100M(clk_100M),     // output clk_out1
    .clk        (sysclkin      ),   //input               clk      ,
    .rstn       (button     ),   //input               rstn     ,
    .key_en     (key_en   ),   //input               key_en   ,
    .key_data   (key_data ),   //input      [3:0]    key_data ,
    .data1_1    (data1_1  ),   //output reg [3:0]    data1_1  ,
    .data1_2    (data1_2  ),   //output reg [3:0]    data1_2  ,
    .data1_3    (data1_3  ),   //output reg [3:0]    data1_3  ,
    .data1_4    (data1_4  ),   //output reg [3:0]    data1_4  ,
    .data1_5    (data1_5  ),   //output reg [3:0]    data1_5  ,
    .data1_6    (data1_6  ),   //output reg [3:0]    data1_6  ,
    .data1_7    (data1_7  ),   //output reg [3:0]    data1_7  ,
    .data1_8    (data1_8  ),   //output reg [3:0]    data1_8  ,
    .data1_9    (data1_9  ),   //output reg [3:0]    data1_9  ,
    .data1_10   (data1_10 ),   //output reg [3:0]    data1_10 ,
    .data1_11   (data1_11 ),   //output reg [3:0]    data1_11 ,
    .data1_12   (data1_12 ),   //output reg [3:0]    data1_12 ,
    .data1_13   (data1_13 ),   //output reg [3:0]    data1_13 ,
    .data1_14   (data1_14 ),   //output reg [3:0]    data1_14 ,
    .data1_15   (data1_15 ),   //output reg [3:0]    data1_15 ,
    .data1_16   (data1_16 ),   //output reg [3:0]    data1_16 ,
    .flag1      (flag1    ),   //output reg          flag1    ,
    .data2_1    (data2_1  ),   //output reg [3:0]    data2_1  ,
    .data2_2    (data2_2  ),   //output reg [3:0]    data2_2  ,
    .data2_3    (data2_3  ),   //output reg [3:0]    data2_3  ,
    .data2_4    (data2_4  ),   //output reg [3:0]    data2_4  ,
    .data2_5    (data2_5  ),   //output reg [3:0]    data2_5  ,
    .data2_6    (data2_6  ),   //output reg [3:0]    data2_6  ,
    .data2_7    (data2_7  ),   //output reg [3:0]    data2_7  ,
    .data2_8    (data2_8  ),   //output reg [3:0]    data2_8  ,
    .data2_9    (data2_9  ),   //output reg [3:0]    data2_9  ,
    .data2_10   (data2_10 ),   //output reg [3:0]    data2_10 ,
    .data2_11   (data2_11 ),   //output reg [3:0]    data2_11 ,
    .data2_12   (data2_12 ),   //output reg [3:0]    data2_12 ,
    .data2_13   (data2_13 ),   //output reg [3:0]    data2_13 ,
    .data2_14   (data2_14 ),   //output reg [3:0]    data2_14 ,
    .data2_15   (data2_15 ),   //output reg [3:0]    data2_15 ,
    .data2_16   (data2_16 ),   //output reg [3:0]    data2_16 ,
    .flag2      (flag2    ),   //output reg          flag2    ,
    .data3_1    (data3_1  ),   //output reg [3:0]    data3_1  ,
    .data3_2    (data3_2  ),   //output reg [3:0]    data3_2  ,
    .data3_3    (data3_3  ),   //output reg [3:0]    data3_3  ,
    .data3_4    (data3_4  ),   //output reg [3:0]    data3_4  ,
    .data3_5    (data3_5  ),   //output reg [3:0]    data3_5  ,
    .data3_6    (data3_6  ),   //output reg [3:0]    data3_6  ,
    .data3_7    (data3_7  ),   //output reg [3:0]    data3_7  ,
    .data3_8    (data3_8  ),   //output reg [3:0]    data3_8  ,
    .data3_9    (data3_9  ),   //output reg [3:0]    data3_9  ,
    .data3_10   (data3_10 ),   //output reg [3:0]    data3_10 ,
    .data3_11   (data3_11 ),   //output reg [3:0]    data3_11 ,
    .data3_12   (data3_12 ),   //output reg [3:0]    data3_12 ,
    .data3_13   (data3_13 ),   //output reg [3:0]    data3_13 ,
    .data3_14   (data3_14 ),   //output reg [3:0]    data3_14 ,
    .data3_15   (data3_15 ),   //output reg [3:0]    data3_15 ,
    .data3_16   (data3_16 ),   //output reg [3:0]    data3_16 ,
    .flag3      (flag3    )    //output reg          flag3     
);
lcd12864 lcd12864_u(
    .clk       (sysclkin     ),  //input               clk            ,
    .rstn      (button    ),  //input               rstn           ,
    .data1_1   (data1_1 ),  //input       [3:0]   data1_1        ,
    .data1_2   (data1_2 ),  //input       [3:0]   data1_2        ,
    .data1_3   (data1_3 ),  //input       [3:0]   data1_3        ,
    .data1_4   (data1_4 ),  //input       [3:0]   data1_4        ,
    .data1_5   (data1_5 ),  //input       [3:0]   data1_5        ,
    .data1_6   (data1_6 ),  //input       [3:0]   data1_6        ,
    .data1_7   (data1_7 ),  //input       [3:0]   data1_7        ,
    .data1_8   (data1_8 ),  //input       [3:0]   data1_8        ,
    .data1_9   (data1_9 ),  //input       [3:0]   data1_9        ,
    .data1_10  (data1_10),  //input       [3:0]   data1_10       ,
    .data1_11  (data1_11),  //input       [3:0]   data1_11       ,
    .data1_12  (data1_12),  //input       [3:0]   data1_12       ,
    .data1_13  (data1_13),  //input       [3:0]   data1_13       ,
    .data1_14  (data1_14),  //input       [3:0]   data1_14       ,
    .data1_15  (data1_15),  //input       [3:0]   data1_15       ,
    .data1_16  (data1_16),  //input       [3:0]   data1_16       ,
    .data2_1   (data2_1 ),  //input       [3:0]   data2_1        ,
    .data2_2   (data2_2 ),  //input       [3:0]   data2_2        ,
    .data2_3   (data2_3 ),  //input       [3:0]   data2_3        ,
    .data2_4   (data2_4 ),  //input       [3:0]   data2_4        ,
    .data2_5   (data2_5 ),  //input       [3:0]   data2_5        ,
    .data2_6   (data2_6 ),  //input       [3:0]   data2_6        ,
    .data2_7   (data2_7 ),  //input       [3:0]   data2_7        ,
    .data2_8   (data2_8 ),  //input       [3:0]   data2_8        ,
    .data2_9   (data2_9 ),  //input       [3:0]   data2_9        ,
    .data2_10  (data2_10),  //input       [3:0]   data2_10       ,
    .data2_11  (data2_11),  //input       [3:0]   data2_11       ,
    .data2_12  (data2_12),  //input       [3:0]   data2_12       ,
    .data2_13  (data2_13),  //input       [3:0]   data2_13       ,
    .data2_14  (data2_14),  //input       [3:0]   data2_14       ,
    .data2_15  (data2_15),  //input       [3:0]   data2_15       ,
    .data2_16  (data2_16),  //input       [3:0]   data2_16       ,
    .data3_1   (data3_1 ),  //input       [3:0]   data3_1        ,//0-9  +8'h10    a-f +8'h11;
    .data3_2   (data3_2 ),  //input       [3:0]   data3_2        ,//0-9  +8'h10    a-f +8'h11;
    .data3_3   (data3_3 ),  //input       [3:0]   data3_3        ,//0-9  +8'h10    a-f +8'h11;
    .data3_4   (data3_4 ),  //input       [3:0]   data3_4        ,//0-9  +8'h10    a-f +8'h11;
    .data3_5   (data3_5 ),  //input       [3:0]   data3_5        ,//0-9  +8'h10    a-f +8'h11;
    .data3_6   (data3_6 ),  //input       [3:0]   data3_6        ,//0-9  +8'h10    a-f +8'h11;
    .data3_7   (data3_7 ),  //input       [3:0]   data3_7        ,//0-9  +8'h10    a-f +8'h11;
    .data3_8   (data3_8 ),  //input       [3:0]   data3_8        ,//0-9  +8'h10    a-f +8'h11;
    .data3_9   (data3_9 ),  //input       [3:0]   data3_9        ,//0-9  +8'h10    a-f +8'h11;
    .data3_10  (data3_10),  //input       [3:0]   data3_10       ,//0-9  +8'h10    a-f +8'h11;
    .data3_11  (data3_11),  //input       [3:0]   data3_11       ,//0-9  +8'h10    a-f +8'h11;
    .data3_12  (data3_12),  //input       [3:0]   data3_12       ,//0-9  +8'h10    a-f +8'h11;
    .data3_13  (data3_13),  //input       [3:0]   data3_13       ,//0-9  +8'h10    a-f +8'h11;
    .data3_14  (data3_14),  //input       [3:0]   data3_14       ,//0-9  +8'h10    a-f +8'h11;
    .data3_15  (data3_15),  //input       [3:0]   data3_15       ,//0-9  +8'h10    a-f +8'h11;
    .data3_16  (data3_16),  //input       [3:0]   data3_16       ,//0-9  +8'h10    a-f +8'h11;
    .lcd_rs    (lcd_rs  ),  //output              lcd_rs         , 
    .lcd_rw    (lcd_rw  ),  //output              lcd_rw         , 
    .lcd_en    (lcd_en  ),  //output              lcd_en         , 
    .lcd_data  (lcd_data)   //output      [7:0]   lcd_data        
);   

  	
endmodule

4.总结

本设计能在LCD12864上显示16个密钥,16个明文,16个密文

需要vivado源代码私我

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值