--
-- Dalton Project
-- Tony Givargis, Rilesh Patel, Deepa Varghese, Roman Lysecky
-- 07/14/98
-- Version 1.0
-- Notes: This file implements the CODEC device.  This device compress
--	  or decompress the data  
--
--	The CODEC has three 32 bit registers: the input register to put 
--	the data that to be compress or decompress, the output register 
--	that stores the  compressed or decompressed data, and  control/ 
--     	status registers.
--
--	IN_REG:
--
--	 MSB                                                         LSB
--       ---------------------------------------------------------------
--	| NU .......................................... NU |     B/W    |
--       ---------------------------------------------------------------
--	  						     8-bits
--	OUT_REG:
--
--	 MSB                                                         LSB
--       ---------------------------------------------------------------
--	| NU .......................................... NU |     B/W    |
--       ---------------------------------------------------------------
--	  						     8-bits
--
-- 	STAT_REG:
--	
--	 MSB                                                         LSB
--       ---------------------------------------------------------------
--	|NU................................................... NU|READY |
--       ---------------------------------------------------------------
--                                                                  ^
--                                                                  |
--                                                                  |
--	                                                            |
--       set = data is ready----------------------------------------
--        
--
--
-- 	CONT_REG:
--	
--	 MSB                                                         LSB
--       ---------------------------------------------------------------
--	|NU...........................................NU|COMPRESS |START| 
--       ---------------------------------------------------------------
--                                                           ^       ^
--                                                           |       |
--                                                           |       |
--       set to compress and reset to decompress ------------        |
--       set to start the operation  --------------------------------
-- 

--*************************************************************************--

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;

--*************************************************************************--

entity CODEC_IN is
	generic( IN_REG_ADDR : INTEGER:=1024;
		 OUT_REG_ADDR : INTEGER:=1025;
		 STAT_REG_ADDR : INTEGER:=1026;
		 CONT_REG_ADDR : INTEGER:=1027;
		 COMPRESSION : INTEGER := 4);
       	port( clk  : in STD_LOGIC;
	      rst  : in STD_LOGIC;
	      ib_data : inout UNSIGNED(31 downto 0);
              ib_addr : in UNSIGNED(22 downto 0);
              ib_wr   : in STD_LOGIC;
	      ib_rd   : in STD_LOGIC;
              ib_valid : out STD_LOGIC );
end CODEC_IN;

--*************************************************************************--

architecture BHV_CODEC_IN of CODEC_IN is

    --
    -- type declarations
    --
    type STATE_TYPE is (IDLE,COMP,DECOMP,DONE);
    
    --
    -- constant declarations
    --
    constant Z_32 : UNSIGNED(31 downto 0) := 
	"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
    
    constant Z_23 : UNSIGNED(22 downto 0) :=
	"ZZZZZZZZZZZZZZZZZZZZZZZ";

    constant C0_32 : UNSIGNED(31 downto 0) := 
	"00000000000000000000000000000000";

    constant C1_32 : UNSIGNED(31 downto 0) := 
	"00000000000000000000000000000001";

    --
    -- type declarations
    --
    subtype REG_CELL is UNSIGNED(31 downto 0);
    type REG_TYPE is array(COMPRESSION-1 downto 0) of REG_CELL;

    --
    -- signal declarations
    --
    signal location: INTEGER range 0 to 4;
    signal in_reg : REG_TYPE;
    signal out_reg,stat_reg,cont_reg: UNSIGNED(31 downto 0);
    signal state : STATE_TYPE;
    
begin

    process(clk, rst)

	variable temp, temp2 : INTEGER range 0 to 31;
    begin
	if( rst = '1' ) then
	    
	    stat_reg <= C0_32;
	    out_reg  <= C0_32;
	    state    <= IDLE;

	elsif( clk'event and clk = '1' ) then	

	    case(state) is
		when IDLE =>

	    if(cont_reg(0)='1' ) then 
		
		stat_reg(0) <= '0';
		if( cont_reg(1) = '1' ) then
		    
		    state <= COMP;
		else
		    
		    state <= DECOMP;
		end if;
	    end if;
	    
	    when COMP =>

	    for temp in 0 to COMPRESSION-1 loop
		temp2 := temp * 8;
		out_reg(temp2+7 downto temp2) <= in_reg(temp)(7 downto 0);
		
	    end loop;

	    state <= DONE;
	    
	    when DECOMP =>

	    out_reg <= C0_32;
	    
	    for temp in 0 to COMPRESSION-1 loop

		temp2 := temp * 8;
		out_reg(temp2+7 downto temp2) <= in_reg(temp)(7 downto 0);

	    end loop;
	    state <= DONE;

	    when DONE =>
	    stat_reg(0) <= '1';

	    if( cont_reg(0) = '0' ) then
		
		state <= IDLE;
	    end if;
	end case;
    end if;
end process;

--
-- register read/write process
--
process(clk, rst)
begin
    if( rst = '1' ) then
    
	--
	-- steady state
	--
	ib_data <= Z_32;
	ib_valid <= '0';
	cont_reg <= C0_32;
	location <= 0;

	for  i in 0 to (COMPRESSION-1) loop
	    in_reg(i) <= C0_32;
	end loop;  -- i
	
    elsif( clk'event and clk = '1' ) then

	--
	-- steady state
	--
	ib_data <= Z_32;
	ib_valid <= '0';
	
	if( ib_wr = '1' ) then
	    
	    if( ib_addr = 
		conv_integer(CONT_REG_ADDR) ) then
	    
		cont_reg <= ib_data ;
	    elsif( ib_addr = 
		   conv_integer(IN_REG_ADDR) ) then
		
		in_reg(location) <= ib_data;
		location <= location + 1;

		if(location = COMPRESSION-1) then
		    location <= 0;

		end if;
		
	    end if;
	elsif( ib_rd = '1' ) then
	
	    if( ib_addr =
		conv_integer(STAT_REG_ADDR) ) then
	    
		ib_data <= stat_reg;
		ib_valid <= '1';
	    
	    elsif(ib_addr = 
		  conv_integer(OUT_REG_ADDR))   then
	    
		ib_data <= out_reg;
		ib_valid <= '1';
	    end if;	
	end if;
    end if;
end process;
end BHV_CODEC_IN;

--*************************************************************************--

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;

--*************************************************************************--

entity CODEC_IM is

    generic( IN_REG_ADDR : INTEGER:=1024;
	     OUT_REG_ADDR : INTEGER:=1025;
	     STAT_REG_ADDR : INTEGER:=1026;
	     CONT_REG_ADDR : INTEGER:=1027);
    port( clk  : in STD_LOGIC;
	  rst  : in STD_LOGIC;
	  ib_data : inout  UNSIGNED(31 downto 0);
	  ib_addr : out  UNSIGNED(22 downto 0);
	  ib_wr   : out  STD_LOGIC;
	  ib_rd   : out  STD_LOGIC;
	  ib_valid : in STD_LOGIC;
	  pdata : inout UNSIGNED(31 downto 0); 
	  paddr : in UNSIGNED(22 downto 0);
	  ior   : in STD_LOGIC;
	  iow   : in STD_LOGIC;
	  ale   : in STD_LOGIC;
	  iochrdy : out STD_LOGIC );
end CODEC_IM;

--*************************************************************************--

architecture BHV_CODEC_IM of CODEC_IM is

    --
    -- type declarations
    --
    type STATE_TYPE is (IDLE_S, READ_WRITE, READ1_S, READ2_S, WRITE_S );

    --
    -- constant declarations
    --
    constant Z_32 : UNSIGNED(31 downto 0) := 
	"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
    
    constant Z_23 : UNSIGNED(22 downto 0) :=
	"ZZZZZZZZZZZZZZZZZZZZZZZ";
    
    constant C0_32 : UNSIGNED(31 downto 0) := 
	"00000000000000000000000000000000";
    
    constant C0_23 : UNSIGNED(22 downto 0) := 
	"00000000000000000000000";
    
    --
    -- signal declarations
    --
    signal state : STATE_TYPE;
    
begin
    process(clk, rst)
    begin
	if ( rst = '1' ) then
	    
	    --
	    -- steady state
	    --
	    state <= IDLE_S;
	    pdata <= Z_32;
	    iochrdy <= 'Z';
	    ib_data <= Z_32;
	    ib_addr <= C0_23;
	    ib_rd <= '0';
	    ib_wr <= '0';
	    
	elsif ( clk'event and clk = '1' ) then
	    
	    --
	    -- steady state
	    --
	    pdata <= Z_32;
	    iochrdy <= 'Z';
	    ib_data <= Z_32;
	    ib_addr <= C0_23;
	    ib_rd <= '0';
	    ib_wr <= '0';
	    
	    --
	    -- otherwise
	    --
	    
	    case( state ) is
		
		when IDLE_S =>
	    
	    if(ale = '1') then
		
		if ( paddr = conv_integer(STAT_REG_ADDR) or
		     paddr = conv_integer(CONT_REG_ADDR) or 
		     paddr = conv_integer(IN_REG_ADDR) or 
		     paddr = conv_integer(OUT_REG_ADDR) ) then
		    
		    state <= READ_WRITE;
		    iochrdy <= '0';
		    
		else
		    
		    state <= IDLE_S;
		end if;
	    else
		
		state <= IDLE_S;
	    end if;
	    
	    when READ_WRITE =>
	    
	    if( ior = '1' ) then
		
		iochrdy <= '0';
		ib_addr <= paddr;
		ib_rd <= '1';
		state <= READ1_S;
		
	    elsif( iow = '1' ) then
		
		iochrdy <= '0';
		ib_data <= pdata;
		ib_addr <= paddr;
		ib_wr <= '1';
		state <= WRITE_S;
	    else
		
		state <= IDLE_S;
	    end if;
	    
	    when READ1_S =>
	    
	    iochrdy <= '0';
	    state <= READ2_S;
	    
	    when READ2_S =>
	    
	    if( ib_valid = '1' ) then
		
		pdata <= ib_data;
		iochrdy <= '1';
		state <= IDLE_S;     
	    else
		
		iochrdy <= '0';
		state <= READ2_S;     
	    end if;
	    
	    when WRITE_S =>
	    
	    if(iow = '1') then
		
		iochrdy <= '1';
		state <= WRITE_S;
	    else
		
	    state <= IDLE_S;
	    end if;
	    
	    when others =>
	    
	    state <= IDLE_S;
	end case;
    end if;
end process;
end BHV_CODEC_IM;

--*************************************************************************--

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;

--*************************************************************************--

entity CODEC is
    generic( IN_REG_ADDR : INTEGER:=1024;
	     OUT_REG_ADDR : INTEGER:=1025;
	     STAT_REG_ADDR : INTEGER:=1026;
	     CONT_REG_ADDR : INTEGER:=1027;
	     COMPRESSION : INTEGER:=4);
    port( clk  : in STD_LOGIC;
	  rst  : in STD_LOGIC;
	  pdata : inout UNSIGNED(31 downto 0); 
	  paddr : in UNSIGNED(22 downto 0);
	  ior   : in STD_LOGIC;
	  iow   : in STD_LOGIC;
	  ale   : in STD_LOGIC;
	  iochrdy : out STD_LOGIC );
end CODEC;

--*************************************************************************--

architecture STR_CODEC of CODEC is

    --
    -- component declarations
    --
    component CODEC_IN
	generic( IN_REG_ADDR : INTEGER:=1024;
		 OUT_REG_ADDR : INTEGER:=1025;
		 STAT_REG_ADDR : INTEGER:=1026;
		 CONT_REG_ADDR : INTEGER:=1027;
		 COMPRESSION : INTEGER:=4);
	port( clk  : in STD_LOGIC;
	      rst  : in STD_LOGIC;
	      ib_data : inout UNSIGNED(31 downto 0);
	      ib_addr : in UNSIGNED(22 downto 0);		
	      ib_wr   : in STD_LOGIC;
	      ib_rd   : in STD_LOGIC;
	      ib_valid : out STD_LOGIC );
    end component;

    component CODEC_IM
	generic( IN_REG_ADDR : INTEGER:=1024;
		 OUT_REG_ADDR : INTEGER:=1025;
		 STAT_REG_ADDR : INTEGER:=1026;
		 CONT_REG_ADDR : INTEGER:=1027);
	port( clk  : in STD_LOGIC;
	      rst  : in STD_LOGIC;
	      ib_data : inout UNSIGNED(31 downto 0);
	      ib_addr : out UNSIGNED(22 downto 0);
	      ib_wr   : out STD_LOGIC;
	      ib_rd   : out STD_LOGIC;
	      ib_valid : in STD_LOGIC;
	      pdata : inout UNSIGNED(31 downto 0); 
	      paddr : in UNSIGNED(22 downto 0);
	      ior   : in STD_LOGIC;
	      iow   : in STD_LOGIC;
	      ale   : in STD_LOGIC;
	      iochrdy : out STD_LOGIC );
    end component;

    --
    -- component configurations
    --
    for all : CODEC_IN use entity WORK.CODEC_IN(BHV_CODEC_IN);
    for all : CODEC_IM use entity WORK.CODEC_IM(BHV_CODEC_IM);

    --
    -- signals
    --
    signal ib_data : UNSIGNED(31 downto 0);
    signal ib_addr : UNSIGNED(22 downto 0);
    signal ib_wr, ib_rd, ib_valid : STD_LOGIC;
begin
    --
    -- component instantiations
    --
    U1 : CODEC_IN 
	generic map(IN_REG_ADDR,OUT_REG_ADDR,
		    STAT_REG_ADDR,CONT_REG_ADDR,COMPRESSION)
	port map(clk, rst, ib_data, ib_addr, ib_wr, ib_rd, ib_valid);
    U2 : CODEC_IM 
	generic map(IN_REG_ADDR,OUT_REG_ADDR,
		    STAT_REG_ADDR,CONT_REG_ADDR)
	port map(clk, rst, ib_data, ib_addr, ib_wr, 
		 ib_rd, ib_valid, pdata, paddr, ior, iow, ale, iochrdy);
end STR_CODEC;

--*************************************************************************--
-- end of file --








<div align="center"><br /><script type="text/javascript"><!--
google_ad_client = "pub-7293844627074885";
//468x60, Created at 07. 11. 25
google_ad_slot = "8619794253";
google_ad_width = 468;
google_ad_height = 60;
//--></script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />&nbsp;</div>