⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 des.v

📁 用VERILOG语言实现的数据加密标准代码,在QUARTUS5.1上仿真过
💻 V
字号:
module DES(clk,en,din,dout,key,oflag,del,mode);
input [0:63] din;        //输入的64位待加密或者待解密的数据,由mode信号决定
input [0:63] key;        //输入的64位key,去除奇偶校验后只有56位有效
input clk;               //DES system clk
input en;                //DES模块使能信号,高电平复位电路,低电平系统工作
input mode;              //加解密模式选择信号,低电平加密,高电平解密
output [0:63] dout;      //输出加密或解密后的64位结果
output oflag;            //输出指示信号,高电平指示输出结果有效
output del;          
wire [0:63] dtemp;
reg [4:0] cnt;
reg flag;
reg start;
reg [2:0] shvar;
reg [1:0] initst;
reg [0:63] dreg;
reg [0:63] kreg;
wire [0:63] dwire;
wire [0:55] kwire;
wire [0:55] ktemp;
assign dtemp={dreg[57],dreg[49],dreg[41],dreg[33],dreg[25],dreg[17],dreg[9],dreg[1],
              dreg[59],dreg[51],dreg[43],dreg[35],dreg[27],dreg[19],dreg[11],dreg[3],
              dreg[61],dreg[53],dreg[45],dreg[37],dreg[29],dreg[21],dreg[13],dreg[5],
              dreg[63],dreg[55],dreg[47],dreg[39],dreg[31],dreg[23],dreg[15],dreg[7],
              dreg[56],dreg[48],dreg[40],dreg[32],dreg[24],dreg[16],dreg[8],dreg[0],
              dreg[58],dreg[50],dreg[42],dreg[34],dreg[26],dreg[18],dreg[10],dreg[2],
              dreg[60],dreg[52],dreg[44],dreg[36],dreg[28],dreg[20],dreg[12],dreg[4],
              dreg[62],dreg[54],dreg[46],dreg[38],dreg[30],dreg[22],dreg[14],dreg[6]}; //input initial permutation

assign oflag=flag;
always @(posedge clk or posedge en)
   begin
       if (en) 
       begin
         initst<=2'b00;
         start<=1'b0;
         dreg<=64'h0;
         kreg<=64'h0;
       end
       else 
       begin
         case (initst)
         2'b00:
           begin
             dreg<=din;    //load input data
             kreg<=key;    //load key
             initst<=2'b01;
           end
         2'b01:
           begin
             dreg<=dtemp;         //input data IP
             kreg[0:55]<=ktemp;  //key IP
             initst<=2'b10;
             start<=1'b1;        //DES not ready
           end
         2'b10:
           begin
             if ((cnt<5'h11)&(cnt>5'h0)) 
             begin
                dreg<=dwire;
                kreg [0:55]<=kwire;
             end
             else if (cnt==5'h11)
                start<=1'b0;      //DES system run
           end 
         default:
                start<=1'b0;
         endcase
       end
    end
always @(posedge clk or posedge en)
  begin
    if (en) 
      begin
        flag<=1'b0;      //output data valid signal,flag=0 reflect not valid
        cnt<=5'h0;
        shvar<=3'b000;
      end
    else
      begin
        if((~flag) & start)
          begin
            if (cnt==5'h10)
               flag<=1'b1;   //output data valid
            case (cnt[3:0])  //set the shift bits of encode or decode process
            4'h0: shvar<=mode? 3'b000:3'b001;
            4'h1: shvar<=3'b001;
            4'h2: shvar<=3'b010;
            4'h3: shvar<=3'b010;
            4'h4: shvar<=3'b010;
            4'h5: shvar<=3'b010;
            4'h6: shvar<=3'b010;          
            4'h7: shvar<=3'b010; 
            4'h8: shvar<=3'b001;
            4'h9: shvar<=3'b010;
            4'ha: shvar<=3'b010;
            4'hb: shvar<=3'b010;
            4'hc: shvar<=3'b010;
            4'hd: shvar<=3'b010;
            4'he: shvar<=3'b010;
            4'hf: shvar<=3'b101;
            endcase
            cnt<=cnt+1'b1;
         end
      end
 end
assign ktemp={kreg[56],kreg[48],kreg[40],kreg[32],kreg[24],kreg[16],kreg[8],kreg[0],
              kreg[57],kreg[49],kreg[41],kreg[33],kreg[25],kreg[17],kreg[9],kreg[1],
              kreg[58],kreg[50],kreg[42],kreg[34],kreg[26],kreg[18],kreg[10],kreg[2],
              kreg[59],kreg[51],kreg[43],kreg[35],kreg[62],kreg[54],kreg[46],kreg[38],
              kreg[30],kreg[22],kreg[14],kreg[6],kreg[61],kreg[53],kreg[45],kreg[37],
              kreg[29],kreg[21],kreg[13],kreg[5],kreg[60],kreg[52],kreg[44],kreg[36],
              kreg[28],kreg[20],kreg[12],kreg[4],kreg[27],kreg[19],kreg[11],kreg[3]}; //key initial permutation
oneblock1  inst(dreg,dwire,kreg[0:55],kwire,shvar,mode);
assign del=kreg[7]^kreg[15]^kreg[23]^kreg[31]^kreg[39]^kreg[47]^kreg[55]^kreg[63];

assign dout={dreg[39],dreg[7],dreg[47],dreg[15],dreg[55],dreg[23],dreg[63],dreg[31],
             dreg[38],dreg[6],dreg[46],dreg[14],dreg[54],dreg[22],dreg[62],dreg[30],
             dreg[37],dreg[5],dreg[45],dreg[13],dreg[53],dreg[21],dreg[61],dreg[29],
             dreg[36],dreg[4],dreg[44],dreg[12],dreg[52],dreg[20],dreg[60],dreg[28],
             dreg[35],dreg[3],dreg[43],dreg[11],dreg[51],dreg[19],dreg[59],dreg[27],
             dreg[34],dreg[2],dreg[42],dreg[10],dreg[50],dreg[18],dreg[58],dreg[26],
             dreg[33],dreg[1],dreg[41],dreg[9],dreg[49],dreg[17],dreg[57],dreg[25],
             dreg[32],dreg[0],dreg[40],dreg[8],dreg[48],dreg[16],dreg[56],dreg[24]}; //last IP
endmodule

       

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -