1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-01-20 01:34:38 +00:00
2019-07-22 23:42:05 +02:00

137 lines
4.6 KiB
VHDL

-- Copyright (c) 2015, $ME
-- All rights reserved.
--
-- Redistribution and use in source and synthezised forms, with or without modification, are permitted
-- provided that the following conditions are met:
--
-- 1. Redistributions of source code must retain the above copyright notice, this list of conditions
-- and the following disclaimer.
--
-- 2. Redistributions in synthezised 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.
--
-- 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 COPYRIGHT HOLDER 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.
--
--
-- implementation of a z80 ctc
--
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity ctc is
generic (
sysclk : integer := 500000; -- 50MHz
ctcclk : integer := 24576 -- 2.4576MHz
);
port (
clk : in std_logic;
res_n : in std_logic; -- negative
en : in std_logic; -- negative
dIn : in std_logic_vector(7 downto 0);
dOut : out std_logic_vector(7 downto 0);
cs : in std_logic_vector(1 downto 0);
m1_n : in std_logic; -- negative
iorq_n : in std_logic; -- negative
rd_n : in std_logic; -- negative
int : out std_logic_vector(3 downto 0);
intAck : in std_logic_vector(3 downto 0);
clk_trg : in std_logic_vector(3 downto 0);
zc_to : out std_logic_vector(3 downto 0);
kcSysClk : out std_logic
);
end ctc;
architecture rtl of ctc is
type byteArray is array (natural range <>) of std_logic_vector(7 downto 0);
signal clkCounter : integer range 0 to sysclk+ctcclk-1 := 0;
signal ctcClkEn : std_logic := '0';
signal cEn : std_logic_vector(3 downto 0);
signal cDOut : byteArray(3 downto 0);
signal cSetTC : std_logic_vector(3 downto 0);
signal setTC : std_logic;
signal irqVect : std_logic_vector(7 downto 3) := (others => '0');
signal intAckChannel : std_logic_vector(1 downto 0);
begin
kcSysClk <= ctcClkEn;
intAckChannel <=
"00" when intAck(0)='1' else
"01" when intAck(1)='1' else
"10" when intAck(2)='1' else
"11";
dOut <=
irqVect & intAckChannel & "0" when intAck/="0000" else -- int acknowledge
cDOut(0) when cEn(0)='1' else
cDOut(1) when cEn(1)='1' else
cDOut(2) when cEn(2)='1' else
cDOut(3);
setTC <=
cSetTC(0) when cs="00" else
cSetTC(1) when cs="01" else
cSetTC(2) when cs="10" else
cSetTC(3);
-- generate clock for ctc timer
clkGen : process
begin
wait until rising_edge(clk);
if (clkCounter>=sysclk-ctcclk) then
clkCounter <= clkCounter - sysclk + ctcclk;
ctcClkEn <= '1';
else
clkCounter <= clkCounter + ctcclk;
ctcClkEn <= '0';
end if;
end process;
cpuInt : process
begin
wait until rising_edge(clk);
if (en='0' and rd_n='1' and iorq_n='0' and m1_n='1' and dIn(0)='0' and setTC='0') then -- set irq vector
irqVect <= dIn(7 downto 3);
end if;
end process;
channels: for i in 0 to 3 generate
channel : entity work.ctc_channel
port map (
clk => clk,
res_n => res_n,
en => cEn(i),
dIn => dIn,
dOut => cDOut(i),
rd_n => rd_n,
int => int(i),
setTC => cSetTC(i),
ctcClkEn => ctcClkEn,
clk_trg => clk_trg(i),
zc_to => zc_to(i)
);
cEn(i) <= '1' when (en='0' and iorq_n='0' and m1_n='1' and to_integer(unsigned(cs))=i) else '0';
end generate;
end;