diff --git a/modules/genrams/xilinx/virtex6/Manifest.py b/modules/genrams/xilinx/virtex6/Manifest.py index 4cae68ecb19878068b3123f9b0df32475048a81a..fa6d02106c09c5ca945d09409a49072e894e80af 100644 --- a/modules/genrams/xilinx/virtex6/Manifest.py +++ b/modules/genrams/xilinx/virtex6/Manifest.py @@ -1,4 +1,5 @@ files =["v6_fifo_pkg.vhd", "v6_hwfifo_wrapper.vhd", "generic_async_fifo.vhd", + "generic_async_fifo_dual_rst.vhd", "generic_sync_fifo.vhd"]; diff --git a/modules/genrams/xilinx/virtex6/generic_async_fifo_dual_rst.vhd b/modules/genrams/xilinx/virtex6/generic_async_fifo_dual_rst.vhd new file mode 100644 index 0000000000000000000000000000000000000000..027d2899621ccb10634a0adfaea5d2f3baf59312 --- /dev/null +++ b/modules/genrams/xilinx/virtex6/generic_async_fifo_dual_rst.vhd @@ -0,0 +1,230 @@ + +-------------------------------------------------------------------------------- +-- CERN BE-CO-HT +-- General Cores Library +-- https://www.ohwr.org/projects/general-cores +------------------------------------------------------------------------------- +-- File : generic_async_fifo_dual_rst.vhd +-- Company : CERN BE-CO-HT +------------------------------------------------------------------------------- +-- Description: Dual-clock asynchronous FIFO. +-- - configurable data width and size +-- - configurable full/empty/almost full/almost empty/word count signals +-- - dual synchronous reset +------------------------------------------------------------------------------- +-- Copyright (c) 2011-2018 CERN +------------------------------------------------------------------------------- +-- Copyright and related rights are licensed under the Solderpad Hardware +-- 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://solderpad.org/licenses/SHL-2.0. +-- Unless required by applicable law or agreed to in writing, software, +-- hardware and materials distributed under this 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. +-------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +use work.genram_pkg.all; +use work.v6_fifo_pkg.all; + +entity generic_async_fifo_dual_rst is + + generic ( + g_data_width : natural; + g_size : natural; + g_show_ahead : boolean := false; + + -- Read-side flag selection + g_with_rd_empty : boolean := true; -- with empty flag + g_with_rd_full : boolean := false; -- with full flag + g_with_rd_almost_empty : boolean := false; + g_with_rd_almost_full : boolean := false; + g_with_rd_count : boolean := false; -- with words counter + + g_with_wr_empty : boolean := false; + g_with_wr_full : boolean := true; + g_with_wr_almost_empty : boolean := false; + g_with_wr_almost_full : boolean := false; + g_with_wr_count : boolean := false; + + g_almost_empty_threshold : integer; -- threshold for almost empty flag + g_almost_full_threshold : integer -- threshold for almost full flag + ); + + port ( + -- write port + rst_wr_n_i : in std_logic; + clk_wr_i : in std_logic; + d_i : in std_logic_vector(g_data_width-1 downto 0); + we_i : in std_logic; + wr_empty_o : out std_logic; + wr_full_o : out std_logic; + wr_almost_empty_o : out std_logic; + wr_almost_full_o : out std_logic; + wr_count_o : out std_logic_vector(f_log2_size(g_size)-1 downto 0); + -- read port + rst_rd_n_i : in std_logic; + clk_rd_i : in std_logic; + q_o : out std_logic_vector(g_data_width-1 downto 0); + rd_i : in std_logic; + rd_empty_o : out std_logic; + rd_full_o : out std_logic; + rd_almost_empty_o : out std_logic; + rd_almost_full_o : out std_logic; + rd_count_o : out std_logic_vector(f_log2_size(g_size)-1 downto 0) + ); + +end generic_async_fifo_dual_rst; + + +architecture syn of generic_async_fifo_dual_rst is + + component inferred_async_fifo_dual_rst + generic ( + g_data_width : natural; + g_size : natural; + g_show_ahead : boolean; + g_with_rd_empty : boolean; + g_with_rd_full : boolean; + g_with_rd_almost_empty : boolean; + g_with_rd_almost_full : boolean; + g_with_rd_count : boolean; + g_with_wr_empty : boolean; + g_with_wr_full : boolean; + g_with_wr_almost_empty : boolean; + g_with_wr_almost_full : boolean; + g_with_wr_count : boolean; + g_almost_empty_threshold : integer; + g_almost_full_threshold : integer); + port ( + rst_wr_n_i : in std_logic; + clk_wr_i : in std_logic; + d_i : in std_logic_vector(g_data_width-1 downto 0); + we_i : in std_logic; + wr_empty_o : out std_logic; + wr_full_o : out std_logic; + wr_almost_empty_o : out std_logic; + wr_almost_full_o : out std_logic; + wr_count_o : out std_logic_vector(f_log2_size(g_size)-1 downto 0); + rst_rd_n_i : in std_logic; + clk_rd_i : in std_logic; + q_o : out std_logic_vector(g_data_width-1 downto 0); + rd_i : in std_logic; + rd_empty_o : out std_logic; + rd_full_o : out std_logic; + rd_almost_empty_o : out std_logic; + rd_almost_full_o : out std_logic; + rd_count_o : out std_logic_vector(f_log2_size(g_size)-1 downto 0)); + end component; + + component v6_hwfifo_wraper + generic ( + g_data_width : natural; + g_size : natural; + g_dual_clock : boolean; + g_almost_empty_threshold : integer; + g_almost_full_threshold : integer); + port ( + rst_n_i : in std_logic := '1'; + clk_wr_i : in std_logic; + clk_rd_i : in std_logic; + d_i : in std_logic_vector(g_data_width-1 downto 0); + we_i : in std_logic; + q_o : out std_logic_vector(g_data_width-1 downto 0); + rd_i : in std_logic; + rd_empty_o : out std_logic; + wr_full_o : out std_logic; + rd_almost_empty_o : out std_logic; + wr_almost_full_o : out std_logic; + rd_count_o : out std_logic_vector(f_log2_size(g_size)-1 downto 0); + wr_count_o : out std_logic_vector(f_log2_size(g_size)-1 downto 0)); + end component; + + constant m : t_v6_fifo_mapping := f_v6_fifo_find_mapping(g_data_width, g_size); + + -- Xilinx defines almost full threshold as number of available empty words in + -- FIFO (UG363 - Virtex 6 FPGA Memory Resources + constant c_virtex_almost_full_thr : integer := g_size - g_almost_full_threshold; + + signal rst_n : std_logic; + +begin -- syn + + rst_n <= rst_wr_n_i and rst_rd_n_i; + + gen_inferred : if(m.d_width = 0 or g_with_wr_count or g_with_rd_count) generate + assert false report "generic_async_fifo_dual_rst[xilinx]: using inferred BRAM-based FIFO." severity note; + + U_Inferred_FIFO: inferred_async_fifo_dual_rst + generic map ( + g_data_width => g_data_width, + g_size => g_size, + g_show_ahead => g_show_ahead, + g_with_rd_empty => g_with_rd_empty, + g_with_rd_full => g_with_rd_full, + g_with_rd_almost_empty => g_with_rd_almost_empty, + g_with_rd_almost_full => g_with_rd_almost_full, + g_with_rd_count => g_with_rd_count, + g_with_wr_empty => g_with_wr_empty, + g_with_wr_full => g_with_wr_full, + g_with_wr_almost_empty => g_with_wr_almost_empty, + g_with_wr_almost_full => g_with_wr_almost_full, + g_with_wr_count => g_with_wr_count, + g_almost_empty_threshold => g_almost_empty_threshold, + g_almost_full_threshold => g_almost_full_threshold) + port map ( + rst_wr_n_i => rst_wr_n_i, + clk_wr_i => clk_wr_i, + d_i => d_i, + we_i => we_i, + wr_empty_o => wr_empty_o, + wr_full_o => wr_full_o, + wr_almost_empty_o => wr_almost_empty_o, + wr_almost_full_o => wr_almost_full_o, + wr_count_o => wr_count_o, + rst_rd_n_i => rst_rd_n_i, + clk_rd_i => clk_rd_i, + q_o => q_o, + rd_i => rd_i, + rd_empty_o => rd_empty_o, + rd_full_o => rd_full_o, + rd_almost_empty_o => rd_almost_empty_o, + rd_almost_full_o => rd_almost_full_o, + rd_count_o => rd_count_o); + + + end generate gen_inferred; + + gen_native : if(m.d_width > 0 and not g_with_wr_count and not g_with_rd_count) generate + + U_Native_FIFO: v6_hwfifo_wraper + generic map ( + g_data_width => g_data_width, + g_size => g_size, + g_dual_clock => true, + g_almost_empty_threshold => f_empty_thr(g_with_rd_almost_empty, g_almost_empty_threshold, g_size), + g_almost_full_threshold => f_empty_thr(g_with_wr_almost_full, c_virtex_almost_full_thr, g_size)) + port map ( + rst_n_i => rst_n, + clk_wr_i => clk_wr_i, + clk_rd_i => clk_rd_i, + d_i => d_i, + we_i => we_i, + q_o => q_o, + rd_i => rd_i, + rd_empty_o => rd_empty_o, + wr_full_o => wr_full_o, + rd_almost_empty_o => rd_almost_empty_o, + wr_almost_full_o => wr_almost_full_o, + rd_count_o => rd_count_o, + wr_count_o => wr_count_o); + end generate gen_native; + + + +end syn;