pong/speaker.vhd

44 lines
801 B
VHDL

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- period of 25 MHz oscillator is 40 ns
entity speaker is
port (
CLK: in std_logic;
HPERIOD: in std_logic_vector(24 downto 0);
PLAY: in std_logic;
PIN: out std_logic
);
end speaker;
architecture Behavioral of speaker is
begin
process (CLK)
variable sout: std_logic := '0';
variable prescaler: std_logic_vector(24 downto 0) := (others => '0');
begin
if CLK'event and CLK = '1' then
if PLAY = '1' then
if prescaler >= HPERIOD then
sout := not sout;
prescaler := (others => '0');
end if;
prescaler := prescaler + 1;
else
sout := '0';
prescaler := (others => '0');
end if;
end if;
PIN <= sout;
end process;
end Behavioral;