repo2/atari_chips/pokeyv2/SID/envelope_tapmatch.vhdl
| 1266 | markw | ---------------------------------------------------------------------------
|
|
-- (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_MISC.all;
|
|||
ENTITY SID_envelope_tapmatch IS
|
|||
PORT
|
|||
(
|
|||
CLK : IN STD_LOGIC;
|
|||
RESET_N : IN STD_LOGIC;
|
|||
DELAY_LFSR1 : IN STD_LOGIC_VECTOR(14 downto 0);
|
|||
DELAY_LFSR2 : IN STD_LOGIC_VECTOR(14 downto 0);
|
|||
DELAY_LFSR3 : IN STD_LOGIC_VECTOR(14 downto 0);
|
|||
TAPKEY1 : IN STD_LOGIC_VECTOR(3 downto 0);
|
|||
TAPKEY2 : IN STD_LOGIC_VECTOR(3 downto 0);
|
|||
TAPKEY3 : IN STD_LOGIC_VECTOR(3 downto 0);
|
|||
TAPMATCHES : OUT STD_LOGIC_VECTOR(2 downto 0)
|
|||
);
|
|||
END SID_envelope_tapmatch;
|
|||
ARCHITECTURE vhdl OF SID_envelope_tapmatch IS
|
|||
signal tapmatches_reg : std_logic_vector(2 downto 0);
|
|||
signal tapmatches_next : std_logic_vector(2 downto 0);
|
|||
signal state_reg : std_logic_vector(1 downto 0);
|
|||
signal state_next : std_logic_vector(1 downto 0);
|
|||
signal delay_lfsr_sel : std_logic_vector(14 downto 0);
|
|||
signal tapkey_sel : std_logic_vector(3 downto 0);
|
|||
signal tapmatch : std_logic;
|
|||
BEGIN
|
|||
process(clk,reset_n)
|
|||
begin
|
|||
if (reset_n='0') then
|
|||
tapmatches_reg <= (others=>'0');
|
|||
state_reg <= (others=>'0');
|
|||
elsif (clk'event and clk='1') then
|
|||
tapmatches_reg <= tapmatches_next;
|
|||
state_reg <= state_next;
|
|||
end if;
|
|||
end process;
|
|||
process(
|
|||
tapkey1,tapkey2,tapkey3,
|
|||
delay_lfsr1,delay_lfsr2,delay_lfsr3,
|
|||
state_reg,
|
|||
tapmatches_reg,
|
|||
tapmatch
|
|||
)
|
|||
begin
|
|||
tapmatches_next <= tapmatches_reg;
|
|||
state_next <= state_reg;
|
|||
delay_lfsr_sel <= (others=>'0');
|
|||
tapkey_sel <= (others=>'0');
|
|||
case state_reg is
|
|||
when "00" =>
|
|||
state_next <= "01";
|
|||
tapmatches_next(0) <= tapmatch;
|
|||
delay_lfsr_sel <= delay_lfsr1;
|
|||
tapkey_sel <= tapkey1;
|
|||
when "01" =>
|
|||
state_next <= "10";
|
|||
tapmatches_next(1) <= tapmatch;
|
|||
delay_lfsr_sel <= delay_lfsr2;
|
|||
tapkey_sel <= tapkey2;
|
|||
when others =>
|
|||
state_next <= "00";
|
|||
tapmatches_next(2) <= tapmatch;
|
|||
| 1268 | markw | delay_lfsr_sel <= delay_lfsr3;
|
|
| 1266 | markw | tapkey_sel <= tapkey3;
|
|
end case;
|
|||
end process;
|
|||
process(tapkey_sel, delay_lfsr_sel)
|
|||
variable tomatch : std_logic_Vector(14 downto 0);
|
|||
begin
|
|||
tapmatch <= '0';
|
|||
tomatch := (others=>'0');
|
|||
case tapkey_sel is
|
|||
when "0000" =>
|
|||
tomatch := "111111100000000"; --8
|
|||
when "0001" =>
|
|||
tomatch := "000000000000110"; --31
|
|||
when "0010" =>
|
|||
tomatch := "000000000111100"; --62
|
|||
when "0011" =>
|
|||
tomatch := "000001100110000"; --94
|
|||
when "0100" =>
|
|||
tomatch := "010000011000000"; --148
|
|||
when "0101" =>
|
|||
tomatch := "110011101010101"; --219
|
|||
when "0110" =>
|
|||
tomatch := "011100000000000"; --266
|
|||
when "0111" =>
|
|||
tomatch := "101000000001110"; --312
|
|||
when "1000" =>
|
|||
tomatch := "001001000010010"; --391
|
|||
when "1001" =>
|
|||
tomatch := "000001000100010"; --976
|
|||
when "1010" =>
|
|||
tomatch := "001100001001000"; --1953
|
|||
when "1011" =>
|
|||
tomatch := "101100110111000"; --3125
|
|||
when "1100" =>
|
|||
tomatch := "011100001000000"; --3906
|
|||
when "1101" =>
|
|||
tomatch := "111011111100010"; --11719
|
|||
when "1110" =>
|
|||
tomatch := "111011000100101"; --19531
|
|||
when "1111" =>
|
|||
tomatch := "000101010010011"; --31250
|
|||
when others=>
|
|||
end case;
|
|||
if (tomatch = delay_lfsr_sel) then
|
|||
tapmatch <= '1';
|
|||
end if;
|
|||
end process;
|
|||
TAPMATCHES <= tapmatches_reg;
|
|||
end vhdl;
|