Project

General

Profile

---------------------------------------------------------------------------
-- (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;
    (1-1/1)