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

📄 des_ctrl.v

📁 Verilog实现的DES和3-DES
💻 V
📖 第 1 页 / 共 3 页
字号:
/*-----------------------------------------------------------------------
/Module			:	DES_CTRL
/Filename		:	DES_CTRL.v
/Description		:	DES
/Called by		:	DES
/Simulator		:	Modelsim5.7 and  Simvision / WindowsXP
/Synthesis tool		:	Synplify / WindowsXP
/Revision history	:	2008-05-30 v1.0

--------------------------------------------------------------------------*/




module DES_CTRL(
		clk,
		rst_n,
		sw_rst,
		key_321,
		work_mode,
		s_width,
		DES_encrypt_start,
		DES_decrypt_start,
		//DES3_encrypt_start,
		//DES3_decrypt_start,
		load_data,
		load_key,
		load_iv,
		//buff_out_load,
		//Left_first,
		ready,
		lut_en,
	        ls1,ls2,ls3,ls4,ls5,ls6,ls7,ls8,ls9,ls10,ls11,ls12,ls13,ls14,ls15,ls16,
	        dls2,dls3,dls4,dls5,dls6,dls7,dls8,dls9,dls10,dls11,dls12,dls13,dls14,dls15,dls16,
	        IP,
		data_sel_iv,
		data_sel_buff,
		data_sel_com1,
		data_sel_com2,
		k1_sel_key1,
		k2_sel_key2,
		k3_sel_key3,
		key_sel_k1,
		key_sel_k2,
		key_sel_k3,
		iv_sel_tmp,
		iv_sel_data,
		//tmp_sel_data,
		tmp_sel_buff,
		IP_1,
		buff_xor_iv,
		data_xor_iv,
		tmp_xor_data_1,
		tmp_xor_data_8,
		tmp_xor_data_16,
		tmp_xor_data_32,
		tmp_xor_data_64,
		iv_shift_1,
		iv_shift_8,
		iv_shift_16,
		iv_shift_32,
		iv_shift_64,
		iv_back_tmp,
		buff_load,
		buff_load_low,
		iv_load
		//sel_left,
		//sel_right
);
input 	clk;				//systerm clk
input 	rst_n;				//reset signal
input 	sw_rst;				//soft reset signal
input 	[2:0] key_321;			//how many keys
input	[4:0] s_width;			//the width of s bit
//input	buff_out_load;
//input   Left_first;
input 	load_data;			//load data enable signal
input 	load_key;			//load key enable signal
input 	load_iv;			//load iv enable signal
input 	[4:0] work_mode;		//work mode of des
input  	DES_encrypt_start;		//des encipher plaintext start signal
input   DES_decrypt_start;		//des decipher cipertext start signal
//input   DES3_encrypt_start;		//3des encipher plaintext start signal
//input   DES3_decrypt_start;		//3des decipher cipertext start signal

output 	ready;				//des finish signal
output 	lut_en;				//f_fuction enable signal;
output  ls1,ls2,ls3,ls4,ls5,ls6,ls7,ls8,ls9,ls10,ls11,ls12,ls13,ls14,ls15,ls16;
					//key left shift enable signal
output  dls2,dls3,dls4,dls5,dls6,dls7,dls8,dls9,dls10,dls11,dls12,dls13,dls14,dls15,dls16;
					//key right shift enable signal
output 	IP;				//IP change enable signal 
output	data_sel_iv;			//data_reg select iv_reg
output 	data_sel_buff;			//buff_reg to data_reg
output  data_sel_com1;			//data_reg select {data_reg[32:63],r2}
output	data_sel_com2;			//data_reg select {r2,data_reg[32:63]}
output	k1_sel_key1;			//k1 select buffin
output  k2_sel_key2;			//k2_select buffin
output  k3_sel_key3;			//k3_select buffin
output 	key_sel_k1;			//x2 port select k1_reg
output	key_sel_k2;			//x2 port select k2_reg
output 	key_sel_k3;			//x2 port select k3_reg
output  iv_sel_tmp;			//tmp to iv resigster
output  iv_sel_data;			//data_reg to iv resigster
output	tmp_sel_buff;			//buff_reg to tmp reg
output	IP_1;				//IP-1 change;
output	buff_xor_iv;			//buff exclusive-or iv
output	data_xor_iv;			//data exclusive-or iv
output	tmp_xor_data_1;			//tmp exclusive-or data  1bit
output	tmp_xor_data_8;			//tmp exclusive-or data  8bits
output	tmp_xor_data_16;       		 //tmp exclusive-or data  16bits
output	tmp_xor_data_32;		//tmp exclusive-or data  32bits
output	tmp_xor_data_64;		//tmp exclusive-or data  64bits
output	iv_shift_1;			//iv left shift 1bit
output	iv_shift_8;			//iv left shift 8bits
output	iv_shift_16;			//iv left shift 16bits
output  iv_shift_32;			//iv left shift	32bits;
output	iv_shift_64;			//iv left shift 64bits;
output  iv_back_tmp;                   //iv back tmp_reg
output  buff_load;			//buffin to buff
output buff_load_low;                  //only load 32bit(most)  to buff_reg
output	iv_load;			//buffin to iv
//output sel_left;
//output sel_right;

wire s_1,s_8,s_16,s_32,s_64;
wire ECB,CBC,OFB,CFB;

reg des_encrypt_busy,des_decrypt_busy,des3_encrypt_busy,des3_decrypt_busy;
reg des_busy,des3_busy;

/***********************work mode des and 3des fsm signal****************/
reg [3:0]	des_mode_current_state;
reg [3:0]	des_mode_next_state;
parameter	des_mode_idle_state			=4'b0000;			//work mode des or 3des idle state;
parameter	des_mode_buff_2_data_1_state		=4'b0001;			//work mode des or 3des buff_reg to data_reg 
parameter	des_mode_des_cal_1_state		=4'b0010;			//work mode des calculate
parameter	des_mode_des3_cal_1_state		=4'b0011;			//work mode 3des calculate
parameter	des_mode_buff_xor_iv_state		=4'b0100;			//buff_reg or iv_reg
parameter	des_mode_buff_2_data_2_state		=4'b0101;			//buff_reg to data_reg
parameter	des_mode_des_cal_2_state		=4'b0110;			//des calculate
parameter	des_mode_des3_cal_2_state		=4'b0111;			//3des calculate
parameter	des_mode_data_2_iv_state		=4'b1000;			//data_reg to iv_reg
parameter 	des_mode_data_xor_iv_state		=4'b1001;			//data_reg xor iv_reg
parameter	des_mode_iv_2_data_state		=4'b1010;			//iv_reg to data_reg
parameter	des_mode_des_cal_3_state		=4'b1011;			//des calculate
parameter	des_mode_des3_cal_3_state		=4'b1100;			//3des calculate
parameter	des_mode_tmp_xor_data_state		=4'b1101;			//tmp_reg xor data_reg
parameter	des_mode_iv_back_shift_state    	=4'b1110;			//iv shift
parameter	des_mode_finish_state				=4'b1111;			//des or 3des finish state
wire buff_2_data,buff_xor_iv,data_2_iv,data_xor_iv,iv_2_data,tmp_xor_data,iv_shift;
/************************************************************************/

/******************************3des fsm signal***************************/
reg [1:0]	des3_current_state;
reg [1:0]	des3_next_state;					
parameter	des3_idle_state		=2'b00;			//3des idle state;
parameter	des3_des1_state		=2'b01;			//3des the first des operation
parameter	des3_des2_state		=2'b10;			//3des the second des opteration
parameter	des3_des3_state		=2'b11;			//3des the thibuff_out_load des opteration
//parameter	des3_ready_state	=3'b100;			//3des finish state
wire des3_ready,des_encrypt,des_decrypt,des_start,des3_start;
wire des1_state,des2_state,des3_state;
wire key_sel_k1,key_sel_k2,key_sel_k3;
/************************************************************************/

/******************************des_fsm signal****************************/
reg [4:0]	des_current_state;
reg [4:0]	des_next_state; 
parameter	des_idle_state		=5'b00000;			//des idle state
parameter	des_IP_state		=5'b00001;			//des ip change state
parameter	des_lut1_state		=5'b00010;			//des round 1 state
parameter	des_lut2_state		=5'b00011;			//des round 2 state
parameter	des_lut3_state		=5'b00100;			//des round 3 state
parameter	des_lut4_state		=5'b00101;			//des round 4 state
parameter	des_lut5_state		=5'b00110;			//des round 5 state
parameter	des_lut6_state		=5'b00111;			//des round 6 state
parameter	des_lut7_state		=5'b01000;			//des round 7 state
parameter	des_lut8_state		=5'b01001;			//des round 8 state
parameter	des_lut9_state		=5'b01010;			//des round 9 state
parameter	des_lut10_state		=5'b01011;			//des round 10 state
parameter	des_lut11_state		=5'b01100;			//des round 11 state
parameter	des_lut12_state		=5'b01101;			//des round 12 state
parameter	des_lut13_state		=5'b01110;			//des round 13 state
parameter	des_lut14_state		=5'b01111;			//des round 14 state
parameter	des_lut15_state		=5'b10000;			//des round 15 state
parameter	des_lut16_state		=5'b10001;			//des round 16 state
parameter	des_IP_1_state		=5'b10010;			//des ip-1 change state
parameter	des_ready_state		=5'b10011;			//des ready state
wire IP,lut_en,IP_1,des_ready;
wire ls1,ls2,ls3,ls4,ls5,ls6,ls7,ls8,ls9,ls10,ls11,ls12,ls13,ls14,ls15,ls16;
wire dls2,dls3,dls4,dls5,dls6,dls7,dls8,dls9,dls10,dls11,dls12,dls13,dls14,dls15,dls16;

wire IP_state,lut1_state,lut2_state,lut3_state,lut4_state,lut5_state,lut6_state,lut7_state;
wire lut8_state,lut9_state,lut10_state,lut11_state,lut12_state,lut13_state,lut14_state,lut15_state,lut16_state,IP_1_state;


/*************************work mode signal*******************************/
assign ECB=work_mode[0];
assign CBC=work_mode[1];
assign CFB=work_mode[2];
assign OFB=work_mode[3];
//assign ECB=(work_mode[1:0]==2'b00)?1'b1:1'b0;
//assign CBC=(work_mode[1:0]==2'b01)?1'b1:1'b0;
//assign CFB=(work_mode[1:0]==2'b10)?1'b1:1'b0;
//assign OFB=(work_mode[1:0]==2'b11)?1'b1:1'b0;
/************************************************************************/

/************************the number of key******************************/
wire key_1,key_2,key_3;
assign key_1=key_321[0];
assign key_2=key_321[1];
assign key_3=key_321[2];
/***********************************************************************/
wire DES3_encrypt_start;
wire DES3_decrypt_start;
assign DES3_encrypt_start=DES_encrypt_start && (key_2|key_3);
assign DES3_decrypt_start=DES_decrypt_start && (key_2|key_3);



/*************************the wide of s*********************************/
assign s_1=s_width[0];
assign s_8=s_width[1];
assign s_16=s_width[2];
assign s_32=s_width[3];
assign s_64=s_width[4];
/***********************************************************************/
reg [2:0] counter;

//------------------------------------------------------------------
//k1_reg select buffin enable signal
//------------------------------------------------------------------
		assign k1_sel_key1=(counter[2:1]==2'b00 &&load_key)?1'b1:1'b0;
		assign k2_sel_key2=(counter[2:1]==2'b01 && (key_2||key_3) && load_key)?1'b1:1'b0;
		assign k3_sel_key3=(((counter[2:1]==2'b10 && key_3)||(counter[2:1]==2'b00 && key_2)) && load_key)?1'b1:1'b0;


//------------------------------------------------------------------
//buff_reg load data enable signal
//------------------------------------------------------------------
		assign buff_load=load_data;
		
                assign buff_load_low=(buff_load && (CFB||OFB) && (s_1||s_8||s_16||s_32))? 1'b1:1'b0;

//------------------------------------------------------------------
//buff_reg load iv enable signal
//------------------------------------------------------------------
		assign iv_load=load_iv;

//----------------------------
//how the counter work
//----------------------------
wire counter_inc,counter_clr;
assign counter_inc=load_key || load_data;
assign counter_clr=((load_key && ((key_3 && counter==3'b101)||(key_2 && counter==3'b011)||(key_1 && counter==3'b001)))||
                    (load_data &&((counter==3'b001)||
		                  (counter==3'b000&&(s_1||s_8||s_16||s_32)&&(CFB || OFB))
				 )))?1'b1:1'b0;
always @(posedge clk or negedge rst_n)
begin
  if(!rst_n) counter<=3'b000;
  else if(sw_rst) counter<=3'b000;
       else 
       begin
          if(counter_clr) counter<=3'b000;
	  else  if(counter_inc) counter<=counter+1'b1;
       end
end


/************************busy_signal*************************************/
//----------------------------
//DES encipher busy signal
//---------------------------
always @(posedge clk or negedge rst_n)
begin
  if(!rst_n)
     des_encrypt_busy<=1'b0;
  else
  if(sw_rst) des_encrypt_busy<=1'b0;
  else
  begin
    if(ready) des_encrypt_busy<=1'b0;
    else    if((DES_encrypt_start&&(!DES3_encrypt_start)) || (DES_decrypt_start&&(!DES3_decrypt_start)&& (CFB||OFB)))  des_encrypt_busy<=1'b1;
      
  end
end


//----------------------------
//DES decipher busy signal
//---------------------------
always @(posedge clk or negedge rst_n)
begin
  if(!rst_n)
     des_decrypt_busy<=1'b0;
  else
  if(sw_rst) des_decrypt_busy<=1'b0;
  else
  begin
      if(ready) des_decrypt_busy<=1'b0;
      else  if((DES_decrypt_start&&(!DES3_decrypt_start)) &&(ECB || CBC))  des_decrypt_busy<=1'b1;
  end
end


//---------------------------
//3DES encipher busy signal
//--------------------------
always @(posedge clk or negedge rst_n)
begin
  if(!rst_n)
     des3_encrypt_busy<=1'b0;
  else 
  if(sw_rst) des3_encrypt_busy<=1'b0;
  else

⌨️ 快捷键说明

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