| 
    
       ---------------------------------------------------------------------------
 
     | 
  
  
     | 
    
       -- (c) 2020 mark watson
 
     | 
  
  
     | 
    
       -- I am happy for anyone to use this for non-commercial use.
 
     | 
  
  
     | 
    
       -- If my vhdl files are used commercially or otherwise sold,
 
     | 
  
  
     | 
    
       -- please contact me for explicit permission at scrameta (gmail).
 
     | 
  
  
     | 
    
       -- This applies for source and binary form and derived works.
 
     | 
  
  
     | 
    
       ---------------------------------------------------------------------------
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       LIBRARY ieee;
 
     | 
  
  
     | 
    
       USE ieee.std_logic_1164.all; 
 
     | 
  
  
     | 
    
       use ieee.numeric_std.all;
 
     | 
  
  
     | 
    
       USE IEEE.STD_LOGIC_UNSIGNED.ALL;
 
     | 
  
  
     | 
    
       use IEEE.STD_LOGIC_MISC.all;
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       LIBRARY work;
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       ENTITY covox_top IS 
 
     | 
  
  
     | 
    
       	PORT
 
     | 
  
  
     | 
    
       	(
 
     | 
  
  
     | 
    
       		CLK : in std_logic;
 
     | 
  
  
     | 
    
       		RESET_N : in std_logic;
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       		WRITE_ENABLE : in std_logic;
 
     | 
  
  
     | 
    
       		ADDR : in std_logic_vector(1 downto 0);
 
     | 
  
  
     | 
    
       		DI : in std_logic_vector(7 downto 0);
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       		DO : out std_logic_vector(7 downto 0);
 
     | 
  
  
     | 
    
       		AUDIO0 : out std_logic_vector(15 downto 0);
 
     | 
  
  
     | 
    
       		AUDIO1 : out std_logic_vector(15 downto 0)
 
     | 
  
  
     | 
    
       	);
 
     | 
  
  
     | 
    
       END covox_top;		
 
     | 
  
  
     | 
    
       		
 
     | 
  
  
     | 
    
       ARCHITECTURE vhdl OF covox_top IS
 
     | 
  
  
     | 
    
       	signal addr_decoded: std_logic_vector(3 downto 0);
 
     | 
  
  
     | 
    
       	signal CH1_REG : std_logic_vector(7 downto 0);
 
     | 
  
  
     | 
    
       	signal CH0_REG : std_logic_vector(7 downto 0);
 
     | 
  
  
     | 
    
       	signal CH1_NEXT : std_logic_vector(7 downto 0);
 
     | 
  
  
     | 
    
       	signal CH0_NEXT : std_logic_vector(7 downto 0);
 
     | 
  
  
     | 
    
       	signal CH3_REG : std_logic_vector(7 downto 0);
 
     | 
  
  
     | 
    
       	signal CH2_REG : std_logic_vector(7 downto 0);
 
     | 
  
  
     | 
    
       	signal CH3_NEXT : std_logic_vector(7 downto 0);
 
     | 
  
  
     | 
    
       	signal CH2_NEXT : std_logic_vector(7 downto 0);
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       BEGIN
 
     | 
  
  
     | 
    
       	process(addr_decoded,CH0_REG,CH1_REG,CH2_REG,CH3_REG)
 
     | 
  
  
     | 
    
       	begin
 
     | 
  
  
     | 
    
       		DO <= (others=>'0');
 
     | 
  
  
     | 
    
       	
 
     | 
  
  
     | 
    
       		if (addr_decoded(0)='1') then
 
     | 
  
  
     | 
    
       			DO <= CH0_REG;
 
     | 
  
  
     | 
    
       		end if;
 
     | 
  
  
     | 
    
       	
 
     | 
  
  
     | 
    
       		if (addr_decoded(1)='1') then
 
     | 
  
  
     | 
    
       			DO <= CH1_REG;
 
     | 
  
  
     | 
    
       		end if;
 
     | 
  
  
     | 
    
       	
 
     | 
  
  
     | 
    
       		if (addr_decoded(2)='1') then
 
     | 
  
  
     | 
    
       			DO <= CH2_REG;
 
     | 
  
  
     | 
    
       		end if;
 
     | 
  
  
     | 
    
       	
 
     | 
  
  
     | 
    
       		if (addr_decoded(3)='1') then
 
     | 
  
  
     | 
    
       			DO <= CH3_REG;
 
     | 
  
  
     | 
    
       		end if;
 
     | 
  
  
     | 
    
       	end process;
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       	decode_addr2 : entity work.complete_address_decoder
 
     | 
  
  
     | 
    
       		generic map(width=>2)
 
     | 
  
  
     | 
    
       		port map (addr_in=>ADDR(1 downto 0), addr_decoded=>addr_decoded);
 
     | 
  
  
     | 
    
       	
 
     | 
  
  
     | 
    
       	process(addr_decoded, WRITE_ENABLE,
 
     | 
  
  
     | 
    
       	CH0_REG,CH1_REG,CH2_REG,CH3_REG,DI)
 
     | 
  
  
     | 
    
       		variable l : unsigned(8 downto 0);
 
     | 
  
  
     | 
    
       		variable r : unsigned(8 downto 0);
 
     | 
  
  
     | 
    
       	begin
 
     | 
  
  
     | 
    
       		CH0_NEXT <= CH0_REG;
 
     | 
  
  
     | 
    
       		CH1_NEXT <= CH1_REG;
 
     | 
  
  
     | 
    
       		CH2_NEXT <= CH2_REG;
 
     | 
  
  
     | 
    
       		CH3_NEXT <= CH3_REG;
 
     | 
  
  
     | 
    
       		
 
     | 
  
  
     | 
    
       		l := resize(unsigned(CH0_REG),9) + resize(unsigned(CH3_REG),9);
 
     | 
  
  
     | 
    
       		r := resize(unsigned(CH1_REG),9) + resize(unsigned(CH2_REG),9);
 
     | 
  
  
     | 
    
       		AUDIO0 <= std_logic_vector(l)&"0000000";
 
     | 
  
  
     | 
    
       		AUDIO1 <= std_logic_vector(r)&"0000000";
 
     | 
  
  
     | 
    
       	
 
     | 
  
  
     | 
    
       		
 
     | 
  
  
     | 
    
       		if (WRITE_ENABLE='1') then
 
     | 
  
  
     | 
    
       			if (addr_decoded(0)='1') then
 
     | 
  
  
     | 
    
       				CH0_NEXT <= DI;
 
     | 
  
  
     | 
    
       			end if;
 
     | 
  
  
     | 
    
       			if (addr_decoded(1)='1') then
 
     | 
  
  
     | 
    
       				CH1_NEXT <= DI;
 
     | 
  
  
     | 
    
       			end if;
 
     | 
  
  
     | 
    
       			if (addr_decoded(2)='1') then
 
     | 
  
  
     | 
    
       				CH2_NEXT <= DI;
 
     | 
  
  
     | 
    
       			end if;
 
     | 
  
  
     | 
    
       			if (addr_decoded(3)='1') then
 
     | 
  
  
     | 
    
       				CH3_NEXT <= DI;
 
     | 
  
  
     | 
    
       			end if;
 
     | 
  
  
     | 
    
       		end if;
 
     | 
  
  
     | 
    
       	end process;
 
     | 
  
  
     | 
    
       	
 
     | 
  
  
     | 
    
       	process(clk,reset_n)
 
     | 
  
  
     | 
    
       	begin
 
     | 
  
  
     | 
    
       		if (reset_n='0') then
 
     | 
  
  
     | 
    
       			CH0_REG <= (others=>'0');
 
     | 
  
  
     | 
    
       			CH1_REG <= (others=>'0');
 
     | 
  
  
     | 
    
       			CH2_REG <= (others=>'0');
 
     | 
  
  
     | 
    
       			CH3_REG <= (others=>'0');
 
     | 
  
  
     | 
    
       		elsif (clk'event and clk='1') then
 
     | 
  
  
     | 
    
       			CH0_REG <= CH0_NEXT;
 
     | 
  
  
     | 
    
       			CH1_REG <= CH1_NEXT;
 
     | 
  
  
     | 
    
       			CH2_REG <= CH2_NEXT;
 
     | 
  
  
     | 
    
       			CH3_REG <= CH3_NEXT;
 
     | 
  
  
     | 
    
       		end if;
 
     | 
  
  
     | 
    
       	end process;
 
     | 
  
  
     | 
    
       END vhdl;
 
     |