-- -- 8052 compatible microcontroller, with internal RAM & ROM -- -- 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 T8052 is generic( tristate : integer := 0; ROMAddressWidth : integer := 13; IRAMAddressWidth : integer := 8; XRAMAddressWidth : integer := 11); port( Clk : in std_logic; Rst_n : in std_logic; P0_in : in std_logic_vector(7 downto 0); P1_in : in std_logic_vector(7 downto 0); P2_in : in std_logic_vector(7 downto 0); P3_in : in std_logic_vector(7 downto 0); P0_out : out std_logic_vector(7 downto 0); P1_out : out std_logic_vector(7 downto 0); P2_out : out std_logic_vector(7 downto 0); P3_out : out std_logic_vector(7 downto 0); INT0 : in std_logic; INT1 : in std_logic; T0 : in std_logic; T1 : in std_logic; T2 : in std_logic; T2EX : in std_logic; RXD : in std_logic; RXD_IsO : out std_logic; RXD_O : out std_logic; TXD : out std_logic; -- External XRAM Wishbone: XRAM_WE_O : out std_logic; XRAM_STB_O : out std_logic; XRAM_CYC_O : out std_logic; XRAM_ACK_I : in std_logic; XRAM_DAT_O : out std_logic_vector(7 downto 0); XRAM_ADR_O : out std_logic_vector(15 downto 0); XRAM_DAT_I : in std_logic_vector(7 downto 0) ); end T8052; architecture rtl of T8052 is component ROM52 port( Clk : in std_logic; A : in std_logic_vector(ROMAddressWidth - 1 downto 0); D : out std_logic_vector(7 downto 0) ); end component; component SSRAM generic( AddrWidth : integer := 16; DataWidth : integer := 8 ); port( Clk : in std_logic; CE_n : in std_logic; WE_n : in std_logic; A : in std_logic_vector(AddrWidth - 1 downto 0); DIn : in std_logic_vector(DataWidth - 1 downto 0); DOut : out std_logic_vector(DataWidth - 1 downto 0) ); end component; constant ext_mux_in_num : integer := 8; --63; type ext_mux_din_type is array(0 to ext_mux_in_num-1) of std_logic_vector(7 downto 0); subtype ext_mux_en_type is std_logic_vector(0 to ext_mux_in_num-1); signal Ready : std_logic; signal ROM_Addr : std_logic_vector(15 downto 0); signal ROM_Data : std_logic_vector(7 downto 0); signal RAM_Addr,RAM_Addr_r : std_logic_vector(15 downto 0); signal XRAM_Addr : std_logic_vector(15 downto 0); signal RAM_RData : std_logic_vector(7 downto 0); signal RAM_DO : std_logic_vector(7 downto 0); signal RAM_WData : std_logic_vector(7 downto 0); signal RAM_Rd : std_logic; signal RAM_Wr : std_logic; signal RAM_WE_n : std_logic; signal zeros : std_logic_vector(15 downto XRAMAddressWidth); signal ram_access : std_logic; signal mux_sel : std_logic; signal mux_sel_r : std_logic; signal ext_ram_en : std_logic; signal int_xram_sel_n : std_logic; signal IO_Rd : std_logic; signal IO_Wr : std_logic; signal IO_Addr : std_logic_vector(6 downto 0); signal IO_Addr_r : std_logic_vector(6 downto 0); signal IO_WData : std_logic_vector(7 downto 0); signal IO_RData : std_logic_vector(7 downto 0); signal IO_RData_arr : ext_mux_din_type; signal IO_RData_en : ext_mux_en_type; signal P0_Sel : std_logic; signal P1_Sel : std_logic; signal P2_Sel : std_logic; signal P3_Sel : std_logic; signal TMOD_Sel : std_logic; signal TL0_Sel : std_logic; signal TL1_Sel : std_logic; signal TH0_Sel : std_logic; signal TH1_Sel : std_logic; signal T2CON_Sel : std_logic; signal RCAP2L_Sel : std_logic; signal RCAP2H_Sel : std_logic; signal TL2_Sel : std_logic; signal TH2_Sel : std_logic; signal SCON_Sel : std_logic; signal SBUF_Sel : std_logic; signal P0_Wr : std_logic; signal P1_Wr : std_logic; signal P2_Wr : std_logic; signal P3_Wr : std_logic; signal TMOD_Wr : std_logic; signal TL0_Wr : std_logic; signal TL1_Wr : std_logic; signal TH0_Wr : std_logic; signal TH1_Wr : std_logic; signal T2CON_Wr : std_logic; signal RCAP2L_Wr : std_logic; signal RCAP2H_Wr : std_logic; signal TL2_Wr : std_logic; signal TH2_Wr : std_logic; signal SCON_Wr : std_logic; signal SBUF_Wr : std_logic; signal UseR2 : std_logic; signal UseT2 : std_logic; signal UART_Clk : std_logic; signal R0 : std_logic; signal R1 : std_logic; signal SMOD : std_logic; signal Int_Trig : std_logic_vector(6 downto 0); signal Int_Acc : std_logic_vector(6 downto 0); signal RI : std_logic; signal TI : std_logic; signal OF0 : std_logic; signal OF1 : std_logic; signal OF2 : std_logic; begin Ready <= '0' when (XRAM_ACK_I='0' and (ext_ram_en and ram_access)='1') else '1'; XRAM_ADR_O <= XRAM_Addr(15 downto 0); -- Registered address XRAM_DAT_O <= RAM_WData; XRAM_CYC_O <= ext_ram_en and ram_access; XRAM_STB_O <= ext_ram_en and ram_access; XRAM_WE_O <= RAM_Wr; process (Rst_n,clk) begin if Rst_n='0' then IO_Addr_r <= (others =>'0'); RAM_Addr_r <= (others =>'0'); mux_sel_r <= '0'; elsif clk'event and clk = '1' then IO_Addr_r <= IO_Addr; if Ready = '1' then RAM_Addr_r <= RAM_Addr; end if; mux_sel_r <= mux_sel; end if; end process; XRAM_Addr <= RAM_Addr_r; rom : ROM52 port map( Clk => Clk, A => ROM_Addr(ROMAddressWidth - 1 downto 0), D => ROM_Data); zeros <= (others => '0'); g_rams0 : if XRAMAddressWidth > 15 generate ext_ram_en <= '0'; -- no external XRAM end generate; g_rams1 : if XRAMAddressWidth < 16 and XRAMAddressWidth > 0 generate ext_ram_en <= '1' when XRAM_Addr(15 downto XRAMAddressWidth) /= zeros else '0'; end generate; ram_access <= '1' when (RAM_Rd or RAM_Wr)='1' else '0'; -- xram bus access is pipelined. -- so use registered signal for selecting read data RAM_RData <= RAM_DO when mux_sel_r = '0' else XRAM_DAT_I; -- select data mux mux_sel <= ext_ram_en; -- internal XRAM select signal is active low. -- so internal xram is selected when external XRAM is not selected (ext_ram_en = '0') int_xram_sel_n <= ext_ram_en; RAM_WE_n <= not RAM_Wr; g_ram : if XRAMAddressWidth > 0 generate ram : SSRAM generic map( AddrWidth => XRAMAddressWidth) port map( Clk => Clk, CE_n => int_xram_sel_n, WE_n => RAM_WE_n, A => XRAM_Addr(XRAMAddressWidth - 1 downto 0), DIn => RAM_WData, DOut => RAM_DO); end generate; core51 : T51 generic map( DualBus => 1, tristate => tristate, t8032 => 0, RAMAddressWidth => IRAMAddressWidth) port map( Clk => Clk, Rst_n => Rst_n, Ready => Ready, ROM_Addr => ROM_Addr, ROM_Data => ROM_Data, RAM_Addr => RAM_Addr, RAM_RData => RAM_RData, RAM_WData => RAM_WData, RAM_Rd => RAM_Rd, RAM_Wr => RAM_Wr, Int_Trig => Int_Trig, Int_Acc => Int_Acc, SFR_Rd_RMW => IO_Rd, SFR_Wr => IO_Wr, SFR_Addr => IO_Addr, SFR_WData => IO_WData, SFR_RData_in => IO_RData); glue51 : T51_Glue generic map( tristate => tristate) port map( Clk => Clk, Rst_n => Rst_n, INT0 => INT0, INT1 => INT1, RI => RI, TI => TI, OF0 => OF0, OF1 => OF1, OF2 => OF2, IO_Wr => IO_Wr, IO_Addr => IO_Addr, IO_Addr_r => IO_Addr_r, IO_WData => IO_WData, IO_RData => IO_RData_arr(0), Selected => IO_RData_en(0), Int_Acc => Int_Acc, R0 => R0, R1 => R1, SMOD => SMOD, P0_Sel => P0_Sel, P1_Sel => P1_Sel, P2_Sel => P2_Sel, P3_Sel => P3_Sel, TMOD_Sel => TMOD_Sel, TL0_Sel => TL0_Sel, TL1_Sel => TL1_Sel, TH0_Sel => TH0_Sel, TH1_Sel => TH1_Sel, T2CON_Sel => T2CON_Sel, RCAP2L_Sel => RCAP2L_Sel, RCAP2H_Sel => RCAP2H_Sel, TL2_Sel => TL2_Sel, TH2_Sel => TH2_Sel, SCON_Sel => SCON_Sel, SBUF_Sel => SBUF_Sel, P0_Wr => P0_Wr, P1_Wr => P1_Wr, P2_Wr => P2_Wr, P3_Wr => P3_Wr, TMOD_Wr => TMOD_Wr, TL0_Wr => TL0_Wr, TL1_Wr => TL1_Wr, TH0_Wr => TH0_Wr, TH1_Wr => TH1_Wr, T2CON_Wr => T2CON_Wr, RCAP2L_Wr => RCAP2L_Wr, RCAP2H_Wr => RCAP2H_Wr, TL2_Wr => TL2_Wr, TH2_Wr => TH2_Wr, SCON_Wr => SCON_Wr, SBUF_Wr => SBUF_Wr, Int_Trig => Int_Trig); tp0 : T51_Port generic map( tristate => tristate) port map( Clk => Clk, Rst_n => Rst_n, Sel => P0_Sel, Rd_RMW => IO_Rd, Wr => P0_Wr, Data_In => IO_WData, Data_Out => IO_RData_arr(1), IOPort_in => P0_in, IOPort_out => P0_out); IO_RData_en(1) <= P0_Sel; tp1 : T51_Port generic map( tristate => tristate) port map( Clk => Clk, Rst_n => Rst_n, Sel => P1_Sel, Rd_RMW => IO_Rd, Wr => P1_Wr, Data_In => IO_WData, Data_Out => IO_RData_arr(2), IOPort_in => P1_in, IOPort_out => P1_out); IO_RData_en(2) <= P1_Sel; tp2 : T51_Port generic map( tristate => tristate) port map( Clk => Clk, Rst_n => Rst_n, Sel => P2_Sel, Rd_RMW => IO_Rd, Wr => P2_Wr, Data_In => IO_WData, Data_Out => IO_RData_arr(3), IOPort_in => P2_in, IOPort_out => P2_out); IO_RData_en(3) <= P2_Sel; tp3 : T51_Port generic map( tristate => tristate) port map( Clk => Clk, Rst_n => Rst_n, Sel => P3_Sel, Rd_RMW => IO_Rd, Wr => P3_Wr, Data_In => IO_WData, Data_Out => IO_RData_arr(4), IOPort_in => P3_in, IOPort_out => P3_out); IO_RData_en(4) <= P3_Sel; tc01 : T51_TC01 generic map( FastCount => 0, tristate => tristate) port map( Clk => Clk, Rst_n => Rst_n, T0 => T0, T1 => T1, INT0 => INT0, INT1 => INT1, M_Sel => TMOD_Sel, H0_Sel => TH0_Sel, L0_Sel => TL0_Sel, H1_Sel => TH1_Sel, L1_Sel => TL1_Sel, R0 => R0, R1 => R1, M_Wr => TMOD_Wr, H0_Wr => TH0_Wr, L0_Wr => TL0_Wr, H1_Wr => TH1_Wr, L1_Wr => TL1_Wr, Data_In => IO_WData, Data_Out => IO_RData_arr(5), OF0 => OF0, OF1 => OF1); IO_RData_en(5) <= TMOD_Sel or TH0_Sel or TL0_Sel or TH1_Sel or TL1_Sel; tc2 : T51_TC2 generic map( FastCount => 0, tristate => tristate) port map( Clk => Clk, Rst_n => Rst_n, T2 => T2, T2EX => T2EX, C_Sel => T2CON_Sel, CH_Sel => RCAP2H_Sel, CL_Sel => RCAP2L_Sel, H_Sel => TH2_Sel, L_Sel => TL2_Sel, C_Wr => T2CON_Wr, CH_Wr => RCAP2H_Wr, CL_Wr => RCAP2L_Wr, H_Wr => TH2_Wr, L_Wr => TL2_Wr, Data_In => IO_WData, Data_Out => IO_RData_arr(6), UseR2 => UseR2, UseT2 => UseT2, UART_Clk => UART_Clk, F => OF2); IO_RData_en(6) <= T2CON_Sel or RCAP2H_Sel or RCAP2L_Sel or TH2_Sel or TL2_Sel; uart : T51_UART generic map( FastCount => 0, tristate => tristate) port map( Clk => Clk, Rst_n => Rst_n, UseR2 => UseR2, UseT2 => UseT2, BaudC2 => UART_Clk, BaudC1 => OF1, SC_Sel => SCON_Sel, SB_Sel => SBUF_Sel, SC_Wr => SCON_Wr, SB_Wr => SBUF_Wr, SMOD => SMOD, Data_In => IO_WData, Data_Out => IO_RData_arr(7), RXD => RXD, RXD_IsO => RXD_IsO, RXD_O => RXD_O, TXD => TXD, RI => RI, TI => TI); IO_RData_en(7) <= SCON_Sel or SBUF_Sel; tristate_mux: if tristate/=0 generate drive: for i in 0 to ext_mux_in_num-1 generate IO_RData <= IO_RData_arr(i); end generate; end generate; std_mux: if tristate=0 generate process(IO_RData_en,IO_RData_arr) begin IO_RData <= IO_RData_arr(0); for i in 1 to ext_mux_in_num-1 loop if IO_RData_en(i)='1' then IO_RData <= IO_RData_arr(i); end if; end loop; end process; end generate; end;