📄 freedes.vhd.txt
字号:
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 + -