---------------------------------------------------------------------- -- PROCESSOR MAIN ENTITY ---------------------------------------------------------------------- library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use work.ESD2004_types.all; entity ESD_2004 is port( ck,reset,enable : in std_logic; I_ADDR_OUT : out std_logic_vector(7 downto 0); I_INSTR_OUT : out std_logic_vector(15 downto 0); D_ADDR_OUT : out std_logic_vector(7 downto 0); D_DATA_OUT : out std_logic_vector(7 downto 0); WB_REG : out std_logic_vector(2 downto 0); WB_VALUE : out std_logic_vector(7 downto 0) ); end ESD_2004; architecture struct of ESD_2004 is component instr_memory port( CK : in std_logic; WEN : in std_logic; A : in std_logic_vector(7 downto 0); D : in std_logic_vector(15 downto 0); Q : out std_logic_vector(15 downto 0) ); end component; component data_memory port( CK : in std_logic; OEN,WEN,CSN : in std_logic; -- Output enable, Write enable, Chip select. -- Sono tutti segnali di controllo attivi bassi, -- tipici delle memorie on-chip. Nel nostro caso CS e' sempre attivo! A : in std_logic_vector(7 downto 0); D : in std_logic_vector(7 downto 0); Q : out std_logic_vector(7 downto 0) ); end component; component ESD2004_core port( ck,reset,enable : in std_logic; I_ADDR : out std_logic_vector(7 downto 0); I_INSTR : in std_logic_vector(15 downto 0); D_MR,D_MW : out std_logic; D_ADDR : out std_logic_vector(7 downto 0); D_DATAOUT : out std_logic_vector(7 downto 0); D_DATAIN : in std_logic_vector(7 downto 0); WB_REG : out std_logic_vector(2 downto 0); WB_VALUE : out std_logic_vector(7 downto 0) ); end component; signal d_mr,d_mw,d_oen,d_wen,d_csn,i_wen : std_logic; signal I_ADDR,D_ADDR,D_DATA_PROC_to_MEM,D_DATA_MEM_to_PROC : std_logic_vector(7 downto 0); signal I_ADDR_PROC : std_logic_vector(7 downto 0); signal I_INSTR_IN,I_INSTR,I_INSTR_PROC : std_logic_vector(15 downto 0); begin I_ADDR <= I_ADDR_PROC; I_INSTR_IN <= (others=>'0'); i_wen <= '1'; -- Non si puo' mai scrivere sulla -- memoria istruzioni Memoria_Istruzioni : instr_memory port map ( ck,I_WEN,I_ADDR,I_INSTR_IN,I_INSTR_PROC ); Memoria_dati: data_memory port map ( ck,D_OEN,D_WEN,D_CSN,D_ADDR,D_DATA_PROC_to_MEM,D_DATA_MEM_to_PROC ); Core_del_microprocessore: ESD2004_core port map ( ck,reset,enable,I_ADDR_PROC,I_INSTR_PROC, d_mr,d_mw,D_ADDR,D_DATA_PROC_to_MEM,D_DATA_MEM_to_PROC, WB_REG,WB_VALUE); D_OEN <= not d_mr; D_WEN <= not d_mw; D_CSN <= '0'; -- In questa applicazione esiste una memoria dati sola e quindi essa e' sempre attiva! -- Bus di uscita verso il mondo esterno: si noti che i segnali-istruzione non hanno alcuna ragione -- di essere portati verso l'esterno, ma lo si fa' ugualmente per leggere con piu' facilita' il comportamento del -- dispositivo! I_ADDR_OUT <= I_ADDR; I_INSTR_OUT <= I_INSTR_PROC; D_ADDR_OUT <= D_ADDR; -- In uscita viene portato il bus dal processore alle memorie in caso di -- store, e il bus dalle memorie al processore in caso di load D_DATA_OUT <= D_DATA_MEM_to_PROC when d_mr='1' else D_DATA_PROC_to_MEM when d_mw='1' else (others=>'0'); end struct;