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/ddr2/ddr2_usr_be.vhd,v $ *
00015 --* $Revision: 1.13.2.4 $ *
00016 --* $Name: dev $ *
00017 --* $Author: mniegl $ *
00018 --* $Date: 2008/11/03 17:57:45 $ *
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
00036
00037
00038
00039
00040 entity ddr2_usr_be is
00041 port(
00042 cntrl0_DDR2_DQ : inout (63 downto 0);
00043 cntrl0_DDR2_DQS : inout (7 downto 0);
00044 cntrl0_DDR2_DQS_N : inout (7 downto 0);
00045 cntrl0_DDR2_A : out (13 downto 0);
00046 cntrl0_DDR2_BA : out (1 downto 0);
00047 cntrl0_DDR2_RAS_N : out ;
00048 cntrl0_DDR2_CAS_N : out ;
00049 cntrl0_DDR2_WE_N : out ;
00050 cntrl0_DDR2_RESET_N : out ;
00051 cntrl0_DDR2_CS_N : out ;
00052 cntrl0_DDR2_ODT : out ;
00053 cntrl0_DDR2_CKE : out ;
00054 cntrl0_DDR2_DM : out (7 downto 0);
00055 cntrl0_DDR2_CK : out ;
00056 cntrl0_DDR2_CK_N : out ;
00057 COMP_OUT1 : out ;
00058 COMP_OUT2 : out ;
00059 LED_CONTR : out ;
00060 LED_R : out ;
00061 VALID_OUT : out ;
00062 SYSCLK : in ;
00063 CLK_SLOW : in ;
00064 R_W : in ;
00065 FETCH : out ;
00066 RESET_IN : in ;
00067 ADDR_RES : in ;
00068 ADDR_OVR : out ;
00069 DATA_IN : in (127 downto 0);
00070 EN : in ;
00071 RDBURST_END : out ;
00072 DATA_OUT : out (127 downto 0)
00073 );
00074 end ddr2_usr_be;
00075
00076
00077
00078
00079 architecture ddr2_usr_be_arc of ddr2_usr_be is
00080
00081 --*************************** Signal Declarations *****************************
00082 signal clk_tb : := '0';
00083 signal data_full : := '0';
00084 signal addr_full : := '0';
00085 signal data_en : := '0';
00086 signal data_en_i : := '0';
00087 signal addr_en : := '0';
00088 signal addr_en_ram : := '0';
00089 signal nop_en : := '0';
00090 signal valid : := '0';
00091 signal reset : := '0';
00092 signal res_out : := '0';
00093 signal res_in : := '0';
00094 signal CS : := '0';
00095 signal AP : := '0';
00096 signal addr_ovr_i : := '0';
00097 signal mask : (15 downto 0) := (others => '0');
00098 signal write_data : (127 downto 0) := (others => '0');
00099 signal read_data1 : (127 downto 0) := (others => '0');
00100 signal addr : (35 downto 0) := (others => '0');
00101 signal addr_ram : (35 downto 0) := (others => '0');
00102 signal cmd : (2 downto 0) := (others => '0');
00103 signal nop_cnt : (2 downto 0) := (others => '0');
00104 signal burst_cnt : (1 downto 0) := (others => '0');
00105 signal bank_sel : (1 downto 0) := (others => '0');
00106 signal row_sel : (12 downto 0) := (others => '0');
00107 signal column_sel : (6 downto 0) := (others => '0');
00108 signal block_start : (2 downto 0) := (others => '0');
00109
00110 --************************** Component Declarations ***************************
00111
00112 component ddr2_mem
00113 port(
00114 SYS_CLK_P : in ;
00115 SYS_CLK_N : in ;
00116 CLK200_P : in ;
00117 CLK200_N : in ;
00118 SYS_RESET_IN : in ;
00119 cntrl0_APP_WDF_WREN : in ;
00120 cntrl0_APP_AF_WREN : in ;
00121 cntrl0_APP_AF_ADDR : in (35 downto 0);
00122 cntrl0_APP_WDF_DATA : in (127 downto 0);
00123 cntrl0_APP_MASK_DATA : in (15 downto 0);
00124 cntrl0_DDR2_DQ : inout (63 downto 0);
00125 cntrl0_DDR2_DQS : inout (7 downto 0);
00126 cntrl0_DDR2_DQS_N : inout (7 downto 0);
00127 cntrl0_DDR2_A : out (13 downto 0);
00128 cntrl0_DDR2_BA : out (1 downto 0);
00129 cntrl0_DDR2_RAS_N : out ;
00130 cntrl0_DDR2_CAS_N : out ;
00131 cntrl0_DDR2_WE_N : out ;
00132 cntrl0_DDR2_RESET_N : out ;
00133 cntrl0_DDR2_CS_N : out ;
00134 cntrl0_DDR2_ODT : out ;
00135 cntrl0_DDR2_CKE : out ;
00136 cntrl0_DDR2_DM : out (7 downto 0);
00137 cntrl0_CLK_TB : out ;
00138 cntrl0_RESET_TB : out ;
00139 cntrl0_WDF_ALMOST_FULL : out ;
00140 cntrl0_AF_ALMOST_FULL : out ;
00141 cntrl0_READ_DATA_VALID : out ;
00142 cntrl0_BURST_LENGTH : out (2 downto 0);
00143 cntrl0_READ_DATA_FIFO_OUT : out (127 downto 0);
00144 cntrl0_DDR2_CK : out ;
00145 cntrl0_DDR2_CK_N : out ;
00146 LOCK_IN : in
00147 );
00148 end component;
00149
00150
00151 component edge
00152 port(
00153 CLK : in ;
00154 A : in ;
00155 PULSE : out
00156 );
00157 end component;
00158
00159
00160 component extend_test
00161 generic (
00162 LEN : range 0 to 63 := 2
00163 );
00164 port(
00165 CLK : in ;
00166 RES : in ;
00167 A : in ;
00168 ENDM : out ;
00169 Y : out
00170 );
00171 end component;
00172
00173 --*****************************************************************************
00174 -- main code
00175 --*****************************************************************************
00176 begin
00177
00178 LED_R <= '0';
00179 LED_CONTR <= '0';
00180 COMP_OUT1 <= '0';
00181 COMP_OUT2 <= '0';
00182 mask <= (others => '0');
00183 CS <= '0';
00184 AP <= '0';
00185 block_start <= "000";
00186
00187 addr <= '0' & cmd & "0000" & CS & bank_sel & '0' & row_sel & AP & column_sel & block_start;
00188 cmd <= "101" when R_W = '1' else -- read command
00189 "100"; -- write command
00190 addr_ovr_i <= '0' when RESET_IN = '1' else
00191 '1' when bank_sel = "11" and row_sel = "1111111111111" and column_sel = "1111111" else
00192 '0';
00193 addr_ram <= addr when rising_edge(clk_tb);
00194 addr_en <= addr_en_ram when rising_edge(clk_tb);
00195 VALID_OUT <= valid when rising_edge(clk_tb);
00196 write_data <= DATA_IN when rising_edge(clk_tb);
00197 res_in <= not RESET_IN;
00198 FETCH <= data_en_i;
00199
00200
00201 reset_ext : extend_test
00202 generic map (LEN => 20)
00203 port map(
00204 CLK => CLK_SLOW ,
00205 RES => RESET_IN ,
00206 ENDM => open,
00207 A => res_out ,
00208 Y => reset
00209 );
00210
00211
00212 pulse_ovr : edge
00213 port map (
00214 CLK => clk_tb,
00215 A => addr_ovr_i,
00216 PULSE => ADDR_OVR
00217 );
00218
00219
00220 control_data_enable : process(clk_tb)
00221 begin
00222 if clk_tb'event and clk_tb = '1' then
00223 data_en <= data_en_i;
00224 if reset = '1' then
00225 data_en_i <= '0';
00226 else
00227 if R_W = '0' and data_full = '0' and nop_en = '0' and EN = '1' then
00228 --if R_W = '0' and stop_write = '0' and nop_en = '0' then
00229 data_en_i <= '1';
00230 else
00231 data_en_i <= '0';
00232 end if;
00233 end if;
00234 end if;
00235 end process;
00236
00237
00238 RDBURST_END <= nop_en;
00239
00240
00241 addr_gen : process(clk_tb)
00242 begin
00243 if clk_tb'event and clk_tb = '1' then
00244
00245 if (reset or ADDR_RES) = '1' then
00246 column_sel <= (others => '0');
00247 bank_sel <= (others => '0');
00248 row_sel <= (others => '0');
00249 burst_cnt <= "00";
00250 nop_cnt <= (others => '0');
00251 addr_en_ram <= '0';
00252 nop_en <= '0';
00253
00254 elsif addr_full = '0' and EN = '1' then
00255 -- elsif stop_write = '0' then
00256
00257 if R_W = '0' and data_full = '0' then -- 7+1 write burst structure
00258
00259 burst_cnt <= burst_cnt + 1;
00260 --addr_en <= '1';
00261 --nop_en <= '0';
00262
00263 if burst_cnt = "11" then
00264 if nop_en = '1' then
00265 addr_en_ram <= '0';
00266 else
00267 addr_en_ram <= '1';
00268 end if;
00269 nop_cnt <= nop_cnt + 1;
00270 else
00271 addr_en_ram <= '0';
00272 nop_cnt <= nop_cnt;
00273 end if;
00274
00275 if burst_cnt = "10" then
00276 if nop_cnt = "111" then
00277 nop_en <= '1';
00278 bank_sel <= bank_sel;
00279 column_sel <= column_sel;
00280 row_sel <= row_sel;
00281 else
00282 nop_en <= '0';
00283 end if;
00284 end if;
00285 if nop_en = '0' then
00286 if burst_cnt = "11" then
00287 column_sel <= column_sel + 1;
00288 if column_sel = "1111111" then
00289 bank_sel <= bank_sel + 1;
00290 column_sel <= (others => '0');
00291 if bank_sel = "11" then
00292 row_sel <= row_sel + 1;
00293 bank_sel <= "00";
00294
00295 if row_sel = "1111111111111" then
00296 nop_cnt <= (others => '0');
00297 nop_en <= '0';
00298 else
00299 end if;
00300
00301 else
00302 row_sel <= row_sel;
00303 end if;
00304 else
00305 bank_sel <= bank_sel;
00306 end if;
00307 else
00308 column_sel <= column_sel;
00309 end if;
00310 end if;
00311
00312 else -- 1+1 read structure
00313
00314 burst_cnt <= burst_cnt + 1;
00315
00316 if burst_cnt = "11" then
00317 if nop_en = '1' then
00318 addr_en_ram <= '0';
00319 else
00320 addr_en_ram <= '1';
00321 end if;
00322 nop_en <= not nop_en;
00323 else
00324 addr_en_ram <= '0';
00325 nop_cnt <= nop_cnt;
00326 end if;
00327
00328 if nop_en = '0' then
00329 if burst_cnt = "11" then
00330 column_sel <= column_sel + 1;
00331 if column_sel = "1111111" then
00332 bank_sel <= bank_sel + 1;
00333 column_sel <= (others => '0');
00334 if bank_sel = "11" then
00335 row_sel <= row_sel + 1;
00336 bank_sel <= "00";
00337
00338 if row_sel = "1111111111111" then
00339 nop_cnt <= (others => '0');
00340 nop_en <= '0';
00341 else
00342 end if;
00343
00344 else
00345 row_sel <= row_sel;
00346 end if;
00347 else
00348 bank_sel <= bank_sel;
00349 end if;
00350 else
00351 column_sel <= column_sel;
00352 end if;
00353 end if;
00354
00355 end if;
00356
00357 elsif R_W = '0' and EN = '0' then
00358 addr_en_ram <= '0';
00359 nop_en <= '0';
00360 nop_cnt <= (others => '0');
00361
00362 else
00363
00364 addr_en_ram <= '0';
00365 burst_cnt <= burst_cnt;
00366
00367 end if;
00368 end if;
00369 end process addr_gen;
00370
00371 clk_tb <= SYSCLK; --clk200_buf1;
00372
00373
00374 -- clk200_buffer1 : BUFG
00375 -- port map (
00376 -- O => clk200_buf1, -- Clock buffer output
00377 -- I => SYSCLK -- Clock buffer input
00378 -- );
00379
00380
00381 ram_contr : ddr2_mem
00382 port map
00383 (
00384 cntrl0_DDR2_DQ => cntrl0_DDR2_DQ,
00385 cntrl0_DDR2_A => cntrl0_DDR2_A,
00386 cntrl0_DDR2_BA => cntrl0_DDR2_BA,
00387 cntrl0_DDR2_RAS_N => cntrl0_DDR2_RAS_N,
00388 cntrl0_DDR2_CAS_N => cntrl0_DDR2_CAS_N,
00389 cntrl0_DDR2_WE_N => cntrl0_DDR2_WE_N,
00390 cntrl0_DDR2_RESET_N => cntrl0_DDR2_RESET_N,
00391 cntrl0_DDR2_CS_N => cntrl0_DDR2_CS_N,
00392 cntrl0_DDR2_ODT => cntrl0_DDR2_ODT,
00393 cntrl0_DDR2_CKE => cntrl0_DDR2_CKE,
00394 cntrl0_DDR2_DM => cntrl0_DDR2_DM,
00395 SYS_CLK_P => clk_tb,
00396 SYS_CLK_N => '0',
00397 CLK200_P => '0',
00398 CLK200_N => '0',
00399 SYS_RESET_IN => res_in,
00400 cntrl0_CLK_TB => open,
00401 cntrl0_RESET_TB => res_out,
00402 cntrl0_WDF_ALMOST_FULL => data_full,
00403 cntrl0_AF_ALMOST_FULL => addr_full,
00404 cntrl0_READ_DATA_VALID => valid,
00405 cntrl0_APP_WDF_WREN => data_en,
00406 cntrl0_APP_AF_WREN => addr_en,
00407 cntrl0_BURST_LENGTH => open,
00408 cntrl0_APP_AF_ADDR => addr_ram,
00409 cntrl0_READ_DATA_FIFO_OUT => read_data1,
00410 cntrl0_APP_WDF_DATA => write_data,
00411 cntrl0_APP_MASK_DATA => mask,
00412 cntrl0_DDR2_DQS => cntrl0_DDR2_DQS,
00413 cntrl0_DDR2_DQS_N => cntrl0_DDR2_DQS_N,
00414 cntrl0_DDR2_CK => cntrl0_DDR2_CK,
00415 cntrl0_DDR2_CK_N => cntrl0_DDR2_CK_N,
00416 LOCK_IN => res_in
00417 );
00418
00419 DATA_OUT <= read_data1 when rising_edge(clk_tb);
00420
00421 end ddr2_usr_be_arc;
00422