OpenCores
URL https://opencores.org/ocsvn/tinycpu/tinycpu/trunk

Subversion Repositories tinycpu

[/] [tinycpu/] [trunk/] [src/] [memory.vhd] - Diff between revs 19 and 37

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 19 Rev 37
Line 14... Line 14...
    Address: in std_logic_vector(15 downto 0); --memory address (in bytes)
    Address: in std_logic_vector(15 downto 0); --memory address (in bytes)
    WriteWord: in std_logic; --if set, will write a full 16-bit word instead of a byte. Address must be aligned to 16-bit address. (bottom bit must be 0)
    WriteWord: in std_logic; --if set, will write a full 16-bit word instead of a byte. Address must be aligned to 16-bit address. (bottom bit must be 0)
    WriteEnable: in std_logic;
    WriteEnable: in std_logic;
    Clock: in std_logic;
    Clock: in std_logic;
    DataIn: in std_logic_vector(15 downto 0);
    DataIn: in std_logic_vector(15 downto 0);
    DataOut: out std_logic_vector(15 downto 0)
    DataOut: out std_logic_vector(15 downto 0);
 
 
 
    Port0: inout std_logic_vector(7 downto 0)
--    Reset: in std_logic
--    Reset: in std_logic
 
 
    --RAM/ROM interface (RAMA is built in to here
    --RAM/ROM interface (RAMA is built in to here
    --RAMBDataIn: out std_logic_vector(15 downto 0);
    --RAMBDataIn: out std_logic_vector(15 downto 0);
    --RAMBDataOut: in std_logic_vector(15 downto 0);
    --RAMBDataOut: in std_logic_vector(15 downto 0);
Line 38... Line 40...
      DataIn: in std_logic_vector(15 downto 0);
      DataIn: in std_logic_vector(15 downto 0);
      DataOut: out std_logic_vector(15 downto 0)
      DataOut: out std_logic_vector(15 downto 0)
    );
    );
  end component;
  end component;
 
 
  constant R1START: integer := 0;
  constant R1START: integer := 15;
  constant R1END: integer := 1023;
  constant R1END: integer := 1023+15;
  signal addr: std_logic_vector(15 downto 0) := (others => '0');
  signal addr: std_logic_vector(15 downto 0) := (others => '0');
  signal R1addr: std_logic_vector(7 downto 0);
  signal R1addr: std_logic_vector(7 downto 0);
  signal we: std_logic_vector(1 downto 0);
  signal we: std_logic_vector(1 downto 0);
  signal datawrite: std_logic_vector(15 downto 0);
  signal datawrite: std_logic_vector(15 downto 0);
  signal dataread: std_logic_vector(15 downto 0);
  signal dataread: std_logic_vector(15 downto 0);
  --signal en: std_logic;
  --signal en: std_logic;
  signal R1we: std_logic_vector(1 downto 0);
  signal R1we: std_logic_vector(1 downto 0);
  signal R1en: std_logic;
  signal R1en: std_logic;
  signal R1in: std_logic_vector(15 downto 0);
  signal R1in: std_logic_vector(15 downto 0);
  signal R1out: std_logic_vector(15 downto 0);
  signal R1out: std_logic_vector(15 downto 0);
 
 
 
  signal port0we: std_logic_vector(7 downto 0);
 
  signal port0temp: std_logic_vector(7 downto 0);
begin
begin
  R1: blockram port map (R1addr, R1we, R1en, Clock, R1in, R1out);
  R1: blockram port map (R1addr, R1we, R1en, Clock, R1in, R1out);
  addrwe: process(Address, WriteWord, WriteEnable, DataIn)
  addrwe: process(Address, WriteWord, WriteEnable, DataIn)
  begin
  begin
    addr <= Address(15 downto 1) & '0';
    addr <= Address(15 downto 1) & '0';
Line 74... Line 79...
      datawrite <= x"0000";
      datawrite <= x"0000";
      we <= "00";
      we <= "00";
    end if;
    end if;
  end process;
  end process;
 
 
  assignram: process (we, datawrite, addr, r1out)
  assignram: process (we, datawrite, addr, r1out, port0, WriteEnable, Address)
  variable tmp: integer;
  variable tmp: integer;
 
  variable tmp2: integer;
  variable found: boolean := false;
  variable found: boolean := false;
  begin
  begin
    tmp := to_integer(unsigned(addr));
    tmp := to_integer(unsigned(addr));
    if tmp >= R1START and tmp <= R1END then
    tmp2 := to_integer(unsigned(Address));
 
    if tmp2 <= 15 then --internal registers/mapped IO
 
      if WriteWord='0' then
 
        if tmp2=0 then
 
          dataread <= x"0000";
 
          gen: for I in 0 to 7 loop
 
            if WriteEnable='1' then
 
              if port0we(I)='1' then --1-bit port set to WRITE mode
 
                port0(I) <= DataIn(I);
 
                port0temp(I) <= DataIn(I);
 
              else
 
                port0(I) <= 'Z';
 
              end if;
 
            else --not WE
 
              if port0we(I)='0' then --1-bit-port set to READ mode
 
                dataread(I) <= port0(I);
 
              else
 
                dataread(I) <= port0temp(I);
 
              end if;
 
            end if;
 
          end loop gen;
 
        elsif tmp2=1 then
 
          dataread <= x"00" & port0we;
 
          if WriteEnable='1' then
 
            port0we <= DataIn(7 downto 0);
 
            setwe: for I in 0 to 7 loop
 
              if DataIn(I)='0' then
 
                port0(I) <= 'Z';
 
              end if;
 
            end loop setwe;
 
          else
 
            dataread <= x"00" & port0we;
 
          end if;
 
        else
 
          --synthesis off
 
          report "Memory address is outside of bounds of RAM and registers" severity warning;
 
          --synthesis on
 
        end if;
 
      else
 
        --synthesis off
 
        report "WriteWord is not allowed in register area. Ignoring access" severity warning;
 
        --synthesis on
 
      end if;
 
    elsif tmp >= R1START and tmp <= R1END then --RAM bank1
      --map all to R1
      --map all to R1
      found := true;
      found := true;
      R1en <= '1';
      R1en <= '1';
      R1we <= we;
      R1we <= we;
      R1in <= datawrite;
      R1in <= datawrite;
Line 104... Line 153...
      DataOut <= dataread;
      DataOut <= dataread;
    else
    else
      DataOut <= x"00" & dataread(15 downto 8);
      DataOut <= x"00" & dataread(15 downto 8);
    end if;
    end if;
  end process;
  end process;
 
 
end Behavioral;
end Behavioral;
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.