00001 --**************************************************************
00002 --* *
00003 --* The source code for the ATLAS BCM "AAA" FPGA is made *
00004 --* available via the GNU General Public License (GPL) *
00005 --* unless otherwise stated below. *
00006 --* *
00007 --* In case of problems/questions/bug reports etc. please *
00008 --* contact michael.niegl@cern.ch *
00009 --* *
00010 --**************************************************************
00011
00012 --**************************************************************
00013 --* *
00014 --* $Source: /local/reps/bcmfpga/bcm_aaa/bcm_aaa/ddr/ddr_data_buffer.vhd,v $
00015 --* $Revision: 1.6.2.4 $ *
00016 --* $Name: dev $ *
00017 --* $Author: mniegl $ *
00018 --* $Date: 2008/11/03 17:57:43 $ *
00019
00020
00021 --* *
00022 --**************************************************************
00023
00024 library ieee;
00025
00026 use ieee.std_logic_1164.all;
00027
00028 use ieee.std_logic_arith.all;
00029
00030 use ieee.std_logic_unsigned.all;
00031
00032 use ieee.numeric_std.all;
00033
00034 library unisim;
00035
00036 use unisim.vcomponents.all;
00037 library work;
00038 use work.main_components.all;
00039
00040
00041 entity ddr_data_buffer is
00042 port (
00043 CLK_A : in ;
00044 CLK_B : in ;
00045 WEN : in ;
00046 RESET : in ;
00047 REN : in ;
00048 EMPTY : out ;
00049 DATA_IN : in (191 downto 0);
00050 DATA_OUT : out (63 downto 0)
00051 );
00052 end ddr_data_buffer;
00053
00054
00055 architecture ddr_data_buffer_arc of ddr_data_buffer is
00056 ----------------------------- signals -----------------------------
00057 signal empty_flag : := '0';
00058 signal over_b : := '0';
00059 signal en_a : := '0';
00060 signal addr_a : (8 downto 0) := (others => '0');
00061 signal addr_b : (6 downto 0) := (others => '0');
00062 signal data : (63 downto 0) := (others => '0');
00063 signal write_data : (255 downto 0) := (others => '0');
00064 signal jmp_cnt : (1 downto 0) := (others => '0');
00065
00066 constant noread : (63 downto 0) := x"11111111_11111111";
00067
00068 ---------------------------- components -----------------------------
00069
00070 component proc_data_buf
00071 port (
00072 addra : in (8 downto 0);
00073 addrb : in (6 downto 0);
00074 clka : in ;
00075 clkb : in ;
00076 dinb : in (255 downto 0);
00077 douta : out (63 downto 0);
00078 ena : in ;
00079 enb : in ;
00080 web : in );
00081 end component;
00082
00083 ---------------------------- main code ----------------------------
00084 begin
00085
00086 DATA_OUT <= data;
00087 EMPTY <= empty_flag;
00088 write_data <= noread & DATA_IN;
00089
00090
00091 bram_buf : proc_data_buf
00092 port map
00093 (
00094 addra => addr_a,
00095 addrb => addr_b,
00096 clka => clk_a,
00097 clkb => clk_b,
00098 dinb => write_data,
00099 douta => data,
00100 ena => en_a,
00101 enb => '1' ,
00102 web => WEN
00103 );
00104
00105
00106 wr_addr_gen : process(clk_b)
00107 begin
00108 if clk_b'event and clk_b = '1' then
00109 if RESET = '1' then
00110 addr_b <= (others => '0');
00111 over_b <= '0';
00112 else
00113 if WEN = '1' then
00114 addr_b <= addr_b + 1;
00115 if addr_b = "1111110" then
00116 over_b <= '1';
00117 end if;
00118 else
00119 addr_b <= addr_b;
00120 end if;
00121 end if;
00122 end if;
00123 end process wr_addr_gen;
00124
00125 empty_flag <= '0' when addr_b >= "0000110" or over_b = '1' else '1';
00126 en_a <= REN;
00127
00128
00129 read_addr : process(clk_a)
00130 begin
00131 if clk_a'event and clk_a = '1' then
00132 if RESET = '1' then
00133 addr_a <= (others => '0');
00134 jmp_cnt <= (others => '0');
00135 else
00136 if REN = '1' then
00137 if jmp_cnt = 2 then
00138 addr_a <= addr_a + 2;
00139 jmp_cnt <= (others => '0');
00140 else
00141 jmp_cnt <= jmp_cnt + 1;
00142 addr_a <= addr_a + 1;
00143 end if;
00144 else
00145 addr_a <= addr_a;
00146 end if;
00147 end if;
00148 end if;
00149 end process read_addr;
00150
00151 end ddr_data_buffer_arc;