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/ram_user_backend.vhd,v $
00015 --* $Revision: 1.15.2.3 $ *
00016 --* $Name: dev $ *
00017 --* $Author: mniegl $ *
00018 --* $Date: 2008/11/03 17:57:44 $ *
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 library unisim;
00033
00034 use unisim.vcomponents.all;
00035 library work;
00036
00037 use work.mem_interface_top_parameters_0.all;
00038
00039
00040
00041
00042 entity ram_user_backend is
00043 port
00044 (
00045 cntrl0_DDR_DQ : inout (31 downto 0);
00046 cntrl0_DDR_A : out (12 downto 0);
00047 cntrl0_DDR_BA : out (1 downto 0);
00048 cntrl0_DDR_CKE : out ;
00049 cntrl0_DDR_CS_N : out ;
00050 cntrl0_DDR_RAS_N : out ;
00051 cntrl0_DDR_CAS_N : out ;
00052 cntrl0_DDR_WE_N : out ;
00053 cntrl0_DDR_DM : out (3 downto 0);
00054 cntrl0_DDR_DQS : inout (3 downto 0);
00055 cntrl0_DDR_CK : out ;
00056 cntrl0_DDR_CK_N : out ;
00057 SYSCLK_P : in ;
00058 SYSCLK_N : in ;
00059 CLK200_P : in ;
00060 CLK200_N : in ;
00061 SYS_RESET_IN : in ;
00062 ADDR_RES : in ;
00063 ADDR_OVR : out ;
00064 R_W : in ;
00065 LED_CONTR : out ;
00066 LED_R : out ;
00067 EN : in ;
00068 HALT : out ;
00069 VALID_OUT : out ;
00070 RDBURST_END : out ;
00071 DATA_IN : in (63 downto 0);
00072 READ_DATA_OUT : out (63 downto 0)
00073 );
00074
00075 end ram_user_backend;
00076
00077
00078
00079
00080
00081
00082 architecture ram_user_backend_arc of ram_user_backend is
00083
00084 --*************************** Signal Declarations *****************************
00085 signal sysclk_p_i : := '0';
00086 signal sysclk_n_i : := '0';
00087 signal clk200_p_i : := '0';
00088 signal clk200_n_i : := '0';
00089 signal clk_tb : := '0';
00090 signal clk_buf : := '0';
00091 signal CS : := '0';
00092 signal addr_en : := '0';
00093 signal data_en : := '0';
00094 signal nop_en : := '0';
00095 signal addr_full : := '0';
00096 signal data_full : := '0';
00097 signal read_valid : := '0';
00098 signal sys_res : := '0';
00099 signal halt_i : := '0';
00100 signal lock_i : := '0';
00101 signal data_out : (63 downto 0) := (others => '0');
00102 signal block_start : (2 downto 0) := (others => '0');
00103 signal command : (2 downto 0) := (others => '0');
00104 signal cmd : (2 downto 0) := (others => '0');
00105 signal nop : (2 downto 0) := (others => '0');
00106 signal address_vec : (35 downto 0) := (others => '0');
00107 signal bank_sel : (1 downto 0) := (others => '0');
00108 signal row_sel : (12 downto 0) := (others => '0');
00109 signal column_sel : (5 downto 0) := (others => '0');
00110 signal burst_cnt : (1 downto 0) := (others => '0');
00111 signal nop_cnt : (1 downto 0) := (others => '0');
00112 signal mask : (7 downto 0) := (others => '0');
00113 signal cntrl0_DDR_CK_i : (1 downto 0) := (others => '0');
00114 signal cntrl0_DDR_CK_N_i : (1 downto 0) := (others => '0');
00115
00116 --************************** Component Declarations ***************************
00117
00118 component mem_interface_top
00119 port(
00120 SYS_CLK_P : in ;
00121 SYS_CLK_N : in ;
00122 CLK200_P : in ;
00123 CLK200_N : in ;
00124 CLK200 : out ;
00125 SYS_RESET_IN : in ;
00126 LOCK : in ;
00127 cntrl0_APP_WDF_WREN : in ;
00128 cntrl0_APP_AF_WREN : in ;
00129 cntrl0_APP_AF_ADDR : in (35 downto 0);
00130 cntrl0_APP_WDF_DATA : in (63 downto 0);
00131 cntrl0_APP_MASK_DATA : in (7 downto 0);
00132 cntrl0_DDR_DQ : inout (31 downto 0);
00133 cntrl0_DDR_DQS : inout (3 downto 0);
00134 cntrl0_DDR_A : out (12 downto 0);
00135 cntrl0_DDR_BA : out (1 downto 0);
00136 cntrl0_DDR_CKE : out ;
00137 cntrl0_DDR_CS_N : out ;
00138 cntrl0_DDR_RAS_N : out ;
00139 cntrl0_DDR_CAS_N : out ;
00140 cntrl0_DDR_WE_N : out ;
00141 cntrl0_DDR_DM : out (3 downto 0);
00142 cntrl0_CLK_TB : out ;
00143 cntrl0_RESET_TB : out ;
00144 cntrl0_WDF_ALMOST_FULL : out ;
00145 cntrl0_AF_ALMOST_FULL : out ;
00146 cntrl0_READ_DATA_VALID : out ;
00147 cntrl0_BURST_LENGTH : out (2 downto 0);
00148 cntrl0_READ_DATA_FIFO_OUT : out (63 downto 0);
00149 cntrl0_DDR_CK : out (1 downto 0);
00150 cntrl0_DDR_CK_N : out (1 downto 0)
00151 );
00152 end component;
00153
00154
00155 component BUFG
00156 port(
00157 O : out ;
00158 I : in
00159 );
00160 end component;
00161
00162 --*************************************************************************
00163 --* main code
00164 --*************************************************************************
00165
00166 begin
00167
00168 LED_CONTR <= '1' when sys_res = '1' else '0';
00169
00170 sys_res <= SYS_RESET_IN when rising_edge(sysclk_p_i);
00171 lock_i <= not SYS_RESET_IN;
00172
00173 LED_R <= '1' when R_W = '1' else '0';
00174 sysclk_p_i <= SYSCLK_P;
00175 sysclk_n_i <= SYSCLK_N;
00176 clk200_p_i <= CLK200_P;
00177 clk200_n_i <= CLK200_N;
00178
00179 VALID_OUT <= read_valid when rising_edge(clk_buf);
00180 READ_DATA_OUT <= data_out when rising_edge(clk_buf);
00181 halt_i <= (data_full or nop_en) when R_W = '0' else '1';
00182 HALT <= not halt_i when rising_edge(clk_buf);
00183 address_vec <= '0' & command & "00000" & CS & bank_sel & row_sel & "00" & column_sel & block_start;
00184 ADDR_OVR <= '0' when SYS_RESET_IN = '1' else
00185 '1' when bank_sel = "11" and row_sel = "1111111111111" and column_sel = "111111" else
00186 '0';
00187 CS <= '0';
00188 mask <= (others => '0');
00189 block_start <= "000"; -- always start burst writes at position zero of block
00190 nop <= "111";
00191 command <= nop when nop_en = '1' else
00192 cmd;
00193 cmd <= "101" when R_W = '1' else -- read command
00194 "100"; -- write command
00195 RDBURST_END <= nop_en when R_W = '1' else '0';
00196
00197
00198 control_data_enable : process(clk_buf)
00199 begin
00200 if clk_buf'event and clk_buf = '1' then
00201 if R_W = '0' and data_full = '0' and nop_en = '0' then
00202 data_en <= '1';
00203 else
00204 data_en <= '0';
00205 end if;
00206 end if;
00207 end process control_data_enable;
00208
00209
00210
00211
00212
00213 addr_gen : process(clk_buf)
00214 begin
00215 if clk_buf'event and clk_buf = '1' then
00216
00217 if (sys_res or ADDR_RES) = '1' then
00218 column_sel <= (others => '0');
00219 bank_sel <= (others => '0');
00220 row_sel <= (others => '0');
00221 burst_cnt <= "00";
00222 nop_cnt <= "00";
00223 addr_en <= '0';
00224 nop_en <= '0';
00225
00226 elsif addr_full = '0' and EN = '1' then --stop_write = '0' then
00227
00228 burst_cnt <= burst_cnt + 1;
00229
00230 if R_W = '0' and data_full = '0' then
00231
00232 if burst_cnt = "11" then
00233 if nop_en = '1' then
00234 addr_en <= '0';
00235 else
00236 addr_en <= '1';
00237 end if;
00238 nop_cnt <= nop_cnt + 1;
00239 else
00240 addr_en <= '0';
00241 nop_cnt <= nop_cnt;
00242 end if;
00243
00244 if burst_cnt = "10" then
00245 if nop_cnt = "11" then
00246 nop_en <= '1';
00247 bank_sel <= bank_sel;
00248 column_sel <= column_sel;
00249 row_sel <= row_sel;
00250 else
00251 nop_en <= '0';
00252 end if;
00253 end if;
00254
00255 if nop_en = '0' then
00256 if burst_cnt = "11" then
00257 column_sel <= column_sel + 1;
00258 if column_sel = "111111" then
00259 bank_sel <= bank_sel + 1;
00260 column_sel <= (others => '0');
00261 if bank_sel = "11" then
00262 row_sel <= row_sel + 1;
00263 bank_sel <= "00";
00264
00265 else
00266 row_sel <= row_sel;
00267 end if;
00268 else
00269 bank_sel <= bank_sel;
00270 end if;
00271 else
00272 column_sel <= column_sel;
00273 end if;
00274 end if;
00275
00276 else
00277
00278 if burst_cnt = "11" then
00279 if nop_en = '1' then
00280 addr_en <= '0';
00281 else
00282 addr_en <= '1';
00283 end if;
00284 nop_en <= not nop_en;
00285 else
00286 addr_en <= '0';
00287 nop_cnt <= nop_cnt;
00288 end if;
00289
00290 if nop_en = '0' then
00291 if burst_cnt = "11" then
00292 column_sel <= column_sel + 1;
00293 if column_sel = "111111" then
00294 bank_sel <= bank_sel + 1;
00295 column_sel <= (others => '0');
00296 if bank_sel = "11" then
00297 row_sel <= row_sel + 1;
00298 bank_sel <= "00";
00299 else
00300 row_sel <= row_sel;
00301 end if;
00302 else
00303 bank_sel <= bank_sel;
00304 end if;
00305 else
00306 column_sel <= column_sel;
00307 end if;
00308 end if;
00309
00310 end if;
00311
00312 elsif R_W = '0' and EN = '0' then
00313 addr_en <= '0';
00314 nop_en <= '0';
00315 nop_cnt <= (others => '0');
00316
00317 else
00318
00319 addr_en <= '0';
00320
00321 end if;
00322 end if;
00323 end process addr_gen;
00324
00325
00326 RAM_controller : mem_interface_top
00327 port map
00328 (
00329 cntrl0_DDR_DQ => cntrl0_DDR_DQ,
00330 cntrl0_DDR_A => cntrl0_DDR_A,
00331 cntrl0_DDR_BA => cntrl0_DDR_BA,
00332 cntrl0_DDR_CKE => cntrl0_DDR_CKE,
00333 cntrl0_DDR_CS_N => cntrl0_DDR_CS_N,
00334 cntrl0_DDR_RAS_N => cntrl0_DDR_RAS_N,
00335 cntrl0_DDR_CAS_N => cntrl0_DDR_CAS_N,
00336 cntrl0_DDR_WE_N => cntrl0_DDR_WE_N,
00337 cntrl0_DDR_DM => cntrl0_DDR_DM,
00338 SYS_CLK_P => SYSCLK_P_i,
00339 SYS_CLK_N => SYSCLK_N_i,
00340 CLK200_P => CLK200_P_i,
00341 CLK200_N => CLK200_N_i,
00342 CLK200 => open,
00343 SYS_RESET_IN => sys_res,
00344 LOCK => lock_i,
00345 cntrl0_CLK_TB => clk_tb,
00346 cntrl0_RESET_TB => open,
00347 cntrl0_WDF_ALMOST_FULL => data_full,
00348 cntrl0_AF_ALMOST_FULL => addr_full,
00349 cntrl0_READ_DATA_VALID => read_valid,
00350 cntrl0_APP_WDF_WREN => data_en,
00351 cntrl0_APP_AF_WREN => addr_en,
00352 cntrl0_BURST_LENGTH => open,
00353 cntrl0_APP_AF_ADDR => address_vec,
00354 cntrl0_APP_WDF_DATA => DATA_IN,
00355 cntrl0_READ_DATA_FIFO_OUT => data_out,
00356 cntrl0_APP_MASK_DATA => mask,
00357 cntrl0_DDR_DQS => cntrl0_DDR_DQS,
00358 cntrl0_DDR_CK => cntrl0_DDR_CK_i,
00359 cntrl0_DDR_CK_N => cntrl0_DDR_CK_N_i
00360 );
00361
00362 cntrl0_DDR_CK <= cntrl0_DDR_CK_i(1);
00363 cntrl0_DDR_CK_N <= cntrl0_DDR_CK_N_i(1);
00364 clk_buf <= clk_tb;
00365
00366
00367 -- BUFG_clk_tb : BUFG
00368 -- port map (
00369 -- O => clk_buf, -- Clock buffer output
00370 -- I => clk_tb -- Clock buffer input
00371 -- );
00372
00373 end ram_user_backend_arc;
00374