📄 key_gen.vhd
字号:
---------|---------|---------|---------|---------|---------|---------|---------|-- Author : Tom Vu-- Date : 09/27/97 -- Description : Generate Schedule Keys to be used by F funtion-- Function : 2 rings of 28 bits each will shift left or right by 1 or-- 2 positions depends on ENCR/DECR and counter16-- -----------------------------------------------------------------------------library ieee;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;-- -----------------------------------------------------------------------------entity KEY_GEN isport( CLK : in std_logic; RST_N : in std_logic; START : in std_logic;-- DECR : in std_logic; KEY_IN : in std_logic_vector(55 downto 0); DONE : out std_logic; CNT : out std_logic_vector(4 downto 0); KEY_OUT : out std_logic_vector(47 downto 0) );end KEY_GEN;-- -----------------------------------------------------------------------------architecture beh of KEY_GEN is-- -----------------------------------------------------------------------------component PC1 port( KEY_IN : in std_logic_vector(55 downto 0); KEY_OUT : out std_logic_vector(55 downto 0) );end component;component PC2port( KEY_IN : in std_logic_vector(55 downto 0); KEY_OUT : out std_logic_vector(47 downto 0) );end component;signal cnt16 : std_logic_vector(4 downto 0);signal PC1_KEY : std_logic_vector(55 downto 0);signal PC1_KEY_C : std_logic_vector(27 downto 0);signal PC1_KEY_D : std_logic_vector(27 downto 0);signal KEY_REG_C : std_logic_vector(27 downto 0);signal KEY_REG_D : std_logic_vector(27 downto 0);signal KEY_REG : std_logic_vector(55 downto 0);signal SHIFT1 : std_logic;begin-- ------------------------------------------------------------------------------- Permutation Choice #1-- ----------------------------------------------------------------------------- PC_1: PC1 port map(KEY_IN => KEY_IN,KEY_OUT => PC1_KEY);-- -----------------------------------------------------------------------------Split_to_C_and_D: process(PC1_KEY)-- -----------------------------------------------------------------------------begin for i in 0 to 27 loop PC1_KEY_D(i) <= PC1_KEY(i); PC1_KEY_C(i) <= PC1_KEY(i+28); end loop;end process;-- -----------------------------------------------------------------------------DONE_P: process(CLK,RST_N) -- -----------------------------------------------------------------------------begin if RST_N = '0' then DONE <= '0'; SHIFT1 <= '0'; elsif CLK'event and CLK = '1' then if CNT16 = 15 and START = '0' then DONE <= '1'; else DONE <= '0'; end if; if START = '1' or CNT16 = 7 or CNT16= 14 then SHIFT1 <= '1' ; else SHIFT1 <= '0' ; end if; end if;end process;-- -----------------------------------------------------------------------------COUNTER16_P: process(CLK,RST_N) -- -----------------------------------------------------------------------------begin if RST_N = '0' then CNT16 <= (others => '0'); elsif CLK'event and CLK = '1' then if START = '1' then CNT16 <= "00001"; else CNT16 <= CNT16 + 1; end if; end if;end process;-- -----------------------------------------------------------------------------KEY_GEN_REG_P: process(CLK,RST_N) -- -----------------------------------------------------------------------------begin if RST_N = '0' then KEY_REG_C <= (others => '0'); KEY_REG_D <= (others => '0'); elsif CLK'event and CLK = '1' then-- if DECR = '0' then -- if START = '1' then -- Load and Shift by 1 from external key-- KEY_REG_C <= PC1_KEY_C(26 downto 0) & PC1_KEY_C(27);-- KEY_REG_D <= PC1_KEY_D(26 downto 0) & PC1_KEY_D(27);-- elsif SHIFT1 = '1' then -- Shift Left by 1 for 1st key-- KEY_REG_C <= KEY_REG_C(26 downto 0) & KEY_REG_C(27);-- KEY_REG_D <= KEY_REG_D(26 downto 0) & KEY_REG_D(27);-- else-- KEY_REG_C <= KEY_REG_C(25 downto 0) & KEY_REG_C(27 downto 26);-- KEY_REG_D <= KEY_REG_D(25 downto 0) & KEY_REG_D(27 downto 26);-- end if;-- else if START = '1' then KEY_REG_C <= PC1_KEY_C; -- Last key was used in Encr KEY_REG_D <= PC1_KEY_D; elsif SHIFT1 = '1' then -- Shift Right by 1 when cnt16 =1,8,15 KEY_REG_C <= KEY_REG_C(0) & KEY_REG_C(27 downto 1); KEY_REG_D <= KEY_REG_D(0) & KEY_REG_D(27 downto 1); else -- Shift Right by 2 when cnt16=others KEY_REG_C <= KEY_REG_C(1 downto 0) & KEY_REG_C(27 downto 2); KEY_REG_D <= KEY_REG_D(1 downto 0) & KEY_REG_D(27 downto 2); end if; -- end if; end if;end process;-- ------------------------------------------------------------------------------- Combine final C and D to KEY_REG-- ----------------------------------------------------------------------------- KEY_REG <= KEY_REG_C(27 downto 0) & KEY_REG_D(27 downto 0);-- ------------------------------------------------------------------------------- Permutation Choice #2-- ----------------------------------------------------------------------------- PC_2: PC2 port map (KEY_IN => KEY_REG,KEY_OUT => KEY_OUT);-- -----------------------------------------------------------------------------CNT <= CNT16;end beh;-- -----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -