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/ddr2_chksum_cal.vhd,v $
00015 --* $Revision: 2.3.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 ddr2_chksum_cal is
00037
00038 port (
00039 CLK : in ;
00040 RESET : in ;
00041 EN : in ;
00042 DATA_IN : in (127 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 ddr2_chksum_cal;
00050
00051
00052
00053
00054 architecture ddr2_dsp_chksum_cal_arc of ddr2_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_out3, accu_out4 : (47 downto 0) := (others => '0');
00060 signal accu_cout1, accu_cout2 : (47 downto 0) := (others => '0');
00061 signal accu_cout3, accu_cout4 : (47 downto 0) := (others => '0');
00062 signal out32, cout32 : (47 downto 0) := (others => '0');
00063 signal out16, cout16 : (47 downto 0) := (others => '0');
00064 signal out32a, cout32a : (47 downto 0) := (others => '0');
00065 signal out16a, cout16a : (47 downto 0) := (others => '0');
00066 signal outd, coutd : (47 downto 0) := (others => '0');
00067 signal last_val : (15 downto 0) := (others => '0');
00068
00069
00070 component ddr_chksum_accu
00071 port (
00072 AB_IN : in (31 downto 0);
00073 CEA_IN : in ;
00074 CEB_IN : in ;
00075 CECTRL_IN : in ;
00076 CEM_IN : in ;
00077 CEP_IN : in ;
00078 CLK_IN : in ;
00079 LOAD_IN : in ;
00080 RSTA_IN : in ;
00081 RSTB_IN : in ;
00082 RSTCTRL_IN : in ;
00083 RSTM_IN : in ;
00084 RSTP_IN : in ;
00085 BCOUT_OUT : out (17 downto 0);
00086 PCOUT_OUT : out (47 downto 0);
00087 P_OUT : out (47 downto 0));
00088 end component;
00089
00090
00091 component ddr_chksum_adder
00092 port (
00093 AB_IN : in (31 downto 0);
00094 CARRYIN_IN : in ;
00095 CEA_IN : in ;
00096 CEB_IN : in ;
00097 CECINSUB_IN : in ;
00098 CEC_IN : in ;
00099 CEM_IN : in ;
00100 CEP_IN : in ;
00101 CLK_IN : in ;
00102 C_IN : in (31 downto 0);
00103 RSTA_IN : in ;
00104 RSTB_IN : in ;
00105 RSTCARRYIN_IN : in ;
00106 RSTC_IN : in ;
00107 RSTM_IN : in ;
00108 RSTP_IN : in ;
00109 BCOUT_OUT : out (17 downto 0);
00110 PCOUT_OUT : out (47 downto 0);
00111 P_OUT : out (47 downto 0));
00112 end component;
00113
00114
00115 component edge is
00116 port (
00117 CLK : in ;
00118 A : in ;
00119 PULSE : out );
00120 end component edge;
00121
00122 begin -- ddr_dsp_chksum_cal_arc
00123
00124 accu_res <= RESET or wrd_sy;
00125
00126
00127 sync_wr_done : entity work.edge port map
00128 (
00129 CLK => CLK ,
00130 A => WRITE_DONE,
00131 PULSE => wrd_sy
00132 );
00133
00134 wrd_sy_msk <= wrd_sy and (not RESET);
00135
00136
00137 done_del : SRL16
00138 generic map (
00139 INIT => X"0000")
00140 port map (
00141 Q => done_i , -- SRL data output
00142 A0 => '0' , -- Select[0] input
00143 A1 => '1' , -- Select[1] input
00144 A2 => '0' , -- Select[2] input
00145 A3 => '1' , -- Select[3] input
00146 CLK => CLK , -- Clock input
00147 D => wrd_sy_msk -- SRL data input
00148 );
00149
00150
00151 ddr_chksum_accu_1 : ddr_chksum_accu
00152 port map
00153 (
00154 AB_IN => DATA_IN(31 downto 0),
00155 CEA_IN => EN,
00156 CEB_IN => EN,
00157 CECTRL_IN => EN,
00158 CEM_IN => EN,
00159 CEP_IN => EN,
00160 CLK_IN => CLK,
00161 LOAD_IN => EN,
00162 RSTA_IN => accu_res,
00163 RSTB_IN => accu_res,
00164 RSTCTRL_IN => accu_res,
00165 RSTM_IN => accu_res,
00166 RSTP_IN => accu_res,
00167 BCOUT_OUT => open,
00168 PCOUT_OUT => open,
00169 P_OUT => accu_out1
00170 );
00171
00172
00173 ddr_chksum_accu_2 : ddr_chksum_accu
00174 port map
00175 (
00176 AB_IN => DATA_IN(63 downto 32),
00177 CEA_IN => EN,
00178 CEB_IN => EN,
00179 CECTRL_IN => EN,
00180 CEM_IN => EN,
00181 CEP_IN => EN,
00182 CLK_IN => CLK,
00183 LOAD_IN => EN,
00184 RSTA_IN => accu_res,
00185 RSTB_IN => accu_res,
00186 RSTCTRL_IN => accu_res,
00187 RSTM_IN => accu_res,
00188 RSTP_IN => accu_res,
00189 BCOUT_OUT => open,
00190 PCOUT_OUT => open,
00191 P_OUT => accu_out2
00192 );
00193
00194
00195 ddr_chksum_accu_1a : ddr_chksum_accu
00196 port map
00197 (
00198 AB_IN => DATA_IN(95 downto 64),
00199 CEA_IN => EN,
00200 CEB_IN => EN,
00201 CECTRL_IN => EN,
00202 CEM_IN => EN,
00203 CEP_IN => EN,
00204 CLK_IN => CLK,
00205 LOAD_IN => EN,
00206 RSTA_IN => accu_res,
00207 RSTB_IN => accu_res,
00208 RSTCTRL_IN => accu_res,
00209 RSTM_IN => accu_res,
00210 RSTP_IN => accu_res,
00211 BCOUT_OUT => open,
00212 PCOUT_OUT => open,
00213 P_OUT => accu_out3
00214 );
00215
00216
00217 ddr_chksum_accu_2a : ddr_chksum_accu
00218 port map
00219 (
00220 AB_IN => DATA_IN(127 downto 96),
00221 CEA_IN => EN,
00222 CEB_IN => EN,
00223 CECTRL_IN => EN,
00224 CEM_IN => EN,
00225 CEP_IN => EN,
00226 CLK_IN => CLK,
00227 LOAD_IN => EN,
00228 RSTA_IN => accu_res,
00229 RSTB_IN => accu_res,
00230 RSTCTRL_IN => accu_res,
00231 RSTM_IN => accu_res,
00232 RSTP_IN => accu_res,
00233 BCOUT_OUT => open,
00234 PCOUT_OUT => open,
00235 P_OUT => accu_out4
00236 );
00237
00238
00239 ddr_chksum_add_in_1 : entity work.ddr_chksum_adder port map
00240 (
00241 AB_IN => accu_out1(31 downto 0),
00242 CARRYIN_IN => '0',
00243 CEA_IN => EN,
00244 CEB_IN => EN,
00245 CECINSUB_IN => EN,
00246 CEC_IN => EN,
00247 CEM_IN => EN,
00248 CEP_IN => EN,
00249 CLK_IN => CLK,
00250 C_IN(31 downto 16) => x"0000",
00251 C_IN(15 downto 0) => accu_out1(47 downto 32),
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 => accu_cout1
00261 );
00262
00263
00264 ddr_chksum_add_in_2 : entity work.ddr_chksum_adder port map
00265 (
00266 AB_IN => accu_out2(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) => accu_out2(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 => accu_cout2
00286 );
00287
00288
00289 ddr_chksum_add_in_1a : entity work.ddr_chksum_adder port map
00290 (
00291 AB_IN => accu_out3(31 downto 0),
00292 CARRYIN_IN => '0',
00293 CEA_IN => EN,
00294 CEB_IN => EN,
00295 CECINSUB_IN => EN,
00296 CEC_IN => EN,
00297 CEM_IN => EN,
00298 CEP_IN => EN,
00299 CLK_IN => CLK,
00300 C_IN(31 downto 16) => x"0000",
00301 C_IN(15 downto 0) => accu_out3(47 downto 32),
00302 RSTA_IN => RESET,
00303 RSTB_IN => RESET,
00304 RSTCARRYIN_IN => RESET,
00305 RSTC_IN => RESET,
00306 RSTM_IN => RESET,
00307 RSTP_IN => RESET,
00308 BCOUT_OUT => open,
00309 PCOUT_OUT => open,
00310 P_OUT => accu_cout3
00311 );
00312
00313
00314 ddr_chksum_add_in_2a : entity work.ddr_chksum_adder port map
00315 (
00316 AB_IN => accu_out4(31 downto 0),
00317 CARRYIN_IN => '0',
00318 CEA_IN => EN,
00319 CEB_IN => EN,
00320 CECINSUB_IN => EN,
00321 CEC_IN => EN,
00322 CEM_IN => EN,
00323 CEP_IN => EN,
00324 CLK_IN => CLK,
00325 C_IN(31 downto 16) => x"0000",
00326 C_IN(15 downto 0) => accu_out4(47 downto 32),
00327 RSTA_IN => RESET,
00328 RSTB_IN => RESET,
00329 RSTCARRYIN_IN => RESET,
00330 RSTC_IN => RESET,
00331 RSTM_IN => RESET,
00332 RSTP_IN => RESET,
00333 BCOUT_OUT => open,
00334 PCOUT_OUT => open,
00335 P_OUT => accu_cout4
00336 );
00337
00338
00339 ddr_chksum_combine_1 : entity work.ddr_chksum_adder port map
00340 (
00341 AB_IN => accu_cout1(31 downto 0),
00342 CARRYIN_IN => '0',
00343 CEA_IN => EN,
00344 CEB_IN => EN,
00345 CECINSUB_IN => EN,
00346 CEC_IN => EN,
00347 CEM_IN => EN,
00348 CEP_IN => EN,
00349 CLK_IN => CLK,
00350 C_IN => accu_cout2(31 downto 0),
00351 RSTA_IN => RESET,
00352 RSTB_IN => RESET,
00353 RSTCARRYIN_IN => RESET,
00354 RSTC_IN => RESET,
00355 RSTM_IN => RESET,
00356 RSTP_IN => RESET,
00357 BCOUT_OUT => open,
00358 PCOUT_OUT => open,
00359 P_OUT => out32
00360 );
00361
00362
00363 ddr_chksum_combine_1a : entity work.ddr_chksum_adder port map
00364 (
00365 AB_IN => accu_cout3(31 downto 0),
00366 CARRYIN_IN => '0',
00367 CEA_IN => EN,
00368 CEB_IN => EN,
00369 CECINSUB_IN => EN,
00370 CEC_IN => EN,
00371 CEM_IN => EN,
00372 CEP_IN => EN,
00373 CLK_IN => CLK,
00374 C_IN => accu_cout4(31 downto 0),
00375 RSTA_IN => RESET,
00376 RSTB_IN => RESET,
00377 RSTCARRYIN_IN => RESET,
00378 RSTC_IN => RESET,
00379 RSTM_IN => RESET,
00380 RSTP_IN => RESET,
00381 BCOUT_OUT => open,
00382 PCOUT_OUT => open,
00383 P_OUT => out32a
00384 );
00385
00386
00387 ddr_chksum_add_in_3 : entity work.ddr_chksum_adder port map
00388 (
00389 AB_IN => out32(31 downto 0),
00390 CARRYIN_IN => '0',
00391 CEA_IN => EN,
00392 CEB_IN => EN,
00393 CECINSUB_IN => EN,
00394 CEC_IN => EN,
00395 CEM_IN => EN,
00396 CEP_IN => EN,
00397 CLK_IN => CLK,
00398 C_IN(31 downto 16) => x"0000",
00399 C_IN(15 downto 0) => out32(47 downto 32),
00400 RSTA_IN => RESET,
00401 RSTB_IN => RESET,
00402 RSTCARRYIN_IN => RESET,
00403 RSTC_IN => RESET,
00404 RSTM_IN => RESET,
00405 RSTP_IN => RESET,
00406 BCOUT_OUT => open,
00407 PCOUT_OUT => open,
00408 P_OUT => cout32
00409 );
00410
00411
00412 ddr_chksum_add_in_3a : entity work.ddr_chksum_adder port map
00413 (
00414 AB_IN => out32a(31 downto 0),
00415 CARRYIN_IN => '0',
00416 CEA_IN => EN,
00417 CEB_IN => EN,
00418 CECINSUB_IN => EN,
00419 CEC_IN => EN,
00420 CEM_IN => EN,
00421 CEP_IN => EN,
00422 CLK_IN => CLK,
00423 C_IN(31 downto 16) => x"0000",
00424 C_IN(15 downto 0) => out32a(47 downto 32),
00425 RSTA_IN => RESET,
00426 RSTB_IN => RESET,
00427 RSTCARRYIN_IN => RESET,
00428 RSTC_IN => RESET,
00429 RSTM_IN => RESET,
00430 RSTP_IN => RESET,
00431 BCOUT_OUT => open,
00432 PCOUT_OUT => open,
00433 P_OUT => cout32a
00434 );
00435
00436
00437 ddr_chksum_combine_2 : entity work.ddr_chksum_adder port map
00438 (
00439 AB_IN(31 downto 16) => x"0000",
00440 AB_IN(15 downto 0) => cout32(15 downto 0),
00441 CARRYIN_IN => '0',
00442 CEA_IN => EN,
00443 CEB_IN => EN,
00444 CECINSUB_IN => EN,
00445 CEC_IN => EN,
00446 CEM_IN => EN,
00447 CEP_IN => EN,
00448 CLK_IN => CLK,
00449 C_IN(31 downto 16) => x"0000",
00450 C_IN(15 downto 0) => cout32(31 downto 16),
00451 RSTA_IN => RESET,
00452 RSTB_IN => RESET,
00453 RSTCARRYIN_IN => RESET,
00454 RSTC_IN => RESET,
00455 RSTM_IN => RESET,
00456 RSTP_IN => RESET,
00457 BCOUT_OUT => open,
00458 PCOUT_OUT => open,
00459 P_OUT => out16
00460 );
00461
00462
00463 ddr_chksum_combine_2a : entity work.ddr_chksum_adder port map
00464 (
00465 AB_IN(31 downto 16) => x"0000",
00466 AB_IN(15 downto 0) => cout32a(15 downto 0),
00467 CARRYIN_IN => '0',
00468 CEA_IN => EN,
00469 CEB_IN => EN,
00470 CECINSUB_IN => EN,
00471 CEC_IN => EN,
00472 CEM_IN => EN,
00473 CEP_IN => EN,
00474 CLK_IN => CLK,
00475 C_IN(31 downto 16) => x"0000",
00476 C_IN(15 downto 0) => cout32a(31 downto 16),
00477 RSTA_IN => RESET,
00478 RSTB_IN => RESET,
00479 RSTCARRYIN_IN => RESET,
00480 RSTC_IN => RESET,
00481 RSTM_IN => RESET,
00482 RSTP_IN => RESET,
00483 BCOUT_OUT => open,
00484 PCOUT_OUT => open,
00485 P_OUT => out16a
00486 );
00487
00488
00489 ddr_chksum_add_in_4 : entity work.ddr_chksum_adder port map
00490 (
00491 AB_IN(31 downto 16) => x"0000",
00492 AB_IN(15 downto 0) => out16(15 downto 0),
00493 CARRYIN_IN => '0',
00494 CEA_IN => EN,
00495 CEB_IN => EN,
00496 CECINSUB_IN => EN,
00497 CEC_IN => EN,
00498 CEM_IN => EN,
00499 CEP_IN => EN,
00500 CLK_IN => CLK,
00501 C_IN(31 downto 16) => x"0000",
00502 C_IN(15 downto 0) => out16(31 downto 16),
00503 RSTA_IN => RESET,
00504 RSTB_IN => RESET,
00505 RSTCARRYIN_IN => RESET,
00506 RSTC_IN => RESET,
00507 RSTM_IN => RESET,
00508 RSTP_IN => RESET,
00509 BCOUT_OUT => open,
00510 PCOUT_OUT => open,
00511 P_OUT => cout16
00512 );
00513
00514
00515 ddr_chksum_add_in_4a : entity work.ddr_chksum_adder port map
00516 (
00517 AB_IN(31 downto 16) => x"0000",
00518 AB_IN(15 downto 0) => out16a(15 downto 0),
00519 CARRYIN_IN => '0',
00520 CEA_IN => EN,
00521 CEB_IN => EN,
00522 CECINSUB_IN => EN,
00523 CEC_IN => EN,
00524 CEM_IN => EN,
00525 CEP_IN => EN,
00526 CLK_IN => CLK,
00527 C_IN(31 downto 16) => x"0000",
00528 C_IN(15 downto 0) => out16a(31 downto 16),
00529 RSTA_IN => RESET,
00530 RSTB_IN => RESET,
00531 RSTCARRYIN_IN => RESET,
00532 RSTC_IN => RESET,
00533 RSTM_IN => RESET,
00534 RSTP_IN => RESET,
00535 BCOUT_OUT => open,
00536 PCOUT_OUT => open,
00537 P_OUT => cout16a
00538 );
00539
00540
00541 ddr_chksum_combine_3 : entity work.ddr_chksum_adder port map
00542 (
00543 AB_IN(31 downto 16) => x"0000",
00544 AB_IN(15 downto 0) => cout16(15 downto 0),
00545 CARRYIN_IN => '0',
00546 CEA_IN => EN,
00547 CEB_IN => EN,
00548 CECINSUB_IN => EN,
00549 CEC_IN => EN,
00550 CEM_IN => EN,
00551 CEP_IN => EN,
00552 CLK_IN => CLK,
00553 C_IN(31 downto 16) => x"0000",
00554 C_IN(15 downto 0) => cout16(31 downto 16),
00555 RSTA_IN => RESET,
00556 RSTB_IN => RESET,
00557 RSTCARRYIN_IN => RESET,
00558 RSTC_IN => RESET,
00559 RSTM_IN => RESET,
00560 RSTP_IN => RESET,
00561 BCOUT_OUT => open,
00562 PCOUT_OUT => open,
00563 P_OUT => outd
00564 );
00565
00566
00567 ddr_chksum_add_in_5 : entity work.ddr_chksum_adder port map
00568 (
00569 AB_IN(31 downto 16) => x"0000" ,
00570 AB_IN(15 downto 0) => outd(15 downto 0),
00571 CARRYIN_IN => '0',
00572 CEA_IN => EN,
00573 CEB_IN => EN,
00574 CECINSUB_IN => EN,
00575 CEC_IN => EN,
00576 CEM_IN => EN,
00577 CEP_IN => EN,
00578 CLK_IN => CLK,
00579 C_IN(31 downto 16) => x"0000",
00580 C_IN(15 downto 0) => outd(31 downto 16),
00581 RSTA_IN => RESET,
00582 RSTB_IN => RESET,
00583 RSTCARRYIN_IN => RESET,
00584 RSTC_IN => RESET,
00585 RSTM_IN => RESET,
00586 RSTP_IN => RESET,
00587 BCOUT_OUT => open,
00588 PCOUT_OUT => open,
00589 P_OUT => coutd
00590 );
00591
00592 -- latch last computed value
00593 last_val <= coutd(15 downto 0) when done_i = '1' else
00594 (others => '0') when RESET = '1' else
00595 last_val;
00596 DATA_OUT <= last_val;
00597 CAL_COMPL <= done_i when rising_edge(CLK);
00598
00599 end ddr2_dsp_chksum_cal_arc;
00600