git-svn-id: http://moon:8086/svn/vhdl/trunk@1424 cc03376c-175c-47c8-b038-4cd826a8556b
This commit is contained in:
2021-03-21 11:37:55 +00:00
parent 73cfd45401
commit bdb8fec295
83 changed files with 9477 additions and 0 deletions
@@ -0,0 +1,171 @@
--------------------------------------------------------------------------
--
-- Copyright (C) 1993, Peter J. Ashenden
-- Mail: Dept. Computer Science
-- University of Adelaide, SA 5005, Australia
-- e-mail: petera@cs.adelaide.edu.au
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 1, or (at your option)
-- any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
--
--------------------------------------------------------------------------
--
-- $RCSfile: dlx_bus_monitor-behaviour.vhdl,v $ $Revision: 2.1 $ $Date: 1993/10/31 22:36:40 $
--
--------------------------------------------------------------------------
--
-- Behavioural architecture of DLX bus monitor
--
use std.textio.all,
work.dlx_instr.all,
work.images.image_hex;
architecture behaviour of dlx_bus_monitor is
begin
monitor : if enable generate
enabled_monitor : process
variable write_command, instr_fetch : boolean;
variable L : line;
begin
monitor_loop : loop
--
-- wait for a command, valid on leading edge of phi2
--
wait until phi2 = '1' and mem_enable = '1';
--
-- capture the command information
--
write_command := write_enable = '1';
instr_fetch := ifetch = '1';
write(L, tag);
write(L, string'(": "));
if write_command then
write(L, string'("D-write to "));
elsif instr_fetch then
write(L, string'("I-fetch from "));
else
write(L, string'("D-read from "));
end if;
write(L, image_hex(a));
if verbose then
case width is
when width_word =>
write(L, string'(", word"));
when width_halfword =>
write(L, string'(", halfword"));
when width_byte =>
write(L, string'(", byte"));
end case;
if burst = '1' then
write(L, string'(", burst "));
else
write(L, string'(", single "));
end if;
writeline(output, L);
else
if not instr_fetch then
write(L, string'(", data"));
else
writeline(output, L);
end if;
end if;
--
burst_loop : loop
if write_command then
if verbose then
write(L, tag);
write(L, string'(": Write data "));
write(L, image_hex(d));
writeline(output, L);
else
write(L, ' ');
write(L, image_hex(d));
end if;
end if;
-- wait for the response from memory
loop
wait until phi2 = '0';
if reset = '1' then
exit monitor_loop;
end if;
exit when ready = '1';
end loop;
if write_command then
if verbose then
write(L, tag);
write(L, string'(": Ready"));
writeline(output, L);
end if;
elsif instr_fetch then
if verbose then
write(L, tag);
write(L, string'(": Ready, instruction "));
write(L, image_hex(d));
write(L, string'(" [ "));
write_instr(L, d);
write(L, string'(" ]"));
writeline(output, L);
else -- brief instruction fetch
write(L, tag);
write(L, string'(": "));
write(L, image_hex(d));
write(L, string'(" [ "));
write_instr(L, d);
write(L, string'(" ]"));
writeline(output, L);
end if;
else -- data fetch
if verbose then
write(L, tag);
write(L, string'(": Ready, data "));
write(L, image_hex(d));
writeline(output, L);
else -- brief data fetch
write(L, ' ');
write(L, image_hex(d));
end if;
end if;
exit burst_loop when burst = '0';
end loop burst_loop;
--
if not verbose and not instr_fetch then
writeline(output, L);
end if;
end loop monitor_loop;
--
-- get here when reset is asserted
--
assert reset = '1'
report "reset code reached with reset = '0'" severity error;
write(L, string'("DLX_bus_monitor: Reset"));
writeline(output, L);
wait until phi2 = '0' and reset = '0';
write(L, string'("DLX_bus_monitor: End Reset"));
writeline(output, L);
--
-- process monitor now starts again from beginning
--
end process enabled_monitor;
end generate;
end behaviour;