---------|---------|---------|---------|---------|---------|---------|---------|
-- -----------------------------------------------------------------------------
-- AUTHOR          :  TOM VU                                                  --
-- DATE            :  10/15/97                                                --
-- TITLE           :  DES  TEST BENCH                                         --
-- FILE            :  des_ctl.vhd                                             --
---------|---------|---------|---------|---------|---------|---------|---------|
--------------------------------------------------------------------------------
library ieee;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
use ieee.std_logic_textio.all;

entity CTL is

port(   CLK             : in     std_logic;
        RST_N           : in     std_logic;
        START           : in     std_logic;
        DECR            : in     std_logic;
        DES_OUT         : in     std_logic_vector(63 downto 0);
        DECR_INT        : out    std_logic;
        READ_EN        : out    std_logic;
        START_INT       : out    std_logic;
        MESSAGE         : out    std_logic_vector(63 downto 0);
        KEY          	: out    std_logic_vector(55 downto 0);
        DATA         	: inout  std_logic_vector(31 downto 0)
    );

end CTL;

-- -----------------------------------------------------------------------------
architecture BEH of CTL is
-- -----------------------------------------------------------------------------

signal CNT16           	: std_logic_vector(3 downto 0);
signal MSG0           	: std_logic_vector(31 downto 0);
signal MSG1           	: std_logic_vector(31 downto 0);
signal KEY0           	: std_logic_vector(31 downto 0);
signal KEY1           	: std_logic_vector(23 downto 0);
signal OUT0           	: std_logic_vector(31 downto 0);
signal OUT1           	: std_logic_vector(31 downto 0);
signal DATA_BAK         : std_logic_vector(31 downto 0);
signal START_INT_D	: std_logic;

begin
-- -----------------------------------------------------------------------------
CNT_PR: process(CLK,RST_N) 
-- -----------------------------------------------------------------------------
begin
        if RST_N = '0' then
                CNT16 <= "0000";
     		START_INT <= '0';
     		DECR_INT <= '0';
        elsif CLK'event and CLK = '1' then
     		START_INT <= START_INT_D;
		if CNT16 = 4 then
     			DECR_INT <= DECR;
		end if;
            if START = '1'  then
                CNT16 <= "0001";
            else
                CNT16 <= CNT16 + 1;
            end if;
        end if;
end process;

-- -----------------------------------------------------------------------------
KEY     <= KEY1 & KEY0;
MESSAGE <= MSG1 & MSG0;

START_INT_D <= '1' when CNT16 = 4 else '0';
-- -----------------------------------------------------------------------------
REG_IN_PR: process(RST_N,CLK)
-- -----------------------------------------------------------------------------
begin
if RST_N = '0' then
        MSG0 <= (others => '0');
        MSG1 <= (others => '0');
        KEY0 <= (others => '0');
        KEY1 <= (others => '0');
elsif CLK'event and CLK = '0' then
    case CNT16 is
	when  "0001" =>
        	MSG0 <= DATA;
	when  "0010" =>
        	MSG1 <= DATA;
	when  "0011" =>
        	KEY0 <= DATA;
	when  "0100" =>
        	KEY1 <= DATA(23 downto 0);
	when others =>
		null;
    end case;
end if;

end process REG_IN_PR;
-----------------------------------------------------------------
MESSAGE_OUT_P: process (CNT16,DES_OUT)
begin
    case CNT16 is
	when  "0110" | "0111" =>
        	DATA <= DES_OUT(63 downto 32);
		READ_EN <= '1';
	when  "1000" | "1001" =>
        	DATA <= DES_OUT(31 downto 0);
		READ_EN <= '1';
	when others =>
		DATA <= (others => 'Z');
		READ_EN <= '0';
    end case;
end process;
 
--DATA <= DATA_BAK;
end BEH;
-- -----------------------------------------------------------------------------
library ieee;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use std.textio.all;


entity DES_CTL is 
port(   CLK             : in     std_logic;
        RST_N           : in     std_logic;
        START           : in     std_logic;
        DECR            : in     std_logic;
        DONE            : out     std_logic;
        READ_EN         : out     std_logic;
        DATA         	: inout  std_logic_vector(31 downto 0)
    );

end DES_CTL;

--------------------------------------------------------------------------------
architecture beh of DES_CTL is

component DES 
port(   CLK             : in     std_logic;
        RST_N           : in     std_logic;
        START           : in     std_logic;
        DECR            : in     std_logic;
        MESSAGE         : in     std_logic_vector(63 downto 0);
        KEY             : in     std_logic_vector(55 downto 0);
        DONE            : out     std_logic;
        DES_OUT          : out    std_logic_vector(63 downto 0)
    );

end component;

component CTL 
port(   CLK             : in     std_logic;
        RST_N           : in     std_logic;
        START           : in     std_logic;
        DECR            : in     std_logic;
        DES_OUT         : in     std_logic_vector(63 downto 0);
        DECR_INT        : out    std_logic;
        READ_EN        	: out    std_logic;
        START_INT       : out    std_logic;
        MESSAGE         : out    std_logic_vector(63 downto 0);
        KEY          	: out    std_logic_vector(55 downto 0);
        DATA         	: inout  std_logic_vector(31 downto 0)
    );
end component;

signal START_INT     	: std_logic;
signal DECR_INT        	: std_logic;
signal MESSAGE         	: std_logic_vector(63 downto 0);
signal KEY             	: std_logic_vector(55 downto 0);
signal DES_OUT         	: std_logic_vector(63 downto 0);

--------------------------------------------
begin

DES_CTL1 : DES 
port map( 
        CLK             => CLK,
        RST_N           => RST_N,
        START           => START_INT,
        DECR            => DECR_INT,
        MESSAGE         => MESSAGE,
        KEY             => KEY,
        DONE            => DONE,
        DES_OUT         => DES_OUT
);

DES_CTL2 : CTL
port map(   CLK 	=> CLK,
        RST_N  		=> RST_N,
        START 		=> START,
        DECR 		=> DECR,
        DES_OUT		=> DES_OUT,
        DECR_INT	=> DECR_INT,
        READ_EN		=> READ_EN,
        START_INT	=> START_INT,
        MESSAGE 	=> MESSAGE,
        KEY		=> KEY,
        DATA		=> DATA
    );

end beh;
