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

Subversion Repositories System09

[/] [System09/] [trunk/] [rtl/] [XilinxRAMs/] [block_spram.vhd] - Rev 221

Go to most recent revision | Compare with Previous | Blame | View Log

--===========================================================================--
--                                                                           --
--            Generic Single-Port Block RAM for Xilinx                       --
--                                                                           --
--===========================================================================--
--
--  File name      : block_spram.vhd
--
--  Entity name    : block_spram
--
--  Purpose        : Implements generic block memory of arbitrary size
--
--  Dependencies   : ieee.std_logic_1164
--                   ieee.std_logic_arith
--
--  Uses           : infers family-specific block memory as required
--
--  Author         : David Burnette
--
--  Email          :       
--
--  Web            : 
--
--  Description    : Generic Block RAM 
--
--
--  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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
--
--===========================================================================--
--                                                                           --
--                              Revision  History                            --
--                                                                           --
--===========================================================================--
--
-- Version Date        Author     Changes
--
-- 0.1     2021-02-19  David Burnette  Initial verison 
--
library IEEE;
  use IEEE.STD_LOGIC_1164.ALL;
  use IEEE.Numeric_Std.ALL;
library unisim;
	use unisim.vcomponents.all;
 
entity block_spram is
  generic (
    dwidth : integer := 8;     -- parameterized data width
	 awidth : integer := 16     -- parameterized address width
	 );
  port (
    clk         : in std_logic;
	 cs          : in std_logic; -- chip-select/enable
	 addr        : in std_logic_vector(awidth-1 downto 0);
	 rw          : in std_logic;
	 data_in     : in std_logic_vector(dwidth-1 downto 0);
	 data_out    : out std_logic_vector(dwidth-1 downto 0)
	 );
end block_spram;
 
architecture rtl of block_spram is
  type ram_t is array ( (2**awidth)-1 downto 0) of std_logic_vector(dwidth-1 downto 0);
  signal ram_data : ram_t := (others => (others => '0')); -- ram storage, initialized to zero
 
  attribute ram_style : string;
  attribute ram_style of ram_data : signal is "BLOCK"; -- direct ISE/Vivado to target block memory
  signal we : std_logic;
begin
  we <= not rw;
  process ( clk ) 
  begin
    if (rising_edge(clk)) then
	   if (cs = '1') then
		  data_out <= ram_data(to_integer(unsigned(addr))); -- read port
		  if (we = '1') then
		    ram_data(to_integer(unsigned(addr))) <= data_in; -- write port
        end if;
      end if;
    end if;
  end process;			 
end architecture rtl;
 
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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