------------------------------------------------------------ -- Copyright Mentor Graphic Corporation 1991. -- All rights reserved. ------------------------------------------------------------ -- -- Model Title: memory unit -- Date Created: 95/10/29 (Sun) -- Author: T. Ohtsuka -- ------------------------------------------------------------ -- Model Description: -- ----------------------------------------------------------- -- LIBRARY IEEE,ARITHMETIC ; USE IEEE.STD_LOGIC_1164.ALL ; USE ARITHMETIC.STD_LOGIC_ARITH.ALL ; LIBRARY work ; USE work.cpu_package.ALL ; USE work.ALL ; ENTITY mu IS PORT ( clk1 : IN STD_LOGIC ; clk2 : IN STD_LOGIC ; adr : IN STD_LOGIC_VECTOR(7 DOWNTO 0) ; asw : IN STD_LOGIC_VECTOR(7 DOWNTO 0) ; mrd : IN STD_LOGIC ; mwr : IN STD_LOGIC ; wp : IN STD_LOGIC ; active : IN STD_LOGIC ; mar_load : IN STD_LOGIC ; -- oe : OUT STD_LOGIC ; data : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0) BUS ; mar_ref : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ; init : IN STD_LOGIC ) ; END mu ; -- --------------------------------------------------------- --Copyright Mentor Graphic Corporation 1991. --All rights reserved. -- --------------------------------------------------------- --Arch. Body for entity declared in ------------------------------------------------------------ -- LIBRARY IEEE ; LIBRARY work ; USE IEEE.STD_LOGIC_1164.ALL ; USE IEEE.STD_LOGIC_1164_EXTENSIONS.ALL ; USE work.cpu_package.ALL ; USE work.ALL ; ARCHITECTURE behav1 OF mu IS CONSTANT mssize : Integer := 256 ; TYPE Msfile IS ARRAY( NATURAL RANGE <>) OF STD_LOGIC_VECTOR(7 DOWNTO 0) ; SIGNAL address : STD_LOGIC_VECTOR(7 DOWNTO 0) ; SIGNAL oe0 : STD_LOGIC ; -- output enable for RAM SIGNAL we0 : STD_LOGIC ; -- write enable for RAM SIGNAL data0 : STD_LOGIC_VECTOR(7 DOWNTO 0) ; SIGNAL mar : STD_LOGIC_VECTOR(7 DOWNTO 0) ; -- memory address resistor SIGNAL ow_ctl : STD_LOGIC_VECTOR(1 DOWNTO 0) ; BEGIN oe0 <= ( mrd OR ((NOT active) AND (NOT wp))) ; we0 <= ( mwr OR ((NOT active) AND wp)) ; mar_ref <= mar ; -- oe <= oe0 ; WITH active SELECT address <= mar WHEN '1', asw WHEN '0', "XXXXXXXX" WHEN OTHERS ; mar_process : PROCESS(clk1) BEGIN IF P_rising(clk1) THEN IF mar_load = '1' THEN mar <= adr ; END IF ; END IF ; END PROCESS ; ram_process : PROCESS(init,oe0,clk1) VARIABLE ms : Msfile(mssize - 1 DOWNTO 0) ; -- memory strage BEGIN IF P_falling(init) THEN -- IF Sw_rising(init) THEN -- test program initialization -- ms(16#00#) := "11011000" ; -- LOAD ACC from Memory ms(16#01#) := "00010010" ; -- adr.16#12# ms(16#02#) := "01000010" ; -- setsp set SP register ms(16#03#) := "11111111" ; -- data 16#FF# ms(16#04#) := "01000000" ; -- call call subroutine ms(16#05#) := "00100000" ; -- adr.16#20# ms(16#06#) := "00110000" ; -- jp jump ms(16#07#) := "00000000" ; -- adr.16#00# ms(16#12#) := "00000001" ; -- data ms(16#20#) := "00010001" ; -- inc increment ACC ms(16#21#) := "01000001" ; -- rtn return ms(16#FF#) := "00000000" ; -- data ms(16#10#) := "10000010" ; -- data ms(16#11#) := "00000001" ; -- data ------------------ END IF ; CASE oe0 IS when '1' => data <= ms(Mar_int(address)) ; when '0' => data <= Z ; when OTHERS => NULL ; END CASE ; IF P_rising(clk1) THEN IF we0 = '1' THEN ms(Mar_int(address)) := data ; END IF ; END IF ; END PROCESS ; END behav1 ;