mirror of
https://github.com/hoglet67/AtomBusMon.git
synced 2024-06-02 18:41:35 +00:00
43df61cd06
Change-Id: Ic21b05ae8ecb828d32e55fe36be501800cfb3407
129 lines
4.0 KiB
VHDL
129 lines
4.0 KiB
VHDL
--************************************************************************************************
|
|
-- Internal I/O registers (implemented inside the core) decoder/multiplexer
|
|
-- for AVR core
|
|
-- Version 1.3 (Special version for the JTAG OCD)
|
|
-- Designed by Ruslan Lepetenok
|
|
-- Modified 22.04.2004
|
|
--************************************************************************************************
|
|
|
|
library IEEE;
|
|
use IEEE.std_logic_1164.all;
|
|
use IEEE.std_logic_unsigned.all;
|
|
|
|
use WORK.AVRuCPackage.all;
|
|
|
|
entity io_reg_file is port (
|
|
--Clock and reset
|
|
cp2 : in std_logic;
|
|
cp2en : in std_logic;
|
|
ireset : in std_logic;
|
|
|
|
adr : in std_logic_vector(15 downto 0);
|
|
iowe : in std_logic;
|
|
dbusout : in std_logic_vector(7 downto 0);
|
|
|
|
sreg_fl_in : in std_logic_vector(7 downto 0);
|
|
sreg_out : out std_logic_vector(7 downto 0);
|
|
|
|
sreg_fl_wr_en : in std_logic_vector (7 downto 0); --FLAGS WRITE ENABLE SIGNALS
|
|
|
|
spl_out : out std_logic_vector(7 downto 0);
|
|
sph_out : out std_logic_vector(7 downto 0);
|
|
sp_ndown_up : in std_logic; -- DIRECTION OF CHANGING OF STACK POINTER SPH:SPL 0->UP(+) 1->DOWN(-)
|
|
sp_en : in std_logic; -- WRITE ENABLE(COUNT ENABLE) FOR SPH AND SPL REGISTERS
|
|
|
|
rampz_out : out std_logic_vector(7 downto 0));
|
|
end io_reg_file;
|
|
|
|
architecture rtl of io_reg_file is
|
|
signal sreg : std_logic_vector(7 downto 0);
|
|
signal sph : std_logic_vector(7 downto 0);
|
|
signal spl : std_logic_vector(7 downto 0);
|
|
signal rampz : std_logic_vector(7 downto 0);
|
|
|
|
signal sp_int : std_logic_vector(15 downto 0);
|
|
signal sp_intp : std_logic_vector(15 downto 0);
|
|
signal sp_intm : std_logic_vector(15 downto 0);
|
|
signal sp_res : std_logic_vector(15 downto 0);
|
|
|
|
|
|
begin
|
|
|
|
sreg_write:process(cp2,ireset)
|
|
begin
|
|
if ireset='0' then
|
|
sreg <= (others => '0');
|
|
elsif (cp2='1' and cp2'event) then
|
|
if (cp2en='1') then -- Clock enable
|
|
for i in sreg'range loop
|
|
if (sreg_fl_wr_en(i)='1' or (adr=SREG_Address and iowe='1')) then -- CLOCK ENABLE
|
|
if iowe='1' then
|
|
sreg(i) <= dbusout(i); -- FROM THE INTERNAL DATA BUS
|
|
else
|
|
sreg(i) <= sreg_fl_in(i); -- FROM ALU FLAGS
|
|
end if;
|
|
end if;
|
|
end loop;
|
|
end if;
|
|
end if;
|
|
end process;
|
|
|
|
sreg_out <= sreg;
|
|
|
|
|
|
sp_intp<=(sph&spl)+1;
|
|
sp_intm<=(sph&spl)-1;
|
|
sp_res<= sp_intm when sp_ndown_up='0' else sp_intp;
|
|
|
|
spl_write:process(cp2,ireset)
|
|
begin
|
|
if ireset='0' then
|
|
spl <= (others => '0');
|
|
elsif (cp2='1' and cp2'event) then
|
|
if (sp_en='1' or (adr=SPL_Address and iowe='1')) then -- CLOCK ENABLE
|
|
if iowe='1' then
|
|
spl <= dbusout; -- FROM THE INTERNAL DATA BUS
|
|
else
|
|
spl <= sp_res(7 downto 0); -- FROM SPL BUS
|
|
end if;
|
|
end if;
|
|
|
|
end if;
|
|
end process;
|
|
|
|
spl_out <= spl;
|
|
|
|
sph_write:process(cp2,ireset)
|
|
begin
|
|
if ireset='0' then
|
|
sph <= (others => '0');
|
|
elsif (cp2='1' and cp2'event) then
|
|
if (sp_en='1' or (adr=SPH_Address and iowe='1')) then -- CLOCK ENABLE
|
|
if iowe='1' then
|
|
sph <= dbusout; -- FROM THE INTERNAL DATA BUS
|
|
else
|
|
sph <= sp_res(15 downto 8); -- FROM SPH BUS
|
|
end if;
|
|
end if;
|
|
|
|
end if;
|
|
end process;
|
|
|
|
sph_out <= sph;
|
|
|
|
|
|
rampz_write:process(cp2,ireset)
|
|
begin
|
|
if ireset='0' then
|
|
rampz <= (others => '0');
|
|
elsif (cp2='1' and cp2'event) then
|
|
if (adr=RAMPZ_Address and iowe='1') then -- CLOCK ENABLE
|
|
rampz <= dbusout; -- FROM THE INTERNAL DATA BUS
|
|
end if;
|
|
end if;
|
|
end process;
|
|
|
|
rampz_out <= rampz;
|
|
|
|
end rtl;
|