Line 1... |
Line 1... |
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
-- --
|
-- --
|
-- This is the TOP-Level for TG68_fast to generate 68K Bus signals --
|
-- This is the TOP-Level for TG68_fast to generate 68K Bus signals --
|
-- --
|
-- --
|
-- Copyright (c) 2007 Tobias Gubener <tobiflex@opencores.org> --
|
-- Copyright (c) 2007-2008 Tobias Gubener <tobiflex@opencores.org> --
|
-- --
|
-- --
|
-- This source file is free software: you can redistribute it and/or modify --
|
-- This source file is free software: you can redistribute it and/or modify --
|
-- it under the terms of the GNU Lesser General Public License as published --
|
-- it under the terms of the GNU Lesser General Public License as published --
|
-- by the Free Software Foundation, either version 3 of the License, or --
|
-- by the Free Software Foundation, either version 3 of the License, or --
|
-- (at your option) any later version. --
|
-- (at your option) any later version. --
|
Line 19... |
Line 19... |
-- along with this program. If not, see <http://www.gnu.org/licenses/>. --
|
-- along with this program. If not, see <http://www.gnu.org/licenses/>. --
|
-- --
|
-- --
|
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
--
|
--
|
|
-- Revision 1.02 2008/01/23
|
|
-- bugfix Timing
|
|
--
|
-- Revision 1.01 2007/11/28
|
-- Revision 1.01 2007/11/28
|
-- add MOVEP
|
-- add MOVEP
|
-- Bugfix Interrupt in MOVEQ
|
-- Bugfix Interrupt in MOVEQ
|
--
|
--
|
-- Revision 1.0 2007/11/05
|
-- Revision 1.0 2007/11/05
|
Line 53... |
Line 56... |
addr : out std_logic_vector(31 downto 0);
|
addr : out std_logic_vector(31 downto 0);
|
data_out : out std_logic_vector(15 downto 0);
|
data_out : out std_logic_vector(15 downto 0);
|
as : out std_logic;
|
as : out std_logic;
|
uds : out std_logic;
|
uds : out std_logic;
|
lds : out std_logic;
|
lds : out std_logic;
|
rw : out std_logic
|
rw : out std_logic;
|
|
drive_data : out std_logic --enable for data_out driver
|
);
|
);
|
end TG68;
|
end TG68;
|
|
|
ARCHITECTURE logic OF TG68 IS
|
ARCHITECTURE logic OF TG68 IS
|
|
|
Line 94... |
Line 98... |
SIGNAL wr : std_logic;
|
SIGNAL wr : std_logic;
|
SIGNAL uds_in : std_logic;
|
SIGNAL uds_in : std_logic;
|
SIGNAL lds_in : std_logic;
|
SIGNAL lds_in : std_logic;
|
SIGNAL state : std_logic_vector(1 downto 0);
|
SIGNAL state : std_logic_vector(1 downto 0);
|
SIGNAL clkena : std_logic;
|
SIGNAL clkena : std_logic;
|
|
SIGNAL n_clk : std_logic;
|
|
SIGNAL cpuIPL : std_logic_vector(2 downto 0);
|
|
|
|
|
BEGIN
|
BEGIN
|
|
|
|
n_clk <= NOT clk;
|
|
|
TG68_fast_inst: TG68_fast
|
TG68_fast_inst: TG68_fast
|
PORT MAP (
|
PORT MAP (
|
clk => not clk, -- : in std_logic;
|
clk => n_clk, -- : in std_logic;
|
reset => reset, -- : in std_logic;
|
reset => reset, -- : in std_logic;
|
clkena_in => clkena, -- : in std_logic;
|
clkena_in => clkena, -- : in std_logic;
|
data_in => data_in, -- : in std_logic_vector(15 downto 0);
|
data_in => data_in, -- : in std_logic_vector(15 downto 0);
|
IPL => IPL, -- : in std_logic_vector(2 downto 0);
|
IPL => cpuIPL, -- : in std_logic_vector(2 downto 0);
|
test_IPL => '0', -- : in std_logic;
|
test_IPL => '0', -- : in std_logic;
|
address => addr, -- : out std_logic_vector(31 downto 0);
|
address => addr, -- : out std_logic_vector(31 downto 0);
|
data_write => data_out, -- : out std_logic_vector(15 downto 0);
|
data_write => data_out, -- : out std_logic_vector(15 downto 0);
|
state_out => state, -- : out std_logic_vector(1 downto 0);
|
state_out => state, -- : out std_logic_vector(1 downto 0);
|
decodeOPC => decode, -- : buffer std_logic;
|
decodeOPC => decode, -- : buffer std_logic;
|
wr => wr, -- : out std_logic;
|
wr => wr, -- : out std_logic;
|
UDS => uds_in, -- : out std_logic;
|
UDS => uds_in, -- : out std_logic;
|
LDS => lds_in -- : out std_logic;
|
LDS => lds_in -- : out std_logic;
|
);
|
);
|
|
|
-- clkena <= '1' WHEN clkena_in='1' AND ((clkena_e OR decode)='1')
|
|
-- ELSE '0';
|
|
|
|
|
|
PROCESS (clk)
|
PROCESS (clk)
|
BEGIN
|
BEGIN
|
IF rising_edge(clk) THEN
|
|
-- IF clkena_in='1' AND ((clkena_e OR decode)='1') THEN
|
|
IF clkena_in='1' AND (clkena_e='1' OR state="01") THEN
|
IF clkena_in='1' AND (clkena_e='1' OR state="01") THEN
|
clkena <= '1';
|
clkena <= '1';
|
ELSE
|
ELSE
|
clkena <= '0';
|
clkena <= '0';
|
END IF;
|
END IF;
|
END IF;
|
|
END PROCESS;
|
END PROCESS;
|
|
|
PROCESS (clk, reset, state, as_s, as_e, rw_s, rw_e, uds_s, uds_e, lds_s, lds_e)
|
PROCESS (clk, reset, state, as_s, as_e, rw_s, rw_e, uds_s, uds_e, lds_s, lds_e)
|
BEGIN
|
BEGIN
|
IF state="01" THEN
|
IF state="01" THEN
|
Line 177... |
Line 178... |
IF waitm='0' THEN
|
IF waitm='0' THEN
|
S_state <= "11";
|
S_state <= "11";
|
END IF;
|
END IF;
|
WHEN "11" =>
|
WHEN "11" =>
|
S_state <= "00";
|
S_state <= "00";
|
|
WHEN OTHERS => null;
|
END CASE;
|
END CASE;
|
END IF;
|
END IF;
|
END IF;
|
END IF;
|
END IF;
|
END IF;
|
IF reset='0' THEN
|
IF reset='0' THEN
|
as_e <= '1';
|
as_e <= '1';
|
rw_e <= '1';
|
rw_e <= '1';
|
uds_e <= '1';
|
uds_e <= '1';
|
lds_e <= '1';
|
lds_e <= '1';
|
clkena_e <= '0';
|
clkena_e <= '0';
|
|
cpuIPL <= "111";
|
|
drive_data <= '0';
|
ELSIF falling_edge(clk) THEN
|
ELSIF falling_edge(clk) THEN
|
IF clkena_in='1' THEN
|
IF clkena_in='1' THEN
|
as_e <= '1';
|
as_e <= '1';
|
rw_e <= '1';
|
rw_e <= '1';
|
uds_e <= '1';
|
uds_e <= '1';
|
lds_e <= '1';
|
lds_e <= '1';
|
clkena_e <= '0';
|
clkena_e <= '0';
|
|
drive_data <= '0';
|
CASE S_state IS
|
CASE S_state IS
|
WHEN "00" =>
|
WHEN "00" => null;
|
WHEN "01" =>
|
WHEN "01" => drive_data <= NOT wr;
|
WHEN "10" => as_e <= '0';
|
WHEN "10" => as_e <= '0';
|
uds_e <= uds_in;
|
uds_e <= uds_in;
|
lds_e <= lds_in;
|
lds_e <= lds_in;
|
|
cpuIPL <= IPL;
|
|
drive_data <= NOT wr;
|
IF state="01" THEN
|
IF state="01" THEN
|
clkena_e <= '1';
|
clkena_e <= '1';
|
waitm <= '0';
|
waitm <= '0';
|
ELSE
|
ELSE
|
clkena_e <= NOT dtack;
|
clkena_e <= NOT dtack;
|
waitm <= dtack;
|
waitm <= dtack;
|
END IF;
|
END IF;
|
WHEN "11" =>
|
WHEN OTHERS => null;
|
END CASE;
|
END CASE;
|
END IF;
|
END IF;
|
END IF;
|
END IF;
|
END PROCESS;
|
END PROCESS;
|
END;
|
END;
|
No newline at end of file
|
No newline at end of file
|