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/eth/ddr_chksum_cal.vhd,v $
00015 --* $Revision: 2.4.2.4 $ *
00016 --* $Name: dev $ *
00017 --* $Author: mniegl $ *
00018 --* $Date: 2008/11/03 17:57:46 $ *
00019
00020
00021
00022 --* *
00023 --**************************************************************
00024
00025 library ieee;
00026
00027 use ieee.std_logic_1164.all;
00028
00029 library unisim;
00030
00031 use unisim.vcomponents.all;
00032
00033
00034
00035
00036 entity ddr_chksum_cal is
00037
00038 port (
00039 CLK : in ;
00040 RESET : in ;
00041 EN : in ;
00042 DATA_IN : in (63 downto 0);
00043 WRITE_DONE : in ;
00044 READ_DATA : in ;
00045 CAL_COMPL : out ;
00046 DATA_OUT : out (15 downto 0)
00047 );
00048
00049 end ddr_chksum_cal;
00050
00051
00052
00053
00054 architecture ddr_dsp_chksum_cal_arc of ddr_chksum_cal is
00055
00056 signal accu_res, done_i, wrd_sy : := '0';
00057 signal wrd_sy_msk : := '0';
00058 signal accu_out1, accu_out2 : (47 downto 0) := (others => '0');
00059 signal accu_cout1, accu_cout2 : (47 downto 0) := (others => '0');
00060 signal out32, cout32 : (47 downto 0) := (others => '0');
00061 signal out16, cout16 : (47 downto 0) := (others => '0');
00062 signal last_val : (15 downto 0) := (others => '0');
00063
00064
00065 component ddr_chksum_accu
00066 port (
00067 AB_IN : in (31 downto 0);
00068 CEA_IN : in ;
00069 CEB_IN : in ;
00070 CECTRL_IN : in ;
00071 CEM_IN : in ;
00072 CEP_IN : in ;
00073 CLK_IN : in ;
00074 LOAD_IN : in ;
00075 RSTA_IN : in ;
00076 RSTB_IN : in ;
00077 RSTCTRL_IN : in ;
00078 RSTM_IN : in ;
00079 RSTP_IN : in ;
00080 BCOUT_OUT : out (17 downto 0);
00081 PCOUT_OUT : out (47 downto 0);
00082 P_OUT : out (47 downto 0));
00083 end component;
00084
00085
00086 component ddr_chksum_adder
00087 port (
00088 AB_IN : in (31 downto 0);
00089 CARRYIN_IN : in ;
00090 CEA_IN : in ;
00091 CEB_IN : in ;
00092 CECINSUB_IN : in ;
00093 CEC_IN : in ;
00094 CEM_IN : in ;
00095 CEP_IN : in ;
00096 CLK_IN : in ;
00097 C_IN : in (31 downto 0);
00098 RSTA_IN : in ;
00099 RSTB_IN : in ;
00100 RSTCARRYIN_IN : in ;
00101 RSTC_IN : in ;
00102 RSTM_IN : in ;
00103 RSTP_IN : in ;
00104 BCOUT_OUT : out (17 downto 0);
00105 PCOUT_OUT : out (47 downto 0);
00106 P_OUT : out (47 downto 0));
00107 end component;
00108
00109
00110 component edge is
00111 port (
00112 CLK : in ;
00113 A : in ;
00114 PULSE : out );
00115 end component edge;
00116
00117 begin -- ddr_dsp_chksum_cal_arc
00118
00119 accu_res <= RESET or wrd_sy;
00120
00121
00122 sync_wr_done : entity work.edge port map
00123 (
00124 CLK => CLK ,
00125 A => WRITE_DONE,
00126 PULSE => wrd_sy
00127 );
00128
00129 wrd_sy_msk <= wrd_sy and (not RESET);
00130
00131
00132 done_del : SRL16
00133 generic map (
00134 INIT => X"0000")
00135 port map (
00136 Q => done_i , -- SRL data output
00137 A0 => '0' , -- Select[0] input
00138 A1 => '0' , -- Select[1] input
00139 A2 => '0' , -- Select[2] input
00140 A3 => '1' , -- Select[3] input
00141 CLK => CLK , -- Clock input
00142 D => wrd_sy_msk -- SRL data input
00143 );
00144
00145
00146 ddr_chksum_accu_1 : ddr_chksum_accu
00147 port map
00148 (
00149 AB_IN => DATA_IN(31 downto 0),
00150 CEA_IN => EN,
00151 CEB_IN => EN,
00152 CECTRL_IN => EN,
00153 CEM_IN => EN,
00154 CEP_IN => EN,
00155 CLK_IN => CLK,
00156 LOAD_IN => EN,
00157 RSTA_IN => accu_res,
00158 RSTB_IN => accu_res,
00159 RSTCTRL_IN => accu_res,
00160 RSTM_IN => accu_res,
00161 RSTP_IN => accu_res,
00162 BCOUT_OUT => open,
00163 PCOUT_OUT => open,
00164 P_OUT => accu_out1
00165 );
00166
00167
00168 ddr_chksum_accu_2 : ddr_chksum_accu
00169 port map
00170 (
00171 AB_IN => DATA_IN(63 downto 32),
00172 CEA_IN => EN,
00173 CEB_IN => EN,
00174 CECTRL_IN => EN,
00175 CEM_IN => EN,
00176 CEP_IN => EN,
00177 CLK_IN => CLK,
00178 LOAD_IN => EN,
00179 RSTA_IN => accu_res,
00180 RSTB_IN => accu_res,
00181 RSTCTRL_IN => accu_res,
00182 RSTM_IN => accu_res ,
00183 RSTP_IN => accu_res,
00184 BCOUT_OUT => open,
00185 PCOUT_OUT => open,
00186 P_OUT => accu_out2
00187 );
00188
00189
00190 ddr_chksum_add_in_1 : entity work.ddr_chksum_adder port map
00191 (
00192 AB_IN => accu_out1(31 downto 0),
00193 CARRYIN_IN => '0',
00194 CEA_IN => EN,
00195 CEB_IN => EN,
00196 CECINSUB_IN => EN,
00197 CEC_IN => EN,
00198 CEM_IN => EN,
00199 CEP_IN => EN,
00200 CLK_IN => CLK,
00201 C_IN(31 downto 16) => x"0000",
00202 C_IN(15 downto 0) => accu_out1(47 downto 32),
00203 RSTA_IN => RESET,
00204 RSTB_IN => RESET,
00205 RSTCARRYIN_IN => RESET,
00206 RSTC_IN => RESET,
00207 RSTM_IN => RESET,
00208 RSTP_IN => RESET,
00209 BCOUT_OUT => open,
00210 PCOUT_OUT => open,
00211 P_OUT => accu_cout1
00212 );
00213
00214
00215 ddr_chksum_add_in_2 : entity work.ddr_chksum_adder port map
00216 (
00217 AB_IN => accu_out2(31 downto 0),
00218 CARRYIN_IN => '0',
00219 CEA_IN => EN,
00220 CEB_IN => EN,
00221 CECINSUB_IN => EN,
00222 CEC_IN => EN,
00223 CEM_IN => EN,
00224 CEP_IN => EN,
00225 CLK_IN => CLK,
00226 C_IN(31 downto 16) => x"0000",
00227 C_IN(15 downto 0) => accu_out2(47 downto 32),
00228 RSTA_IN => RESET,
00229 RSTB_IN => RESET,
00230 RSTCARRYIN_IN => RESET,
00231 RSTC_IN => RESET,
00232 RSTM_IN => RESET,
00233 RSTP_IN => RESET,
00234 BCOUT_OUT => open,
00235 PCOUT_OUT => open,
00236 P_OUT => accu_cout2
00237 );
00238
00239
00240 ddr_chksum_combine_1 : entity work.ddr_chksum_adder port map
00241 (
00242 AB_IN => accu_cout1(31 downto 0),
00243 CARRYIN_IN => '0',
00244 CEA_IN => EN,
00245 CEB_IN => EN,
00246 CECINSUB_IN => EN,
00247 CEC_IN => EN,
00248 CEM_IN => EN,
00249 CEP_IN => EN,
00250 CLK_IN => CLK,
00251 C_IN => accu_cout2(31 downto 0),
00252 RSTA_IN => RESET,
00253 RSTB_IN => RESET,
00254 RSTCARRYIN_IN => RESET,
00255 RSTC_IN => RESET,
00256 RSTM_IN => RESET,
00257 RSTP_IN => RESET,
00258 BCOUT_OUT => open,
00259 PCOUT_OUT => open,
00260 P_OUT => out32
00261 );
00262
00263
00264 ddr_chksum_add_in_3 : entity work.ddr_chksum_adder port map
00265 (
00266 AB_IN => out32(31 downto 0),
00267 CARRYIN_IN => '0',
00268 CEA_IN => EN,
00269 CEB_IN => EN,
00270 CECINSUB_IN => EN,
00271 CEC_IN => EN,
00272 CEM_IN => EN,
00273 CEP_IN => EN,
00274 CLK_IN => CLK,
00275 C_IN(31 downto 16) => x"0000",
00276 C_IN(15 downto 0) => out32(47 downto 32),
00277 RSTA_IN => RESET,
00278 RSTB_IN => RESET,
00279 RSTCARRYIN_IN => RESET,
00280 RSTC_IN => RESET,
00281 RSTM_IN => RESET,
00282 RSTP_IN => RESET,
00283 BCOUT_OUT => open,
00284 PCOUT_OUT => open,
00285 P_OUT => cout32
00286 );
00287
00288
00289 ddr_chksum_combine_2 : entity work.ddr_chksum_adder port map
00290 (
00291 AB_IN(31 downto 16) => x"0000",
00292 AB_IN(15 downto 0) => cout32(15 downto 0),
00293 CARRYIN_IN => '0',
00294 CEA_IN => EN,
00295 CEB_IN => EN,
00296 CECINSUB_IN => EN,
00297 CEC_IN => EN,
00298 CEM_IN => EN,
00299 CEP_IN => EN,
00300 CLK_IN => CLK,
00301 C_IN(31 downto 16) => x"0000",
00302 C_IN(15 downto 0) => cout32(31 downto 16),
00303 RSTA_IN => RESET,
00304 RSTB_IN => RESET,
00305 RSTCARRYIN_IN => RESET,
00306 RSTC_IN => RESET,
00307 RSTM_IN => RESET,
00308 RSTP_IN => RESET,
00309 BCOUT_OUT => open,
00310 PCOUT_OUT => open,
00311 P_OUT => out16
00312 );
00313
00314
00315 ddr_chksum_add_in_4 : entity work.ddr_chksum_adder port map
00316 (
00317 AB_IN(31 downto 16) => x"0000",
00318 AB_IN(15 downto 0) => out16(15 downto 0),
00319 CARRYIN_IN => '0',
00320 CEA_IN => EN,
00321 CEB_IN => EN,
00322 CECINSUB_IN => EN,
00323 CEC_IN => EN,
00324 CEM_IN => EN,
00325 CEP_IN => EN,
00326 CLK_IN => CLK,
00327 C_IN(31 downto 16) => x"0000",
00328 C_IN(15 downto 0) => out16(31 downto 16),
00329 RSTA_IN => RESET,
00330 RSTB_IN => RESET,
00331 RSTCARRYIN_IN => RESET,
00332 RSTC_IN => RESET,
00333 RSTM_IN => RESET,
00334 RSTP_IN => RESET,
00335 BCOUT_OUT => open,
00336 PCOUT_OUT => open,
00337 P_OUT => cout16
00338 );
00339
00340 -- latch last computed value
00341 last_val <= cout16(15 downto 0) when done_i = '1' else
00342 (others => '0') when RESET = '1' else
00343 last_val;
00344 DATA_OUT <= last_val;
00345 CAL_COMPL <= done_i when rising_edge(CLK);
00346
00347 end ddr_dsp_chksum_cal_arc;
00348