?? des_cal.v
字號:
/*-----------------------------------------------------------------------
/Module : DES_CAL
/Filename : DES_CAL.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_CAL(
clk,
rst_n,
sw_rst,
buffin,
buffo,
//Left_first,
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_buff,
data_sel_com1,
data_sel_com2,
data_sel_iv,
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_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 [31:0] buffin; //the bus of input data
//input Left_first; //low bits first
output [63:0] buffo; //the bus of output data
input lut_en; //f_fuction enable signal;
input ls1,ls2,ls3,ls4,ls5,ls6,ls7,ls8,ls9,ls10,ls11,ls12,ls13,ls14,ls15,ls16;
//key left shift enable signal
input dls2,dls3,dls4,dls5,dls6,dls7,dls8,dls9,dls10,dls11,dls12,dls13,dls14,dls15,dls16;
//key right shift enable signal
input IP; //IP change enable signal
input data_sel_buff; //buff_reg to data_reg
input data_sel_iv; //data_reg select iv_reg
input data_sel_com1; //data_reg select {data_reg[32:63],r2}
input data_sel_com2; //data_reg select {r2,data_reg[32:63]}
input k1_sel_key1; //k1 select buffin
input k2_sel_key2; //k2_select buffin
input k3_sel_key3; //k3_select buffin
input key_sel_k1; //x2 port select k1_reg
input key_sel_k2; //x2 port select k2_reg
input key_sel_k3; //x2 port select k3_reg
input iv_sel_tmp; //tmp to iv resigster
input iv_sel_data; //data_reg to iv resigster
input tmp_sel_buff; //buff_reg to tmp reg
input IP_1; //IP-1 change;
input buff_xor_iv; //buff exclusive-or iv
input data_xor_iv; //data exclusive-or iv
input tmp_xor_data_1; //tmp exclusive-or data 1bit
input tmp_xor_data_8; //tmp exclusive-or data 8bits
input tmp_xor_data_16; //tmp exclusive-or data 16bits
input tmp_xor_data_32; //tmp exclusive-or data 32bits
input tmp_xor_data_64; //tmp exclusive-or data 64bits
input iv_shift_1; //iv left shift 1bit
input iv_shift_8; //iv left shift 8bits
input iv_shift_16; //iv left shift 16bits
input iv_shift_32; //iv left shift 32bits;
input iv_shift_64; //iv left shift 64bits;
input iv_back_tmp; //iv back tmp_reg
input buff_load; //buffin to buff
input buff_load_low; //only load 32bit(most) to buff_reg
input iv_load; //buffin to iv
//input sel_left;
//input sel_right;
reg [0:63] data_reg; //the register of des calculate
reg [0:63] iv_reg; //the register of iv
reg [0:63] buff_reg; //the register of buff text
reg [0:63] tmp_reg; //the register of temp save data
reg [0:55] k1_reg; //the register of key 1
reg [0:55] k2_reg; //the register of key 2
reg [0:55] k3_reg; //the register of key 3
reg [0:55] key_reg;
/***************s_box******************************/
reg s10,s11,s12,s13;
reg s20,s21,s22,s23;
reg s30,s31,s32,s33;
reg s40,s41,s42,s43;
reg s50,s51,s52,s53;
reg s60,s61,s62,s63;
reg s70,s71,s72,s73;
reg s80,s81,s82,s83;
/***************************************************/
/*****************the first xor********************/
wire [0:47] r1;
wire [0:47] x1;
wire [0:47] x2;
assign
x1={data_reg[63],data_reg[32:36],data_reg[35:40],data_reg[39:44],data_reg[43:48],data_reg[47:52],data_reg[51:56],data_reg[55:60],data_reg[59:63],data_reg[32]};
assign x2= {key_reg[13],key_reg[16],key_reg[10],key_reg[23],key_reg[0],key_reg[4],
key_reg[2],key_reg[27],key_reg[14],key_reg[5],key_reg[20],key_reg[9],
key_reg[22],key_reg[18],key_reg[11],key_reg[3],key_reg[25],key_reg[7],
key_reg[15],key_reg[6],key_reg[26],key_reg[19],key_reg[12],key_reg[1],
key_reg[40],key_reg[51],key_reg[30],key_reg[36],key_reg[46],key_reg[54],
key_reg[29],key_reg[39],key_reg[50],key_reg[44],key_reg[32],key_reg[47],
key_reg[43],key_reg[48],key_reg[38],key_reg[55],key_reg[33],key_reg[52],
key_reg[45],key_reg[41],key_reg[49],key_reg[35],key_reg[28],key_reg[31]};
assign r1=(lut_en)?x1^x2:48'd0;
/**************************************************/
/*****************the secode xor******************/
wire [0:31] r2;
wire [0:31] x3;
wire [0:31] x4;
assign x3={
s40,s21,s50,s63,
s83,s30,s70,s53,
s13,s41,s61,s72,
s23,s52,s81,s32,
s12,s20,s60,s42,
s80,s71,s11,s33,
s51,s43,s82,s22,
s62,s31,s10,s73
};
assign x4=data_reg[0:31];
assign r2=x3^x4;
/*************************************************/
assign buffo=data_reg;
//------------------------------------------------------------------
// buff_reg
//------------------------------------------------------------------
wire buff_load_lst,buff_load_hst;
//assign buff_load_lst=buff_load && Left_first;
//assign buff_load_hst=buff_load && !Left_first;
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n) buff_reg<=64'd0;
else if(sw_rst) buff_reg<=64'd0;
else
begin
case({buff_load_low,buff_load})
2'b11: buff_reg<={buffin[31:0],32'd0};
// 3'b010:buff_reg<={buff_reg[32:63],buffin[31:0]};
2'b01:buff_reg<={buffin[31:0],buff_reg[0:31]};
default: buff_reg<=buff_reg;
endcase
/* case({buff_load_low,buff_load_lst,buff_load_hst})
3'b110,3'b101: buff_reg<={buffin[31:0],32'd0};
3'b010:buff_reg<={buff_reg[32:63],buffin[31:0]};
3'b001:buff_reg<={buffin[31:0],buff_reg[0:31]};
default: buff_reg<=buff_reg;
endcase */
end
end
//------------------------------------------------------------------
// tmp_reg
//------------------------------------------------------------------
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n) tmp_reg<=64'd0;
else if(sw_rst) tmp_reg<=64'd0;
else
begin
if(tmp_sel_buff) tmp_reg<=buff_reg;
end
end
//------------------------------------------------------------------
// k1_reg
//------------------------------------------------------------------
wire ls1_16=ls1||ls2||ls9||ls16;
wire ls3_15=ls3|ls4|ls5|ls6|ls7|ls8|ls10|ls11|ls12|ls13|ls14|ls15;
wire dls2_16=dls2|dls9|dls16;
wire dls3_15=dls3|dls4|dls5|dls6|dls7|dls8|dls10|dls11|dls12|dls13|dls14|dls15;
wire [0:55]sel_key;
assign sel_key=(key_sel_k1)? { k1_reg[49],k1_reg[42], k1_reg[35], k1_reg[28], k1_reg[21], k1_reg[14], k1_reg[7],
k1_reg[0], k1_reg[50], k1_reg[43], k1_reg[36], k1_reg[29], k1_reg[22], k1_reg[15],
k1_reg[8], k1_reg[1], k1_reg[51], k1_reg[44], k1_reg[37], k1_reg[30], k1_reg[23],
k1_reg[16], k1_reg[9], k1_reg[2], k1_reg[52], k1_reg[45], k1_reg[38], k1_reg[31],
k1_reg[55],k1_reg[48], k1_reg[41], k1_reg[34], k1_reg[27], k1_reg[20], k1_reg[13],
k1_reg[6], k1_reg[54], k1_reg[47], k1_reg[40], k1_reg[33], k1_reg[26], k1_reg[19],
k1_reg[12], k1_reg[5], k1_reg[53], k1_reg[46], k1_reg[39], k1_reg[32], k1_reg[25],
k1_reg[18], k1_reg[11], k1_reg[4], k1_reg[24], k1_reg[17], k1_reg[10], k1_reg[3]}:
(key_sel_k2)?{ k2_reg[49],k2_reg[42], k2_reg[35], k2_reg[28], k2_reg[21], k2_reg[14], k2_reg[7],
k2_reg[0], k2_reg[50], k2_reg[43], k2_reg[36], k2_reg[29], k2_reg[22], k2_reg[15],
k2_reg[8], k2_reg[1], k2_reg[51], k2_reg[44], k2_reg[37], k2_reg[30], k2_reg[23],
k2_reg[16], k2_reg[9], k2_reg[2], k2_reg[52], k2_reg[45], k2_reg[38], k2_reg[31],
k2_reg[55],k2_reg[48], k2_reg[41], k2_reg[34], k2_reg[27], k2_reg[20], k2_reg[13],
k2_reg[6], k2_reg[54], k2_reg[47], k2_reg[40], k2_reg[33], k2_reg[26], k2_reg[19],
k2_reg[12], k2_reg[5], k2_reg[53], k2_reg[46], k2_reg[39], k2_reg[32], k2_reg[25],
k2_reg[18], k2_reg[11], k2_reg[4], k2_reg[24], k2_reg[17], k2_reg[10], k2_reg[3]}:
(key_sel_k3)?{ k3_reg[49],k3_reg[42], k3_reg[35], k3_reg[28], k3_reg[21], k3_reg[14], k3_reg[7],
k3_reg[0], k3_reg[50], k3_reg[43], k3_reg[36], k3_reg[29], k3_reg[22], k3_reg[15],
k3_reg[8], k3_reg[1], k3_reg[51], k3_reg[44], k3_reg[37], k3_reg[30], k3_reg[23],
k3_reg[16], k3_reg[9], k3_reg[2], k3_reg[52], k3_reg[45], k3_reg[38], k3_reg[31],
k3_reg[55],k3_reg[48], k3_reg[41], k3_reg[34], k3_reg[27], k3_reg[20], k3_reg[13],
k3_reg[6], k3_reg[54], k3_reg[47], k3_reg[40], k3_reg[33], k3_reg[26], k3_reg[19],
k3_reg[12], k3_reg[5], k3_reg[53], k3_reg[46], k3_reg[39], k3_reg[32], k3_reg[25],
k3_reg[18], k3_reg[11], k3_reg[4], k3_reg[24], k3_reg[17], k3_reg[10], k3_reg[3]}:64'd0;
wire key_sel_key123=key_sel_k1 || key_sel_k2||key_sel_k3;
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n) key_reg<=56'd0;
else if(sw_rst) key_reg<=56'd0;
else
begin
case({key_sel_key123,ls1_16,ls3_15,dls2_16,dls3_15})
5'b10000: //key_sel_k1
key_reg<=sel_key;
5'b01000://ls1_16
key_reg<={key_reg[1:27],key_reg[0],key_reg[29:55],key_reg[28]};
5'b00100: //ls3_15
key_reg<={key_reg[2:27],key_reg[0:1],key_reg[30:55],key_reg[28:29]};
5'b00010: //dls2_16
key_reg<={key_reg[27],key_reg[0:26],key_reg[55],key_reg[28:54]};
5'b00001: //dls3_15
key_reg<={key_reg[26:27],key_reg[0:25],key_reg[54:55],key_reg[28:53]};
default: key_reg<=key_reg;
endcase
end
end
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n) k1_reg<=56'd0;
else if(sw_rst) k1_reg<=56'd0;
else
begin
if(k1_sel_key1) k1_reg<={buffin[31:25],buffin[23:17],buffin[15:9],buffin[7:1],k1_reg[0:27]};
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -