Subversion Repositories f9daq

Rev

Blame | Last modification | View Log | RSS feed

  1. ----------------------------------------------------------------------------------
  2. -- Company:
  3. -- Engineer:
  4. --
  5. -- Create Date: 12.10.2018 13:26:08
  6. -- Design Name:
  7. -- Module Name: dual_port_ram - Behavioral
  8. -- Project Name:
  9. -- Target Devices:
  10. -- Tool Versions:
  11. -- Description:
  12. --
  13. -- Dependencies:
  14. --
  15. -- Revision:
  16. -- Revision 0.01 - File Created
  17. -- Additional Comments:
  18. --
  19. ----------------------------------------------------------------------------------
  20.  
  21.  
  22. library IEEE;
  23. use IEEE.STD_LOGIC_1164.ALL;
  24.  
  25. -- Uncomment the following library declaration if using
  26. -- arithmetic functions with Signed or Unsigned values
  27. use IEEE.NUMERIC_STD.ALL;
  28.  
  29. -- Uncomment the following library declaration if instantiating
  30. -- any Xilinx leaf cells in this code.
  31. --library UNISIM;
  32. --use UNISIM.VComponents.all;
  33.  
  34. entity dual_port_bram is
  35.  
  36.     generic (
  37.               bit_num : natural := 10;
  38.               bin_num : natural := 1024; --number of histogram bins
  39.               buffer_size : natural := 10 -- buffer size in bits, 5 bit gets 32 different values
  40.              );
  41.  
  42.     port (
  43.            -- A side --
  44.            clk_A: in std_logic;
  45.            bram_en_A: in std_logic;
  46.            wr_en_A: in std_logic;
  47.            addr_A: in unsigned ( (bit_num - 1) downto 0 );
  48.            data_in_A: in unsigned ( buffer_size downto 0 );
  49.            data_out_A: out unsigned ( buffer_size downto 0 );
  50.            
  51.            -- B side --
  52.            clk_B: in std_logic;
  53.            bram_en_B: in std_logic;
  54.            wr_en_B: in std_logic;
  55.            addr_B: in unsigned ( (bit_num - 1) downto 0 );
  56.            data_in_B: in unsigned ( buffer_size downto 0 );
  57.            data_out_B: out unsigned ( buffer_size downto 0 )
  58.            );
  59.  
  60. end dual_port_bram;
  61.  
  62. architecture Behavioral of dual_port_bram is
  63.  
  64.     type BRAM_ARRAY is array ( 0 to (bin_num - 1) ) of unsigned ( buffer_size downto 0 );
  65.     shared variable bram: BRAM_ARRAY := (others => (others => '0'));
  66.    
  67.    
  68.    
  69.  
  70. begin
  71.  
  72.     A_side: process (clk_A)
  73.     begin
  74.         if (rising_edge(clk_A)) then
  75.             if (bram_en_A = '1') then
  76.                 if (wr_en_A = '1') then
  77.                     bram(to_integer(addr_A)) := data_in_A;
  78.                 end if;
  79.                 data_out_A <= bram(to_integer(addr_A));
  80.             end if;
  81.         end if;
  82.     end process;
  83.    
  84.    
  85.     B_side: process (clk_B)
  86.     begin
  87.         if (rising_edge(clk_B)) then
  88.             if (bram_en_B = '1') then
  89.                 if (wr_en_B = '1') then
  90.                     bram(to_integer(addr_B)) := data_in_B;
  91.                 end if;
  92.                 data_out_B <= bram(to_integer(addr_B));
  93.             end if;
  94.         end if;
  95.     end process;        
  96.  
  97. end Behavioral;
  98.