-- -- Small Asynchronous FIFO -- library ieee; use ieee.std_logic_1164.all; -- synthesis translate_off library UNISIM; use UNISIM.all; -- synthesis translate_on entity async_fifo is generic ( width : natural := 32); port ( wclk : in std_logic; rst : in std_logic; wadv : in std_logic; wdata : in std_logic_vector(width-1 downto 0); wnfull : out std_logic; wfull : out std_logic; rclk : in std_logic; radv : in std_logic; rdata : out std_logic_vector(width-1 downto 0); rdw_out : out std_logic_vector(width-1 downto 0); rempty : out std_logic; rnempty : out std_logic ); end async_fifo; architecture rtl of async_fifo is component async_bram_fifo port ( din : in std_logic_vector(31 downto 0); rd_clk : in std_logic; rd_en : in std_logic; rst : in std_logic; wr_clk : in std_logic; wr_en : in std_logic; dout : out std_logic_vector(31 downto 0); empty : out std_logic; full : out std_logic; prog_empty : out std_logic; prog_full : out std_logic); end component; component async_bram_fifo64 port ( din : in std_logic_vector(63 downto 0); rd_clk : in std_logic; rd_en : in std_logic; rst : in std_logic; wr_clk : in std_logic; wr_en : in std_logic; dout : out std_logic_vector(63 downto 0); empty : out std_logic; full : out std_logic; prog_empty : out std_logic; prog_full : out std_logic); end component; signal dinl, doutl : std_logic_vector(31 downto 0); signal dinw, doutw : std_logic_vector(63 downto 0); signal rdw_out_i : std_logic_vector(width-1 downto 0); signal remptyl, remptyh : std_logic; begin rdw_out <= rdw_out_i; reg_oip : process (rclk, rst) begin -- process reg_oip if rst = '1' then -- asynchronous reset (active low) rdata <= (others => '0'); elsif rclk'event and rclk = '1' then -- rising clock edge if radv = '1' then rdata <= rdw_out_i; end if; end if; end process reg_oip; gen_1bram : if width < 33 generate dinl(width-1 downto 0) <= wdata; rdw_out_i <= doutl(width-1 downto 0); abf0 : async_bram_fifo port map ( din => dinl, rd_clk => rclk, rd_en => radv, rst => rst, wr_clk => wclk, wr_en => wadv, dout => doutl, empty => rempty, full => wfull, prog_empty => rnempty, prog_full => wnfull); end generate gen_1bram; gen_2bram : if width > 32 generate dinw(width-1 downto 0) <= wdata; rdw_out_i <= doutw(width-1 downto 0); abf0 : async_bram_fifo64 port map ( din => dinw, rd_clk => rclk, rd_en => radv, rst => rst, wr_clk => wclk, wr_en => wadv, dout => doutw, empty => rempty, full => wfull, prog_empty => rnempty, prog_full => wnfull); end generate gen_2bram; end rtl;