library IEEE;
|
library IEEE;
|
use IEEE.std_logic_1164.all;
|
use IEEE.std_logic_1164.all;
|
use IEEE.std_logic_unsigned.all;
|
use IEEE.std_logic_unsigned.all;
|
|
|
use work.cpu_pack.ALL;
|
use work.cpu_pack.ALL;
|
|
|
library UNISIM;
|
library UNISIM;
|
use UNISIM.VComponents.all;
|
use UNISIM.VComponents.all;
|
|
|
entity cpu is
|
entity cpu is
|
PORT( CLK_I : in STD_LOGIC;
|
PORT( CLK_I : in STD_LOGIC;
|
SWITCH : in STD_LOGIC_VECTOR (9 downto 0);
|
SWITCH : in STD_LOGIC_VECTOR (9 downto 0);
|
|
|
SER_IN : in STD_LOGIC;
|
SER_IN : in STD_LOGIC;
|
SER_OUT : out STD_LOGIC;
|
SER_OUT : out STD_LOGIC;
|
|
|
TEMP_SPO : in STD_LOGIC;
|
TEMP_SPO : in STD_LOGIC;
|
TEMP_SPI : out STD_LOGIC;
|
TEMP_SPI : out STD_LOGIC;
|
|
|
TEMP_CE : out STD_LOGIC;
|
TEMP_CE : out STD_LOGIC;
|
TEMP_SCLK : out STD_LOGIC;
|
TEMP_SCLK : out STD_LOGIC;
|
SEG1 : out STD_LOGIC_VECTOR (7 downto 0);
|
SEG1 : out STD_LOGIC_VECTOR (7 downto 0);
|
SEG2 : out STD_LOGIC_VECTOR (7 downto 0);
|
SEG2 : out STD_LOGIC_VECTOR (7 downto 0);
|
LED : out STD_LOGIC_VECTOR( 7 downto 0);
|
LED : out STD_LOGIC_VECTOR( 7 downto 0);
|
|
|
XM_ADR : out STD_LOGIC_VECTOR(15 downto 0);
|
XM_ADR : out STD_LOGIC_VECTOR(15 downto 0);
|
XM_RDAT : in STD_LOGIC_VECTOR( 7 downto 0);
|
XM_RDAT : in STD_LOGIC_VECTOR( 7 downto 0);
|
XM_WDAT : out STD_LOGIC_VECTOR( 7 downto 0);
|
XM_WDAT : out STD_LOGIC_VECTOR( 7 downto 0);
|
XM_WE : out STD_LOGIC;
|
XM_WE : out STD_LOGIC;
|
XM_CE : out STD_LOGIC
|
XM_CE : out STD_LOGIC
|
);
|
);
|
end cpu;
|
end cpu;
|
|
|
architecture behavioral of cpu is
|
architecture behavioral of cpu is
|
|
|
COMPONENT bin_to_7segment
|
COMPONENT bin_to_7segment
|
PORT( CLK_I : IN std_logic;
|
PORT( CLK_I : IN std_logic;
|
PC : IN std_logic_vector(15 downto 0);
|
PC : IN std_logic_vector(15 downto 0);
|
SEG1 : OUT std_logic_vector(7 downto 1);
|
SEG1 : OUT std_logic_vector(7 downto 1);
|
SEG2 : OUT std_logic_vector(7 downto 0)
|
SEG2 : OUT std_logic_vector(7 downto 0)
|
);
|
);
|
END COMPONENT;
|
END COMPONENT;
|
|
|
COMPONENT cpu_engine
|
COMPONENT cpu_engine
|
PORT( CLK_I : in std_logic;
|
PORT( CLK_I : in std_logic;
|
DAT_I : in std_logic_vector( 7 downto 0);
|
DAT_I : in std_logic_vector( 7 downto 0);
|
DAT_O : out std_logic_vector( 7 downto 0);
|
DAT_O : out std_logic_vector( 7 downto 0);
|
RST_I : in std_logic;
|
RST_I : in std_logic;
|
ACK_I : in std_logic;
|
ACK_I : in std_logic;
|
ADR_O : out std_logic_vector(15 downto 0);
|
ADR_O : out std_logic_vector(15 downto 0);
|
CYC_O : out std_logic;
|
CYC_O : out std_logic;
|
STB_O : out std_logic;
|
STB_O : out std_logic;
|
TGA_O : out std_logic_vector(0 downto 0);
|
TGA_O : out std_logic_vector(0 downto 0);
|
WE_O : out std_logic;
|
WE_O : out std_logic;
|
|
|
INT : in std_logic;
|
INT : in std_logic;
|
HALT : out std_logic;
|
HALT : out std_logic;
|
|
|
-- debug signals
|
-- debug signals
|
--
|
--
|
Q_PC : out std_logic_vector(15 downto 0);
|
Q_PC : out std_logic_vector(15 downto 0);
|
Q_OPC : out std_logic_vector( 7 downto 0);
|
Q_OPC : out std_logic_vector( 7 downto 0);
|
Q_CAT : out op_category;
|
Q_CAT : out op_category;
|
Q_IMM : out std_logic_vector(15 downto 0);
|
Q_IMM : out std_logic_vector(15 downto 0);
|
Q_CYC : out cycle;
|
Q_CYC : out cycle;
|
|
|
-- select signals
|
-- select signals
|
Q_SX : out std_logic_vector(1 downto 0);
|
Q_SX : out std_logic_vector(1 downto 0);
|
Q_SY : out std_logic_vector(3 downto 0);
|
Q_SY : out std_logic_vector(3 downto 0);
|
Q_OP : out std_logic_vector(4 downto 0);
|
Q_OP : out std_logic_vector(4 downto 0);
|
Q_SA : out std_logic_vector(4 downto 0);
|
Q_SA : out std_logic_vector(4 downto 0);
|
Q_SMQ : out std_logic;
|
Q_SMQ : out std_logic;
|
|
|
-- write enable/select signal
|
-- write enable/select signal
|
Q_WE_RR : out std_logic;
|
Q_WE_RR : out std_logic;
|
Q_WE_LL : out std_logic;
|
Q_WE_LL : out std_logic;
|
Q_WE_SP : out SP_OP;
|
Q_WE_SP : out SP_OP;
|
|
|
Q_RR : out std_logic_vector(15 downto 0);
|
Q_RR : out std_logic_vector(15 downto 0);
|
Q_LL : out std_logic_vector(15 downto 0);
|
Q_LL : out std_logic_vector(15 downto 0);
|
Q_SP : out std_logic_vector(15 downto 0)
|
Q_SP : out std_logic_vector(15 downto 0)
|
);
|
);
|
END COMPONENT;
|
END COMPONENT;
|
|
|
COMPONENT input_output
|
COMPONENT input_output
|
PORT( CLK_I : IN std_logic;
|
PORT( CLK_I : IN std_logic;
|
CYC_I : IN std_logic;
|
CYC_I : IN std_logic;
|
RST_O : OUT std_logic;
|
RST_O : OUT std_logic;
|
STB_I : IN std_logic;
|
STB_I : IN std_logic;
|
ACK_O : OUT std_logic;
|
ACK_O : OUT std_logic;
|
IO : IN std_logic;
|
IO : IN std_logic;
|
WE_I : IN std_logic;
|
WE_I : IN std_logic;
|
ADR_I : IN std_logic_vector(7 downto 0);
|
ADR_I : IN std_logic_vector(7 downto 0);
|
|
|
TEMP_SPO : IN std_logic;
|
TEMP_SPO : IN std_logic;
|
TEMP_SPI : OUT std_logic;
|
TEMP_SPI : OUT std_logic;
|
TEMP_CE : OUT std_logic;
|
TEMP_CE : OUT std_logic;
|
TEMP_SCLK : OUT std_logic;
|
TEMP_SCLK : OUT std_logic;
|
|
|
SER_IN : IN std_logic;
|
SER_IN : IN std_logic;
|
SER_OUT : OUT std_logic;
|
SER_OUT : OUT std_logic;
|
|
|
SWITCH : IN std_logic_vector(9 downto 0);
|
SWITCH : IN std_logic_vector(9 downto 0);
|
LED : OUT std_logic_vector(7 downto 0);
|
LED : OUT std_logic_vector(7 downto 0);
|
|
|
IO_WDAT : IN std_logic_vector(7 downto 0);
|
IO_WDAT : IN std_logic_vector(7 downto 0);
|
IO_RDAT : OUT std_logic_vector(7 downto 0);
|
IO_RDAT : OUT std_logic_vector(7 downto 0);
|
INT : OUT std_logic;
|
INT : OUT std_logic;
|
HALT : in std_logic
|
HALT : in std_logic
|
);
|
);
|
END COMPONENT;
|
END COMPONENT;
|
|
|
signal CLR : std_logic;
|
signal CLR : std_logic;
|
|
|
signal ADR : std_logic_vector(15 downto 0);
|
signal ADR : std_logic_vector(15 downto 0);
|
signal CYC : std_logic;
|
signal CYC : std_logic;
|
signal STB : std_logic;
|
signal STB : std_logic;
|
signal XM_STB : std_logic;
|
signal XM_STB : std_logic;
|
signal IO_STB : std_logic;
|
signal IO_STB : std_logic;
|
signal ACK : std_logic;
|
signal ACK : std_logic;
|
signal XM_ACK : std_logic;
|
signal XM_ACK : std_logic;
|
signal IO_ACK : std_logic;
|
signal IO_ACK : std_logic;
|
|
|
signal HALT : std_logic;
|
signal HALT : std_logic;
|
signal INT : std_logic;
|
signal INT : std_logic;
|
signal IO : std_logic;
|
signal IO : std_logic;
|
signal WE : std_logic;
|
signal WE : std_logic;
|
signal IO_RDAT : std_logic_vector( 7 downto 0);
|
signal IO_RDAT : std_logic_vector( 7 downto 0);
|
signal WDAT : std_logic_vector( 7 downto 0);
|
signal WDAT : std_logic_vector( 7 downto 0);
|
signal RDAT : std_logic_vector( 7 downto 0);
|
signal RDAT : std_logic_vector( 7 downto 0);
|
|
|
signal PC : std_logic_vector(15 downto 0);
|
signal PC : std_logic_vector(15 downto 0);
|
signal Q_C_SX : std_logic_vector(1 downto 0);
|
signal Q_C_SX : std_logic_vector(1 downto 0);
|
signal Q_C_SY : std_logic_vector(3 downto 0);
|
signal Q_C_SY : std_logic_vector(3 downto 0);
|
signal Q_C_OP : std_logic_vector(4 downto 0);
|
signal Q_C_OP : std_logic_vector(4 downto 0);
|
signal Q_C_SA : std_logic_vector(4 downto 0);
|
signal Q_C_SA : std_logic_vector(4 downto 0);
|
signal Q_C_SMQ : std_logic;
|
signal Q_C_SMQ : std_logic;
|
|
|
signal Q_C_WE_RR : std_logic;
|
signal Q_C_WE_RR : std_logic;
|
signal Q_C_WE_LL : std_logic;
|
signal Q_C_WE_LL : std_logic;
|
signal Q_C_WE_SP : SP_OP;
|
signal Q_C_WE_SP : SP_OP;
|
|
|
signal Q_C_RR : std_logic_vector(15 downto 0);
|
signal Q_C_RR : std_logic_vector(15 downto 0);
|
signal Q_C_LL : std_logic_vector(15 downto 0);
|
signal Q_C_LL : std_logic_vector(15 downto 0);
|
signal Q_C_SP : std_logic_vector(15 downto 0);
|
signal Q_C_SP : std_logic_vector(15 downto 0);
|
|
|
signal Q_C_OPC : std_logic_vector( 7 downto 0);
|
signal Q_C_OPC : std_logic_vector( 7 downto 0);
|
signal Q_C_CAT : op_category;
|
signal Q_C_CAT : op_category;
|
signal Q_C_IMM : std_logic_vector(15 downto 0);
|
signal Q_C_IMM : std_logic_vector(15 downto 0);
|
signal Q_C_CYC : cycle;
|
signal Q_C_CYC : cycle;
|
|
|
begin
|
begin
|
|
|
SEG1(0) <= HALT;
|
SEG1(0) <= HALT;
|
XM_ADR <= ADR;
|
XM_ADR <= ADR;
|
XM_WDAT <= WDAT;
|
XM_WDAT <= WDAT;
|
XM_WE <= WE;
|
XM_WE <= WE;
|
XM_STB <= STB and not IO;
|
XM_STB <= STB and not IO;
|
IO_STB <= STB and IO;
|
IO_STB <= STB and IO;
|
XM_ACK <= XM_STB;
|
XM_ACK <= XM_STB;
|
XM_CE <= CYC and not IO;
|
XM_CE <= CYC and not IO;
|
RDAT <= IO_RDAT when (IO = '1') else XM_RDAT;
|
RDAT <= IO_RDAT when (IO = '1') else XM_RDAT;
|
ACK <= IO_ACK when (IO = '1') else XM_ACK;
|
ACK <= IO_ACK when (IO = '1') else XM_ACK;
|
|
|
seg7: bin_to_7segment
|
seg7: bin_to_7segment
|
PORT MAP( CLK_I => CLK_I,
|
PORT MAP( CLK_I => CLK_I,
|
PC => PC,
|
PC => PC,
|
SEG1 => SEG1(7 downto 1), -- SEG1(0) is HALT
|
SEG1 => SEG1(7 downto 1), -- SEG1(0) is HALT
|
SEG2 => SEG2
|
SEG2 => SEG2
|
);
|
);
|
|
|
eng: cpu_engine
|
eng: cpu_engine
|
PORT MAP( CLK_I => CLK_I,
|
PORT MAP( CLK_I => CLK_I,
|
DAT_I => RDAT,
|
DAT_I => RDAT,
|
DAT_O => WDAT,
|
DAT_O => WDAT,
|
RST_I => CLR, -- SW-1 (RESET)
|
RST_I => CLR, -- SW-1 (RESET)
|
ACK_I => ACK,
|
ACK_I => ACK,
|
CYC_O => CYC,
|
CYC_O => CYC,
|
STB_O => STB,
|
STB_O => STB,
|
ADR_O => ADR,
|
ADR_O => ADR,
|
TGA_O(0) => IO,
|
TGA_O(0) => IO,
|
WE_O => WE,
|
WE_O => WE,
|
|
|
INT => INT,
|
INT => INT,
|
HALT => HALT,
|
HALT => HALT,
|
|
|
Q_PC => PC,
|
Q_PC => PC,
|
Q_OPC => Q_C_OPC,
|
Q_OPC => Q_C_OPC,
|
Q_CAT => Q_C_CAT,
|
Q_CAT => Q_C_CAT,
|
Q_IMM => Q_C_IMM,
|
Q_IMM => Q_C_IMM,
|
Q_CYC => Q_C_CYC,
|
Q_CYC => Q_C_CYC,
|
|
|
Q_SX => Q_C_SX,
|
Q_SX => Q_C_SX,
|
Q_SY => Q_C_SY,
|
Q_SY => Q_C_SY,
|
Q_OP => Q_C_OP,
|
Q_OP => Q_C_OP,
|
Q_SA => Q_C_SA,
|
Q_SA => Q_C_SA,
|
Q_SMQ => Q_C_SMQ,
|
Q_SMQ => Q_C_SMQ,
|
|
|
Q_WE_RR => Q_C_WE_RR,
|
Q_WE_RR => Q_C_WE_RR,
|
Q_WE_LL => Q_C_WE_LL,
|
Q_WE_LL => Q_C_WE_LL,
|
Q_WE_SP => Q_C_WE_SP,
|
Q_WE_SP => Q_C_WE_SP,
|
|
|
Q_RR => Q_C_RR,
|
Q_RR => Q_C_RR,
|
Q_LL => Q_C_LL,
|
Q_LL => Q_C_LL,
|
Q_SP => Q_C_SP
|
Q_SP => Q_C_SP
|
);
|
);
|
|
|
ino: input_output
|
ino: input_output
|
PORT MAP( CLK_I => CLK_I,
|
PORT MAP( CLK_I => CLK_I,
|
CYC_I => CYC,
|
CYC_I => CYC,
|
RST_O => CLR,
|
RST_O => CLR,
|
STB_I => IO_STB,
|
STB_I => IO_STB,
|
ACK_O => IO_ACK,
|
ACK_O => IO_ACK,
|
|
|
TEMP_SPO => TEMP_SPO,
|
TEMP_SPO => TEMP_SPO,
|
TEMP_SPI => TEMP_SPI,
|
TEMP_SPI => TEMP_SPI,
|
TEMP_CE => TEMP_CE,
|
TEMP_CE => TEMP_CE,
|
TEMP_SCLK => TEMP_SCLK,
|
TEMP_SCLK => TEMP_SCLK,
|
|
|
SER_IN => SER_IN,
|
SER_IN => SER_IN,
|
SER_OUT => SER_OUT,
|
SER_OUT => SER_OUT,
|
|
|
SWITCH => SWITCH,
|
SWITCH => SWITCH,
|
LED => LED,
|
LED => LED,
|
|
|
IO => IO,
|
IO => IO,
|
WE_I => WE,
|
WE_I => WE,
|
ADR_I => ADR(7 downto 0),
|
ADR_I => ADR(7 downto 0),
|
IO_RDAT => IO_RDAT,
|
IO_RDAT => IO_RDAT,
|
IO_WDAT => WDAT,
|
IO_WDAT => WDAT,
|
INT => INT,
|
INT => INT,
|
HALT => HALT
|
HALT => HALT
|
);
|
);
|
|
|
end behavioral;
|
end behavioral;
|
|
|