📄 des_f.v
字号:
/*##########################################################################---- ---- Module : DES_F.v ---- Last Update : 08/01/2001-- ---- Description : One round of DES F funciton ---- ---- ---- Designers : Steve Trimberger & Vikram Pasham ---- Company : Xilinx & Inc. ---- ---- ---- Disclaimer : THESE DESIGNS ARE PROVIDED "AS IS" WITH NO WARRANTY ---- WHATSOEVER AND XILINX SPECIFICALLY DISCLAIMS ANY ---- IMPLIED WARRANTIES OF MERCHANTABILITY & FITNESS FOR ---- A PARTICULAR PURPOSE, OR AGAINST INFRINGEMENT. ---- THEY ARE ONLY INTENDED TO BE USED BY XILINX ---- CUSTOMERS, AND WITHIN XILINX DEVICES. ---- ---- Copyright (c) 2000 Xilinx, Inc. ---- All rights reserved ---- ---- ---- ----#########################################################################*////////////////////////////////////////////////////////////////////// One round of DES F function///////////////////////////////////////////////////////////////////module des_f(reset, clk, f_in_l, f_in_r, f_out_l_reg, f_out_r_reg, compressed_key);input reset;input clk;input [1:32] f_in_l; // left 32 input bits for this roundinput [1:32] f_in_r; // right 32 input bits for this roundinput [1:48] compressed_key; // 48-bit key for round noutput [1:32] f_out_l_reg; // left 32 output bits from this roundoutput [1:32] f_out_r_reg; // right 32 output bits from this roundwire [1:48] expanded_out; // expanded f_in_rwire [1:48] xor_out_prereg; // xor'd expanded_out and compressed_keywire [1:48] xor_out; // registered xor_out [PIPE]reg [1:48] xor_out_reg;reg [1:32] sbox_out; // output of sbox substitutionwire [1:32] pbox_out; // output of pbox permutationwire [1:32] f_out_l, f_out_r;reg [1:32] f_out_l_reg, f_out_r_reg; // Register for f result [PIPE]reg [1:32] f_in_l_reg1, f_in_r_reg1;reg [1:32] f_in_l_reg, f_in_r_reg;// Outputs from individual Sboxeswire [1:4] sb1outa, sb1outb;wire [1:4] sb2outa, sb2outb;wire [1:4] sb3outa, sb3outb;wire [1:4] sb4outa, sb4outb;wire [1:4] sb5outa, sb5outb;wire [1:4] sb6outa, sb6outb;wire [1:4] sb7outa, sb7outb;wire [1:4] sb8outa, sb8outb;reg [1:4] sb1outa_reg, sb1outb_reg;reg [1:4] sb2outa_reg, sb2outb_reg;reg [1:4] sb3outa_reg, sb3outb_reg;reg [1:4] sb4outa_reg, sb4outb_reg;reg [1:4] sb5outa_reg, sb5outb_reg;reg [1:4] sb6outa_reg, sb6outb_reg;reg [1:4] sb7outa_reg, sb7outb_reg;reg [1:4] sb8outa_reg, sb8outb_reg;//// Expand right half data from 32 to 48 bits ////assign expanded_out = { f_in_r[32], f_in_r[1], f_in_r[2], f_in_r[3], f_in_r[4], f_in_r[5], f_in_r[4], f_in_r[5], f_in_r[6], f_in_r[7], f_in_r[8], f_in_r[9], f_in_r[8], f_in_r[9], f_in_r[10],f_in_r[11], f_in_r[12], f_in_r[13],f_in_r[12],f_in_r[13], f_in_r[14], f_in_r[15],f_in_r[16],f_in_r[17], f_in_r[16], f_in_r[17],f_in_r[18],f_in_r[19], f_in_r[20], f_in_r[21],f_in_r[20],f_in_r[21], f_in_r[22], f_in_r[23],f_in_r[24],f_in_r[25], f_in_r[24], f_in_r[25],f_in_r[26],f_in_r[27], f_in_r[28], f_in_r[29],f_in_r[28],f_in_r[29], f_in_r[30], f_in_r[31],f_in_r[32],f_in_r[1]};//// xor expaned right half data with key ////assign xor_out = expanded_out ^ compressed_key;//////////////register xor_out///////////////////////always @(posedge reset or posedge clk )begin if(reset) begin xor_out_reg <= 48'b0; end else begin xor_out_reg <= xor_out; endend//// s-box substitution ////SB1 Isb1(xor_out[1:6], sb1outa, sb1outb);SB2 Isb2(xor_out[7:12], sb2outa, sb2outb);SB3 Isb3(xor_out[13:18], sb3outa, sb3outb);SB4 Isb4(xor_out[19:24], sb4outa, sb4outb);SB5 Isb5(xor_out[25:30], sb5outa, sb5outb);SB6 Isb6(xor_out[31:36], sb6outa, sb6outb);SB7 Isb7(xor_out[37:42], sb7outa, sb7outb);SB8 Isb8(xor_out[43:48], sb8outa, sb8outb);//////////////register sbxouts///////////////////////always @(posedge reset or posedge clk ) begin if(reset) begin sb1outa_reg <= 4'b0; sb1outb_reg <= 4'b0; sb2outa_reg <= 4'b0; sb2outb_reg <= 4'b0; sb3outa_reg <= 4'b0; sb3outb_reg <= 4'b0; sb4outa_reg <= 4'b0; sb4outb_reg <= 4'b0; sb5outa_reg <= 4'b0; sb5outb_reg <= 4'b0; sb6outa_reg <= 4'b0; sb6outb_reg <= 4'b0; sb7outa_reg <= 4'b0; sb7outb_reg <= 4'b0; sb8outa_reg <= 4'b0; sb8outb_reg <= 4'b0; endelse begin sb1outa_reg <= sb1outa; sb1outb_reg <= sb1outb; sb2outa_reg <= sb2outa; sb2outb_reg <= sb2outb; sb3outa_reg <= sb3outa; sb3outb_reg <= sb3outb; sb4outa_reg <= sb4outa; sb4outb_reg <= sb4outb; sb5outa_reg <= sb5outa; sb5outb_reg <= sb5outb; sb6outa_reg <= sb6outa; sb6outb_reg <= sb6outb; sb7outa_reg <= sb7outa; sb7outb_reg <= sb7outb; sb8outa_reg <= sb8outa; sb8outb_reg <= sb8outb; endend /* complete the SBOXes, they build 2 F5. We combine them here (and synth should lump this with the xor with f_in_l into a single 4LUT) */always @(sb1outa_reg or sb1outb_reg or xor_out_reg) begin if(xor_out_reg[1]) sbox_out[1:4] = sb1outb_reg; else sbox_out[1:4] = sb1outa_reg;endalways @(sb2outa_reg or sb2outb_reg or xor_out_reg) begin if(xor_out_reg[7]) sbox_out[5:8] = sb2outb_reg; else sbox_out[5:8] = sb2outa_reg;endalways @(sb3outa_reg or sb3outb_reg or xor_out_reg) begin if(xor_out_reg[13]) sbox_out[9:12] = sb3outb_reg; else sbox_out[9:12] = sb3outa_reg;endalways @(sb4outa_reg or sb4outb_reg or xor_out_reg) begin if(xor_out_reg[19]) sbox_out[13:16] = sb4outb_reg; else sbox_out[13:16] = sb4outa_reg;endalways @(sb5outa_reg or sb5outb_reg or xor_out_reg) begin if(xor_out_reg[25]) sbox_out[17:20] = sb5outb_reg; else sbox_out[17:20] = sb5outa_reg;endalways @(sb6outa_reg or sb6outb_reg or xor_out_reg) begin if(xor_out_reg[31]) sbox_out[21:24] = sb6outb_reg; else sbox_out[21:24] = sb6outa_reg;endalways @(sb7outa_reg or sb7outb_reg or xor_out_reg) begin if(xor_out_reg[37]) sbox_out[25:28] = sb7outb_reg; else sbox_out[25:28] = sb7outa_reg;endalways @(sb8outa_reg or sb8outb_reg or xor_out_reg) begin if(xor_out_reg[43]) sbox_out[29:32] = sb8outb_reg; else sbox_out[29:32] = sb8outa_reg;end//// P-box permutation ////assign pbox_out = { sbox_out[16], sbox_out[ 7], sbox_out[20], sbox_out[21], sbox_out[29], sbox_out[12], sbox_out[28], sbox_out[17], sbox_out[ 1], sbox_out[15], sbox_out[23], sbox_out[26], sbox_out[ 5], sbox_out[18], sbox_out[31], sbox_out[10], sbox_out[ 2], sbox_out[ 8], sbox_out[24], sbox_out[14], sbox_out[32], sbox_out[27], sbox_out[ 3], sbox_out[ 9], sbox_out[19], sbox_out[13], sbox_out[30], sbox_out[ 6], sbox_out[22], sbox_out[11], sbox_out[ 4], sbox_out[25]};//// Generate outputs ////always @(posedge reset or posedge clk)begin if(reset) begin f_in_l_reg <= 32'b0; f_in_r_reg <= 32'b0; f_in_l_reg1 <= 32'b0; f_in_r_reg1 <= 32'b0; end else begin f_in_l_reg1 <= f_in_l_reg; f_in_r_reg1 <= f_in_r_reg; f_in_l_reg <= f_in_l; f_in_r_reg <= f_in_r; endendassign f_out_l = f_in_r_reg1;assign f_out_r = pbox_out ^ f_in_l_reg1;//// Register outputs of f function module ////always @(posedge reset or posedge clk )begin if(reset) begin f_out_l_reg <= 32'b0; f_out_r_reg <= 32'b0; end else begin f_out_l_reg <= f_out_l; f_out_r_reg <= f_out_r; end endendmodule // f //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -