diff --git a/libraries/technology/memory/tech_memory_ram_rw_rw.vhd b/libraries/technology/memory/tech_memory_ram_rw_rw.vhd new file mode 100644 index 0000000000000000000000000000000000000000..1bd1363a593b0c2d8b2b62b30fc5ee22be40f2cc --- /dev/null +++ b/libraries/technology/memory/tech_memory_ram_rw_rw.vhd @@ -0,0 +1,120 @@ +-- ----------------------------------------------------------------------------- +-- +-- Copyright 2023 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- ----------------------------------------------------------------------------- +-- +-- Author: +-- D.F. Brouwer +-- Remark: +-- Because the crw_crw IP isn't supported as used for previous FPGA +-- technology identifiers (device types) by the Agilex 7 (agi027_xxxx), the +-- rw_rw IP should be used. For the previous technology identifiers, it is +-- constructed using the crw_crw IPs by providing the same clock twice. For +-- more details please refer the README.txt in the ip_agi027_xxxx/ram/ folder. +-- Reference: +-- Copied from tech_memory_ram_crw_crw.vhd and combined two enable entity +-- ports to one and two clock enity ports to one. These changes have been +-- incorporated into the existing generate-blocks and the generate-block +-- for agi_xxxx is added. + +library ieee, technology_lib; +use ieee.std_logic_1164.all; +use work.tech_memory_component_pkg.all; +use technology_lib.technology_pkg.all; +use technology_lib.technology_select_pkg.all; + +-- Declare IP libraries to ensure default binding in simulation. The IP library clause is ignored by synthesis. +library ip_stratixiv_ram_lib; +library ip_arria10_ram_lib; +library ip_arria10_e3sge3_ram_lib; +library ip_arria10_e1sg_ram_lib; +library ip_arria10_e2sg_ram_lib; +library ip_ultrascale_ram_lib; +library ip_agi027_xxxx_ram_lib; + +entity tech_memory_ram_rw_rw is + generic ( + g_technology : natural := c_tech_select_default; + g_adr_w : natural := 5; + g_dat_w : natural := 8; + g_nof_words : natural := 2**5; + g_rd_latency : natural := 2; -- choose 1 or 2 + g_init_file : string := "UNUSED" + ); + port + ( + address_a : in std_logic_vector(g_adr_w - 1 downto 0); + address_b : in std_logic_vector(g_adr_w - 1 downto 0); + clock : in std_logic := '1'; + data_a : in std_logic_vector(g_dat_w - 1 downto 0); + data_b : in std_logic_vector(g_dat_w - 1 downto 0); + enable : in std_logic := '1'; + rden_a : in std_logic := '1'; + rden_b : in std_logic := '1'; + wren_a : in std_logic := '0'; + wren_b : in std_logic := '0'; + q_a : out std_logic_vector(g_dat_w - 1 downto 0); + q_b : out std_logic_vector(g_dat_w - 1 downto 0) + ); +end tech_memory_ram_rw_rw; + +architecture str of tech_memory_ram_rw_rw is +begin + gen_ip_stratixiv : if g_technology = c_tech_stratixiv generate + u0 : ip_stratixiv_ram_crw_crw + generic map (g_adr_w, g_dat_w, g_nof_words, g_rd_latency, g_init_file) + port map (address_a, address_b, clock, clock, data_a, data_b, enable, enable, rden_a, rden_b, wren_a, wren_b, q_a, q_b); + end generate; + + gen_ip_arria10 : if g_technology = c_tech_arria10_proto generate + u0 : ip_arria10_ram_crw_crw + generic map (false, g_adr_w, g_dat_w, g_nof_words, g_rd_latency, g_init_file) + port map (address_a, address_b, clock, clock, data_a, data_b, wren_a, wren_b, q_a, q_b); + end generate; + + gen_ip_arria10_e3sge3 : if g_technology = c_tech_arria10_e3sge3 generate + u0 : ip_arria10_e3sge3_ram_crw_crw + generic map (false, g_adr_w, g_dat_w, g_nof_words, g_rd_latency, g_init_file) + port map (address_a, address_b, clock, clock, data_a, data_b, wren_a, wren_b, q_a, q_b); + end generate; + + gen_ip_arria10_e1sg : if g_technology = c_tech_arria10_e1sg generate + u0 : ip_arria10_e1sg_ram_crw_crw + generic map (false, g_adr_w, g_dat_w, g_nof_words, g_rd_latency, g_init_file) + port map (address_a, address_b, clock, clock, data_a, data_b, wren_a, wren_b, q_a, q_b); + end generate; + + gen_ip_arria10_e2sg : if g_technology = c_tech_arria10_e2sg generate + u0 : ip_arria10_e2sg_ram_crw_crw + generic map (false, g_adr_w, g_dat_w, g_nof_words, g_rd_latency, g_init_file) + port map (address_a, address_b, clock, clock, data_a, data_b, wren_a, wren_b, q_a, q_b); + end generate; + + gen_ip_ultrascale : if g_technology = c_tech_ultrascale generate + u0 : ip_ultrascale_ram_crw_crw + generic map (false, g_adr_w, g_dat_w, g_nof_words, g_rd_latency, g_init_file) + port map (address_a, address_b, clock, clock, data_a, data_b, wren_a, wren_b, q_a, q_b); + end generate; + + gen_ip_agi027_xxxx : if g_technology = c_tech_agi027_xxxx generate + u0 : ip_agi027_xxxx_ram_rw_rw + generic map (false, g_adr_w, g_dat_w, g_nof_words, g_rd_latency, g_init_file) + port map (address_a, address_b, clock, data_a, data_b, wren_a, wren_b, q_a, q_b); + end generate; + +end architecture;