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

📄 freedes.vhd.txt

📁 DES 加密算法的VHDL和VERILOG 源程序及其TESTBENCH。
💻 TXT
📖 第 1 页 / 共 5 页
字号:
      when "110000" =>  val(19 downto 16) := "1111";      when "110001" =>  val(19 downto 16) := "1001";
      when "110010" =>  val(19 downto 16) := "0001";      when "110011" =>  val(19 downto 16) := "0100";
      when "110100" =>  val(19 downto 16) := "0011";      when "110101" =>  val(19 downto 16) := "0101";
      when "110110" =>  val(19 downto 16) := "1110";      when "110111" =>  val(19 downto 16) := "1011";
      when "111000" =>  val(19 downto 16) := "0101";      when "111001" =>  val(19 downto 16) := "1100";
      when "111010" =>  val(19 downto 16) := "0010";      when "111011" =>  val(19 downto 16) := "0111";
      when "111100" =>  val(19 downto 16) := "1000";      when "111101" =>  val(19 downto 16) := "0010";
      when "111110" =>  val(19 downto 16) := "0100";      when "111111" =>  val(19 downto 16) := "1110";
      when others   =>  val(19 downto 16) := "1110";
    end case;

    -- SBOX 3
    case din(35 downto 30) is
      when "000000" =>  val(23 downto 20) := "1010";      when "000001" =>  val(23 downto 20) := "1101";
      when "000010" =>  val(23 downto 20) := "0000";      when "000011" =>  val(23 downto 20) := "0111";
      when "000100" =>  val(23 downto 20) := "1001";      when "000101" =>  val(23 downto 20) := "0000";
      when "000110" =>  val(23 downto 20) := "1110";      when "000111" =>  val(23 downto 20) := "1001";
      when "001000" =>  val(23 downto 20) := "0110";      when "001001" =>  val(23 downto 20) := "0011";
      when "001010" =>  val(23 downto 20) := "0011";      when "001011" =>  val(23 downto 20) := "0100";
      when "001100" =>  val(23 downto 20) := "1111";      when "001101" =>  val(23 downto 20) := "0110";
      when "001110" =>  val(23 downto 20) := "0101";      when "001111" =>  val(23 downto 20) := "1010";
      when "010000" =>  val(23 downto 20) := "0001";      when "010001" =>  val(23 downto 20) := "0010";
      when "010010" =>  val(23 downto 20) := "1101";      when "010011" =>  val(23 downto 20) := "1000";
      when "010100" =>  val(23 downto 20) := "1100";      when "010101" =>  val(23 downto 20) := "0101";
      when "010110" =>  val(23 downto 20) := "0111";      when "010111" =>  val(23 downto 20) := "1110";
      when "011000" =>  val(23 downto 20) := "1011";      when "011001" =>  val(23 downto 20) := "1100";
      when "011010" =>  val(23 downto 20) := "0100";      when "011011" =>  val(23 downto 20) := "1011";
      when "011100" =>  val(23 downto 20) := "0010";      when "011101" =>  val(23 downto 20) := "1111";
      when "011110" =>  val(23 downto 20) := "1000";      when "011111" =>  val(23 downto 20) := "0001";
      when "100000" =>  val(23 downto 20) := "1101";      when "100001" =>  val(23 downto 20) := "0001";
      when "100010" =>  val(23 downto 20) := "0110";      when "100011" =>  val(23 downto 20) := "1010";
      when "100100" =>  val(23 downto 20) := "0100";      when "100101" =>  val(23 downto 20) := "1101";
      when "100110" =>  val(23 downto 20) := "1001";      when "100111" =>  val(23 downto 20) := "0000";
      when "101000" =>  val(23 downto 20) := "1000";      when "101001" =>  val(23 downto 20) := "0110";
      when "101010" =>  val(23 downto 20) := "1111";      when "101011" =>  val(23 downto 20) := "1001";
      when "101100" =>  val(23 downto 20) := "0011";      when "101101" =>  val(23 downto 20) := "1000";
      when "101110" =>  val(23 downto 20) := "0000";      when "101111" =>  val(23 downto 20) := "0111";
      when "110000" =>  val(23 downto 20) := "1011";      when "110001" =>  val(23 downto 20) := "0100";
      when "110010" =>  val(23 downto 20) := "0001";      when "110011" =>  val(23 downto 20) := "1111";
      when "110100" =>  val(23 downto 20) := "0010";      when "110101" =>  val(23 downto 20) := "1110";
      when "110110" =>  val(23 downto 20) := "1100";      when "110111" =>  val(23 downto 20) := "0011";
      when "111000" =>  val(23 downto 20) := "0101";      when "111001" =>  val(23 downto 20) := "1011";
      when "111010" =>  val(23 downto 20) := "1010";      when "111011" =>  val(23 downto 20) := "0101";
      when "111100" =>  val(23 downto 20) := "1110";      when "111101" =>  val(23 downto 20) := "0010";
      when "111110" =>  val(23 downto 20) := "0111";      when "111111" =>  val(23 downto 20) := "1100";
      when others   =>  val(23 downto 20) := "1100";
    end case;

    -- SBOX 2
    case din(41 downto 36) is
      when "000000" =>  val(27 downto 24) := "1111";      when "000001" =>  val(27 downto 24) := "0011";
      when "000010" =>  val(27 downto 24) := "0001";      when "000011" =>  val(27 downto 24) := "1101";
      when "000100" =>  val(27 downto 24) := "1000";      when "000101" =>  val(27 downto 24) := "0100";
      when "000110" =>  val(27 downto 24) := "1110";      when "000111" =>  val(27 downto 24) := "0111";
      when "001000" =>  val(27 downto 24) := "0110";      when "001001" =>  val(27 downto 24) := "1111";
      when "001010" =>  val(27 downto 24) := "1011";      when "001011" =>  val(27 downto 24) := "0010";
      when "001100" =>  val(27 downto 24) := "0011";      when "001101" =>  val(27 downto 24) := "1000";
      when "001110" =>  val(27 downto 24) := "0100";      when "001111" =>  val(27 downto 24) := "1110";
      when "010000" =>  val(27 downto 24) := "1001";      when "010001" =>  val(27 downto 24) := "1100";
      when "010010" =>  val(27 downto 24) := "0111";      when "010011" =>  val(27 downto 24) := "0000";
      when "010100" =>  val(27 downto 24) := "0010";      when "010101" =>  val(27 downto 24) := "0001";
      when "010110" =>  val(27 downto 24) := "1101";      when "010111" =>  val(27 downto 24) := "1010";
      when "011000" =>  val(27 downto 24) := "1100";      when "011001" =>  val(27 downto 24) := "0110";
      when "011010" =>  val(27 downto 24) := "0000";      when "011011" =>  val(27 downto 24) := "1001";
      when "011100" =>  val(27 downto 24) := "0101";      when "011101" =>  val(27 downto 24) := "1011";
      when "011110" =>  val(27 downto 24) := "1010";      when "011111" =>  val(27 downto 24) := "0101";
      when "100000" =>  val(27 downto 24) := "0000";      when "100001" =>  val(27 downto 24) := "1101";
      when "100010" =>  val(27 downto 24) := "1110";      when "100011" =>  val(27 downto 24) := "1000";
      when "100100" =>  val(27 downto 24) := "0111";      when "100101" =>  val(27 downto 24) := "1010";
      when "100110" =>  val(27 downto 24) := "1011";      when "100111" =>  val(27 downto 24) := "0001";
      when "101000" =>  val(27 downto 24) := "1010";      when "101001" =>  val(27 downto 24) := "0011";
      when "101010" =>  val(27 downto 24) := "0100";      when "101011" =>  val(27 downto 24) := "1111";
      when "101100" =>  val(27 downto 24) := "1101";      when "101101" =>  val(27 downto 24) := "0100";
      when "101110" =>  val(27 downto 24) := "0001";      when "101111" =>  val(27 downto 24) := "0010";
      when "110000" =>  val(27 downto 24) := "0101";      when "110001" =>  val(27 downto 24) := "1011";
      when "110010" =>  val(27 downto 24) := "1000";      when "110011" =>  val(27 downto 24) := "0110";
      when "110100" =>  val(27 downto 24) := "1100";      when "110101" =>  val(27 downto 24) := "0111";
      when "110110" =>  val(27 downto 24) := "0110";      when "110111" =>  val(27 downto 24) := "1100";
      when "111000" =>  val(27 downto 24) := "1001";      when "111001" =>  val(27 downto 24) := "0000";
      when "111010" =>  val(27 downto 24) := "0011";      when "111011" =>  val(27 downto 24) := "0101";
      when "111100" =>  val(27 downto 24) := "0010";      when "111101" =>  val(27 downto 24) := "1110";
      when "111110" =>  val(27 downto 24) := "1111";      when "111111" =>  val(27 downto 24) := "1001";
      when others   =>  val(27 downto 24) := "1001";
    end case;

    -- SBOX 1
    case din(47 downto 42) is
      when "000000" =>  val(31 downto 28) := "1110";      when "000001" =>  val(31 downto 28) := "0000";
      when "000010" =>  val(31 downto 28) := "0100";      when "000011" =>  val(31 downto 28) := "1111";
      when "000100" =>  val(31 downto 28) := "1101";      when "000101" =>  val(31 downto 28) := "0111";
      when "000110" =>  val(31 downto 28) := "0001";      when "000111" =>  val(31 downto 28) := "0100";
      when "001000" =>  val(31 downto 28) := "0010";      when "001001" =>  val(31 downto 28) := "1110";
      when "001010" =>  val(31 downto 28) := "1111";      when "001011" =>  val(31 downto 28) := "0010";
      when "001100" =>  val(31 downto 28) := "1011";      when "001101" =>  val(31 downto 28) := "1101";
      when "001110" =>  val(31 downto 28) := "1000";      when "001111" =>  val(31 downto 28) := "0001";
      when "010000" =>  val(31 downto 28) := "0011";      when "010001" =>  val(31 downto 28) := "1010";
      when "010010" =>  val(31 downto 28) := "1010";      when "010011" =>  val(31 downto 28) := "0110";
      when "010100" =>  val(31 downto 28) := "0110";      when "010101" =>  val(31 downto 28) := "1100";
      when "010110" =>  val(31 downto 28) := "1100";      when "010111" =>  val(31 downto 28) := "1011";
      when "011000" =>  val(31 downto 28) := "0101";      when "011001" =>  val(31 downto 28) := "1001";
      when "011010" =>  val(31 downto 28) := "1001";      when "011011" =>  val(31 downto 28) := "0101";
      when "011100" =>  val(31 downto 28) := "0000";      when "011101" =>  val(31 downto 28) := "0011";
      when "011110" =>  val(31 downto 28) := "0111";      when "011111" =>  val(31 downto 28) := "1000";
      when "100000" =>  val(31 downto 28) := "0100";      when "100001" =>  val(31 downto 28) := "1111";
      when "100010" =>  val(31 downto 28) := "0001";      when "100011" =>  val(31 downto 28) := "1100";
      when "100100" =>  val(31 downto 28) := "1110";      when "100101" =>  val(31 downto 28) := "1000";
      when "100110" =>  val(31 downto 28) := "1000";      when "100111" =>  val(31 downto 28) := "0010";
      when "101000" =>  val(31 downto 28) := "1101";      when "101001" =>  val(31 downto 28) := "0100";
      when "101010" =>  val(31 downto 28) := "0110";      when "101011" =>  val(31 downto 28) := "1001";
      when "101100" =>  val(31 downto 28) := "0010";      when "101101" =>  val(31 downto 28) := "0001";
      when "101110" =>  val(31 downto 28) := "1011";      when "101111" =>  val(31 downto 28) := "0111";
      when "110000" =>  val(31 downto 28) := "1111";      when "110001" =>  val(31 downto 28) := "0101";
      when "110010" =>  val(31 downto 28) := "1100";      when "110011" =>  val(31 downto 28) := "1011";
      when "110100" =>  val(31 downto 28) := "1001";      when "110101" =>  val(31 downto 28) := "0011";
      when "110110" =>  val(31 downto 28) := "0111";      when "110111" =>  val(31 downto 28) := "1110";
      when "111000" =>  val(31 downto 28) := "0011";      when "111001" =>  val(31 downto 28) := "1010";
      when "111010" =>  val(31 downto 28) := "1010";      when "111011" =>  val(31 downto 28) := "0000";
      when "111100" =>  val(31 downto 28) := "0101";      when "111101" =>  val(31 downto 28) := "0110";
      when "111110" =>  val(31 downto 28) := "0000";      when "111111" =>  val(31 downto 28) := "1101";
      when others   =>  val(31 downto 28) := "1101";
    end case;

    return val;
  end des_sbox;


  --------------------------------------------------------
  -- P-Box Permutation
  function des_pbox(din   :std_logic_vector (31 downto 0))
                    return std_logic_vector is
    variable val 	:std_logic_vector (31 downto 0);
  begin
    val := din(32-16) & din(32- 7) & din(32-20) & din(32-21) & din(32-29) & din(32-12) & din(32-28) & din(32-17) &
           din(32- 1) & din(32-15) & din(32-23) & din(32-26) & din(32- 5) & din(32-18) & din(32-31) & din(32-10) &
           din(32- 2) & din(32- 8) & din(32-24) & din(32-14) & din(32-32) & din(32-27) & din(32- 3) & din(32- 9) &
           din(32-19) & din(32-13) & din(32-30) & din(32- 6) & din(32-22) & din(32-11) & din(32- 4) & din(32-25);
    return val;
  end des_pbox;


  --------------------------------------------------------
  -- Key Shift
  function des_keyshift (din	:std_logic_vector (55 downto 0);
                         n 	:std_logic_vector (4 downto 0))
                         return std_logic_vector is
    variable val	:std_logic_vector (55 downto 0);
  begin
    case n is
      when "00000" =>  val := din(55 downto 28)                      & din(27 downto  0);
      when "00001" =>  val := din(54 downto 28) & din (55)           & din(26 downto  0) & din (27);
      when "00010" =>  val := din(53 downto 28) & din (55 downto 54) & din(25 downto  0) & din (27 downto 26);
    --when "00011" =>  val := din(52 downto 28) & din (55 downto 53) & din(24 downto  0) & din (27 downto 25);
      when "00100" =>  val := din(51 downto 28) & din (55 downto 52) & din(23 downto  0) & din (27 downto 24);
    --when "00101" =>  val := din(50 downto 28) & din (55 downto 51) & din(22 downto  0) & din (27 downto 23);
      when "00110" =>  val := din(49 downto 28) & din (55 downto 50) & din(21 downto  0) & din (27 downto 22);
    --when "00111" =>  val := din(48 downto 28) & din (55 downto 49) & din(20 downto  0) & din (27 downto 21);
      when "01000" =>  val := din(47 downto 28) & din (55 downto 48) & din(19 downto  0) & din (27 downto 20);
    --when "01001" =>  val := din(46 downto 28) & din (55 downto 47) & din(18 downto  0) & din (27 downto 19);
      when "01010" =>  val := din(45 downto 28) & din (55 downto 46) & din(17 downto  0) & din (27 downto 18);
    --when "01011" =>  val := din(44 downto 28) & din (55 downto 45) & din(16 downto  0) & din (27 downto 17);
      when "01100" =>  val := din(43 downto 28) & din (55 downto 44) & din(15 downto  0) & din (27 downto 16);
    --when "01101" =>  val := din(42 downto 28) & din (55 downto 43) & din(14 downto  0) & din (27 downto 15);
      when "01110" =>  val := din(41 downto 28) & din (55 downto 42) & din(13 downto  0) & din (27 downto 14);
      when "01111" =>  val := din(40 downto 28) & din (55 downto 41) & din(12 downto  0) & din (27 downto 13);
    --when "10000" =>  val := din(39 downto 28) & din (55 downto 40) & din(11 downto  0) & din (27 downto 12);
      when "10001" =>  val := din(38 downto 28) & din (55 downto 39) & din(10 downto  0) & din (27 downto 11);
    --when "10010" =>  val := din(37 downto 28) & din (55 downto 38) & din( 9 downto  0) & din (27 downto 10);
      when "10011" =>  val := din(36 downto 28) & din (55 downto 37) & din( 8 downto  0) & din (27 downto  9);
    --when "10100" =>  val := din(35 downto 28) & din (55 downto 36) & din( 7 downto  0) & din (27 downto  8);
      when "10101" =>  val := din(34 downto 28) & din (55 downto 35) & din( 6 downto  0) & din (27 downto  7);
    --when "10110" =>  val := din(33 downto 28) & din (55 downto 34) & din( 5 downto  0) & din (27 downto  6);
      when "10111" =>  val := din(32 downto 28) & din (55 downto 33) & din( 4 downto  0) & din (27 downto  5);
    --when "11000" =>  val := din(31 downto 28) & din (55 downto 32) & din( 3 downto  0) & din (27 downto  4);
      when "11001" =>  val := din(30 downto 28) & din (55 downto 31) & din( 2 downto  0) & din (27 downto  3);
    --when "11010" =>  val := din(29 downto 28) & din (55 downto 30) & din( 1 downto  0) & din (27 downto  2);
      when "11011" =>  val := din(28          ) & din (55 downto 29) & din( 0          ) & din (27 downto  1);
      when others  =>  val := din;
    end case;

    return val;
  end des_keyshift;

end des_lib;

----------------------------------------------------------------------------
----------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
library work;
use work.des_lib.all;

entity des_round is
    port (clk		:in std_logic;
          reset		:in std_logic;
          stall		:in std_logic;

	  encrypt_in	:in std_logic;
          encrypt_shift	:in std_logic_vector (4 downto 0);
          decrypt_shift	:in std_logic_vector (4 downto 0);
          key_in	:in std_logic_vector (55 downto 0);
          din		:in std_logic_vector (63 downto 0);
          din_valid     :in std_logic;	


	  encrypt_out	:out std_logic;
          key_out	:out std_logic_vector (55 downto 0);

⌨️ 快捷键说明

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