Committed on the Free edition of March Hare Software CVSNT Server. Upgrade to CVS Suite for more features and support: http://march-hare.com/cvsnt/ git-svn-id: http://moon:8086/svn/vhdl/trunk@734 cc03376c-175c-47c8-b038-4cd826a8556b
144 lines
3.1 KiB
VHDL
144 lines
3.1 KiB
VHDL
LIBRARY IEEE;
|
|
USE IEEE.STD_LOGIC_1164.ALL;
|
|
USE IEEE.NUMERIC_STD.ALL;
|
|
|
|
ENTITY ps2_wb IS
|
|
Generic
|
|
(
|
|
f_sys_clk : real := 100.0
|
|
);
|
|
Port
|
|
(
|
|
CLK_I : in STD_LOGIC;
|
|
RST_I : in STD_LOGIC;
|
|
CYC_I : in STD_LOGIC;
|
|
STB_I : in STD_LOGIC;
|
|
SEL_I : in unsigned(3 downto 0);
|
|
WE_I : in STD_LOGIC;
|
|
ACK_O : out STD_LOGIC;
|
|
SRDY_O : out STD_LOGIC;
|
|
MRDY_I : in STD_LOGIC;
|
|
ADDR_I : in unsigned(31 downto 0);
|
|
DAT_I : in unsigned(31 downto 0);
|
|
DAT_O : out unsigned(31 downto 0);
|
|
INT_O : out STD_LOGIC;
|
|
clk_rx : in std_logic;
|
|
data_rx : in std_logic;
|
|
clk_tx : out std_logic;
|
|
data_tx : out std_logic
|
|
);
|
|
END ps2_wb;
|
|
|
|
ARCHITECTURE behavior OF ps2_wb IS
|
|
|
|
|
|
-- Signals for ps2 connections
|
|
signal reg_we_ps2_tx : std_logic;
|
|
signal reg_re_ps2_rx : std_logic;
|
|
signal reg_ps2_tx : unsigned(7 downto 0);
|
|
signal reg_ps2_rx : unsigned(7 downto 0);
|
|
signal rx_data_present : std_logic;
|
|
signal ps2_status_port : unsigned(15 downto 0);
|
|
signal rx_int_en : std_logic;
|
|
signal tx_int_en : std_logic;
|
|
signal irq_rx : std_logic;
|
|
signal irq_tx : std_logic;
|
|
signal tx_empty : std_logic;
|
|
signal rx_err_flag : std_logic;
|
|
signal rx_err_par : std_logic;
|
|
signal stat_clk : std_logic;
|
|
signal stat_data : std_logic;
|
|
|
|
begin
|
|
|
|
SRDY_O <= CYC_I;
|
|
|
|
------------------------------------------------------------------
|
|
registers_write:
|
|
process(CLK_I)
|
|
begin
|
|
if rising_edge(CLK_I) then
|
|
reg_we_ps2_tx <= '0';
|
|
if RST_I = '1' then
|
|
rx_int_en <= '0';
|
|
tx_int_en <= '0';
|
|
elsif (STB_I and CYC_I and WE_I) = '1' then
|
|
case ADDR_I(5 downto 2) is
|
|
|
|
when "0000" =>
|
|
reg_we_ps2_tx <= '1';
|
|
reg_ps2_tx <= DAT_I(7 downto 0);
|
|
|
|
when "0001" =>
|
|
rx_int_en <= DAT_I(6);
|
|
tx_int_en <= DAT_I(5);
|
|
|
|
when others => null;
|
|
end case;
|
|
end if;
|
|
end if;
|
|
end process;
|
|
|
|
registers_read:
|
|
process(CLK_I)
|
|
begin
|
|
if rising_edge(CLK_I) then
|
|
reg_re_ps2_rx <= '0';
|
|
ACK_O <= '0';
|
|
if (STB_I and CYC_I) = '1' then
|
|
ACK_O <= not WE_I;
|
|
DAT_O <= (others => '0');
|
|
case ADDR_I(5 downto 2) is
|
|
|
|
when "0000" =>
|
|
reg_re_ps2_rx <= not WE_I;
|
|
DAT_O(7 downto 0) <= unsigned(reg_ps2_rx);
|
|
|
|
when "0001" =>
|
|
DAT_O(15 downto 0) <= ps2_status_port;
|
|
|
|
when others => null;
|
|
end case;
|
|
end if;
|
|
end if;
|
|
end process;
|
|
|
|
irq_register:
|
|
process(CLK_I)
|
|
begin
|
|
if rising_edge(CLK_I) then
|
|
INT_O <= irq_rx or irq_tx;
|
|
irq_tx <= tx_empty and tx_int_en;
|
|
irq_rx <= rx_data_present and rx_int_en;
|
|
stat_clk <= clk_rx;
|
|
stat_data <= data_rx;
|
|
end if;
|
|
end process;
|
|
|
|
inst_ps2_core: entity work.ps2_core
|
|
GENERIC MAP
|
|
(
|
|
f_sys_clk => f_sys_clk
|
|
)
|
|
PORT MAP
|
|
(
|
|
rst => RST_I,
|
|
clk => CLK_I,
|
|
din => reg_ps2_tx,
|
|
dout => reg_ps2_rx,
|
|
tx_empty => tx_empty,
|
|
rx_present => rx_data_present,
|
|
rx_err_flag => rx_err_flag,
|
|
rx_err_par => rx_err_par,
|
|
din_vld => reg_we_ps2_tx,
|
|
read_en => reg_re_ps2_rx,
|
|
ps2_clk_rx => clk_rx,
|
|
ps2_data_rx => data_rx,
|
|
ps2_clk_tx => clk_tx,
|
|
ps2_data_tx => data_tx
|
|
);
|
|
|
|
ps2_status_port <= rx_err_flag & "000" & rx_err_par & '0' & irq_rx & irq_tx & '0' & rx_int_en & tx_int_en & stat_data & stat_clk & rx_data_present & '0' & tx_empty;
|
|
|
|
end behavior;
|