📄 search.vhd
字号:
WR1B <= '1'; WR_STROBEB <= '1';elsif CLK'event and CLK = '1' then WR_STROBEB <= WR1B; WR1B <= WRB;end if;end process WRITE_STROBE_PR;--------------------------------------------------------------------------------KEY_PR: process(RST_N,CLK)--------------------------------------------------------------------------------beginif (RST_N = '0')then KEY <= (others => '0');elsif CLK'event and CLK = '1' then if (WR1B = '0'and ADDR_KEY(0) = '1') then KEY(7 downto 0) <= DATAI; elsif (PRE_DONE = '1') then KEY(7 downto 0) <= D_KEY(7 downto 0); end if;----- if (WR1B = '0'and ADDR_KEY(1) = '1') then KEY(15 downto 8) <= DATAI; elsif (PRE_DONE = '1') then KEY(15 downto 8) <= D_KEY(15 downto 8); end if;----- if (WR1B = '0'and ADDR_KEY(2) = '1') then KEY(23 downto 16) <= DATAI; elsif (PRE_DONE = '1') then KEY(23 downto 16) <= D_KEY(23 downto 16); end if;----- if (WR1B = '0'and ADDR_KEY(3) = '1') then KEY(31 downto 24) <= DATAI; elsif (PRE_DONE = '1') then KEY(31 downto 24) <= D_KEY(31 downto 24); end if;----- if (WR1B = '0'and ADDR_KEY(4) = '1') then KEY(39 downto 32) <= DATAI; end if;----- if (WR1B = '0'and ADDR_KEY(5) = '1') then KEY(47 downto 40) <= DATAI; end if;----- if (WR1B = '0'and ADDR_KEY(6) = '1') then KEY(55 downto 48) <= DATAI; end if;end if;end process KEY_PR;--------------------------------------------------------------------------------READ_KEY_PR: process(ADDR_KEY, RDB, KEY)--------------------------------------------------------------------------------beginif (RDB = '0') then if (ADDR_KEY(0) = '1') then DATAO <= KEY(7 downto 0) ; elsif (ADDR_KEY(1) = '1') then DATAO <= KEY(15 downto 8) ; elsif (ADDR_KEY(2) = '1') then DATAO <= KEY(23 downto 16) ; elsif (ADDR_KEY(3) = '1') then DATAO <= KEY(31 downto 24) ; elsif (ADDR_KEY(4) = '1') then DATAO <= KEY(39 downto 32) ; elsif (ADDR_KEY(5) = '1') then DATAO <= KEY(47 downto 40) ; elsif (ADDR_KEY(6) = '1') then DATAO <= KEY(55 downto 48) ; else DATAO <= (others => 'Z'); end if;else DATAO <= (others => 'Z');end if;end process READ_KEY_PR;--------------------------------------------------------------------------------KEY_ALU_PR: process(KEY_DECR,KEY_INCR,KEY)--------------------------------------------------------------------------------beginif (KEY_INCR = '1') and (KEY_DECR = '0')then D_KEY <= KEY(31 downto 0) + 1;elsif (KEY_DECR = '1') and (KEY_INCR = '0') then D_KEY <= KEY(31 downto 0) - 1;else D_KEY <= KEY(31 downto 0);end if;end process KEY_ALU_PR;--------------------------------------------------------------------------------EXTRA_XOR_PR: process(PT_XOR_MASK,EXTRA_SELECT, DES_OUT, C0)--------------------------------------------------------------------------------begincase EXTRA_SELECT iswhen "000" => EXTRA_XOR_OUT <= DES_OUT xor PT_XOR_MASK;when "001" => EXTRA_XOR_OUT <= DES_OUT xor PT_XOR_MASK;when "010" => EXTRA_XOR_OUT <= ((DES_OUT(63 downto 56) xor DES_OUT(31 downto 24)) & (DES_OUT(55 downto 48) xor DES_OUT(23 downto 16)) & (DES_OUT(47 downto 40) xor DES_OUT(15 downto 8)) & (DES_OUT(39 downto 32) xor DES_OUT( 7 downto 0)) & DES_OUT(31 downto 0)) xor PT_XOR_MASK; -----------------------------when "101" => EXTRA_XOR_OUT <= DES_OUT xor C0;when "110" => EXTRA_XOR_OUT <= (DES_OUT(63 downto 56) xor DES_OUT(31 downto 24)) & (DES_OUT(55 downto 48) xor DES_OUT(23 downto 16)) & (DES_OUT(47 downto 40) xor DES_OUT(15 downto 8)) & (DES_OUT(39 downto 32) xor DES_OUT( 7 downto 0)) & DES_OUT(31 downto 0) ; when others => EXTRA_XOR_OUT <= DES_OUT;end case;end process EXTRA_XOR_PR;EXTRA_SELECT <= SELECT1_DLY & EXTRA_XOR & USE_CBC;--EXTRA_SELECT <= SELECT1 & EXTRA_XOR & USE_CBC;--------------------------------------------------------------------------------STARTDES_PR: process(RST_N,CLK)--------------------------------------------------------------------------------beginif RST_N = '0' then STARTDES <= '0';elsif CLK'event and CLK = '1' then-- STARTDES <= DONE or LOAD; -- 17 clocks STARTDES <= PRE_DONE or LOAD; -- 16 clocksend if;end process STARTDES_PR;--------------------------------------------------------------------------------KEY_INCR_DECR_PR: process(RST_N,CLK)--------------------------------------------------------------------------------beginif RST_N = '0' then KEY_INCR <= '0'; KEY_DECR <= '0';elsif CLK'event and CLK = '1' then--KEY_INCR <= (CNT_GT_10 and not(DONE) and SEARCHING_DLY) and ( not(MATCH) or --- normal case SELECT1 or --- false match FIRST_DES);KEY_DECR <= (CNT_GT_10 and not(DONE) and SEARCHING_DLY) and --timing (MATCH and not(SELECT1)) -- only backup if match on C0 and not(FIRST_DES); end if;end process KEY_INCR_DECR_PR;FALSE_MATCH <= '1' when (MATCH_DLY_CYCLE2 = '1') and (MATCH = '0') and (SEARCHING_DLY = '1') else '0';----------------------------------------------------- timing block, sensitive to START -----------------------------------------------------------PRE_DONE <= '1' when (CNT = "01111") else '0';RESET_SEARCHING <= '1' when (CNT = "01100") else '0';CNT_EQ_1 <= '1' when (CNT = 1 ) else '0';CNT_LE_10 <= '1' when (CNT > 1 and CNT < 10) else '0';CNT_EQ_10 <= '1' when (CNT = 10) else '0';CNT_GT_10 <= '1' when (CNT > 10) else '0';--------------------------------------------------------------------------------SEARCHING_PR: process(RST_N,CLK)--------------------------------------------------------------------------------beginif RST_N = '0' then SEARCHING <= '0'; SEARCHING_DLY <= '0'; CLEAR_SEARCH <= '0';elsif CLK'event and CLK = '1' then SEARCHING_DLY <= SEARCHING;--------------- search active ------------------- if ((LOAD = '1') or (SEARCHING = '1')) then SEARCHING <= '1'; end if;--------------- found C1 ------------------------ if (CLEAR_SEARCH_BAK = '1') then SEARCHING <= '0'; end if;--------------- CLEAR_SEARCH <= CLEAR_SEARCH_BAK;end if; end process SEARCHING_PR; CHECK_SAME_KEY <= '1' when (KEY(1 downto 0) = KEY_ODD_DLY2) else '0';--------------------------------------------------------------------------------SELECT1_PR: process(RST_N,CLK)--------------------------------------------------------------------------------beginif RST_N = '0' then SELECT1 <= '1';elsif CLK'event and CLK = '1' then--------------- found C0, look for C1 ---------- if ((MATCH = '1') and (SELECT1 = '0') and (PRE_DONE = '1')) then SELECT1 <= '1'; end if;--------------- Restart by PC or C1 is not a match ---------- if -- (LOAD = '1') or ((SELECT1 = '1') and (PRE_DONE = '1') and (SEARCHING_DLY = '1')) then SELECT1 <= '0'; end if;--------------- if (PRE_DONE = '1') then SELECT1_DLY <= SELECT1 ; end if;end if; end process SELECT1_PR;--------------------------------------------------------------------------------SEARCH_OUT <= SEARCHING;LOAD <= SEARCH_DLY1 and PRE_DONE and not(SEARCH_DLY2); -- 17 clocksFIRST_DES <= SEARCH_DLY2 and not(SEARCH_DLY3); CLEAR_SEARCH_BAK <= '1' when ((MATCH = '1') and (SELECT1 = '0') and (SELECT1_DLY = '1') and (RESET_SEARCHING = '1') and (SEARCHING = '1')) else '0';SELECT_ONE <= SELECT1; KEY_OUT <= KEY; DES_OUTPUT <= DES_OUT;-- MATCH_OUT <= MATCH;--------------------------------------------------------------------------------end beh;--------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -