diff options
Diffstat (limited to 'rtl/vhdl/T8032.vhd')
-rw-r--r-- | rtl/vhdl/T8032.vhd | 459 |
1 files changed, 459 insertions, 0 deletions
diff --git a/rtl/vhdl/T8032.vhd b/rtl/vhdl/T8032.vhd new file mode 100644 index 0000000..637b6f1 --- /dev/null +++ b/rtl/vhdl/T8032.vhd @@ -0,0 +1,459 @@ +-- +-- 8032 compatible microcontroller, wishbone compatible +-- +-- Version : 0222 +-- +-- 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 T8032 is + generic( + tristate : integer := 0; + RAMAddressWidth : integer := 8); + port( + -- Wishbone signals + CLK_I : in std_logic; + RST_I : in std_logic; + ACK_I : in std_logic; + TAG0_O : out std_logic; -- PSEN_n + CYC_O : out std_logic; + STB_O : out std_logic; + WE_O : out std_logic; + ADR_O : out std_logic_vector(15 downto 0); + DAT_I : in std_logic_vector(7 downto 0); + DAT_O : out std_logic_vector(7 downto 0); + -- Peripheral signals + 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 + ); +end T8032; + +architecture rtl of T8032 is + 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 Rst_n : std_logic; + signal ROM_Addr : std_logic_vector(15 downto 0); + signal ROM_Data : std_logic_vector(7 downto 0); + signal RAM_Addr : std_logic_vector(15 downto 0); + signal RAM_RData : std_logic_vector(7 downto 0); + signal RAM_WData : std_logic_vector(7 downto 0); + signal RAM_Cycle : std_logic; + signal RAM_Cycle_r : std_logic; + signal CYC_s : std_logic; + signal RAM_Rd : std_logic; + signal RAM_Wr : 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 + + Rst_n <= not RST_I; + + -- Wishbone interface + DAT_O <= RAM_WData; + ROM_Data <= DAT_I; + WE_O <= RAM_Wr and RAM_Cycle; + TAG0_O <= RAM_Cycle_r; -- PSEN_n + STB_O <= CYC_s; + CYC_O <= CYC_s; + + process(Rst_n, CLK_I) + begin + if Rst_n = '0' then + CYC_s <= '0'; + ADR_O <= (others => '0'); + RAM_Cycle_r <= '0'; + RAM_RData <= (others => '0'); + elsif CLK_I'event and CLK_I = '1' then + CYC_s <= '1'; + RAM_Cycle_r <= RAM_Cycle; + if ACK_I='1' then + RAM_RData <= DAT_I; + end if; + + if RAM_Cycle = '1' and (RAM_Cycle_r = '0' or ACK_I = '0') then + ADR_O <= RAM_Addr; + else + ADR_O <= ROM_Addr; + end if; + end if; + end process; + + process (CLK_I) + begin + if CLK_I'event and CLK_I = '1' then + IO_Addr_r <= IO_Addr; + end if; + end process; + + core51 : T51 + generic map( + RAMAddressWidth => RAMAddressWidth, + tristate => tristate, + t8032 => 1, + DualBus => 0) + port map( + Clk => CLK_I, + Rst_n => Rst_n, + Ready => ACK_I, + ROM_Addr => ROM_Addr, + ROM_Data => ROM_Data, + RAM_Addr => RAM_Addr, + RAM_RData => RAM_RData, + RAM_WData => RAM_WData, + RAM_Cycle => RAM_Cycle, + 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_I, + 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_I, + 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_I, + 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_I, + 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_I, + 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_I, + 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_I, + 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_I, + 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; |