summaryrefslogtreecommitdiff
path: root/rtl/vhdl/T51_Glue.vhd
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/vhdl/T51_Glue.vhd')
-rw-r--r--rtl/vhdl/T51_Glue.vhd254
1 files changed, 254 insertions, 0 deletions
diff --git a/rtl/vhdl/T51_Glue.vhd b/rtl/vhdl/T51_Glue.vhd
new file mode 100644
index 0000000..dde72f6
--- /dev/null
+++ b/rtl/vhdl/T51_Glue.vhd
@@ -0,0 +1,254 @@
+--
+-- 8052 compatible microcontroller
+--
+-- Version : 0300
+--
+-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
+-- (c) 2004-2005 Andreas Voggeneder (andreas.voggeneder@fh-hagenberg.at)
+--
+-- All rights reserved
+--
+-- Redistribution and use in source and synthezised forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+-- Redistributions of source code must retain the above copyright notice,
+-- this list of conditions and the following disclaimer.
+--
+-- Redistributions in synthesized form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+--
+-- Neither the name of the author nor the names of other contributors may
+-- be used to endorse or promote products derived from this software without
+-- specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
+-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+-- POSSIBILITY OF SUCH DAMAGE.
+--
+-- Please report bugs to the author, but before you do so, please
+-- make sure that this is not a derivative work and that
+-- you have the latest version of this file.
+--
+-- The latest version of this file can be found at:
+-- http://www.opencores.org/cvsweb.shtml/t51/
+--
+-- Limitations :
+--
+-- File history :
+--
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use work.T51_Pack.all;
+
+entity T51_Glue is
+ generic(
+ tristate : integer := 1
+ );
+ port(
+ Clk : in std_logic;
+ Rst_n : in std_logic;
+ INT0 : in std_logic;
+ INT1 : in std_logic;
+ RI : in std_logic;
+ TI : in std_logic;
+ OF0 : in std_logic;
+ OF1 : in std_logic;
+ OF2 : in std_logic;
+ IO_Wr : in std_logic;
+ IO_Addr : in std_logic_vector(6 downto 0);
+ IO_Addr_r : in std_logic_vector(6 downto 0);
+ IO_WData : in std_logic_vector(7 downto 0);
+ IO_RData : out std_logic_vector(7 downto 0);
+ Selected : out std_logic;
+ Int_Acc : in std_logic_vector(6 downto 0); -- Acknowledge
+ R0 : out std_logic;
+ R1 : out std_logic;
+ SMOD : out std_logic;
+ P0_Sel : out std_logic;
+ P1_Sel : out std_logic;
+ P2_Sel : out std_logic;
+ P3_Sel : out std_logic;
+ TMOD_Sel : out std_logic;
+ TL0_Sel : out std_logic;
+ TL1_Sel : out std_logic;
+ TH0_Sel : out std_logic;
+ TH1_Sel : out std_logic;
+ T2CON_Sel : out std_logic;
+ RCAP2L_Sel : out std_logic;
+ RCAP2H_Sel : out std_logic;
+ TL2_Sel : out std_logic;
+ TH2_Sel : out std_logic;
+ SCON_Sel : out std_logic;
+ SBUF_Sel : out std_logic;
+ P0_Wr : out std_logic;
+ P1_Wr : out std_logic;
+ P2_Wr : out std_logic;
+ P3_Wr : out std_logic;
+ TMOD_Wr : out std_logic;
+ TL0_Wr : out std_logic;
+ TL1_Wr : out std_logic;
+ TH0_Wr : out std_logic;
+ TH1_Wr : out std_logic;
+ T2CON_Wr : out std_logic;
+ RCAP2L_Wr : out std_logic;
+ RCAP2H_Wr : out std_logic;
+ TL2_Wr : out std_logic;
+ TH2_Wr : out std_logic;
+ SCON_Wr : out std_logic;
+ SBUF_Wr : out std_logic;
+ Int_Trig : out std_logic_vector(6 downto 0)
+ );
+end T51_Glue;
+
+architecture rtl of T51_Glue is
+
+ signal IE : std_logic_vector(7 downto 0);
+ signal TCON : std_logic_vector(7 downto 0);
+ signal PCON : std_logic_vector(7 downto 0);
+
+ signal Int0_r : std_logic_vector(1 downto 0);
+ signal Int1_r : std_logic_vector(1 downto 0);
+
+begin
+
+ R0 <= TCON(4);
+ R1 <= TCON(6);
+ SMOD <= PCON(7);
+
+ -- Registers/Interrupts
+ tristate_mux: if tristate/=0 generate
+ IO_RData <= TCON when IO_Addr = "0001000" else "ZZZZZZZZ"; -- $88 TCON
+ IO_RData <= PCON when IO_Addr = "0000111" else "ZZZZZZZZ"; -- $87 TCON
+ IO_RData <= IE when IO_Addr = "0101000" else "ZZZZZZZZ";
+ Selected <= '0';
+ end generate;
+
+ std_mux: if tristate=0 generate
+ IO_RData <= TCON when IO_Addr = "0001000" else
+ PCON when IO_Addr = "0000111" else
+ IE when IO_Addr = "0101000" else
+ (others =>'-');
+ Selected <= '1' when IO_Addr = "0001000" or
+ IO_Addr = "0000111" or
+ IO_Addr = "0101000" else
+ '0';
+ end generate;
+
+ process (Rst_n, Clk)
+ begin
+ if Rst_n = '0' then
+ IE <= "00000000";
+ TCON <= "00000000";
+ PCON <= "00000000";
+ Int0_r <= "11";
+ Int1_r <= "11";
+ elsif Clk'event and Clk = '1' then
+ Int0_r(0) <= INT0;
+ Int0_r(1) <= Int0_r(0);
+ Int1_r(0) <= INT1;
+ Int1_r(1) <= Int1_r(0);
+
+ if IO_Wr = '1' and IO_Addr_r = "0101000" then
+ IE <= IO_WData;
+ end if;
+ if IO_Wr = '1' and IO_Addr_r = "0001000" then
+ TCON <= IO_WData;
+ end if;
+ if IO_Wr = '1' and IO_Addr_r = "0000111" then
+ PCON <= IO_WData;
+ end if;
+
+ if OF0 = '1' then
+ TCON(5) <= '1';
+ end if;
+ if Int_Acc(1) = '1' then
+ TCON(5) <= '0';
+ end if;
+ if OF1 = '1' then
+ TCON(7) <= '1';
+ end if;
+ if Int_Acc(3) = '1' then
+ TCON(7) <= '0';
+ end if;
+
+ -- External interrupts
+ if TCON(0) = '1' then
+ if Int_Acc(0) = '1' then
+ TCON(1) <= '0';
+ end if;
+ if Int0_r = "10" then
+ TCON(1) <= '1';
+ end if;
+ else
+ TCON(1) <= not Int0_r(0);
+ end if;
+ if TCON(2) = '1' then
+ if Int_Acc(2) = '1' then
+ TCON(3) <= '0';
+ end if;
+ if Int1_r = "10" then
+ TCON(3) <= '1';
+ end if;
+ else
+ TCON(3) <= not Int1_r(0);
+ end if;
+ end if;
+ end process;
+
+ Int_Trig(0) <= '0' when IE(7) = '0' or IE(0) = '0' else not Int0_r(1) when TCON(0) = '0' else TCON(1);
+ Int_Trig(1) <= '1' when IE(7) = '1' and IE(1) = '1' and TCON(5) = '1' else '0';
+ Int_Trig(2) <= '0' when IE(7) = '0' or IE(2) = '0' else not Int1_r(1) when TCON(2) = '0' else TCON(3);
+ Int_Trig(3) <= '1' when IE(7) = '1' and IE(3) = '1' and TCON(7) = '1' else '0';
+ Int_Trig(4) <= '1' when IE(7) = '1' and IE(4) = '1' and (RI = '1' or TI = '1') else '0';
+ Int_Trig(5) <= '1' when IE(7) = '1' and IE(5) = '1' and OF2 = '1' else '0';
+ Int_Trig(6) <= '0';
+
+ P0_Sel <= '1' when IO_Addr = "0000000" else '0';
+ P0_Wr <= '1' when IO_Addr_r = "0000000" and IO_Wr = '1' else '0';
+
+ P1_Sel <= '1' when IO_Addr = "0010000" else '0';
+ P1_Wr <= '1' when IO_Addr_r = "0010000" and IO_Wr = '1' else '0';
+
+ P2_Sel <= '1' when IO_Addr = "0100000" else '0';
+ P2_Wr <= '1' when IO_Addr_r = "0100000" and IO_Wr = '1' else '0';
+
+ P3_Sel <= '1' when IO_Addr = "0110000" else '0';
+ P3_Wr <= '1' when IO_Addr_r = "0110000" and IO_Wr = '1' else '0';
+
+ TMOD_Sel <= '1' when IO_Addr = "0001001" else '0';
+ TMOD_Wr <= '1' when IO_Addr_r = "0001001" and IO_Wr = '1' else '0';
+ TL0_Sel <= '1' when IO_Addr = "0001010" else '0';
+ TL0_Wr <= '1' when IO_Addr_r = "0001010" and IO_Wr = '1' else '0';
+ TL1_Sel <= '1' when IO_Addr = "0001011" else '0';
+ TL1_Wr <= '1' when IO_Addr_r = "0001011" and IO_Wr = '1' else '0';
+ TH0_Sel <= '1' when IO_Addr = "0001100" else '0';
+ TH0_Wr <= '1' when IO_Addr_r = "0001100" and IO_Wr = '1' else '0';
+ TH1_Sel <= '1' when IO_Addr = "0001101" else '0';
+ TH1_Wr <= '1' when IO_Addr_r = "0001101" and IO_Wr = '1' else '0';
+
+ T2CON_Sel <= '1' when IO_Addr = "1001000" else '0';
+ T2CON_Wr <= '1' when IO_Addr_r = "1001000" and IO_Wr = '1' else '0';
+ RCAP2L_Sel <= '1' when IO_Addr = "1001010" else '0';
+ RCAP2L_Wr <= '1' when IO_Addr_r = "1001010" and IO_Wr = '1' else '0';
+ RCAP2H_Sel <= '1' when IO_Addr = "1001011" else '0';
+ RCAP2H_Wr <= '1' when IO_Addr_r = "1001011" and IO_Wr = '1' else '0';
+ TL2_Sel <= '1' when IO_Addr = "1001100" else '0';
+ TL2_Wr <= '1' when IO_Addr_r = "1001100" and IO_Wr = '1' else '0';
+ TH2_Sel <= '1' when IO_Addr = "1001101" else '0';
+ TH2_Wr <= '1' when IO_Addr_r = "1001101" and IO_Wr = '1' else '0';
+
+ SCON_Sel <= '1' when IO_Addr = "0011000" else '0';
+ SCON_Wr <= '1' when IO_Addr_r = "0011000" and IO_Wr = '1' else '0';
+ SBUF_Sel <= '1' when IO_Addr = "0011001" else '0';
+ SBUF_Wr <= '1' when IO_Addr_r = "0011001" and IO_Wr = '1' else '0';
+end;