Files
lt16lab/soc/peripheral/switches.vhd

89 lines
1.9 KiB
VHDL

-- See the file "LICENSE" for the full license governing this code. --
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.lt16x32_global.all;
use work.wishbone.all;
use work.config.all;
entity wb_switches is
generic(
memaddr : generic_addr_type; --:= CFG_BADR_SW;
addrmask : generic_mask_type --:= CFG_MADR_SW;
);
port(
clk : in std_logic;
rst : in std_logic;
wslvi : in wb_slv_in_type;
wslvo : out wb_slv_out_type;
buttons : in std_logic_vector(4 downto 0);
switches : in std_logic_vector(15 downto 0);
interrupt : out std_logic
);
end wb_switches;
architecture Behavioral of wb_switches is
signal data : std_logic_vector(20 downto 0);
signal ack : std_logic;
signal old_input : std_logic_vector(20 downto 0);
begin
process(clk)
begin
if clk'event and clk='1' then
if rst = '1' then
ack <= '0';
data <= (others=>'0');
else
if wslvi.stb = '1' and wslvi.cyc = '1' then
if wslvi.we='0' then
data(15 downto 0) <= switches;
data(20 downto 16) <= buttons;
end if;
if ack = '0' then
ack <= '1';
else
ack <= '0';
end if;
else
ack <= '0';
end if;
end if;
end if;
end process;
process(clk)
begin
if clk'event and clk='1' then
if rst = '1' then
interrupt <= '0';
old_input <= (others => '0');
else
if buttons & switches /= old_input
then
interrupt <= '1';
else
interrupt <= '0';
end if;
old_input(15 downto 0) <= switches;
old_input(20 downto 16) <= buttons;
end if;
end if;
end process;
wslvo.dat(20 downto 0) <= data;
wslvo.dat(31 downto 21) <= (others=>'0');
wslvo.ack <= ack;
wslvo.wbcfg <= wb_membar(memaddr, addrmask);
end Behavioral;