Line 18... |
Line 18... |
END testbench;
|
END testbench;
|
|
|
ARCHITECTURE behavior OF testbench IS
|
ARCHITECTURE behavior OF testbench IS
|
|
|
COMPONENT cpu_engine
|
COMPONENT cpu_engine
|
PORT( CLK : in std_logic;
|
PORT(
|
CCK : in std_logic;
|
clk_i : IN std_logic;
|
CLR : in std_logic;
|
dat_i : IN std_logic_vector(7 downto 0);
|
Q_PC : out std_logic_vector(15 downto 0);
|
rst_i : IN std_logic;
|
Q_OPC : out std_logic_vector( 7 downto 0);
|
ack_i : IN std_logic;
|
Q_CAT : out op_category;
|
int : IN std_logic;
|
Q_IMM : out std_logic_vector(15 downto 0);
|
dat_o : OUT std_logic_vector(7 downto 0);
|
Q_CYC : out cycle;
|
adr_o : OUT std_logic_vector(15 downto 0);
|
|
cyc_o : OUT std_logic;
|
-- input/output
|
stb_o : OUT std_logic;
|
INT : in std_logic;
|
tga_o : OUT std_logic_vector(0 to 0);
|
IO_ADR : out std_logic_vector(7 downto 0);
|
we_o : OUT std_logic;
|
IO_RD : out std_logic;
|
halt : OUT std_logic;
|
IO_WR : out std_logic;
|
q_pc : OUT std_logic_vector(15 downto 0);
|
IO_RDAT : in std_logic_vector( 7 downto 0);
|
q_opc : OUT std_logic_vector(7 downto 0);
|
|
q_cat : OUT op_category;
|
-- memory
|
q_imm : OUT std_logic_vector(15 downto 0);
|
XM_ADR : out std_logic_vector(15 downto 0);
|
q_cyc : OUT cycle;
|
XM_RDAT : in std_logic_vector( 7 downto 0);
|
q_sx : OUT std_logic_vector(1 downto 0);
|
XM_WDAT : out std_logic_vector( 7 downto 0);
|
q_sy : OUT std_logic_vector(3 downto 0);
|
XM_WE : out std_logic;
|
q_op : OUT std_logic_vector(4 downto 0);
|
XM_CE : out std_logic;
|
q_sa : OUT std_logic_vector(4 downto 0);
|
|
q_smq : OUT std_logic;
|
-- select signals
|
q_we_rr : OUT std_logic;
|
Q_SX : out std_logic_vector(1 downto 0);
|
q_we_ll : OUT std_logic;
|
Q_SY : out std_logic_vector(3 downto 0);
|
q_we_sp : OUT SP_OP;
|
Q_OP : out std_logic_vector(4 downto 0);
|
q_rr : OUT std_logic_vector(15 downto 0);
|
Q_SA : out std_logic_vector(4 downto 0);
|
q_ll : OUT std_logic_vector(15 downto 0);
|
Q_SMQ : out std_logic;
|
q_sp : OUT std_logic_vector(15 downto 0)
|
|
|
-- write enable/select signal
|
|
Q_WE_RR : out std_logic;
|
|
Q_WE_LL : out std_logic;
|
|
Q_WE_SP : out SP_OP;
|
|
|
|
Q_RR : 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);
|
|
HALT : out std_logic
|
|
);
|
);
|
END COMPONENT;
|
END COMPONENT;
|
|
|
signal CLK : std_logic;
|
signal CLK_I : std_logic;
|
signal CLR : std_logic;
|
signal DAT_I : std_logic_vector( 7 downto 0);
|
signal Q_PC : std_logic_vector(15 downto 0);
|
signal DAT_O : std_logic_vector( 7 downto 0);
|
signal Q_OPC : std_logic_vector( 7 downto 0);
|
signal RST_I : std_logic;
|
signal Q_CAT : op_category;
|
signal ACK_I : std_logic;
|
signal Q_CYC : cycle;
|
signal ADR_O : std_logic_vector(15 downto 0);
|
signal Q_IMM : std_logic_vector(15 downto 0);
|
signal CYC_O : std_logic;
|
|
signal STB_O : std_logic;
|
|
signal TGA_O : std_logic_vector( 0 downto 0); -- '1' if I/O
|
|
signal WE_O : std_logic;
|
|
|
signal Q_SP : std_logic_vector(15 downto 0);
|
|
signal Q_LL : std_logic_vector(15 downto 0);
|
|
signal Q_RR : std_logic_vector(15 downto 0);
|
|
|
|
-- input/output
|
|
signal INT : std_logic;
|
signal INT : std_logic;
|
signal IO_RD : std_logic;
|
|
signal IO_ADR : std_logic_vector( 7 downto 0);
|
|
signal IO_WR : std_logic;
|
|
signal IO_RDAT : std_logic_vector( 7 downto 0);
|
|
signal HALT : std_logic;
|
signal HALT : std_logic;
|
|
|
-- memory
|
-- debug signals
|
signal XM_ADR : std_logic_vector(15 downto 0);
|
--
|
signal XM_RDAT : std_logic_vector( 7 downto 0);
|
signal Q_PC : std_logic_vector(15 downto 0);
|
signal XM_WDAT : std_logic_vector( 7 downto 0);
|
signal Q_OPC : std_logic_vector( 7 downto 0);
|
signal XM_WE : std_logic;
|
signal Q_CAT : op_category;
|
signal XM_CE : std_logic;
|
signal Q_IMM : std_logic_vector(15 downto 0);
|
|
signal Q_CYC : cycle;
|
|
|
-- select signals
|
-- select signals
|
signal Q_SX : std_logic_vector(1 downto 0);
|
signal Q_SX : std_logic_vector(1 downto 0);
|
signal Q_SY : std_logic_vector(3 downto 0);
|
signal Q_SY : std_logic_vector(3 downto 0);
|
signal Q_OP : std_logic_vector(4 downto 0);
|
signal Q_OP : std_logic_vector(4 downto 0);
|
Line 99... |
Line 84... |
-- write enable/select signal
|
-- write enable/select signal
|
signal Q_WE_RR : std_logic;
|
signal Q_WE_RR : std_logic;
|
signal Q_WE_LL : std_logic;
|
signal Q_WE_LL : std_logic;
|
signal Q_WE_SP : SP_OP;
|
signal Q_WE_SP : SP_OP;
|
|
|
|
signal Q_RR : std_logic_vector(15 downto 0);
|
|
signal Q_LL : std_logic_vector(15 downto 0);
|
|
signal Q_SP : std_logic_vector(15 downto 0);
|
|
|
signal clk_counter : INTEGER := 0;
|
signal clk_counter : INTEGER := 0;
|
|
|
BEGIN
|
BEGIN
|
|
|
uut: cpu_engine PORT MAP(
|
uut: cpu_engine
|
CLK => CLK,
|
PORT MAP(
|
CCK => CLK,
|
clk_i => clk_i,
|
CLR => CLR,
|
dat_i => dat_i,
|
Q_PC => Q_PC,
|
dat_o => dat_o,
|
Q_OPC => Q_OPC,
|
rst_i => rst_i,
|
Q_CAT => Q_CAT,
|
ack_i => ack_i,
|
Q_IMM => Q_IMM,
|
adr_o => adr_o,
|
Q_CYC => Q_CYC,
|
cyc_o => cyc_o,
|
|
stb_o => stb_o,
|
INT => INT,
|
tga_o => tga_o,
|
IO_ADR => IO_ADR,
|
we_o => we_o,
|
IO_RD => IO_RD,
|
int => int,
|
IO_WR => IO_WR,
|
halt => halt,
|
IO_RDAT => IO_RDAT,
|
q_pc => q_pc,
|
|
q_opc => q_opc,
|
XM_ADR => XM_ADR,
|
q_cat => q_cat,
|
XM_RDAT => XM_RDAT,
|
q_imm => q_imm,
|
XM_WDAT => XM_WDAT,
|
q_cyc => q_cyc,
|
XM_WE => XM_WE,
|
q_sx => q_sx,
|
XM_CE => XM_CE,
|
q_sy => q_sy,
|
|
q_op => q_op,
|
Q_SX => Q_SX,
|
q_sa => q_sa,
|
Q_SY => Q_SY,
|
q_smq => q_smq,
|
Q_OP => Q_OP,
|
q_we_rr => q_we_rr,
|
Q_SA => Q_SA,
|
q_we_ll => q_we_ll,
|
Q_SMQ => Q_SMQ,
|
q_we_sp => q_we_sp,
|
|
q_rr => q_rr,
|
Q_WE_RR => Q_WE_RR,
|
q_ll => q_ll,
|
Q_WE_LL => Q_WE_LL,
|
q_sp => q_sp
|
Q_WE_SP => Q_WE_SP,
|
|
|
|
Q_RR => Q_RR,
|
|
Q_LL => Q_LL,
|
|
Q_SP => Q_SP,
|
|
HALT => HALT
|
|
);
|
);
|
|
|
|
ack_i <= stb_o;
|
|
|
-- *** Test Bench - User Defined Section ***
|
-- *** Test Bench - User Defined Section ***
|
PROCESS -- clock process for CLK,
|
PROCESS -- clock process for CLK_I,
|
BEGIN
|
BEGIN
|
CLOCK_LOOP : LOOP
|
CLOCK_LOOP : LOOP
|
CLK <= transport '0';
|
CLK_I <= transport '0';
|
WAIT FOR 1 ns;
|
WAIT FOR 1 ns;
|
CLK <= transport '1';
|
CLK_I <= transport '1';
|
WAIT FOR 1 ns;
|
WAIT FOR 1 ns;
|
WAIT FOR 11 ns;
|
WAIT FOR 11 ns;
|
CLK <= transport '0';
|
CLK_I <= transport '0';
|
WAIT FOR 12 ns;
|
WAIT FOR 12 ns;
|
END LOOP CLOCK_LOOP;
|
END LOOP CLOCK_LOOP;
|
END PROCESS;
|
END PROCESS;
|
|
|
PROCESS(CLK)
|
PROCESS(CLK_I)
|
BEGIN
|
BEGIN
|
if (rising_edge(CLK)) then
|
if (rising_edge(CLK_I)) then
|
if (Q_CYC = M1) then
|
if (Q_CYC = M1) then
|
CLK_COUNTER <= CLK_COUNTER + 1;
|
CLK_COUNTER <= CLK_COUNTER + 1;
|
end if;
|
end if;
|
|
|
if (XM_ADR(0) = '0') then IO_RDAT <= X"44"; -- data
|
if (ADR_O(0) = '0') then DAT_I <= X"44"; -- data
|
else IO_RDAT <= X"01"; -- control
|
else DAT_I <= X"01"; -- control
|
end if;
|
end if;
|
|
|
case CLK_COUNTER is
|
case CLK_COUNTER is
|
when 0 => CLR <= '1'; INT <= '0';
|
when 0 => RST_I <= '1'; INT <= '0';
|
when 1 => CLR <= '0';
|
when 1 => RST_I <= '0';
|
-- when 20 => INT <= '1';
|
-- when 20 => INT <= '1';
|
|
|
|
|
when 1000 => CLK_COUNTER <= 0;
|
when 1000 => CLK_COUNTER <= 0;
|
ASSERT (FALSE) REPORT
|
ASSERT (FALSE) REPORT
|