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

📄 des_top.vhd

📁 fpga3des加密非常有用 希望大家喜
💻 VHD
字号:
-----------------------------------------------------------------------				(c) Copyright 2006, CoreTex Systems, LLC					 ----		                   www.coretexsys.com                        --    --                                                            		 ----		This source file may be used and distributed without         ----		restriction provided that this copyright statement is not    ----		removed from the file and that any derivative work contains  ----		the original copyright notice and the associated disclaimer. ----                                                            		 ----		    THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY      ----		EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED    ----		TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    ----		FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR       ----		OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          ----		INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES     ----		(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE    ----		GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR         ----		BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF   ----		LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT   ----		(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT   ----		OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          ----		POSSIBILITY OF SUCH DAMAGE.                                  ----																						 ----------------------------------------------------------------------------------------------------------------------------------------------- Poject structure: --  |- tdes_top.vhd--  |--    |- des_cipher_top.vhd--    |- des_top.vhd--      |- block_top.vhd--        |- add_key.vhd--        |--        |- add_left.vhd--        |--				|- e_expansion_function.vhd--				|--				|- p_box.vhd--				|--				|- s_box.vhd--            |- s1_box.vhd--            |- s2_box.vhd--            |- s3_box.vhd--            |- s4_box.vhd--            |- s5_box.vhd--            |- s6_box.vhd--            |- s7_box.vhd--            |- s8_box.vhd--    |- key_schedule.vhd----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Title       : des_top-- Company     : CoreTex Systems, LLC-----------------------------------------------------------------------------------------------------library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity des_top isport (		-- input/output core signals		key_round_in:	in 	std_logic_vector(0 to 47);		data_in:			in 	std_logic_vector(0 to 63);		data_out:		out 	std_logic_vector(0 to 63);				-- signals for communication with key expander module		KeySelect: 		inout std_logic_vector(3 downto 0);		-- selector for key		key_ready: 		in std_logic;						-- active high when key is ready		data_ready: 	in std_logic;						-- active high when data is ready		func_select:   in std_logic;						-- encryption/decryption flag		des_out_rdy: out std_logic;						-- active high when decrypted/encrypted data are ready		core_busy: out std_logic;							-- active high when core is in process of encryption		reset: in std_logic; 								-- master reset		clock: in std_logic  								-- master clock		);end des_top;architecture Behavioral of des_top is---- BLOCK_TOP entity performs encryption/deccryption operation. It uses expaned key for that process--component block_top isport(		L_in: in std_logic_vector(0 to 31);				-- left permuted input		R_in: in std_logic_vector(0 to 31);				-- right permuted input			L_out: out std_logic_vector(0 to 31);			-- left permuted output		R_out: out std_logic_vector(0 to 31);			-- right permuted output		round_key_des: in std_logic_vector(0 to 47)	-- current round key	);end component;---- Internal DES_TOP signals--signal L_in_internal, R_in_internal: 	std_logic_vector(0 to 31);signal L_out_internal, R_out_internal: std_logic_vector(0 to 31);type statetype is (WaitKey, WaitData, InitialRound, RepeatRound, FinalRound);signal nextstate: statetype;signal RoundCounter: 						std_logic_vector(3 downto 0);begin---- Finite state machine--process (clock)begin	if rising_edge(clock)  then			if reset = '1' then			--			-- Reset all signal to inital values			--			nextstate 				<= WaitKey;	  			RoundCounter			<= "0000";	  			core_busy				<= '0';				-- core is in reset state: not busy			des_out_rdy				<= '0';				-- output data is not ready					else					case nextstate is				--				-- WaitKey: wait for key to be expanded				--				when WaitKey =>					-- wait until key has been expanded					if key_ready = '0' then						nextstate	<= WaitKey;					else						nextstate	<= WaitData;					end if;										core_busy				<= '0';				-- core waits for the key: not busy					des_out_rdy				<= '0';				-- output data is not ready												--				-- WaitData: waits for data until it is ready				--				when WaitData =>					-- wait for data to be loaded in input registers					if (data_ready = '0') then						nextstate				<= WaitData;					else						core_busy				<= '1';				-- core is processing = busy 												L_in_internal <= 	data_in(57) & data_in(49) & data_in(41) & data_in(33) & data_in(25) & data_in(17) & 												data_in(9) & data_in(1) & data_in(59) & data_in(51) & data_in(43) & data_in(35) & 												data_in(27) & data_in(19) & data_in(11) & data_in(3) & data_in(61) & data_in(53) & 												data_in(45) & data_in(37) & data_in(29) & data_in(21) & data_in(13) & data_in(5) & 												data_in(63) & data_in(55) & data_in(47) & data_in(39) & data_in(31) & data_in(23) & 												data_in(15) & data_in(7);												R_in_internal <= 	data_in(56) & data_in(48) & data_in(40) & data_in(32) & data_in(24) & data_in(16) & 												data_in(8) & data_in(0) & data_in(58) & data_in(50) & data_in(42) & data_in(34) & 												data_in(26) & data_in(18) & data_in(10) & data_in(2) & data_in(60) & data_in(52) & 												data_in(44) & data_in(36) & data_in(28) & data_in(20) & data_in(12) & data_in(4) & 												data_in(62) & data_in(54) & data_in(46) & data_in(38) & data_in(30) & data_in(22) & 												data_in(14) & data_in(6);																								nextstate		<= InitialRound;												-- function select (decrypting/encrypting) will determine key selection						if func_select = '1' then							KeySelect	<= "0000";						else							KeySelect	<= "1111";						end if;					end if;												--				-- Initial State where input is equal to a block that we need to encode				--				when InitialRound =>													L_in_internal 	<= L_out_internal;						R_in_internal 	<= R_out_internal;												-- fuction select determines direction of key selection						if func_select = '1' then							KeySelect 	<= KeySelect + '1';						else							KeySelect 	<= KeySelect - '1';						end if;						nextstate 		<= RepeatRound;				--				-- Repeat Section, where input is output from prevous state				--				when RepeatRound =>										L_in_internal <= L_out_internal;						R_in_internal <= R_out_internal;							-- fuction select determines direction of key selection						if func_select = '1' then							KeySelect <= KeySelect + '1';						else							KeySelect <= KeySelect - '1';						end if; 												RoundCounter <= RoundCounter + '1'; 						-- if finished with all rounds, go to the final round						if RoundCounter = x"E" then							-- perform inverse initial permutation							data_out	<=	L_out_internal(7) & R_out_internal(7) & L_out_internal(15) & R_out_internal(15) & 											L_out_internal(23) & R_out_internal(23) & L_out_internal(31) & R_out_internal(31) & 											L_out_internal(6) & R_out_internal(6) & L_out_internal(14) & R_out_internal(14) & 											L_out_internal(22) & R_out_internal(22) & L_out_internal(30) & R_out_internal(30) & 											L_out_internal(5) & R_out_internal(5) & L_out_internal(13) & R_out_internal(13) & 											L_out_internal(21) & R_out_internal(21) & L_out_internal(29) & R_out_internal(29) & 											L_out_internal(4) & R_out_internal(4) & L_out_internal(12) & R_out_internal(12) & 											L_out_internal(20) & R_out_internal(20) & L_out_internal(28) & R_out_internal(28) & 											L_out_internal(3) & R_out_internal(3) & L_out_internal(11) & R_out_internal(11) & 											L_out_internal(19) & R_out_internal(19) & L_out_internal(27) & R_out_internal(27) & 											L_out_internal(2) & R_out_internal(2) & L_out_internal(10) & R_out_internal(10) & 											L_out_internal(18) & R_out_internal(18) & L_out_internal(26) & R_out_internal(26) & 											L_out_internal(1) & R_out_internal(1) & L_out_internal(9) & R_out_internal(9) & 											L_out_internal(17) & R_out_internal(17) & L_out_internal(25) & R_out_internal(25) & 											L_out_internal(0) & R_out_internal(0) & L_out_internal(8) & R_out_internal(8) & 											L_out_internal(16) & R_out_internal(16) & L_out_internal(24) & R_out_internal(24);							core_busy				<= '0';		-- core is not busy							des_out_rdy				<= '1';		-- output data is ready							nextstate 				<= FinalRound;						else							-- Continue with regular rounds							nextstate <= RepeatRound;						end if;				--				-- Last round				--				when FinalRound =>										RoundCounter 			<= "0000";					nextstate 				<= WaitKey; 					des_out_rdy				<= '0';		-- deselect out data ready signal 				when others =>					-- should never happen			end case;			end if;	end if;	end process;---- Instantations--BLOCKTOP: block_top port map (		L_in 				=> L_in_internal,		R_in 				=> R_in_internal,		round_key_des 	=> key_round_in,			L_out 			=> L_out_internal,		R_out 			=>	R_out_internal	);end Behavioral;

⌨️ 快捷键说明

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