Commit bf36a0c8 authored by Tomasz Wlostowski's avatar Tomasz Wlostowski

merged clock tree fixes branch

parents 7bb56989 4d472dcb
*.*\#
\#*
.\#*
*.*~
hdl/ip_cores/*
modelsim.ini
*.wlf
*.vstf
work
*.bak
syn/*
transcript
\ No newline at end of file
modules = {"local": [
"hdl/rtl",
"hdl/top/spec"] };
files = [
"blk_mem_circ_buff_v6_4.ngc",
"blk_mem_gen_v6_1.ngc",
"blk_mem_gen_v6_2.ngc",
"blk_mem_gen_v6_3.ngc",
"Manifest.py"
]
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.6e
$3ge40<,[o}e~g`n;"2*731&=$:,)<4-0;8456789:;<9>40123456789:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?12924?OIX\^1mij}b);94,7238836D@_UU8gmkg/9;=1<$?8;00;>JSSX\^1hb{{a)313?6.9=1:87GAPTV9EABUI!;86='>4:37>LHW]]0JHI\M(0194,77380BB][[:vgb,5<7!8:0=7GAPTV9s`d/83:"=?5<2;KMTPR=L@K#?<4?)00877<NFY__6IGM(2394,743:81EC^ZT;fjjg.493:"=>5<2;MVPUSS2MEJ$>?50(30?64=G\^[YY4KOC*05?6.9<18>7AZTQWW>air|k"8=7>&1097>LHW]]0OE]O'3;2*54=32@D[YY4KIQ@+7?6.991?6D@_UU8TAD.429#:<6:5IORVP?QBJ!91<$?=;58LQQVR\3ND\L&<:1+26>2=G\^[YY4KOQ@+7?6.n2<x`u::tged0=2*:88047GAPTV9eabui!=1<$64AEFQE-6.02KOH_O'1(;8EABUI!;;%45NDEPB,47.12KOH_O'13+:?DBCZH":?$l4AEFQE-7429#37LJKR@*1-==FLMXJ$>'7;@FGVD.3!11JHI\N(4+;?DBCZH"=%55NDEPB,2/?3HNO^L&7)99B@ATF 0#37LJKRC*3-==FLMXI$<'6;@FGVG.68 30MIJ]B)32-<=FLMXI$<<&9:CG@WD/9:#i7LJKRC*27?6.02KOH_L'2(:8EABUJ!9"46OKDS@+0,><IMNYN%;&8:CG@WD/> 20MIJ]B)5*<>GCL[H#4$64AEFQF-?.;2KG@55MUR]JJCI53JO:>6MGEBI\HLEBFZOTXT^J4:AOO50<KEA:4=84CMI1353<KEA9T55LLJ0[5=623JF@5=:4CMIB1>EKCH;<7NBDA0F13>EKCH;O8:5LLJC2@=2<KEAI96MCKC36?FJLK8?0OAEK149@HNBQk2IGGIXPDHTJ@@3<KEAMT55LLJD[5=6>3JEFADZ[EE37?FIUMVMNBH\NTHMM[LHAG>1H^HO[EEa8@DRFW^COXEQNc:FBPDYPAM^CSO84DHC+4,0<L@K#=$94DHC+55/03MCJ$<?&7:FJE-75!>1OEL&>3(58@LG/9=#<7IGN(07*3>BNI!;=%:5KI@*23,1<L@K#=5'8;EKB,4?.>2NBM%<&7:FJE-47!>1OEL&=1(58@LG/:;#<7IGN(31*3>BNI!8?%:5KI@*11,1<L@K#>;'8;EKB,71.?2NBM%<7)69GMD.51 <0HDO'3(58@LG/;9#<7IGN(23*=>BNI!9:6='9;EKB,1/13MCJ$8'9;EKB,3/13MCJ$:'9;EKB,=/13MCJ$4'9;EKA,5/13MCI$<'8;EKA,46.?2NBN%?>)69GMG.6: =0HDL'12+4?AOE 8>";6JFB)36-2=CAK"::$94DH@+52/03MCI$<6&7:FJF-7>!?1OEO&=)69GMG.58 =0HDL'20+4?AOE ;8";6JFB)00-2=CAK"98$94DH@+60/03MCI$?8&7:FJF-40!>1OEO&=8(58@LD/:0#=7IGM(2+4?AOE ::";6JFB)12-<=CAK"8=7>&6:FJF-2.>2NBN%;&6:FJF-0.>2NBN%9&6:FJF->.>2NBN%7&7:FJTD.7!>1OE]O'1(58@LVF ;#<7IG_A)1*=>BNXH"86='8;EKSF-6.?2NB\O&>)69GMUD/: =0HD^M(2+:?AOWJ!91<$84DNC+4,0<LFK#=$94DNC+55/03MEJ$<?&7:FLE-75!>1OCL&>3(58@JG/9=#<7IAN(07*3>BHI!;=%:5KO@*23,1<LFK#=5'8;EMB,4?.>2NDM%<&7:FLE-47!>1OCL&=1(58@JG/:;#<7IAN(31*3>BHI!8?%:5KO@*11,1<LFK#>;'8;EMB,71.?2NDM%<7)69GKD.51 <0HBO'3(58@JG/;9#<7IAN(23*=>BHI!9:6='9;EMB,1/13MEJ$8'9;EMB,3/13MEJ$:'9;EMB,=/13MEJ$4'8;EMB[WC@>2NDN%>&6:FLF-7.?2NDN%??)69GKG.69 =0HBL'13+4?AIE 89";6J@B)37-2=CGK":9$94DN@+53/03MEI$<9&7:FLF-7?!>1OCO&>9(48@JD/: =0HBL'21+4?AIE ;;";6J@B)01-2=CGK"9?$94DN@+61/03MEI$?;&7:FLF-41!>1OCO&=7(58@JD/:1#<7IAM(3;*2>BHJ!9";6J@B)13-2=CGK"8=$74DN@+74<7!?1OCO&;)79GKG.2!?1OCO&9)79GKG.0!?1OCO&7)79GKG.>!>1OCOQ]EF58@JVF 9#<7IA_A)3*3>BHXH"9%:5KOQC+7,?<LFZJ$>4?)69GKUD/8 =0HB^M(0+4?AIWJ!8";6J@PC*0-<=CGYH#?7>&3:GME6=BFKh0ICQ]SUPBIZGe3LDT^^Z]AL]A1>@FDZO:7J=4GOF;?LHN\YU;<55FNHVS[57?3@DBX]Q?299JJLRWW9937D@FTQ]30==NF@^[S=;7;HLJPUY7>11BBDZ__154?LHN\V:;;6GAIU]352=NF@^T<?94IOKW[5503@DBXR>;7:KMMQY7=>1BBDZP0758MKOSW9=<7D@FT^2;3>OIA]U;5:5FNHV\4D1<AGC_S=L8;HLJPZ6D?2CEEYQ?D69JJLRX8L=0ECG[_1D4?LHN\V;;;6GAIU]252=NF@^T=?94IOKW[4503@DBXR?;7:KMMQY6=>1BBDZP1758MKOSW8=<7D@FT^3;3>OIA]U:5:5FNHV\5D1<AGC_S<L8;HLJPZ7D?2CEEYQ>D69JJLRX9L=0ECG[_0D4?LHN\V8;;6GAIU]152=NF@^T>?94IOKW[7503@DBXR<;7:KMMQY5=>1BBDZP2758MKOSW;=<7D@FT^0;3>OIA]U95:5FNHV\6D1<AGC_S?L8;HLJPZ4D?2CEEYQ=D69JJLRX:L=0ECG[_3D4?LHN\V9;;6GAIU]052=NF@^T??94IOKW[6503@DBXR=;7:KMMQY4=>1BBDZP3758MKOSW:=<7D@FT^1;3>OIA]U85:5FNHV\7D1<AGC_S>L8;HLJPZ5D?2CEEYQ<D69JJLRX;L=0ECG[_2D5?LHN\VK=7D@FT^@:?LHN\VLB@H84LNCGAA0<DFI@II94LNEJGDJd3DkacXjrrkljf=JageyZh||inl1?K703GO_[B\D4:LLJ@><G'==tiQC4:RBVQg<X@DTNX]FDY`8TLHXJ\YEM@K9;QQGKKCf3[KFN<8MWDP5?WC@KLK=7_KHCD@7?WUSI=1Y_YL8;SQWP\VBm2XXXR^]INPJP\YFm2XXXR^]INPJP\YE981XD_KH_DZWVDESWGMHi6]GRDE\ILHX[@PN=>5\IL]@KIJN[@EESNFJCJc8WLKXLL\BOH84SNWQG@><[YKYXL@97:QQRDJXI>1X^[OC_C48WQGS]Z>0_T@L4:VZT@143\:$t~zPbmi\i`kXoldn~lz`r.emeqoqmkgl"co{iwg\fimXelgTkh` v`nj`+et|{%ym`b`oqY3Y+tfe'x$;Qaohljp+tfe&^YYHQKP/RQMH7?&{kf;>5Z0.zppZdkcVgnaRijndpbpjt(ogke{kmmf,meqoqmVhggRcjm^efj*pfd`n%o~z}/scnhjiwS8W%~lc!r.q5[kinf`~%~lc TSWF[AV)X[CF=5 }al50?P6(pz~TnaePmdo\c`hbzh~d~"iaaukuagk`&gke{kPbmi\i`kXold$zlbfd/appw)uidfdc}U=]/pbi+t({?Uecd`ft/pbi*RU]LUO\#^]IL3;*wgj?:1^<"v|t^`ooZkbeVmnbh|ntnp,ckgsaoiaj aaukuaZdkcVgnaRijn.tbhlb)kz~y#oblnms_6[)zhg%~"}9_omjjlr)zhg$X_[J_ER-TWOJ91$ym`m4URGQ[SOTAKFN56XFEV]W]UC13^OJ$='9;VGB,4/13^OJ$?'9;VGB,6/?3^OJ$>4?)79TAG.7!?1\IO&>)79TAG.5!?1\IO&<)99TAG.429#i7Z\FTD]EMWUSk2]YEYKPMNFF[De<_[C_IRC@DD]A5a=_AECET VKB!2-5%US]K*;"<.NSBKJ2>^T\ECI;6V\T^EM@g=_WJEYIRGAFN48\adXAml0TifPPsknR`ttafd:<6Vkm^ObnjtQm{ybcc??;Yfn[Hoig{\n~~g`n29[wq5<Qly37ljkr`*3-==flmxj$<'7;`fgvd.5!11jhi|n(2+;?dbczh"?%55ndepb,0/?3hno~l&9)99b`atf >#j7ljkr`*4>5/?3hno~o&?)99b`ate 8#37ljkrc*1-==flmxi$>'7;`fgvg.3!11jhi|m(4+;?dbczk"=%55ndepa,2/?3hno~o&7)99b`ate 0#j7ljkrc*:>5/6>2hggRcjm^ajvfYe}olTz;Q;4e58fimXelgTod|l_cwebZp1W=&i`fQbel]dakYq>V8'wnQndepb[roc|a73 nQndepa[roc|a7:<!mPamelvlroe4;'oRowi^kg[roc|a7? nQnxh]phdpbW}s{i0>#c^c{mZr~xl7: nQmyug\wl|b50&hSnabmnl\gim:8%iThhhnumv\`drf59&hSig|acnf[rgufVhczRm`lm?3(fYcazki`hQxasl\fmpXzhdli0>#c^goegiui}cdbRjfr<-bbv)dm{d%oe!jnf-f`d)dlzU~h||/fdfvkgil&zycgkltr-w`f)tzj%b|Rm`rdq,i`kXkfxn#yc/^ad+)eXnhgb`t3|p`pwek0+kVbjRowi^kg95*dWakxSh`n=0.`[mgtWldi1<"l_icp[lhmmj~n~3?,b]kevYjmdUdyy~zt^pfcvYf59&hSeo|_lgn[jssx|~T~hi|_c?2(fYoizUfyuQ`uurvpZtbozUj1="l_icp[hsWf|xzPrdep[g;7$jUcm~Q}efafe86+kVbjR|jgbga95*dWakxS}{a<2/gZnf{Vxxxo3?,b]kevYtgo~nonQfnqww[wc`{Vk6<!mPh`q\wj`smjiTcxzuu]qabuXj4:'oRgaiu]emicXfhgn1caPcng\bljbWeejhhj#c^kmmqgX~hf6<!mPiokwfZpfd4:'oRgatdpeefcX|pzn1="l_mmb`Zoia}Umeak20-a\i`kX|pzn1?"l_lw{[uowmeceiR}{afgp95*dWyxbaRzvpd?2(fYumhnThh~{h^c>600+kVxnmiQkeqvk[g;68;>'oR|jae]tmaroWh7:>5"l_sgb`Zqnl}bTn0==,b]qwqYwz`eyeywPa<AF(fYu{}U{~da}iu{\f8EB$jUyyQ{yqg>W\HD$jUyy|nm^c>4)eXzz~ym`Qm=1.`[vojWjeg`d}foo]`l`el5HFG nQzsd]a}qcXlk6<!mPurg\f|rbW~oi1="l_tqf[acai|fSio{a<2/gZstmVoho0>#c^wpaZuhn}oho0>#c^ufeZqnl}b6=!mPwd`\slbs`4;'oRy}iug\``vs`Vk6>88#c^uqmqcXllzdRl21107(fYpz`~nS`ake^c>SWOSMVLB^^Z#c^uqmqcXefnnSo3XRHVF[COU[]&hSz|ftd]tmaroWh7:>5"l_vpjp`Ypam~cSo3<2-a\|acqajomm`gcy<qsewrff?w9m6lck^ofiZenzjUiykhPv7]7(gjlWdofSjka_w4\6)}z911i`fQbel]dakY`mgoyenQlsup2<>dkcVgnaRijn^rqmhYpam~cS<?7;cnh[hcjWnoeS}|fm^uj`qnX:820naePmdo\c`hXx{cfSzgkti]05==edbUfi`Qheo]svlkX`ndR:>d:`ooZkbeVmnbR~}il]tvdvwm{Ux:R?>d:`ooZkbeVmnbR~}il]tvdvwm{Ux:R<>d:`ooZkbeVmnbR~}il]tvdvwm{Ux:R=>d:`ooZkbeVmnbR~}il]tvdvwm{Ux:R:i;cnh[hcjWnoeSya119ahnYjmdUlicQy6^01g>dkcVgnaRijn^t5[7*'P`fbbu.LOSG#C`hbzh~d~-?<.237?gjlWdofSjka_w4\6Z~t|890naePmdo\mkvr|Vhgcne>4:`ooZkbeVe~x}{{_cnlgn2<keaj86mckc58`lhf 9#<7igaa)3*<>bnfh":<$74dhlb,467!01oeco'113*=>bnfh":<?'6;ekme-77; 30hd`n(027-<=cagk#==;&9:fjjd.68?#27igaa)333,?<l`dj$<>7)89gmkg/993"46jfn`*25,?<l`dj$<??)89gmkg/98;"56jfn`*257/>3mcem%?>3(;8`lhf 8;?%45kioc+543.12nbbl&>17+:?aoii!;:;$74dhlb,47?!01oeco'10;*<>bnfh":>$74dhlb,447!01oeco'133*=>bnfh":>?'6;ekme-75; 30hd`n(007-<=cagk#=?;&9:fjjd.6:?#27igaa)313,d<l`dj$<<8:1+;?aoii!;8%55kioc+51/?3mcem%?:)99gmkg/9?#37igaa)34-==cagk#=5'7;ekme-7>!>1oeco'2(:8`lhf ;:"46jfn`*15,><l`dj$?<&8:fjjd.5; 20hd`n(36*<>bnfh"99$64dhlb,70.02nbbl&=7(:8`lhf ;2"46jfn`*1=,1<l`dj$>'7;ekme-57!11oeco'30+;?aoii!99%55kioc+76/?3mcem%=;)99gmkg/;<#37igaa)15-==cagk#?:'7;ekme-5?!11oeco'38+4?aoii!>"46jfn`*74,><l`dj$9?&8:fjjd.3: 20hd`n(51*<>bnfh"?8$64dhlb,13.02nbbl&;6(:8`lhf =="46jfn`*7<,><l`dj$97&7:fjjd.2!11oeco'51+;?aoii!?:%55kioc+17/?3mcem%;<)99gmkg/==#37igaa)76-==cagk#9;'7;ekme-30!11oeco'59+;?aoii!?2%:5kioc+2,><l`dj$;>&8:fjjd.19 20hd`n(70*<>bnfh"=?$64dhlb,32.02nbbl&95(:8`lhf ?<"46jfn`*53,><l`dj$;6&8:fjjd.11 =0hd`n(6+;?aoii!=;%55kioc+34/?3mcem%9=)99gmkg/?:#37igaa)57-==cagk#;8'7;ekme-11!11oeco'76+;?aoii!=3%55kioc+3</03mcem%6&8:fjjd.?8 20hd`n(93*<>bnfh"3>$64dhlb,=5.02nbbl&74(:8`lhf 1?"46jfn`*;2,><l`dj$59&8:fjjd.?0 20hd`n(9;*3>bnfh"2%55kioc+=5/?3mcem%7>)99gmkg/1;#37igaa);0-==cagk#59'7;ekme-?2!11oeco'97+;?aoii!3<%55kioc+==/?3mcem%76)69gmkd/8 =0hd`m(0+;?aoij!;;%55kio`+54/?3mcen%?=)99gmkd/9:#37igab)37-==cagh#=8'7;ekmf-71!11oecl'16+;?aoij!;3%55kio`+5</03mcen%<&8:fjjg.58 20hd`m(33*<>bnfk"9>$64dhla,75.02nbbo&=4(:8`lhe ;?"46jfnc*12,><l`di$?9&8:fjjg.50 20hd`m(3;*3>bnfk"8%55kio`+75/?3mcen%=>)`9gmkd/;80;%:5kio`+0,1<l`di$8'8;ekmf-0.?2nbbo&8)69gmkd/0 =0hd`m(8+;?air|h";%55kotvb,4/>3me~xl&>0(c8`jssi!;;<$o4dnwwe-779 k0hb{{a)336,g<lfm%??3(c8`jssi!;;8$o4dnwwe-77= k0hb{{a)332,g<lfm%??7(c8`jssi!;;4$o4dnwwe-771 30hb{{a)32-d=cg|~j$<??)`9gkprf 8;:%l5kotvb,475!h1ocxzn(030-d=cg|~j$<?;)`9gkprf 8;>%l5kotvb,471!h1ocxzn(034-d=cg|~j$<?7)`9gkprf 8;2%45kotvb,44.i2ndyyo'132*e>bh}}k#=??&a:flqqg/9;8"m6j`uuc+575.i2ndyyo'136*e>bh}}k#=?;&a:flqqg/9;<"m6j`uuc+571.k2ndyyo'13594,?<lfm%?<)89gkprf 8>"56j`uuc+50/>3me~xl&>6(;8`jssi!;<%45kotvb,4>.12ndyyo'18+;?air|h"9%45kotvb,76.12ndyyo'20+:?air|h"9>$74dnwwe-44!01ocxzn(36*=>bh}}k#>8'6;emvpd.5> 30hb{{a)04-<=cg|~j$?6&9:flqqg/:0#37iazt`*0-<=cg|~j$>>&9:flqqg/;8#27iazt`*06,?<lfm%=<)89gkprf :>"56j`uuc+70/>3me~xl&<6(;8`jssi!9<%45kotvb,6>.12ndyyo'38+;?air|h"?%45kotvb,16.12ndyyo'40+:?air|h"?>$74dnwwe-24!01ocxzn(56*=>bh}}k#88'6;emvpd.3> 30hb{{a)64-<=cg|~j$96&9:flqqg/<0#37iazt`*6-<=cg|~j$8>&9:flqqg/=8#27iazt`*66,?<lfm%;<)89gkprf <>"56j`uuc+10/>3me~xl&:6(;8`jssi!?<%45kotvb,0>.12ndyyo'58+;?air|h"=%45kotvb,36.12ndyyo'60+:?air|h"=>$74dnwwe-04!01ocxzn(76*=>bh}}k#:8'6;emvpd.1> 30hb{{a)44-<=cg|~j$;6&9:flqqg/>0#37iazt`*4-<=cg|~j$:>&9:flqqg/?8#27iazt`*46,?<lfm%9<)89gkprf >>"56j`uuc+30/>3me~xl&86(;8`jssi!=<%45kotvb,2>.12ndyyo'78+;?air|h"3%45kotvb,=6.12ndyyo'80+:?air|h"3>$74dnwwe->4!01ocxzn(96*=>bh}}k#48'6;emvpd.?> 30hb{{a):4-<=cg|~j$56&9:flqqg/00#37iazt`*:-<=cg|~j$4>&9:flqqg/18#27iazt`*:6,?<lfm%7<)89gkprf 0>"56j`uuc+=0/>3me~xl&66(;8`jssi!3<%45kotvb,<>.12ndyyo'98+;?air|k";%55kotva,4/>3me~xo&>0(;8`jssj!;:%45kotva,44.12ndyyl'12+:?air|k":8$74dnwwf-72!01ocxzm(04*=>bh}}h#=:'6;emvpg.60 30hb{{b)3:-==cg|~i$?'6;emvpg.58 30hb{{b)02-<=cg|~i$?<&9:flqqd/::#27iaztc*10,?<lfn%<:)89gkpre ;<"56j`uu`+62/>3me~xo&=8(;8`jssj!82%55kotva,6/>3me~xo&<0(;8`jssj!9:%o5kotva,67=8 20hb{{b)6*<>bh}}h#9$64dnwwf-0.02ndyyl'7(:8`jssj!2"46j`uu`+=,5<mgk87h`m8:ldggsndm<0{ho'0(:8s`g/83:":6yjb)2*<>qbj!:1<$sO@q53f>FGp83;6K4;:0yP15<6?h0:8:4>33ffbc<5?1nnwc?88;38j41>2?1/=:851608yV2b28=j6<:8:011```a2;=3i;5\12d96`g=83;8>ikif;04<`c<[=o1>ho50;306acan38<4k?4d0;3>5<628qX9=4>7`8202<6;;nnjk4=79g1?sR6=10;6<4>:07:V3728=j6<:8:011```a2;=3i?5+1769517<^8=<6?uz15095>s6<:0;7p*>49823>d6190;6<;7:4821<}O9?90(<;j:0;3?_5?21q26<655;c90?b=>3;;6p*>7482=`=#;h0:5?5+4g82=4=#9<?1=6*>55823g=n:lh1<7*>4`81af=i9=31<65f19194?"6<h0:495a15;94>=n9181<7*>4`82<1=i9=31=65f19394?"6<h0:495a15;96>=n91:1<7*>4`82<1=i9=31?65f16d94?"6<h0:495a15;90>=n9>o1<7*>4`82<1=i9=31965f16f94?"6<h0:495a15;92>=n9>i1<7*>4`82<1=i9=31;65f1b694?"6<h0:o85a15;94>=n9j91<7*>4`82g0=i9=31=65f1b094?"6<h0:o85a15;96>=n9j;1<7*>4`82g0=i9=31?65f1b294?"6<h0:o85a15;90>=n9kl1<7*>4`82g0=i9=31965f1cg94?"6<h0:o85a15;92>=n9kn1<7*>4`82g0=i9=31;65f1c`94?"6<h0:o85a15;9<>=n9kk1<7*>4`82g0=i9=31565f1c;94?"6<h0:o85a15;9e>=n9k21<7*>4`82g0=i9=31n65f1c594?"6<h0:o85a15;9g>=n9k<1<7*>4`82g0=i9=31h65f1c794?"6<h0:o85a15;9a>=n9k>1<7*>4`82g0=i9=31j65f1c194?"6<h0:o85a15;955=<a8h96=4+15c95f3<f8>26<?4;h3a4?6=,8>j6<m:;o37=?7532c:mk4?:%37e?7d=2d:844>3:9j5dc=83.:8l4>c49m51?=9=10e<ok:18'51g=9j?0b<:6:078?l7fk3:1(<:n:0a6?k7313;=76g>ac83>!73i3;h96`>48823>=n9hk1<7*>4`82g0=i9=31=554i0c:>5<#9=k1=n;4n06:>4?<3`;j47>5$06b>4e23g;?57?n;:k2e2<72-;?m7?l5:l20<<6j21b>?:50;&20d<6k<1e=9751b98m744290/=9o51b78j42>28n07d<=2;29 42f28i>7c?;9;3f?>o5:80;6)?;a;3`1>h6<00:j65f23294?"6<h0:o85a15;965=<a;;m6=4+15c95f3<f8>26??4;h02a?6=,8>j6<m:;o37=?4532c9=i4?:%37e?7d=2d:844=3:9j64e=83.:8l4>c49m51?=:=10e??m:18'51g=9j?0b<:6:378?l4613:1(<:n:0a6?k73138=76g=1983>!73i3;h96`>48813>=n:8=1<7*>4`82g0=i9=31>554i335>5<#9=k1=n;4n06:>7?<3`8:97>5$06b>4e23g;?57<n;:k151<72-;?m7?l5:l20<<5j21b><=50;&20d<6k<1e=9752b98m775290/=9o51b78j42>2;n07d<>1;29 42f28i>7c?;9;0f?>o5990;6)?;a;3`1>h6<009j65f21g94?"6<h0:o85a15;975=<a;:o6=4+15c95f3<f8>26>?4;h03g?6=,8>j6<m:;o37=?5532c9<o4?:%37e?7d=2d:844<3:9j65g=83.:8l4>c49m51?=;=10e?>6:18'51g=9j?0b<:6:278?l4703:1(<:n:0a6?k73139=76g=0683>!73i3;h96`>48803>=n:9<1<7*>4`82g0=i9=31?554i326>5<#9=k1=n;4n06:>6?<3`8;?7>5$06b>4e23g;?57=n;:k147<72-;?m7?l5:l20<<4j21b>=?50;&20d<6k<1e=9753b98m767290/=9o51b78j42>2:n07d?if;29 42f28i>7c?;9;1f?>o6nl0;6)?;a;3`1>h6<008j65f1gf94?"6<h0:o85a15;905=<a8lh6=4+15c95f3<f8>269?4;h3ef?6=,8>j6<m:;o37=?2532c:jl4?:%37e?7d=2d:844;3:9j5c>=83.:8l4>c49m51?=<=10e<h8:18'51g=9j?0b<:6:578?l7a>3:1(<:n:0a6?k7313>=76g>f483>!73i3;h96`>48873>=n9o>1<7*>4`82g0=i9=318554i0d0>5<#9=k1=n;4n06:>1?<3`;m>7>5$06b>4e23g;?57:n;:k2b4<72-;?m7?l5:l20<<3j21b=k>50;&20d<6k<1e=9754b98m4ca290/=9o51b78j42>2=n07d?jd;29 42f28i>7c?;9;6f?>o6mj0;6)?;a;3`1>h6<00?j65f1d`94?"6<h0:o85a15;915=<a8oj6=4+15c95f3<f8>268?4;h3f=?6=,8>j6<m:;o37=?3532c:i54?:%37e?7d=2d:844:3:9j5`1=83.:8l4>c49m51?===10e<k9:18'51g=9j?0b<:6:478?l7b=3:1(<:n:0a6?k7313?=76g>e583>!73i3;h96`>48863>=n9l81<7*>4`82g0=i9=319554i0g2>5<#9=k1=n;4n06:>0?<3`;n<7>5$06b>4e23g;?57;n;:k2`c<72-;?m7?l5:l20<<2j21b=ik50;&20d<6k<1e=9755b98m4bc290/=9o51b78j42>2<n07d?kc;29 42f28i>7c?;9;7f?>o6lk0;6)?;a;3`1>h6<00>j65f1ec94?"6<h0:o85a15;925=<a8n26=4+15c95f3<f8>26;?4;h3g3?6=,8>j6<m:;o37=?0532c:h;4?:%37e?7d=2d:84493:9j5a3=83.:8l4>c49m51?=>=10e<j;:18'51g=9j?0b<:6:778?l7c;3:1(<:n:0a6?k7313<=76g>d383>!73i3;h96`>48853>=n9m;1<7*>4`82g0=i9=31:554i0f3>5<#9=k1=n;4n06:>3?<3`;hj7>5$06b>4e23g;?578n;:k2g`<72-;?m7?l5:l20<<1j21b=nm50;&20d<6k<1e=9756b98m4ee290/=9o51b78j42>2?n07d?la;29 42f28i>7c?;9;4f?>o6k00;6)?;a;3`1>h6<00=j65f1b:94?"6<h0:o85a15;935=<a8i<6=4+15c95f3<f8>26:?4;h3`2?6=,8>j6<m:;o37=?1532c:nn4?:%37e?7d=2d:84483:9j5g7=83.:8l4>c49m51?=?=10e<o9:18'51g=9j?0b<:6:678?l46i3:1(<:n:0a6?k7313==76g=0g83>!73i3;h96`>48843>=n:9>1<7*>4`82g0=i9=31;554i0d:>5<#9=k1=n;4n06:>2?<3`;ni7>5$06b>4e23g;?579n;:k2a6<72-;?m7?l5:l20<<0j21b=i650;&20d<6k<1e=9757b98m4ec290/=9o51b78j42>2>n07d?n5;29 42f28i>7c?;9;5f?>o6i=0;6)?;a;3`1>h6<00<j65f2df94?"6<h09ih5a15;94>=n91o1<7*>4`82<c=i9=31<65f19f94?"6<h0:4k5a15;95>=n91i1<7*>4`82<c=i9=31>65f19`94?"6<h0:4k5a15;97>=n91k1<7*>4`82<c=i9=31865f19;94?"6<h0:4k5a15;91>=n9121<7*>4`82<c=i9=31:65f19594?"6<h0:4k5a15;93>=n91<1<7*>4`82<c=i9=31465f19794?"6<h0:4k5a15;9=>=n::o1<7*>4`817c=i9=31<65f22f94?"6<h09?k5a15;95>=n::h1<7*>4`817c=i9=31>65f22c94?"6<h09?k5a15;97>=n::31<7*>4`817c=i9=31865f22:94?"6<h09?k5a15;91>=n::=1<7*>4`817c=i9=31:65f22494?"6<h09?k5a15;93>=n::?1<7*>4`817c=i9=31465f22694?"6<h09?k5a15;9=>=n::91<7*>4`817c=i9=31m65f22094?"6<h09?k5a15;9f>=n:::1<7*>4`817c=i9=31o65f23d94?"6<h09?k5a15;9`>=n:;o1<7*>4`817c=i9=31i65f23f94?"6<h09?k5a15;9b>=n:;i1<7*>4`817c=i9=31==54i30a>5<#9=k1>>h4n06:>47<3`89m7>5$06b>75a3g;?57?=;:k16<<72-;?m7<<f:l20<<6;21b>?650;&20d<5;o1e=9751598m740290/=9o522d8j42>28?07d<;5;29 42f2;9m7c?;9;35?>o5<=0;6)?;a;00b>h6<00:;65f25194?"6<h09?k5a15;95==<a;>96=4+15c966`<f8>26<74;h075?6=,8>j6?=i;o37=?7f32c98=4?:%37e?44n2d:844>b:9j66e=83.:8l4=3g9m51?=9j10e?=>:18'51g=::l0b<:6:0f8?l45>3:1(<:n:31e?k7313;n76g=2483>!73i388j6`>4882b>=n9h81<75f2d:94?=n9h91<75f2d;94?=h:?<1<7*>4`8122=i9=31<65`27794?"6<h09::5a15;95>=h:?>1<7*>4`8122=i9=31>65`27194?"6<h09::5a15;97>=h:?81<7*>4`8122=i9=31865`27394?"6<h09::5a15;91>=h:?:1<7*>4`8122=i9=31:65`24d94?"6<h09::5a15;93>=h:<n1<7*>4`8122=i9=31465`24a94?"6<h09::5a15;9=>=h:<h1<7*>4`8122=i9=31m65`24c94?"6<h09::5a15;9f>=h:<31<7*>4`8122=i9=31o65`24:94?"6<h09::5a15;9`>=h:<=1<7*>4`8122=i9=31i65`24494?"6<h09::5a15;9b>=h:<?1<7*>4`8122=i9=31==54o377>5<#9=k1>;94n06:>47<3f8>>7>5$06b>7003g;?57?=;:m114<72-;?m7<97:l20<<6;21d>8>50;&20d<5>>1e=9751598k72a290/=9o52758j42>28?07b<;e;29 42f2;<<7c?;9;35?>i5<m0;6)?;a;053>h6<00:;65`25a94?"6<h09::5a15;95==<g;>i6=4+15c9631<f8>26<74;n07e?6=,8>j6?88;o37=?7f32e9844?:%37e?41?2d:844>b:9l6f0=83.:8l4=669m51?=9j10c?m::18'51g=:?=0b<:6:0f8?j4d<3:1(<:n:344?k7313;n76a=c283>!73i38=;6`>4882b>=h:j81<7*>4`8122=i9=31>=54o3a2>5<#9=k1>;94n06:>77<3f8h<7>5$06b>7003g;?57<=;:m1fc<72-;?m7<97:l20<<5;21d>ok50;&20d<5>>1e=9752598k7dc290/=9o52758j42>2;?07b<mb;29 42f2;<<7c?;9;05?>i5jh0;6)?;a;053>h6<009;65`2c;94?"6<h09::5a15;96==<g;h36=4+15c9631<f8>26?74;n0a3?6=,8>j6?88;o37=?4f32e9n;4?:%37e?41?2d:844=b:9l6g3=83.:8l4=669m51?=:j10c?l;:18'51g=:?=0b<:6:3f8?j4e;3:1(<:n:344?k73138n76a=b383>!73i38=;6`>4881b>=h:k:1<7*>4`8122=i9=31?=54o3ce>5<#9=k1>;94n06:>67<3f8ji7>5$06b>7003g;?57==;:m1ea<72-;?m7<97:l20<<4;21d>lm50;&20d<5>>1e=9753598k7ge290/=9o52758j42>2:?07b<na;29 42f2;<<7c?;9;15?>i5i00;6)?;a;053>h6<008;65`2`:94?"6<h09::5a15;97==<g;k<6=4+15c9631<f8>26>74;n0b1?6=,8>j6?88;o37=?5f32e9m94?:%37e?41?2d:844<b:9l6d5=83.:8l4=669m51?=;j10c?o=:18'51g=:?=0b<:6:2f8?j4f93:1(<:n:344?k73139n76a=a183>!73i38=;6`>4880b>=h:0l1<7*>4`8122=i9=318=54o3;f>5<#9=k1>;94n06:>17<3f82h7>5$06b>7003g;?57:=;:m1=f<72-;?m7<97:l20<<3;21d>4o50;&20d<5>>1e=9754598k7?>290/=9o52758j42>2=?07b<68;29 42f2;<<7c?;9;65?>i51>0;6)?;a;053>h6<00?;65`28494?"6<h09::5a15;90==<g;3>6=4+15c9631<f8>26974;n0:0?6=,8>j6?88;o37=?2f32e95>4?:%37e?41?2d:844;b:9l6<4=83.:8l4=669m51?=<j10c?7>:18'51g=:?=0b<:6:5f8?j4?n3:1(<:n:344?k7313>n76a=8d83>!73i38=;6`>4887b>=h:1n1<7*>4`8122=i9=319=54o3:`>5<#9=k1>;94n06:>07<3f83n7>5$06b>7003g;?57;=;:m1<d<72-;?m7<97:l20<<2;21d>5750;&20d<5>>1e=9755598k7>?290/=9o52758j42>2<?07b<77;29 42f2;<<7c?;9;75?>i50?0;6)?;a;053>h6<00>;65`29694?"6<h09::5a15;91==<g;286=4+15c9631<f8>26874;n0;6?6=,8>j6?88;o37=?3f32e94<4?:%37e?41?2d:844:b:9l6=6=83.:8l4=669m51?==j10c?9i:18'51g=:?=0b<:6:4f8?j40m3:1(<:n:344?k7313?n76a=7e83>!73i38=;6`>4886b>=h:>i1<7*>4`8122=i9=31:=54o35a>5<#9=k1>;94n06:>37<3f8<57>5$06b>7003g;?578=;:m13=<72-;?m7<97:l20<<1;21d>:950;&20d<5>>1e=9756598k711290/=9o52758j42>2??07b<85;29 42f2;<<7c?;9;45?>i5?=0;6)?;a;053>h6<00=;65`26194?"6<h09::5a15;92==<g;=96=4+15c9631<f8>26;74;n045?6=,8>j6?88;o37=?0f32e9;=4?:%37e?41?2d:8449b:9l63c=83.:8l4=669m51?=>j10c?8k:18'51g=:?=0b<:6:7f8?j41k3:1(<:n:344?k7313<n76a=6c83>!73i38=;6`>4885b>=h:?k1<7*>4`8122=i9=31;=54o34:>5<#9=k1>;94n06:>27<3f8=47>5$06b>7003g;?579=;:m11`<72-;?m7<97:l20<<0;21d>8=50;&20d<5>>1e=9757598k72?290/=9o52758j42>2>?07b<mc;29 42f2;<<7c?;9;55?>i5j80;6)?;a;053>h6<00<;65`2`494?"6<h09::5a15;93==<g;3i6=4+15c9631<f8>26:74;n0:4?6=,8>j6?88;o37=?1f32e9484?:%37e?41?2d:8448b:9l62g=83.:8l4=669m51?=?j10c?8i:18'51g=:?=0b<:6:6f8?j43?3:1(<:n:344?k7313=n76a=4783>!73i38=;6`>4884b>=h:l:1<7*>4`81a4=i9=31<65`2ed94?"6<h09i<5a15;95>=h:mn1<7*>4`81a4=i9=31>65`2ea94?"6<h09i<5a15;97>=h:mh1<7*>4`81a4=i9=31865`2ec94?"6<h09i<5a15;91>=h:m31<7*>4`81a4=i9=31:65`2e:94?"6<h09i<5a15;93>=h:m=1<7*>4`81a4=i9=31465`2e494?"6<h09i<5a15;9=>=h:m?1<7*>4`81a4=i9=31m65`2e694?"6<h09i<5a15;9f>=h:m81<7*>4`81a4=i9=31o65`2e394?"6<h09i<5a15;9`>=h:m:1<7*>4`81a4=i9=31i65`2bd94?"6<h09i<5a15;9b>=h:jo1<7*>4`81a4=i9=31==54o3ag>5<#9=k1>h?4n06:>47<3f8ho7>5$06b>7c63g;?57?=;:m1gg<72-;?m7<j1:l20<<6;21d>no50;&20d<5m81e=9751598k7e>290/=9o52d38j42>28?07b<j7;29 42f2;o:7c?;9;35?>i5m?0;6)?;a;0f5>h6<00:;65`2d794?"6<h09i<5a15;95==<g;o?6=4+15c96`7<f8>26<74;n0f7?6=,8>j6?k>;o37=?7f32e9i?4?:%37e?4b92d:844>b:9l6ac=83.:8l4=e09m51?=9j10c?j<:18'51g=:l;0b<:6:0f8?j4d03:1(<:n:3g2?k7313;n76a=c683>!73i38n=6`>4882b>=e9>>1<7?50;2x 43b2o90D<9<;I357>ia:3:17pl>5g83>ge=83:p(<;j:06`?M70;2B::>5U398`2<?28;1=84>2;35>45=m3i1j7?;:c8~j07=:=1e9?46;oa3>5=im;0:7)ki:g38 c6=n81/j94<;%d6>6=#n?087)h8:29'b=<43-l26>5+f`80?!`e2:1/jn4<;%dg>6=#nl087)hi:29'556=;2.:<<4<;%336?5<,8:86>5+11697>"68<087)??6;18 4602:1/==653:&24<<43-;;m7=4$02a>6=#99i1?6*>0e80?!77m390(<>i:29'546=;2.:=<4<;%326?5<,8;86>5+10697>"69<087)?>6;18 4702:1/=<653:&25<<43-;:m7=4$03a>6=#98i1?6*>1e80?!76m390(<?i:29'576=;2.:><4<;%316?5<,8886>5+13697>"6:<087)?=6;18 4402:1/=?653:&26<<43-;9m7=4$00a>6=#9;i1?6*>2e80?!75m390(<<i:29'566=;2.:?<4<;%306?5<,8986>5+12697>"6;<087)?<6;18 4502:1/=>653:&27<<43-;8m7=4$01a>6=#9:i1>6*>3e81?!74m3;?:6*>50821a=#9<81?45+14197<=#9<<1?:5+145950?<,8?j6?5+14`96>"6?90::k5+163953`<a8>o6=44i5394?=nml0;66g>5183>>o3>3:17d?;e;29?l73n3:17dkk:188m<>=83.:8l469:l20<<732c2;7>5$06b><?<f8>26<54i8494?"6<h0256`>4881?>o>=3:1(<:n:8;8j42>2:10e<87:18'51g=9?30b<:6:198m400290/=9o517;8j42>2810e<89:18'51g=9?30b<:6:398m402290/=9o517;8j42>2:10co650;&20d<e12d:844?;:ma3?6=,8>j6o74n06:>4=<gk?1<7*>4`8a=>h6<00976am4;29 42f2k30b<:6:298kg5=83.:8l4m9:l20<<332ei>7>5$06b>g?<f8>26854oc394?"6<h0i56`>4885?>ie83:1(<:n:c;8j42>2>10clh50;&20d<e12d:8447;:mba?6=,8>j6o74n06:><=<ghn1<7*>4`8a=>h6<00j76anc;29 42f2k30b<:6:c98kdg=83.:8l4m9:l20<<d32ej57>5$06b>g?<f8>26i54o`:94?"6<h0i56`>488f?>if?3:1(<:n:c;8j42>2o10cl850;&20d<e12d:844>0:9le0<72-;?m7l6;o37=?7632ej87>5$06b>g?<f8>26<<4;nc0>5<#9=k1n45a15;956=<gh81<7*>4`8a=>h6<00:865`a083>!73i3h27c?;9;36?>ien3:1(<:n:c;8j42>28<07blj:18'51g=j01e=9751698kgb=83.:8l4m9:l20<<6021dnn4?:%37e?d>3g;?57?6;:maf?6=,8>j6o74n06:>4g<3fhj6=4+15c9f<=i9=31=o54oc494?"6<h0i56`>4882g>=hik0;6)?;a;`:?k7313;o76an0;29 42f2k30b<:6:0g8?j?a290/=9o5b89m51?=9o10e<k50;&20d<6n2d:844?;:k2`?6=,8>j6<h4n06:>4=<a8i1<7*>4`82b>h6<00976g>b;29 42f28l0b<:6:298m71=83.:8l4>f:l20<<332c9:7>5$06b>4`<f8>26854i3794?"6<h0:j6`>4885?>o5<3:1(<:n:0d8j42>2>10e?=50;&20d<6n2d:8447;:k16?6=,8>j6<h4n06:><=<a;;1<7*>4`82b>h6<00j76g=0;29 42f28l0b<:6:c98m4g=83.:8l4>f:l20<<d32c:57>5$06b>4`<f8>26i54i3f94?"6<h09i6`>4883?>o5k3:1(<:n:3g8j42>2810e?l50;&20d<5m2d:844=;:k1e?6=,8>j6?k4n06:>6=<a:<1<7*>4`81a>h6<00?76g<5;29 42f2;o0b<:6:498m62=83.:8l4=e:l20<<132c8?7>5$06b>7c<f8>26:54i2094?"6<h09i6`>488;?>o493:1(<:n:3g8j42>2010e>>50;&20d<5m2d:844n;:k1b?6=,8>j6?k4n06:>g=<a;31<7*>4`81a>h6<00h76g=8;29 42f2;o0b<:6:e98m=b=83.:8l47e:l20<<732c3o7>5$06b>=c<f8>26<54i9c94?"6<h03i6`>4881?>o?13:1(<:n:9g8j42>2:10e5650;&20d<?m2d:844;;:k;3?6=,8>j65k4n06:>0=<a1<1<7*>4`8;a>h6<00=76g75;29 42f21o0b<:6:698m=2=83.:8l47e:l20<<?32c3?7>5$06b>=c<f8>26454i9094?"6<h03i6`>488b?>o?93:1(<:n:9g8j42>2k10e:h50;&20d<?m2d:844l;:k4a?6=,8>j65k4n06:>a=<a>n1<7*>4`8;a>h6<00n76g8c;29 42f21o0b<:6:g98m2d=83.:8l47e:l20<<6821b;l4?:%37e?>b3g;?57?>;:k4=?6=,8>j65k4n06:>44<3`=36=4+15c9<`=i9=31=>54i6594?"6<h03i6`>48820>=n??0;6)?;a;:f?k7313;>76g64;29 42f21o0b<:6:048?l?4290/=9o58d9m51?=9>10e4<50;&20d<?m2d:844>8:9j=4<72-;?m76j;o37=?7>32c2<7>5$06b>=c<f8>26<o4;h:e>5<#9=k14h5a15;95g=<a1h1<7*>4`8;a>h6<00:o65f8183>!73i32n7c?;9;3g?>o0=3:1(<:n:9g8j42>28o07d9;:18'51g=0l1e=9751g98k`0=83.:8l4j7:l20<<732en97>5$06b>`1<f8>26<54od694?"6<h0n;6`>4881?>ib;3:1(<:n:d58j42>2:10e4j50;&20d<>m2d:844?;:k:g?6=,8>j64k4n06:>4=<a0h1<7*>4`8:a>h6<00976g6a;29 42f20o0b<:6:298k`d=83.:8l4jc:l20<<732enm7>5$06b>`e<f8>26<54od;94?"6<h0no6`>4881?>ib03:1(<:n:da8j42>2:10cio50;&20d<cj2d:844?;:mg=?6=,8>j6il4n06:>4=<gm=1<7*>4`8gf>h6<00976ak6;29 42f2mh0b<:6:298ka3=83.:8l4kb:l20<<332eo87>5$06b>ad<f8>26854oe194?"6<h0on6`>4885?>ic:3:1(<:n:e`8j42>2>10ci?50;&20d<cj2d:8447;:mg4?6=,8>j6il4n06:><=<gjl1<7*>4`8gf>h6<00j76ale;29 42f2mh0b<:6:c98kfe=83.:8l4kb:l20<<d32ehn7>5$06b>ad<f8>26i54obc94?"6<h0on6`>488f?>id13:1(<:n:e`8j42>2o10cn650;&20d<cj2d:844>0:9lg2<72-;?m7jm;o37=?7632eh:7>5$06b>ad<f8>26<<4;na6>5<#9=k1ho5a15;956=<gj>1<7*>4`8gf>h6<00:865`c283>!73i3ni7c?;9;36?>ib93:1(<:n:e`8j42>28<07bk?:18'51g=lk1e=9751698ka`=83.:8l4kb:l20<<6021dhh4?:%37e?be3g;?57?6;:mg`?6=,8>j6il4n06:>4g<3fnh6=4+15c9`g=i9=31=o54oe:94?"6<h0on6`>4882g>=hkm0;6)?;a;fa?k7313;o76al2;29 42f2mh0b<:6:0g8?je6290/=9o5dc9m51?=9o10e<8k:18'51g=9?o0b<:6:198m40d290/=9o517g8j42>2810e<8m:18'51g=9?o0b<:6:398m40f290/=9o517g8j42>2:10e;m50;&20d<1l2d:844?;:k5f?6=,8>j6;j4n06:>4=<a?31<7*>4`85`>h6<00976g98;29 42f2?n0b<:6:298m31=83.:8l49d:l20<<332c=:7>5$06b>3b<f8>26854i7794?"6<h0=h6`>4885?>o1<3:1(<:n:7f8j42>2>10e;=50;&20d<1l2d:8447;:k56?6=,8>j6;j4n06:><=<a?;1<7*>4`85`>h6<00j76g90;29 42f2?n0b<:6:c98m0c=83.:8l49d:l20<<d32c>h7>5$06b>3b<f8>26i54i4a94?"6<h0=h6`>488f?>o2j3:1(<:n:7f8j42>2o10e8o50;&20d<1l2d:844>0:9j1<<72-;?m78k;o37=?7632c>47>5$06b>3b<f8>26<<4;h74>5<#9=k1:i5a15;956=<a<<1<7*>4`85`>h6<00:865f5483>!73i3<o7c?;9;36?>o0;3:1(<:n:7f8j42>28<07d9=:18'51g=>m1e=9751698m27=83.:8l49d:l20<<6021b;=4?:%37e?0c3g;?57?6;:k5b?6=,8>j6;j4n06:>4g<3`<n6=4+15c92a=i9=31=o54i7c94?"6<h0=h6`>4882g>=n=o0;6)?;a;4g?k7313;o76g:4;29 42f2?n0b<:6:0g8?l34290/=9o56e9m51?=9o10qo?90;29ff<729q/=8k515a8L4143A;=?6T<8;ax3?>=980:97?=:04956<b2j0m6<:5b;m14<5<2d>>774nb294>hb:3;0(hh5f09'b5<a92.m87=4$g797>"a>390(k953:&e<?5<,o31?6*ia;18 cd=;2.mo7=4$gf97>"am390(kh53:&245<43-;;=7=4$021>6=#9991?6*>0580?!77=390(<>9:29'551=;2.:<54<;%33=?5<,8:j6>5+11`97>"68j087)??d;18 46b2:1/==h53:&255<43-;:=7=4$031>6=#9891?6*>1580?!76=390(<?9:29'541=;2.:=54<;%32=?5<,8;j6>5+10`97>"69j087)?>d;18 47b2:1/=<h53:&265<43-;9=7=4$001>6=#9;91?6*>2580?!75=390(<<9:29'571=;2.:>54<;%31=?5<,88j6>5+13`97>"6:j087)?=d;18 44b2:1/=?h53:&275<43-;8=7=4$011>6=#9:91?6*>3580?!74=390(<=9:29'561=;2.:?54<;%30=?5<,89j6>5+12`97>"6;j097)?<d;08 45b28>=7)?:1;36`>"6=;0856*>5280=>"6=?08;6*>56821<=#9<k1>6*>5c81?!7083;=j6*>70822c=n9=n1<75f4083>>obm3:17d?:0;29?l212900e<:j:188m42a2900ehj50;9j==<72-;?m776;o37=?6<3`3<6=4+15c9=<=i9=31=65f9783>!73i3327c?;9;08?l?2290/=9o5989m51?=;21b=;650;&20d<6>01e=9750:9j531=83.:8l4>689m51?=921b=;850;&20d<6>01e=9752:9j533=83.:8l4>689m51?=;21dn54?:%37e?d>3g;?57>4;n`4>5<#9=k1n45a15;95>=hj<0;6)?;a;`:?k7313807bl;:18'51g=j01e=9753:9lf6<72-;?m7l6;o37=?2<3fh96=4+15c9f<=i9=31965`b083>!73i3h27c?;9;48?jd7290/=9o5b89m51?=?21dmk4?:%37e?d>3g;?5764;ncf>5<#9=k1n45a15;9=>=him0;6)?;a;`:?k7313k07bol:18'51g=j01e=975b:9led<72-;?m7l6;o37=?e<3fk26=4+15c9f<=i9=31h65`a983>!73i3h27c?;9;g8?jg0290/=9o5b89m51?=n21dm;4?:%37e?d>3g;?57??;:mb1?6=,8>j6o74n06:>47<3fk?6=4+15c9f<=i9=31=?54o`194?"6<h0i56`>48827>=hi;0;6)?;a;`:?k7313;?76an1;29 42f2k30b<:6:078?jda290/=9o5b89m51?=9?10cok50;&20d<e12d:844>7:9lfa<72-;?m7l6;o37=?7?32eio7>5$06b>g?<f8>26<74;n`a>5<#9=k1n45a15;95d=<gkk1<7*>4`8a=>h6<00:n65`b783>!73i3h27c?;9;3`?>ifj3:1(<:n:c;8j42>28n07bo?:18'51g=j01e=9751d98k<`=83.:8l4m9:l20<<6n21b=h4?:%37e?7a3g;?57>4;h3g>5<#9=k1=k5a15;95>=n9j0;6)?;a;3e?k7313807d?m:18'51g=9o1e=9753:9j62<72-;?m7?i;o37=?2<3`8=6=4+15c95c=i9=31965f2483>!73i3;m7c?;9;48?l43290/=9o51g9m51?=?21b>>4?:%37e?7a3g;?5764;h01>5<#9=k1=k5a15;9=>=n:80;6)?;a;3e?k7313k07d<?:18'51g=9o1e=975b:9j5d<72-;?m7?i;o37=?e<3`;26=4+15c95c=i9=31h65f2e83>!73i38n7c?;9;28?l4d290/=9o52d9m51?=921b>o4?:%37e?4b3g;?57<4;h0b>5<#9=k1>h5a15;97>=n;?0;6)?;a;0f?k7313>07d=::18'51g=:l1e=9755:9j71<72-;?m7<j;o37=?0<3`986=4+15c96`=i9=31;65f3383>!73i38n7c?;9;:8?l56290/=9o52d9m51?=121b?=4?:%37e?4b3g;?57o4;h0e>5<#9=k1>h5a15;9f>=n:00;6)?;a;0f?k7313i07d<7:18'51g=:l1e=975d:9j<a<72-;?m76j;o37=?6<3`2h6=4+15c9<`=i9=31=65f8`83>!73i32n7c?;9;08?l>>290/=9o58d9m51?=;21b454?:%37e?>b3g;?57:4;h:4>5<#9=k14h5a15;91>=n0?0;6)?;a;:f?k7313<07d6::18'51g=0l1e=9757:9j<1<72-;?m76j;o37=?><3`286=4+15c9<`=i9=31565f8383>!73i32n7c?;9;c8?l>6290/=9o58d9m51?=j21b;k4?:%37e?>b3g;?57m4;h5f>5<#9=k14h5a15;9`>=n?m0;6)?;a;:f?k7313o07d9l:18'51g=0l1e=975f:9j3g<72-;?m76j;o37=?7732c<m7>5$06b>=c<f8>26<?4;h5:>5<#9=k14h5a15;957=<a>21<7*>4`8;a>h6<00:?65f7683>!73i32n7c?;9;37?>o0>3:1(<:n:9g8j42>28?07d7;:18'51g=0l1e=9751798m<5=83.:8l47e:l20<<6?21b5?4?:%37e?>b3g;?57?7;:k:5?6=,8>j65k4n06:>4?<3`3;6=4+15c9<`=i9=31=l54i9d94?"6<h03i6`>4882f>=n0k0;6)?;a;:f?k7313;h76g70;29 42f21o0b<:6:0f8?l12290/=9o58d9m51?=9l10e::50;&20d<?m2d:844>f:9la3<72-;?m7k8;o37=?6<3fo>6=4+15c9a2=i9=31=65`e583>!73i3o<7c?;9;08?jc4290/=9o5e69m51?=;21b5i4?:%37e??b3g;?57>4;h;`>5<#9=k15h5a15;95>=n1k0;6)?;a;;f?k7313807d7n:18'51g=1l1e=9753:9lag<72-;?m7kl;o37=?6<3foj6=4+15c9af=i9=31=65`e883>!73i3oh7c?;9;08?jc?290/=9o5eb9m51?=;21dhl4?:%37e?be3g;?57>4;nf:>5<#9=k1ho5a15;95>=hl>0;6)?;a;fa?k7313807bj9:18'51g=lk1e=9753:9l`0<72-;?m7jm;o37=?2<3fn?6=4+15c9`g=i9=31965`d283>!73i3ni7c?;9;48?jb5290/=9o5dc9m51?=?21dh<4?:%37e?be3g;?5764;nf3>5<#9=k1ho5a15;9=>=hko0;6)?;a;fa?k7313k07bmj:18'51g=lk1e=975b:9lgf<72-;?m7jm;o37=?e<3fii6=4+15c9`g=i9=31h65`c`83>!73i3ni7c?;9;g8?je>290/=9o5dc9m51?=n21do54?:%37e?be3g;?57??;:m`3?6=,8>j6il4n06:>47<3fi=6=4+15c9`g=i9=31=?54ob794?"6<h0on6`>48827>=hk=0;6)?;a;fa?k7313;?76al3;29 42f2mh0b<:6:078?jc6290/=9o5dc9m51?=9?10ch>50;&20d<cj2d:844>7:9l`c<72-;?m7jm;o37=?7?32eoi7>5$06b>ad<f8>26<74;nfg>5<#9=k1ho5a15;95d=<gmi1<7*>4`8gf>h6<00:n65`d983>!73i3ni7c?;9;3`?>idl3:1(<:n:e`8j42>28n07bm=:18'51g=lk1e=9751d98kf7=83.:8l4kb:l20<<6n21b=;j50;&20d<6>l1e=9750:9j53e=83.:8l4>6d9m51?=921b=;l50;&20d<6>l1e=9752:9j53g=83.:8l4>6d9m51?=;21b:n4?:%37e?0c3g;?57>4;h4a>5<#9=k1:i5a15;95>=n>00;6)?;a;4g?k7313807d87:18'51g=>m1e=9753:9j22<72-;?m78k;o37=?2<3`<=6=4+15c92a=i9=31965f6483>!73i3<o7c?;9;48?l03290/=9o56e9m51?=?21b:>4?:%37e?0c3g;?5764;h41>5<#9=k1:i5a15;9=>=n>80;6)?;a;4g?k7313k07d8?:18'51g=>m1e=975b:9j1`<72-;?m78k;o37=?e<3`?o6=4+15c92a=i9=31h65f5b83>!73i3<o7c?;9;g8?l3e290/=9o56e9m51?=n21b9l4?:%37e?0c3g;?57??;:k6=?6=,8>j6;j4n06:>47<3`?36=4+15c92a=i9=31=?54i4594?"6<h0=h6`>48827>=n=?0;6)?;a;4g?k7313;?76g:5;29 42f2?n0b<:6:078?l14290/=9o56e9m51?=9?10e:<50;&20d<1l2d:844>7:9j34<72-;?m78k;o37=?7?32c<<7>5$06b>3b<f8>26<74;h4e>5<#9=k1:i5a15;95d=<a?o1<7*>4`85`>h6<00:n65f6`83>!73i3<o7c?;9;3`?>o2n3:1(<:n:7f8j42>28n07d;;:18'51g=>m1e=9751d98m05=83.:8l49d:l20<<6n21vn<8>:18ag?6=8r.:9h4>4b9K525<@8<87W=7:by4>=<693;>6<<517827?c=k3l1=94m:|l65?433g?9645ac183?kc5281/ik4i1:&e4?`63-l?6>5+f480?!`12:1/j:4<;%d;>6=#n0087)hn:29'bg<43-lh6>5+fe80?!`b2:1/jk4<;%334?5<,8::6>5+11097>"68:087)??4;18 4622:1/==853:&242<43-;;47=4$02:>6=#99k1?6*>0c80?!77k390(<>k:29'55c=;2.:<k4<;%324?5<,8;:6>5+10097>"69:087)?>4;18 4722:1/=<853:&252<43-;:47=4$03:>6=#98k1?6*>1c80?!76k390(<?k:29'54c=;2.:=k4<;%314?5<,88:6>5+13097>"6::087)?=4;18 4422:1/=?853:&262<43-;947=4$00:>6=#9;k1?6*>2c80?!75k390(<<k:29'57c=;2.:>k4<;%304?5<,89:6>5+12097>"6;:087)?<4;18 4522:1/=>853:&272<43-;847=4$01:>6=#9:k1?6*>3c80?!74k380(<=k:39'56c=9=<0(<;>:07g?!72:3927)?:3;1:?!72>39<7)?:7;36=>"6=h097)?:b;08 41728<m7)?81;35b>o6<m0;66g;1;29?lcb2900e<;?:188m10=831b=9k50;9j51`=831bii4?::k:<?6=,8>j6474n06:>5=<a0=1<7*>4`8:=>h6<00:76g66;29 42f2030b<:6:398m<3=83.:8l469:l20<<432c::54?:%37e?7112d:844?;:k222<72-;?m7?99:l20<<632c::;4?:%37e?7112d:844=;:k220<72-;?m7?99:l20<<432ei47>5$06b>g?<f8>26=54oc594?"6<h0i56`>4882?>ie=3:1(<:n:c;8j42>2;10co:50;&20d<e12d:844<;:ma7?6=,8>j6o74n06:>1=<gk81<7*>4`8a=>h6<00>76am1;29 42f2k30b<:6:798kg6=83.:8l4m9:l20<<032ejj7>5$06b>g?<f8>26554o`g94?"6<h0i56`>488:?>ifl3:1(<:n:c;8j42>2h10clm50;&20d<e12d:844m;:mbe?6=,8>j6o74n06:>f=<gh31<7*>4`8a=>h6<00o76an8;29 42f2k30b<:6:d98kd1=83.:8l4m9:l20<<a32ej:7>5$06b>g?<f8>26<>4;nc6>5<#9=k1n45a15;954=<gh>1<7*>4`8a=>h6<00:>65`a283>!73i3h27c?;9;30?>if:3:1(<:n:c;8j42>28>07bo>:18'51g=j01e=9751498kg`=83.:8l4m9:l20<<6>21dnh4?:%37e?d>3g;?57?8;:ma`?6=,8>j6o74n06:>4><3fhh6=4+15c9f<=i9=31=454oc`94?"6<h0i56`>4882e>=hjh0;6)?;a;`:?k7313;i76am6;29 42f2k30b<:6:0a8?jge290/=9o5b89m51?=9m10cl>50;&20d<e12d:844>e:9l=c<72-;?m7l6;o37=?7a32c:i7>5$06b>4`<f8>26=54i0f94?"6<h0:j6`>4882?>o6k3:1(<:n:0d8j42>2;10e<l50;&20d<6n2d:844<;:k13?6=,8>j6<h4n06:>1=<a;<1<7*>4`82b>h6<00>76g=5;29 42f28l0b<:6:798m72=83.:8l4>f:l20<<032c9?7>5$06b>4`<f8>26554i3094?"6<h0:j6`>488:?>o593:1(<:n:0d8j42>2h10e?>50;&20d<6n2d:844m;:k2e?6=,8>j6<h4n06:>f=<a831<7*>4`82b>h6<00o76g=d;29 42f2;o0b<:6:198m7e=83.:8l4=e:l20<<632c9n7>5$06b>7c<f8>26?54i3c94?"6<h09i6`>4880?>o4>3:1(<:n:3g8j42>2=10e>;50;&20d<5m2d:844:;:k00?6=,8>j6?k4n06:>3=<a:91<7*>4`81a>h6<00<76g<2;29 42f2;o0b<:6:998m67=83.:8l4=e:l20<<>32c8<7>5$06b>7c<f8>26l54i3d94?"6<h09i6`>488a?>o513:1(<:n:3g8j42>2j10e?650;&20d<5m2d:844k;:k;`?6=,8>j65k4n06:>5=<a1i1<7*>4`8;a>h6<00:76g7a;29 42f21o0b<:6:398m=?=83.:8l47e:l20<<432c347>5$06b>=c<f8>26954i9594?"6<h03i6`>4886?>o?>3:1(<:n:9g8j42>2?10e5;50;&20d<?m2d:8448;:k;0?6=,8>j65k4n06:>==<a191<7*>4`8;a>h6<00276g72;29 42f21o0b<:6:`98m=7=83.:8l47e:l20<<e32c<j7>5$06b>=c<f8>26n54i6g94?"6<h03i6`>488g?>o0l3:1(<:n:9g8j42>2l10e:m50;&20d<?m2d:844i;:k4f?6=,8>j65k4n06:>46<3`=j6=4+15c9<`=i9=31=<54i6;94?"6<h03i6`>48826>=n?10;6)?;a;:f?k7313;876g87;29 42f21o0b<:6:068?l11290/=9o58d9m51?=9<10e4:50;&20d<?m2d:844>6:9j=6<72-;?m76j;o37=?7032c2>7>5$06b>=c<f8>26<64;h;2>5<#9=k14h5a15;95<=<a0:1<7*>4`8;a>h6<00:m65f8g83>!73i32n7c?;9;3a?>o?j3:1(<:n:9g8j42>28i07d6?:18'51g=0l1e=9751e98m23=83.:8l47e:l20<<6m21b;94?:%37e?>b3g;?57?i;:mf2?6=,8>j6h94n06:>5=<gl?1<7*>4`8f3>h6<00:76aj4;29 42f2l=0b<:6:398k`5=83.:8l4j7:l20<<432c2h7>5$06b><c<f8>26=54i8a94?"6<h02i6`>4882?>o>j3:1(<:n:8g8j42>2;10e4o50;&20d<>m2d:844<;:mff?6=,8>j6hm4n06:>5=<glk1<7*>4`8fg>h6<00:76aj9;29 42f2li0b<:6:398k`>=83.:8l4jc:l20<<432eom7>5$06b>ad<f8>26=54oe;94?"6<h0on6`>4882?>ic?3:1(<:n:e`8j42>2;10ci850;&20d<cj2d:844<;:mg1?6=,8>j6il4n06:>1=<gm>1<7*>4`8gf>h6<00>76ak3;29 42f2mh0b<:6:798ka4=83.:8l4kb:l20<<032eo=7>5$06b>ad<f8>26554oe294?"6<h0on6`>488:?>idn3:1(<:n:e`8j42>2h10cnk50;&20d<cj2d:844m;:m`g?6=,8>j6il4n06:>f=<gjh1<7*>4`8gf>h6<00o76ala;29 42f2mh0b<:6:d98kf?=83.:8l4kb:l20<<a32eh47>5$06b>ad<f8>26<>4;na4>5<#9=k1ho5a15;954=<gj<1<7*>4`8gf>h6<00:>65`c483>!73i3ni7c?;9;30?>id<3:1(<:n:e`8j42>28>07bm<:18'51g=lk1e=9751498k`7=83.:8l4kb:l20<<6>21di=4?:%37e?be3g;?57?8;:mgb?6=,8>j6il4n06:>4><3fnn6=4+15c9`g=i9=31=454oef94?"6<h0on6`>4882e>=hlj0;6)?;a;fa?k7313;i76ak8;29 42f2mh0b<:6:0a8?jec290/=9o5dc9m51?=9m10cn<50;&20d<cj2d:844>e:9lg4<72-;?m7jm;o37=?7a32c::i4?:%37e?71m2d:844?;:k22f<72-;?m7?9e:l20<<632c::o4?:%37e?71m2d:844=;:k22d<72-;?m7?9e:l20<<432c=o7>5$06b>3b<f8>26=54i7`94?"6<h0=h6`>4882?>o113:1(<:n:7f8j42>2;10e;650;&20d<1l2d:844<;:k53?6=,8>j6;j4n06:>1=<a?<1<7*>4`85`>h6<00>76g95;29 42f2?n0b<:6:798m32=83.:8l49d:l20<<032c=?7>5$06b>3b<f8>26554i7094?"6<h0=h6`>488:?>o193:1(<:n:7f8j42>2h10e;>50;&20d<1l2d:844m;:k6a?6=,8>j6;j4n06:>f=<a<n1<7*>4`85`>h6<00o76g:c;29 42f2?n0b<:6:d98m0d=83.:8l49d:l20<<a32c>m7>5$06b>3b<f8>26<>4;h7:>5<#9=k1:i5a15;954=<a<21<7*>4`85`>h6<00:>65f5683>!73i3<o7c?;9;30?>o2>3:1(<:n:7f8j42>28>07d;::18'51g=>m1e=9751498m25=83.:8l49d:l20<<6>21b;?4?:%37e?0c3g;?57?8;:k45?6=,8>j6;j4n06:>4><3`=;6=4+15c92a=i9=31=454i7d94?"6<h0=h6`>4882e>=n>l0;6)?;a;4g?k7313;i76g9a;29 42f2?n0b<:6:0a8?l3a290/=9o56e9m51?=9m10e8:50;&20d<1l2d:844>e:9j16<72-;?m78k;o37=?7a32wi=;<50;``>5<7s-;>i7?;c:J236=O9?90V>65cz59<?7628?1=?4>6;30>`<d2o0:87l5}o72>72<f<8156`l0;28j`4=92.nj7h>;%d3>c7<,o>1?6*i5;18 c0=;2.m;7=4$g:97>"a1390(ko53:&ef?5<,oi1?6*id;18 cc=;2.mj7=4$023>6=#99;1?6*>0380?!77;390(<>;:29'553=;2.:<;4<;%333?5<,8:36>5+11;97>"68h087)??b;18 46d2:1/==j53:&24`<43-;;j7=4$033>6=#98;1?6*>1380?!76;390(<?;:29'543=;2.:=;4<;%323?5<,8;36>5+10;97>"69h087)?>b;18 47d2:1/=<j53:&25`<43-;:j7=4$003>6=#9;;1?6*>2380?!75;390(<<;:29'573=;2.:>;4<;%313?5<,8836>5+13;97>"6:h087)?=b;18 44d2:1/=?j53:&26`<43-;9j7=4$013>6=#9:;1?6*>3380?!74;390(<=;:29'563=;2.:?;4<;%303?5<,8936>5+12;97>"6;h087)?<b;18 45d2;1/=>j52:&27`<6<?1/=8?514f8 4352:30(<;<:2;8 4312:=0(<;8:07:?!72i380(<;m:39'526=9?l0(<9>:04e?l73l3:17d:>:188m`c=831b=8>50;9j03<722c:8h4?::k20c<722cnh7>5;h;;>5<#9=k1545a15;94>=n1>0;6)?;a;;:?k7313;07d79:18'51g=101e=9752:9j=0<72-;?m776;o37=?5<3`;=47>5$06b>40>3g;?57>4;h353?6=,8>j6<86;o37=?7<3`;=:7>5$06b>40>3g;?57<4;h351?6=,8>j6<86;o37=?5<3fh36=4+15c9f<=i9=31<65`b683>!73i3h27c?;9;38?jd2290/=9o5b89m51?=:21dn94?:%37e?d>3g;?57=4;n`0>5<#9=k1n45a15;90>=hj;0;6)?;a;`:?k7313?07bl>:18'51g=j01e=9756:9lf5<72-;?m7l6;o37=?1<3fkm6=4+15c9f<=i9=31465`ad83>!73i3h27c?;9;;8?jgc290/=9o5b89m51?=i21dmn4?:%37e?d>3g;?57l4;ncb>5<#9=k1n45a15;9g>=hi00;6)?;a;`:?k7313n07bo7:18'51g=j01e=975e:9le2<72-;?m7l6;o37=?`<3fk=6=4+15c9f<=i9=31==54o`794?"6<h0i56`>48825>=hi=0;6)?;a;`:?k7313;976an3;29 42f2k30b<:6:018?jg5290/=9o5b89m51?=9=10cl?50;&20d<e12d:844>5:9lfc<72-;?m7l6;o37=?7132eii7>5$06b>g?<f8>26<94;n`g>5<#9=k1n45a15;95==<gki1<7*>4`8a=>h6<00:565`bc83>!73i3h27c?;9;3b?>iei3:1(<:n:c;8j42>28h07bl9:18'51g=j01e=9751b98kdd=83.:8l4m9:l20<<6l21dm=4?:%37e?d>3g;?57?j;:m:b?6=,8>j6o74n06:>4`<3`;n6=4+15c95c=i9=31<65f1e83>!73i3;m7c?;9;38?l7d290/=9o51g9m51?=:21b=o4?:%37e?7a3g;?57=4;h04>5<#9=k1=k5a15;90>=n:?0;6)?;a;3e?k7313?07d<::18'51g=9o1e=9756:9j61<72-;?m7?i;o37=?1<3`886=4+15c95c=i9=31465f2383>!73i3;m7c?;9;;8?l46290/=9o51g9m51?=i21b>=4?:%37e?7a3g;?57l4;h3b>5<#9=k1=k5a15;9g>=n900;6)?;a;3e?k7313n07d<k:18'51g=:l1e=9750:9j6f<72-;?m7<j;o37=?7<3`8i6=4+15c96`=i9=31>65f2`83>!73i38n7c?;9;18?l51290/=9o52d9m51?=<21b?84?:%37e?4b3g;?57;4;h17>5<#9=k1>h5a15;92>=n;:0;6)?;a;0f?k7313=07d==:18'51g=:l1e=9758:9j74<72-;?m7<j;o37=??<3`9;6=4+15c96`=i9=31m65f2g83>!73i38n7c?;9;`8?l4>290/=9o52d9m51?=k21b>54?:%37e?4b3g;?57j4;h:g>5<#9=k14h5a15;94>=n0j0;6)?;a;:f?k7313;07d6n:18'51g=0l1e=9752:9j<<<72-;?m76j;o37=?5<3`236=4+15c9<`=i9=31865f8683>!73i32n7c?;9;78?l>1290/=9o58d9m51?=>21b484?:%37e?>b3g;?5794;h:7>5<#9=k14h5a15;9<>=n0:0;6)?;a;:f?k7313307d6=:18'51g=0l1e=975a:9j<4<72-;?m76j;o37=?d<3`=m6=4+15c9<`=i9=31o65f7d83>!73i32n7c?;9;f8?l1c290/=9o58d9m51?=m21b;n4?:%37e?>b3g;?57h4;h5a>5<#9=k14h5a15;955=<a>k1<7*>4`8;a>h6<00:=65f7883>!73i32n7c?;9;31?>o003:1(<:n:9g8j42>28907d98:18'51g=0l1e=9751598m20=83.:8l47e:l20<<6=21b594?:%37e?>b3g;?57?9;:k:7?6=,8>j65k4n06:>41<3`396=4+15c9<`=i9=31=554i8394?"6<h03i6`>4882=>=n190;6)?;a;:f?k7313;j76g7f;29 42f21o0b<:6:0`8?l>e290/=9o58d9m51?=9j10e5>50;&20d<?m2d:844>d:9j30<72-;?m76j;o37=?7b32c<87>5$06b>=c<f8>26<h4;ng5>5<#9=k1i:5a15;94>=hm<0;6)?;a;g4?k7313;07bk;:18'51g=m>1e=9752:9la6<72-;?m7k8;o37=?5<3`3o6=4+15c9=`=i9=31<65f9b83>!73i33n7c?;9;38?l?e290/=9o59d9m51?=:21b5l4?:%37e??b3g;?57=4;nga>5<#9=k1in5a15;94>=hmh0;6)?;a;g`?k7313;07bk6:18'51g=mj1e=9752:9la=<72-;?m7kl;o37=?5<3fnj6=4+15c9`g=i9=31<65`d883>!73i3ni7c?;9;38?jb0290/=9o5dc9m51?=:21dh;4?:%37e?be3g;?57=4;nf6>5<#9=k1ho5a15;90>=hl=0;6)?;a;fa?k7313?07bj<:18'51g=lk1e=9756:9l`7<72-;?m7jm;o37=?1<3fn:6=4+15c9`g=i9=31465`d183>!73i3ni7c?;9;;8?jea290/=9o5dc9m51?=i21doh4?:%37e?be3g;?57l4;na`>5<#9=k1ho5a15;9g>=hkk0;6)?;a;fa?k7313n07bmn:18'51g=lk1e=975e:9lg<<72-;?m7jm;o37=?`<3fi36=4+15c9`g=i9=31==54ob594?"6<h0on6`>48825>=hk?0;6)?;a;fa?k7313;976al5;29 42f2mh0b<:6:018?je3290/=9o5dc9m51?=9=10cn=50;&20d<cj2d:844>5:9la4<72-;?m7jm;o37=?7132en<7>5$06b>ad<f8>26<94;nfe>5<#9=k1ho5a15;95==<gmo1<7*>4`8gf>h6<00:565`de83>!73i3ni7c?;9;3b?>ick3:1(<:n:e`8j42>28h07bj7:18'51g=lk1e=9751b98kfb=83.:8l4kb:l20<<6l21do?4?:%37e?be3g;?57?j;:m`5?6=,8>j6il4n06:>4`<3`;=h7>5$06b>40b3g;?57>4;h35g?6=,8>j6<8j;o37=?7<3`;=n7>5$06b>40b3g;?57<4;h35e?6=,8>j6<8j;o37=?5<3`<h6=4+15c92a=i9=31<65f6c83>!73i3<o7c?;9;38?l0>290/=9o56e9m51?=:21b:54?:%37e?0c3g;?57=4;h44>5<#9=k1:i5a15;90>=n>?0;6)?;a;4g?k7313?07d8::18'51g=>m1e=9756:9j21<72-;?m78k;o37=?1<3`<86=4+15c92a=i9=31465f6383>!73i3<o7c?;9;;8?l06290/=9o56e9m51?=i21b:=4?:%37e?0c3g;?57l4;h7f>5<#9=k1:i5a15;9g>=n=m0;6)?;a;4g?k7313n07d;l:18'51g=>m1e=975e:9j1g<72-;?m78k;o37=?`<3`?j6=4+15c92a=i9=31==54i4;94?"6<h0=h6`>48825>=n=10;6)?;a;4g?k7313;976g:7;29 42f2?n0b<:6:018?l31290/=9o56e9m51?=9=10e8;50;&20d<1l2d:844>5:9j36<72-;?m78k;o37=?7132c<>7>5$06b>3b<f8>26<94;h52>5<#9=k1:i5a15;95==<a>:1<7*>4`85`>h6<00:565f6g83>!73i3<o7c?;9;3b?>o1m3:1(<:n:7f8j42>28h07d8n:18'51g=>m1e=9751b98m0`=83.:8l49d:l20<<6l21b994?:%37e?0c3g;?57?j;:k67?6=,8>j6;j4n06:>4`<3ty:894?:c7x94132o801<;i:0g8943a2;801<;i:338943a2;:01<;i:0c8943a28301<;i:3f8943a2;l01<;i:3;8943a2;201<;i:9f8943a21i01<;i:9c8943a21301<;i:9:8943a21=01<;i:948943a21?01<;i:968943a21901<;i:908943a21;01<;i:6d8943a2>o01<;i:6f8943a2>i01<;i:6`8943a2>k01<;i:6;8943a2>201<;i:658943a2><01<;i:868943a20901<;i:8f8943a20i01<;i:8`8943a28>o70?:f;37b>;6=o0:9=5217295`=:9?:1>?52172964=:9?:1>=5217295d=:9?:1=45217296a=:9?:1>k5217296<=:9?:1>5521729<a=:9?:14n521729<d=:9?:144521729<==:9?:14:521729<3=:9?:148521729<1=:9?:14>521729<7=:9?:14<5217293c=:9?:1;h5217293a=:9?:1;n5217293g=:9?:1;l5217293<=:9?:1;552172932=:9?:1;;521729=1=:9?:15>521729=a=:9?:15n521729=g=:9?:1=9j4=043>42a34;=<7?:0:?224<6m27::<4=2:?224<5927::<4=0:?224<6i27::<4>9:?224<5l27::<4=f:?224<5127::<4=8:?224<?l27::<47c:?224<?i27::<479:?224<?027::<477:?224<?>27::<475:?224<?<27::<473:?224<?:27::<471:?224<0n27::<48e:?224<0l27::<48c:?224<0j27::<48a:?224<0127::<488:?224<0?27::<486:?224<><27::<463:?224<>l27::<46c:?224<>j27::<4>4e9>537=9=l01<8>:073?871:3;n70?92;01?871:38:70?92;03?871:3;j70?92;3:?871:38o70?92;0e?871:38270?92;0;?871:3<h70?92;4a?871:3<270?92;40?871:3<970?92;42?871:3?j70?92;7:?871:3?370?92;52?871:3=;70?92;4e?871:32o70?92;:`?871:32j70?92;::?871:32370?92;:4?871:32=70?92;:6?871:32?70?92;:0?871:32970?92;:2?871:3=m70?92;5f?871:3=o70?92;5`?871:3=i70?92;5b?871:3=270?92;5;?871:3=<70?92;55?871:33?70?92;;0?871:33970?92;;2?871:33;70?92;;;?871:33<70?92;;5?871:33>70?92;;g?871:33h70?92;;a?871:33j70?92;37`>;6>;0:8k521709506<uz8h;7>52z\1g2=:9<l1o<5rs3a;>5<5sW8h463>5g8`6>{t:m91<7<t^3f0?872n3io7p}=dd83>7}Y:mo01<;i:e:8yv4b:3:1>vP=e39>50`=lj1v?k<:181[4b;27:9k4kd:p6`2=838pR?k;;<36b?bb3ty9i84?:3y]6`3<58?m6ih4}r0f2?6=:rT9i;5214d9a==z{;o<6=4={_0f3>;6>90h=6s|2b;94?4|V;i270?90;a1?xu5kh0;6?uQ2bc894072jn0q~<lb;296~X5kk16=;>5d99~w7ed2909wS<lc:?225<ck2wx>nj50;0xZ7ec34;=<7jk;|q1g`<72;qU>nk4=043>ac<uz8hj7>52z\1gc=:9?:1hk5rs3f3>5<5sW8o<63>618f<>{t:m;1<7<t^3f2?87193i:7p}=d383>7}Y:m801<8>:b08yv4c<3:1>vP=d59>537=km1v?j::181[4c=27::<4k8:p6a0=838pR?j9;<355?bd3ty9h:4?:3y]6a1<58<:6ij4}r0g<?6=:rT9h5521739``=z{;n26=4={_0g=>;6>80oj6s|2ec94?4|V;nj70?91;g;?xu5lk0;6?uQ2e`894052j;0q~<kc;296~X5lj16=;<5c39~w7bc2909wS<kd:?227<dl2wx>ih50;0xZ7ba34;=>7j7;|q1a5<72;qU>h>4=041>ae<uz8?:7>52z\103=:9<l15k5rs364>5<5sW8?;63>5g8b4>{t:?l1<7<t^34e?872n3ki7p}=7`83>7}Y:>k01<;i:c48yv4?=3:1>vP=849>50`=jh1v?7?:181[4>827:9k4mb:p6<d=838pR?7m;<36b?dd3ty9m;4?:3y]6d0<58?m6oj4}r0a5?6=:rT9n<5214d9a6=z{;hh6=4={_0ag>;6>902j6s|25:94?4|V;>370?90;c3?xu5=:0;6?uQ241894072hh0q~<:e;296~X5=l16=;>5b79~w70?2909wS<98:?225<ei2wx>;750;0xZ70>34;=<7lm;|q12d<72;qU>;o4=043>ge<uz8=n7>52z\12g=:9?:1ni5rs34`>5<5sW8=o63>618f7>{t:?n1<7<t^34g?871933m7p}=6d83>7}Y:?o01<8>:`28yv4083:1>vP=719>537=ik1v?9>:181[40927::<4m6:p624=838pR?9=;<355?df3ty9;>4?:3y]625<58<:6ol4}r040?6=:rT9;9521739ff=z{;=>6=4={_041>;6>80ih6s|26494?4|V;==70?91;g0?xu5?>0;6?uQ2658940520l0q~<88;296~X5?116=;<5a19~w71>2909wS<89:?227<fj2wx>:l50;0xZ71e34;=>7l9;|q13f<72;qU>:m4=041>gg<uz8<h7>52z\13a=:9<l1nh5rs35f>5<5sW8<i63>5g8ab>{t:>l1<7<t^35e?872n3k:7p}=8183>7}Y:1:01<;i:`08yv4?93:1>vP=809>50`=i:1v?6=:181[4?:27:9k4n4:p6=5=838pR?6<;<36b?g23ty9494?:3y]6=2<58?m6l84}r0;2?6=:rT94;5214d9a1=z{;2<6=4={_0;3>;6>90ii6s|29:94?4|V;2370?90;`e?xu5000;6?uQ29;894072h;0q~<7a;296~X50h16=;>5a39~w7>e2909wS<7b:?225<f;2wx>5m50;0xZ7>d34;=<7o;;|q1<a<72;qU>5j4=043>d3<uz83i7>52z\1<`=:9?:1m;5rs3:e>5<5sW83j63>618f0>{t:0;1<7<t^3;2?87193hn7p}=9383>7}Y:0801<8>:cd8yv4>;3:1>vP=929>537=i81v?7;:181[4><27::<4n2:p6<3=838pR?7:;<355?g43ty95;4?:3y]6<0<58<:6l:4}r0:3?6=:rT95:521739e0=z{;336=4={_0:<>;6>80j:6s|28;94?4|V;3270?91;g7?xu51h0;6?uQ28c894052ko0q~<6c;296~X51j16=;<5bg9~w7?c2909wS<6d:?227<f92wx>4k50;0xZ7?b34;=>7o=;|q1=c<72;qU>4h4=041>d5<uz8j<7>52z\1e5=:9<l1m:5rs3c2>5<5sW8j=63>5g8b<>{t:h81<7<t^3c1?872n3k27p}=a283>7}Y:h901<;i:`c8yv4f<3:1>vP=a59>50`=ij1v?o::181[4f=27:9k4nd:p6d1=838pR?o8;<36b?gb3ty9m54?:3y]6d><58?m6lh4}r0b=?6=:rT9m45214d9a0=z{;kj6=4={_0be>;6>90j;6s|2``94?4|V;ki70?90;c;?xu5ij0;6?uQ2`a894072h30q~<nd;296~X5im16=;>5a`9~w7gb2909wS<ne:?225<fk2wx>lh50;0xZ7ga34;=<7ok;|q1f5<72;qU>o>4=043>dc<uz8i>7>52z\1f7=:9?:1mk5rs3`0>5<5sW8i?63>618f1>{t:k>1<7<t^3`7?87193k<7p}=b483>7}Y:k?01<8>:`:8yv4e>3:1>vP=b79>537=i01v?l8:181[4e?27::<4na:p6g>=838pR?l7;<355?gd3ty9n44?:3y]6g?<58<:6lj4}r0ae?6=:rT9nl521739e`=z{;hi6=4={_0af>;6>80jj6s|2cf94?4|V;ho70?91;g6?xu5jl0;6?uQ2cg894052h=0q~<mf;296~X5jo16=;<5a99~w7e72909wS<l0:?227<f12wx>n?50;0xZ7e634;=>7on;|q1g7<72;qU>n<4=041>de<uz8h?7>52z\1g6=:9<l1n=5rs3a7>5<5sW8h863>5g8a5>{t:j?1<7<t^3a6?872n3h97p}=c783>7}Y:j<01<;i:c18yv4313:1>vP=489>50`=j=1v?:n:181[43i27:9k4m5:p61d=838pR?:m;<36b?d03ty98n4?:3y]61e<58?m6o64}r07`?6=:rT98i5214d9a3=z{;>n6=4={_07a>;6>90i<6s|25d94?4|V;>m70?90;`2?xu5=90;6?uQ242894072k80q~<:1;296~X5=816=;>5b29~w7352909wS<:2:?225<e<2wx>8:50;0xZ73334;=<7l:;|q110<72;qU>8;4=043>g1<uz8>:7>52z\113=:9?:1n55rs374>5<5sW8>;63>618f2>{t:<21<7<t^37;?87193h;7p}=5883>7}Y:<301<8>:c38yv42i3:1>vP=5`9>537=j;1v?;m:181[42j27::<4m3:p60e=838pR?;l;<355?d33ty99i4?:3y]60b<58<:6o;4}r06b?6=:rT99k521739f2=z{;<;6=4={_054>;6>80i46s|27394?4|V;<:70?91;g5?xu5>;0;6?uQ270894052k:0q~<93;296~X5>:16=;<5b09~w7032909wS<94:?227<e:2wx>;;50;0xZ70234;=>7l<;|q123<72;qU>;84=041>g2<uz8n57>59z\1a<=:9<l1ih5214d951c<58<;6hk4=043>42b34;==7kj;<355?73m27::?4je:?227<6<l1v<o<:186[7f;27:9k4;6:?225<3>27::<4;6:?227<3>2wx>h650;7xZ7c?34;>j7kk;<354?cc34;==7kk;<356?cc3ty:m?4?:4y]5d4<58?m69?4=043>17<58<:69?4=041>17<uz8997>52z\160=:9<l1;95rs305>5<5sW89:63>5g841>{t::;1<7<t^312?872n32;7p}=3b83>7}Y::i01<;i:9`8yv4383:1>vP=419>50`=0o1v?:>:181[43927:9k460:p614=838pR?:=;<36b??63ty98>4?:3y]615<58?m64<4}r070?6=:rT9895214d9=d=z{;>>6=4={_071>;6>90<86s|23594?4|V;8<70?90;56?xu5:10;6?uQ23:8940721:0q~<=9;296~X5:016=;>58c9~w74f2909wS<=a:?225<?n2wx>?l50;0xZ74e34;=<77?;|q16f<72;qU>?m4=043><7<uz89h7>52z\16a=:9?:15?5rs30f>5<5sW89i63>618:e>{t:;l1<7<t^30e?87193=?7p}=3183>7}Y:::01<8>:678yv44:3:1>vP=339>537=091v?=<:181[44;27::<47b:p662=838pR?=;;<355?>a3ty9?84?:3y]663<58<:64>4}r002?6=:rT9?;521739=4=z{;9<6=4={_003>;6>802>6s|22:94?4|V;9370?91;;b?xu5;00;6?uQ22;894052>>0q~<<a;296~X5;h16=;<5749~w75e2909wS<<b:?227<?82wx>>j50;0xZ75c34;=>76m;|q17`<72;qU>>k4=041>=`<uz;397>55z\2<0=:9<l1?=52172975=:9?;1?=52170975=z{82=6=4:{_3;2>;6=o08=63>61805>;6>808=63>63805>{t91=1<7;t^0:4?872n39970?90;11?871939970?92;11?xu6010;68uQ19:8943a2:901<8?:21894062:901<8=:218yv7?13:19vP>889>50`=;=16=;>5359>537=;=16=;<5359~w4>f290>wS?7a:?21c<4=27::=4<5:?224<4=27::?4<5:p5=d=83?pR<6m;<36b?5134;=<7=9;<355?5134;=>7=9;|q2<f<72<qU=5m4=07e>7g<58<;6?o4=042>7g<58<96?o4}r3;`?6==rT:4i5214d96g=:9?:1>o5217396g=:9?81>o5rs0:f>5<2sW;3i63>5g81g>;6>909o63>6081g>;6>;09o6s|2df94?76sW8nh63>5g822a=:9<l1=;m4=07e>40e34;>j7?9a:?225<6>m16=;>517a8940728<i70?90;35e>;6>80::i52173953e<58<:6<8m;<355?71i27::?4>6e9>534=9?i01<8=:04a?871:3;=m6s|1`694?4|V8k?70?:f;70?xu6i<0;6?uQ1`78943a2<>0q~?ld;296~X6km16=8h55g9~w4b?2909wS?k8:?21c<1i2wx=h=50;0xZ4c434;>j78j;|q2a`<72;qU=hk4=07e>3`<uz;m57>52z\2b<=:9<l1;=5rs327>5<5sW8;863>5g845>{t:9l1<7<t^32e?872n33>7p}=1`83>7}Y:8k01<8?:418yv7f>3:1>vP>a79>536===1v<l>:181[7e927::=4:f:p5ge=838pR<ll;<354?0f3ty:o;4?:3y]5f0<58<;6;k4}r3`3?6=:rT:o:5217292c=z{8i36=4={_3`<>;6>90<<6s|1b;94?4|V8i270?90;52?xu6kh0;6?uQ1bc8940720?0q~?lb;296~X6kk16=;?5529~w4ed2909wS?lc:?224<2<2wx=nk50;0xZ4eb34;==7;i;|q2gc<72;qU=nh4=042>3g<uz;o<7>52z\2`5=:9?;1:h5rs0f2>5<5sW;o=63>6085b>{t9m81<7<t^0f1?87193=;7p}>d283>7}Y9m901<8>:638yv7c<3:1>vP>d59>537=1<1v<j::181[7c=27::?4:3:p5a0=838pR<j9;<356?333ty:h:4?:3y]5a1<58<968h4}r3g=?6=:rT:h45217092d=z{8nj6=4={_3ge>;6>;0=i6s|1e`94?4|V8ni70?:f;51?xu6lj0;6?uQ1ea8943a2>90q~?kd;296~X6lm16=8h5549~w4bb2909wS?ke:?21c<2>2wx=ih50;0xZ4ba34;>j7;8;|q2a5<72;qU=h>4=07e>0><uz;n=7>52z\2a4=:9<l1945rs0g1>5<5sW;n>63>5g86e>{t9l>1<7<t^0g7?872n33=7p}>e483>7}Y9l?01<8?:608yv7b>3:1>vP>e79>536=?:1v<k8:181[7b?27::=4:5:p5`>=838pR<k7;<354?313ty:i44?:3y]5`?<58<;6894}r3fe?6=:rT:il5217291==z{8oi6=4={_3ff>;6>90>56s|1da94?4|V8oh70?90;7b?xu6mm0;6?uQ1df8940720<0q~?jf;296~X6mo16=;?5739~w4`72909wS?i0:?224<0;2wx=k?50;0xZ4`634;==7;:;|q2b7<72;qU=k<4=042>00<uz;m?7>52z\2b6=:9?;19:5rs0d7>5<5sW;m863>6086<>{t9o?1<7<t^0d6?87193?27p}>f783>7}Y9o<01<8>:4c8yv7a?3:1>vP>f69>537=1?1v<h7:181[7a027::?482:p5cg=838pR<hn;<356?143ty:jo4?:3y]5cd<58<968;4}r3eg?6=:rT:jn52170913=z{8lo6=4={_3e`>;6>;0>;6s|1gg94?4|V8ln70?:f;7a?xu6no0;6?uQ1gd8943a2<i0q~<?0;296~X58916=8h55e9~w7662909wS<?1:?21c<2m2wx>=<50;0xZ76534;>j78?;|q146<72;qU>==4=07e>37<uz8;97>52z\140=:9<l1:?5rs325>5<5sW8;:63>5g857>{t:9=1<7<t^324?872n33<7p}=0983>7}Y:9201<8?:4`8yv4713:1>vP=089>536==j1v?>n:181[47i27::=4:d:p65d=838pR?>m;<354?3b3ty9<n4?:3y]65e<58<;6;>4}r03`?6=:rT9<i52172924=z{;:n6=4={_03a>;6>90=>6s|20294?4|V;;;70?90;40?xu5980;6?uQ2038940720=0q~<>2;296~X59;16=;?55c9~w7742909wS<>3:?224<2k2wx><:50;0xZ77334;==7;k;|q150<72;qU><;4=042>0c<uz8::7>52z\153=:9?;1:=5rs334>5<5sW8:;63>60855>{t:821<7<t^33;?87193<97p}=1883>7}Y:8301<8>:718yv46j3:1>vP=1c9>537=1>1v??l:181[46k27::?4:b:p64b=838pR??k;<356?3d3ty9=h4?:3y]64c<58<968j4}r02b?6=:rT9=k5217091`=z{;8;6=4={_014>;6>;0=<6s|23394?4|V;8:70?:f;47?xu5:;0;6?uQ2308943a2??0q~<=3;296~X5::16=8h5679~w7432909wS<=4:?21c<1?2wx=l950;0xZ4g034;>j787;|q2e=<72;qU=l64=07e>3?<uz;j57>52z\2e<=:9<l1:o5rs0cb>5<5sW;jm63>5g85g>{t9hh1<7<t^0ca?872n3337p}>ab83>7}Y9hi01<8?:768yv7fl3:1>vP>ae9>536=><1v<oj:181[7fm27::=496:p5d`=838pR<oi;<354?003ty:n=4?:3y]5g6<58<;6;64}r3a6?6=:rT:n?5217292<=z{8h86=4={_3a7>;6>90=n6s|1c694?4|V8h?70?90;4`?xu6j<0;6?uQ1c7894072020q~?m6;296~X6j?16=;?5659~w4d02909wS?m7:?224<1=2wx=o650;0xZ4d?34;==789;|q2f<<72;qU=o74=042>31<uz;im7>52z\2fd=:9?;1:55rs0`a>5<5sW;in63>6085=>{t9kn1<7<t^0`g?87193<i7p}>bd83>7}Y9ko01<8>:7a8yv7en3:1>vP>bg9>537=111v<m?:181[7d827::?494:p5f7=838pR<m>;<356?023ty:o?4?:3y]5f4<58<96;84}r3`7?6=:rT:o>52170922=z{8i?6=4={_3`0>;6>;0=46s|16a94?3|V8=h70?:f;00?871838870?91;00?871:3887p}>7e83>0}Y9>n01<;i:36894072;>01<8>:36894052;>0q~?8e;291~X6?l16=8h5249>536=:<16=;?5249>534=:<1v<9i:186[70n27:9k4=6:?225<5>27::<4=6:?227<5>2wx=5>50;7xZ4>734;>j7<8;<354?4034;==7<8;<356?403ty:4<4?:4y]5=7<58?m6<l4=043>4d<58<:6<l4=041>4d<uz;3>7>55z\2<7=:9<l1=n5217295f=:9?;1=n5217095f=z{8286=4:{_3;7>;6=o0:h63>6182`>;6>80:h63>6382`>{t:lh1<7?>{_0ff>;6=o0::55214d9531<58?m6<89;<36b?71=27::=4>699>536=9?=01<8?:045?87183;=963>60822==:9?;1=;94=042>40134;==7?95:?227<6>116=;<51758940528<=70?92;351>{zf=?26=4>{I357>{i<<k1<7?tH040?xh3=k0;6<uG1718yk22k3:1=vF>629~j13c290:wE?93:m00c=83;pD<8<;|l71c<728qC=;=4}o654?6=9rB::>5rn542>5<6sA;=?6sa47094?7|@8<87p`;6283>4}O9?90qc:94;295~N6>:1vb98::182M71;2we8;850;3xL4043td?::4?:0yK535<ug>=47>51zJ226=zf=<26=4>{I357>{i<?k1<7?tH040?xh3>k0;6<uG1718yk21k3:1=vF>629~j10c290:wE?93:m03c=83;pD<8<;|l72c<728qC=;=4}o644?6=9rB::>5rn552>5<6sA;=?6sa46094?7|@8<87p`;7283>4}O9?90qc:84;295~N6>:1vb99::182M71;2we8:850;3xL4043td?;:4?:0yK535<ug><47>51zJ226=zf==26=4>{I357>{i<>k1<7?tH040?xh3?k0;6<uG1718yk20k3:1=vF>629~j11c290:wE?93:m02c=83;pD<8<;|l73c<728qC=;=4}o6;4?6=9rB::>5rn5:2>5<6sA;=?6sa49094?7|@8<87p`;8283>4}O9?90qc:74;295~N6>:1vb96::182M71;2we85850;3xL4043td?4:4?:0yK535<ug>347>51zJ226=zf=226=4>{I357>{i<1k1<7?tH040?xh30k0;6<uG1718yk2?k3:1=vF>629~j1>c290:wE?93:m0=c=83;pD<8<;|l7<c<728qC=;=4}o6:4?6=9rB::>5rn5;2>5<6sA;=?6sa48094?7|@8<87p`;9283>4}O9?90qc:64;295~N6>:1vb97::182M71;2we84850;3xL4043td?5:4?:0yK535<ug>247>51zJ226=zf=326=4>{I357>{i<0k1<7?tH040?xh31k0;6<uG1718yk2>k3:1=vF>629~j1?c290:wE?93:m0<c=83;pD<8<;|l7=c<728qC=;=4}o6b4?6=9rB::>5rn5c2>5<6sA;=?6sa4`094?7|@8<87p`;a283>4}O9?90qc:n4;295~N6>:1vb9o::182M71;2we8l850;3xL4043td?m:4?:0yK535<ug>j47>51zJ226=zf=k26=4>{I357>{i<hk1<7?tH040?xh3ik0;6<uG1718yk2fk3:1=vF>629~j1gc290:wE?93:m0dc=83;pD<8<;|l7ec<728qC=;=4}o6a4?6=9rB::>5rn5`2>5<6sA;=?6sa4c094?7|@8<87p`;b283>4}O9?90qc:m4;295~N6>:1vb9l::182M71;2we8o850;3xL4043td?n:4?:0yK535<ug>i47>51zJ226=zf=h26=4>{I357>{i<kk1<7?tH040?xh3jk0;6<uG1718yk2ek3:1=vF>629~j1dc290:wE?93:m0gc=83;pD<8<;|l7fc<728qC=;=4}o6`4?6=9rB::>5rn5a2>5<6sA;=?6sa4b094?7|@8<87p`;c283>4}O9?90qc:l4;295~N6>:1vb9m::182M71;2we8n850;3xL4043td?o:4?:0yK535<ug>h47>51zJ226=zf=i26=4>{I357>{i<jk1<7?tH040?xh3kk0;6<uG1718yk2dk3:1=vF>629~j1ec290:wE?93:m0fc=83;pD<8<;|l7gc<728qC=;=4}o6g4?6=9rB::>5rn5f2>5<6sA;=?6sa4e094?7|@8<87p`;d283>4}O9?90qc:k4;295~N6>:1vb9j::182M71;2we8i850;3xL4043td?h:4?:0yK535<ug>o47>51zJ226=zf=n26=4>{I357>{i<mk1<7?tH040?xh3lk0;6<uG1718yk2ck3:1=vF>629~j1bc290:wE?93:m0ac=83;pD<8<;|l7`c<728qC=;=4}o6f4?6=9rB::>5rn5g2>5<6sA;=?6sa4d094?7|@8<87p`;e283>4}O9?90qc:j4;295~N6>:1vb9k::182M71;2we8h850;3xL4043td?i:4?:0yK535<ug>n47>51zJ226=zf=o26=4>{I357>{i<lk1<7?tH040?xh3mk0;6<uG1718yk2bk3:1=vF>629~j1cc290:wE?93:m0`c=83;pD<8<;|l7ac<728qC=;=4}o6e4?6=9rB::>5rn5d2>5<6sA;=?6sa4g094?7|@8<87p`;f283>4}O9?90qc:i4;295~N6>:1vb9h::182M71;2we8k850;3xL4043td?j:4?:0yK535<ug>m47>51zJ226=zf=l26=4>{I357>{i<ok1<7?tH040?xh3nk0;6<uG1718yk2ak3:1=vF>629~j1`c290:wE?93:m0cc=83;pD<8<;|l7bc<728qC=;=4}o734?6=9rB::>5rn422>5<6sA;=?6sa51094?7|@8<87p`:0283>4}O9?90qc;?4;295~N6>:1vb8>::182M71;2we9=850;3xL4043td><:4?:0yK535<ug?;47>51zJ226=zf<:26=4>{I357>{i=9k1<7?tH040?xh28k0;6<uG1718yk37k3:1=vF>629~j06c290:wE?93:m15c=83;pD<8<;|l64c<728qC=;=4}o724?6=9rB::>5rn432>5<6sA;=?6sa50094?7|@8<87p`:1283>4}O9?90qc;>4;295~N6>:1vb8?::182M71;2we9<850;3xL4043td>=:4?:0yK535<ug?:47>51zJ226=zf<;26=4>{I357>{i=8k1<7?tH040?xh29k0;6<uG1718yk36k3:1=vF>629~j07c290:wE?93:m14c=83;pD<8<;|l65c<728qC=;=4}o714?6=9rB::>5rn402>5<6sA;=?6sa53094?7|@8<87p`:2283>4}O9?90qc;=4;295~N6>:1vb8<::182M71;2we9?850;3xL4043td>>:4?:0yK535<ug?947>51zJ226=zf<826=4>{I357>{i=;k1<7?tH040?xh2:k0;6<uG1718yk35k3:1=vF>629~j04c290:wE?93:m17c=83;pD<8<;|l66c<728qC=;=4}o704?6=9rB::>5rn412>5<6sA;=?6sa52094?7|@8<87p`:3283>4}O9?90qc;<4;295~N6>:1vb8=::182M71;2we9>850;3xL4043td>?:4?:0yK535<ug?847>51zJ226=zf<926=4>{I357>{i=:k1<7?tH040?xh2;k0;6<uG1718yk34k3:1=vF>629~j05c290:wE?93:m16c=83;pD<8<;|l67c<728qC=;=4}o774?6=9rB::>5rn462>5<6sA;=?6sa55094?7|@8<87p`:4283>4}O9?90qc;;4;295~N6>:1vb8:::182M71;2we99850;3xL4043td>8:4?:0yK535<ug??47>51zJ226=zf<>26=4>{I357>{i==k1<7?tH040?xh2<k0;6<uG1718yk33k3:1=vF>629~j02c290:wE?93:m11c=83;pD<8<;|l60c<728qC=;=4}o764?6=9rB::>5rn472>5<6sA;=?6sa54094?7|@8<87p`:5283>4}O9?90qc;:4;295~N6>:1vb8;::182M71;2we98850;3xL4043td>9:4?:0yK535<ug?>47>51zJ226=zf<?26=4>{I357>{i=<k1<7?tH040?xh2=k0;6<uG1718yk32k3:1=vF>629~j03c290:wE?93:m10c=83;pD<8<;|l61c<728qC=;=4}o754?6=9rB::>5rn442>5<6sA;=?6sa57094?7|@8<87p`:6283>4}O9?90qc;94;295~N6>:1vb88::182M71;2we9;850;3xL4043td>::4?:0yK535<ug?=47>51zJ226=zf<<26=4>{I357>{i=?k1<7?tH040?xh2>k0;6<uG1718yk31k3:1=vF>629~j00c290:wE?93:m13c=83;pD<8<;|l62c<728qC=;=4}o744?6=9rB::>5rn452>5<6sA;=?6sa56094?7|@8<87p`:7283>4}O9?90qc;84;295~N6>:1vb89::182M71;2we9:850;3xL4043td>;:4?:0yK535<ug?<47>51zJ226=zf<=26=4>{I357>{i=>k1<7?tH040?xh2?k0;6<uG1718yk30k3:1=vF>629~j01c290:wE?93:m12c=83;pD<8<;|l63c<728qC=;=4}o7;4?6=9rB::>5rn4:2>5<6sA;=?6sa59094?7|@8<87p`:8283>4}O9?90qc;74;295~N6>:1vb86::182M71;2we95850;3xL4043td>4:4?:0yK535<ug?347>51zJ226=zf<226=4>{I357>{i=1k1<7?tH040?xh20k0;6<uG1718yk3?k3:1=vF>629~j0>c290:wE?93:m1=c=83;pD<8<;|l6<c<728qC=;=4}o7:4?6=9rB::>5rn4;2>5<6sA;=?6sa58094?7|@8<87p`:9283>4}O9?90qc;64;295~N6>:1vb87::182M71;2we94850;3xL4043td>5:4?:0yK535<ug?247>51zJ226=zf<326=4>{I357>{i=0k1<7?tH040?xh21k0;6<uG1718yk3>k3:1=vF>629~j0?c290:wE?93:m1<c=83;pD<8<;|l6=c<728qC=;=4}o7b4?6=9rB::>5rn4c2>5<6sA;=?6sa5`094?7|@8<87p`:a283>4}O9?90qc;n4;295~N6>:1vb8o::182M71;2we9l850;3xL4043td>m:4?:0yK535<ug?j47>51zJ226=zf<k26=4>{I357>{i=hk1<7?tH040?xh2ik0;6<uG1718yk3fk3:1=vF>629~j0gc290:wE?93:m1dc=83;pD<8<;|l6ec<728qC=;=4}o7a4?6=9rB::>5rn4`2>5<6sA;=?6sr}|BCG~17j3ioi;<=0bCDG}7uIJ[wpNO
\ No newline at end of file
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.6e
$30044<,[o}e~g`n;"2*736(-30<=>?0123416<89:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?012345679=1:87GAPTV9EABUI!;86='>4:37>LHW]]0JHI\M(0194,77380BB][[:vgb,5<7!8:0=7GAPTV9s`d/83:"=?5<2;KMTPR=L@K#?<4?)00877<NFY__6IGM(2394,743:81EC^ZT;fjjd.493:"=>5<2;KMTPR=l`di$>?50(30?64=G\^[YY4KO@*05?6.9:18>7AZTQWW>AIE :;1<$?:;209KPRW]]0ocxzn(2394,723:81CXZ_UU8gkpre :;1<$?>;58JJUSS2MC[M%=50(32?1<NFY__6IG_B)194,773=0BB][[:VGB,6<7!8:087GAPTV9S@D/;3:"=?5;:NWWTPR=LFZJ$>4?)0080?IR\Y__6IA_B)194,`<>zfs88zigf6;0(46:231EC^ZT;cg`wg/03:"=?56:HLSQQ<flmxi$54?)99B@ATF 9#37LJKR@*2-<=FLMXJ$<>&9:CG@WG/98#27LJKR@*26,?<IMNYM%?<)c9B@ATF 891<$64AEFQE-4.02KOH_O'3(:8EABUI!>"46OKDSC+1,><IMNYM%8&8:CG@WG/? 20MIJ]A):*<>GCL[K#5$64AEFQF-6.02KOH_L'1(;8EABUJ!;;%45NDEPA,47.12KOH_L'13+:?DBCZK":?$l4AEFQF-7429#37LJKRC*1-==FLMXI$>'7;@FGVG.3!11JHI\M(4+;?DBCZK"=%55NDEPA,2/?3HNO^O&7)99B@ATE 0#87LBC8:@VWZOINF80OH?=;BJFGNYKAJOE_HQ[YQG7?FJL8?1H@F?7079@HN408<1H@F<W8:AOO7^609?0OAE6059@HNG23JF@M<94CMIB5A403JF@M<J;7:AOOD7C0=1H@FL:;BNHF43<KEAH=85LLJF21>EKCM\h7NBDDW]GMSOCM<1H@FHW8:AOOC^60930OBCBIUVF@42<KFXNSJKAESCWMJHXAGLD;6M]E@VF@f=CI]KT[DJ[H^C`?AGSIV]BHYFPB79GMD.7!?1OEL&>)69GMD.68 =0HDO'10+4?AOF 88";6JFA)30-2=CAH":8$94DHC+50/03MCJ$<8&7:FJE-70!>1OEL&>8(58@LG/90#=7IGN(3+4?AOF ;:";6JFA)02-2=CAH"9>$94DHC+66/03MCJ$?:&7:FJE-42!>1OEL&=6(58@LG/:>#<7IGN(3:*3>BNI!82%;5KI@*0-2=CAH"8<$94DHC+74/>3MCJ$>?50(48@LG/< <0HDO'5(48@LG/> <0HDO'7(48@LG/0 <0HDO'9(48@LD/8 <0HDL'1(58@LD/99#<7IGM(03*3>BNJ!;9%:5KIC*27,1<L@H#=9'8;EKA,43.?2NBN%?9)69GMG.6? =0HDL'19+4?AOE 83":6JFB)0*3>BNJ!8;%:5KIC*15,1<L@H#>?'8;EKA,75.?2NBN%<;)69GMG.5= =0HDL'27+4?AOE ;=";6JFB)0;-2=CAK"95$84DH@+7,1<L@H#?='8;EKA,67.12NBN%=>:1+5?AOE =#=7IGM(4+5?AOE ?#=7IGM(6+5?AOE 1#=7IGM(8+4?AOWI!:";6JFP@*2-2=CAYK#>$94DHRB,6/>3MC[M%=50(58@LVE 9#<7IG_B)3*3>BNXK"9%:5KIQ@+7,?<L@ZI$>4?)79GKD.7!?1OCL&>)69GKD.68 =0HBO'10+4?AIF 88";6J@A)30-2=CGH":8$94DNC+50/03MEJ$<8&7:FLE-70!>1OCL&>8(58@JG/90#=7IAN(3+4?AIF ;:";6J@A)02-2=CGH"9>$94DNC+66/03MEJ$?:&7:FLE-42!>1OCL&=6(58@JG/:>#<7IAN(3:*3>BHI!82%;5KO@*0-2=CGH"8<$94DNC+74/>3MEJ$>?50(48@JG/< <0HBO'5(48@JG/> <0HBO'7(48@JG/0 <0HBO'9(58@JGXZLM=7IAM(1+5?AIE 8#<7IAM(02*3>BHJ!;:%:5KOC*26,1<LFH#=>'8;EMA,42.?2NDN%?:)69GKG.6> =0HBL'16+4?AIE 82";6J@B)3:-3=CGK"9%:5KOC*14,1<LFH#><'8;EMA,74.?2NDN%<<)69GKG.5< =0HBL'24+4?AIE ;<";6J@B)04-2=CGK"94$94DN@+6</13MEI$>'8;EMA,66.?2NDN%=>)89GKG.493:":6J@B)6*2>BHJ!?":6J@B)4*2>BHJ!=":6J@B):*2>BHJ!3";6J@B^PFC2=CGYK#<$94DNRB,4/03ME[M%<&7:FLTD.4!01OC]O'3;2*3>BHXK";%:5KOQ@+5,1<LFZI$?'8;EMSF-5.12ND\O&<:1+0?@HF;2OENo5JN^PPPWGJWHh0ICQ]SUPBIZD23OKG_H?4G29DJA><AGC_\R>?8:KMMQVX8820ECG[P^21<>OIA]ZT<>64IOKWTZ6302CEEY^P04:8MKOSXV:=46GAIUR\421<AGC_S=>8;HLJPZ66?2CEEYQ?269JJLRX8:=0ECG[_164?LHN\V:>;6GAIU]322=NF@^T<:94IOKW[5>03@DBXR>67:KMMQY7I>1BBDZP0C58MKOSW9I<7D@FT^2G3>OIA]U;I:5FNHV\4C1<AGC_S<>8;HLJPZ76?2CEEYQ>269JJLRX9:=0ECG[_064?LHN\V;>;6GAIU]222=NF@^T=:94IOKW[4>03@DBXR?67:KMMQY6I>1BBDZP1C58MKOSW8I<7D@FT^3G3>OIA]U:I:5FNHV\5C1<AGC_S?>8;HLJPZ46?2CEEYQ=269JJLRX::=0ECG[_364?LHN\V8>;6GAIU]122=NF@^T>:94IOKW[7>03@DBXR<67:KMMQY5I>1BBDZP2C58MKOSW;I<7D@FT^0G3>OIA]U9I:5FNHV\6C1<AGC_S>>8;HLJPZ56?2CEEYQ<269JJLRX;:=0ECG[_264?LHN\V9>;6GAIU]022=NF@^T?:94IOKW[6>03@DBXR=67:KMMQY4I>1BBDZP3C58MKOSW:I<7D@FT^1G3>OIA]U8I:5FNHV\7C0<AGC_SL84IOKW[G?<AGC_SKGCE79OKDBBL?1GCNEJD69OKBODIEi0Ald`rWgqwliik2Gbbb|Yesqjkk4<F980B<94NDVTKWM33GEEI:5@.52g[I7<X=1[M_Zn;QKM[GSTAMRi7]GA_CWPJDKB>2ZXHB@Ja:PBIG71J^OY:6\JGBGB2>TBOJOI86\\T@68VVRE?2XXXYW_Ed9QWQYWZ@EYEYWPAd9QWQYWZ@EYEYWPB018WLKXKFFGE^G@N^AKAFMf3ZCFSIKYIBG5?VIRZJO37^^NRUCM22=TZ_KGSL94SSTBHZD13Z^JXX];;R[MG1=SQYO<?6[?/yqw[gjlWdofSjkaescwkw)`fh~bzhlbg/lbplpbWkf`S`kb_fgm+sgkam$hy| r`ookjv\8T$ym` }/r4\jjoia}$ym`![RTG\@U(WZ@G:4#|nmb9VW@TX^@YBNAK<;WA@=>PNM^U_U]K9;VGB,5/13^OJ$<'9;VGB,7/13^OJ$>'7;VGB,6<7!?1\IO&?)79TAG.6!?1\IO&=)79TAG.4!11\IO&<:1+a?RTN\LUME_][c:UQMQCXEFNNSLm4WSKWAZKHLLUI=i5WIMKM\(^CJ):%=-][UC"3*4&F[JCB:6V\TMKA3>^T\VMEH:5WSU]UGFd<PVID^HQFNGM5?]beW@nm7Ujg_QpjiScu{`ee==5Wdl]Neoiu^lxxeb`>0:ZgiZKnffx]i}foo18\vr?3hno~l&?)99b`atf 8#37ljkr`*1-==flmxj$>'7;`fgvd.3!11jhi|n(4+;?dbczh"=%55ndepb,2/?3hno~l&7)`9b`atf 10;%55ndepa,5/?3hno~o&>)99b`ate ;#37ljkrc*0-==flmxi$9'7;`fgvg.2!11jhi|m(7+;?dbczk"<%55ndepa,=/f3hno~o&7:1+2<>dkcVgnaRijn^efj`tnkVixx?9;cnh[hcjWnoeS}|fm^uj`qn6j2hggRcjm^efjZvuadU|~l~es]p2c=edbUfi`Qheo]wku773kf`S`kb_fgm[s0X9;i0naePmdo\c`hX~?U: -Vflhl{$FIUM)Mnbh|ntnp#56(6:k1i`fQbel]dakYq>V;'naePmdo\c`hX~?U: CAAE-LLJ@2dl2hggRcjm^efjZp1W8&i`fQbel]dakYq>V;'wnQndepb[roc|a72 nQndepa[roc|a72 nQnlfmqmqnj58&hSlvf_hf\slbs`4>'oRowi^qoescX|pzn1="l_`zj[qwm4;'oRlvtd]pmc:1%iTobcboo]`hn;7$jUoikozlu]geqg:8%iThd}nbmg\sdtiWkb}Snacl<2/gZbn{hhgiRynro]alsYuigmn1="l_dnbfjtf|`eeSig}=.cew*ebzg$hd"kag.gge*ec{Vxi} gggqjdhc'yxdfhm{s.vgg*uuk&c{Sna}er-nahYdg{o$x`~ _be,+)eXnhgb`t3|p`pwek0+kVbjRowi^kg95*dWakxSh`n=1.`[mgtWldi1="l_icp[lhmmj~n~3?,b]kevYjmdUdyy~zt^pfcvYf59&hSeo|_lgn[jssx|~T~hi|_c?2(fYoizUfyuQ`uurvpZtbozUj1="l_icp[hsWf|xzPrdep[g;7$jUcm~Q}efafe86+kVbjR|jgbga95*dWakxS}{a<2/gZnf{Vxxxo3?,b]kevYtgo~nonQfnqww[wc`{Vk6<!mPh`q\wj`smjiTcxzuu]qabuXj4:'oRgaiu]emicXfhgn1caPcng\bljbWeejhhj#c^kmmqgX~hf6<!mPiokwfZpfd4:'oRgatdpeefcX|pzn1="l_mmb`Zoia}Umeak20-a\i`kX|pzn1?"l_lw{[uowmeceiR}{afgp95*dWyxbaRzvpd?2(fYumhnThh~{h^c>144+kVxnmiQkeqvk[g;29;&hSknd^uj`qnXi499 nQ}e`f\slbs`Vh6??"l_sqw[utng{cuRo2CD.`[wusWyxbcg{y^`>G@*dW{ySywe<QZJF*dW{y~lcPa<2/gZtt|{kfSo3?,b]pmhYdgefbdaa_bjfgn;FDE&hSx}j_c{waZqbi4:'oR{|e^`zp`Ypmk7; nQzsd]gacgrd}Uomyo20-a\qvcXmji6<!mPurg\wj`smji6<!mPwdc\slbs`4;'oRyjb^uj`qn:9%iT{g{e^fftqnXi4?:>!mPwskwaZbbx}bTn0;>2-a\swosmVgdhhQn=VPJP@YAA[Y_ nQxrhvf[hicmVh6[_G[E^DJVVR+kV}yeykPwhfwlZg:;;&hSz|ftd]tmaroWk78>!mPxegumfcaidcgu0}asvbj3{6<2hggRcjm^efjZp1W8Usy?<;cnh[hcjW`d{yyQmlnah51=edbUfi`Q`uurvpZdkgja?7nbda59`hnd03mcem%>&7:fjjd.6!11oeco'11+;?aoii!;:%55kioc+57/?3mcem%?<)99gmkg/9=#37igaa)36-==cagk#=;'7;ekme-70!11oeco'19+;?aoii!;2%:5kioc+6,><l`dj$?>&8:fjjd.59 20hd`n(30*<>bnfh"9?$64dhlb,72.02nbbl&=5(:8`lhf ;<"46jfn`*13,><l`dj$?6&8:fjjd.51 =0hd`n(2+;?aoii!9;%55kioc+74/f3mcem%=>:1+4?aoii!>";6jfn`*6-2=cagk#:$94dhlb,2/03mcem%6&7:fjjd.>!>1oecl'0(58`lhe 8#37igab)33-==cagh#=<'7;ekmf-75!11oecl'12+;?aoij!;?%55kio`+50/?3mcen%?9)99gmkd/9>#37igab)3;-==cagh#=4'8;ekmf-4.02nbbo&=0(:8`lhe ;;"46jfnc*16,><l`di$?=&8:fjjg.5< 20hd`m(37*<>bnfk"9:$64dhla,71.02nbbo&=8(:8`lhe ;3";6jfnc*0-==cagh#?='7;ekmf-56!h1oecl'3083-2=cagh#8$94dhla,0/03mcen%8&7:fjjg.0!>1oecl'8(58`lhe 0#37iazt`*3-==cg|~j$<'6;emvpd.68 30hb{{a)32-<=cg|~j$<<&9:flqqg/9:#27iazt`*20,?<lfm%?:)89gkprf 8<"56j`uuc+52/>3me~xl&>8(;8`jssi!;2%55kotvb,7/>3me~xl&=0(;8`jssi!8:%45kotvb,74.12ndyyo'22+:?air|h"98$74dnwwe-42!01ocxzn(34*=>bh}}k#>:'6;emvpd.50 30hb{{a)0:-==cg|~j$>'6;emvpd.48 30hb{{a)12-g=cg|~j$>?50(:8`jssi!>"46j`uuc+1,><lfm%8&8:flqqg/? 20hb{{a):*<>bh}}k#5$64dnwwf-6.02ndyyl'1(;8`jssj!;;%45kotva,47.12ndyyl'13+:?air|k":?$74dnwwf-73!01ocxzm(07*=>bh}}h#=;'6;emvpg.6? 30hb{{b)3;-<=cg|~i$<7&8:flqqd/: 30hb{{b)03-<=cg|~i$??&9:flqqd/:;#27iaztc*17,?<lfn%<;)89gkpre ;?"56j`uu`+63/>3me~xo&=7(;8`jssj!83%45kotva,7?.02ndyyl'3(;8`jssj!9;%45kotva,67.j2ndyyl'3083-==cg|~i$9'7;emvpg.2!11ocxzm(7+;?air|k"<%55kotva,=/?3me~xo&6)99mcfdraen=7zkn(1+;?rcf 90;%;5xec*3-==pmk";6='r@Ar1=7=GHq;2=7H54;3xW1`=9>21=995120ga<e=:0niiv`>7782?k70?3<0(<9;:04e?xU3l3;<47?;7;306ac>k382hn?4S01f>77b290:??jj9b81=a`53Z>o6??j:18277bb1j095ih;;e3:5?6=93;p_9h516:9511=9:8oi4m528faa>pS9<=1<7?51;;;V2a28=36<:8:011``?d2;3onh5+1739516<^8=>6?uz15395>s6<;0;7p*>48821>d6180;64853;;;M72n2.:9i4>909Y72<?s<0::7756;34>d<c2l0v(<9<:0;1?!5>28387):j:0;7?l46n3:1(<:m:303?k73i3:07d?71;29 42e28297c?;a;28?l7?83:1(<:m:0:1?k73i3;07d?8f;29 42e28297c?;a;08?l70m3:1(<:m:0:1?k73i3907d?8d;29 42e28297c?;a;68?l70k3:1(<:m:0:1?k73i3?07d?8b;29 42e28297c?;a;48?l70i3:1(<:m:0:1?k73i3=07d?89;29 42e28297c?;a;:8?l7e;3:1(<:m:0`7?k73i3:07d?m2;29 42e28h?7c?;a;38?l7e83:1(<:m:0`7?k73i3807d?nf;29 42e28h?7c?;a;18?l7fm3:1(<:m:0`7?k73i3>07d?nd;29 42e28h?7c?;a;78?l7fk3:1(<:m:0`7?k73i3<07d?nb;29 42e28h?7c?;a;58?l7fi3:1(<:m:0`7?k73i3207d?n9;29 42e28h?7c?;a;;8?l7f03:1(<:m:0`7?k73i3k07d?n7;29 42e28h?7c?;a;`8?l7f=3:1(<:m:0`7?k73i3i07d?n4;29 42e28h?7c?;a;f8?l7f;3:1(<:m:0`7?k73i3o07d?n2;29 42e28h?7c?;a;d8?l7f93:1(<:m:0`7?k73i3;;76g>a183>!73j3;i86`>4`825>=n90l1<7*>4c82f1=i9=k1=?54i0;f>5<#9=h1=o:4n06b>45<3`;2h7>5$06a>4d33g;?m7?;;:k2=f<72-;?n7?m4:l20d<6=21b=oo50;&20g<6j=1e=9o51798m4d>290/=9l51c68j42f28=07d?m8;29 42e28h?7c?;a;3;?>o6j>0;6)?;b;3a0>h6<h0:565f1c494?"6<k0:n95a15c95d=<a8h>6=4+15`95g2<f8>j6<l4;h3a5?6=,8>i6<l;;o37e?7d32c:m;4?:%37f?7e<2d:8l4>d:9j5<d=83.:8o4>b59m51g=9l10e<7n:18'51d=9k>0b<:n:0d8?l4593:1(<:m:301?k73i3:07d?7b;29 42e282h7c?;a;28?l7?i3:1(<:m:0:`?k73i3;07d?79;29 42e282h7c?;a;08?l7?03:1(<:m:0:`?k73i3907d?77;29 42e282h7c?;a;68?l7?>3:1(<:m:0:`?k73i3?07d?75;29 42e282h7c?;a;48?l7?<3:1(<:m:0:`?k73i3=07d?73;29 42e282h7c?;a;:8?l7c<3:1(<:m:0f6?k73i3:07d?k3;29 42e28n>7c?;a;38?l7c93:1(<:m:0f6?k73i3807d?k0;29 42e28n>7c?;a;18?l7dn3:1(<:m:0f6?k73i3>07d?le;29 42e28n>7c?;a;78?l7dl3:1(<:m:0f6?k73i3<07d?lc;29 42e28n>7c?;a;58?l7dj3:1(<:m:0f6?k73i3207d?la;29 42e28n>7c?;a;;8?l7d13:1(<:m:0f6?k73i3k07d?l8;29 42e28n>7c?;a;`8?l7d>3:1(<:m:0f6?k73i3i07d?l5;29 42e28n>7c?;a;f8?l7d<3:1(<:m:0f6?k73i3o07d?l3;29 42e28n>7c?;a;d8?l7d:3:1(<:m:0f6?k73i3;;76g>c083>!73j3;o96`>4`825>=n9j:1<7*>4c82`0=i9=k1=?54i0`e>5<#9=h1=i;4n06b>45<3`;ii7>5$06a>4b23g;?m7?;;:k2fa<72-;?n7?k5:l20d<6=21b=il50;&20g<6l<1e=9o51798m4bf290/=9l51e78j42f28=07d?k9;29 42e28n>7c?;a;3;?>o6l10;6)?;b;3g1>h6<h0:565f1e594?"6<k0:h85a15c95d=<a8n=6=4+15`95a3<f8>j6<l4;h3g6?6=,8>i6<j:;o37e?7d32c:o:4?:%37f?7c=2d:8l4>d:9j5ge=83.:8o4>d49m51g=9l10e<lm:18'51d=9m?0b<:n:0d8?l7>03:17d?69;29?j7a=3:1(<:m:0d5?k73i3:07b?i4;29 42e28l=7c?;a;38?j7a:3:1(<:m:0d5?k73i3807b?i1;29 42e28l=7c?;a;18?j7a83:1(<:m:0d5?k73i3>07b?jf;29 42e28l=7c?;a;78?j7bm3:1(<:m:0d5?k73i3<07b?jd;29 42e28l=7c?;a;58?j7bk3:1(<:m:0d5?k73i3207b?jb;29 42e28l=7c?;a;;8?j7bi3:1(<:m:0d5?k73i3k07b?j9;29 42e28l=7c?;a;`8?j7b?3:1(<:m:0d5?k73i3i07b?j6;29 42e28l=7c?;a;f8?j7b=3:1(<:m:0d5?k73i3o07b?j4;29 42e28l=7c?;a;d8?j7b;3:1(<:m:0d5?k73i3;;76a>e383>!73j3;m:6`>4`825>=h9l;1<7*>4c82b3=i9=k1=?54o0g3>5<#9=h1=k84n06b>45<3f;oj7>5$06a>4`13g;?m7?;;:m2``<72-;?n7?i6:l20d<6=21d=km50;&20g<6n?1e=9o51798k4`e290/=9l51g48j42f28=07b?ia;29 42e28l=7c?;a;3;?>i6n00;6)?;b;3e2>h6<h0:565`1g:94?"6<k0:j;5a15c95d=<g8l<6=4+15`95c0<f8>j6<l4;n3e7?6=,8>i6<h9;o37e?7d32e:i54?:%37f?7a>2d:8l4>d:9l5ab=83.:8o4>f79m51g=9l10c<jl:18'51d=9o<0b<:n:0d8?j46>3:1(<:m:334?k73i3:07b<>5;29 42e2;;<7c?;a;38?j46;3:1(<:m:334?k73i3807b<>2;29 42e2;;<7c?;a;18?j4693:1(<:m:334?k73i3>07b<>0;29 42e2;;<7c?;a;78?j47n3:1(<:m:334?k73i3<07b<?e;29 42e2;;<7c?;a;58?j47l3:1(<:m:334?k73i3207b<?c;29 42e2;;<7c?;a;;8?j47j3:1(<:m:334?k73i3k07b<?a;29 42e2;;<7c?;a;`8?j4703:1(<:m:334?k73i3i07b<?7;29 42e2;;<7c?;a;f8?j47>3:1(<:m:334?k73i3o07b<?5;29 42e2;;<7c?;a;d8?j47<3:1(<:m:334?k73i3;;76a=0283>!73j38:;6`>4`825>=h:981<7*>4c8152=i9=k1=?54o322>5<#9=h1><94n06b>45<3f8;<7>5$06a>7703g;?m7?;;:m2bc<72-;?n7<>7:l20d<6=21d><j50;&20g<59>1e=9o51798k77d290/=9l52058j42f28=07b<>b;29 42e2;;<7c?;a;3;?>i59h0;6)?;b;023>h6<h0:565`20;94?"6<k09=:5a15c95d=<g;;36=4+15`9641<f8>j6<l4;n020?6=,8>i6??8;o37e?7d32e9<44?:%37f?46?2d:8l4>d:9l5cc=83.:8o4=169m51g=9l10c<hk:18'51d=:8=0b<:n:0d8?g70:3:1=7>50z&21a<6>91C=:>4H07e?j7303:17pl>7083>4<729q/=8j5f39K526<@8?m7bh>:188yg72m3:1nn4?:1y'50b=9=n0D<9?;I36b>\4?3ip?7:5f;30>46=9=0:=7l58;a957<02td><7<;;o72>72<fkl1<6`j1;38 `c=n91/ik4i0:&e7?4<,o>1>6*i5;08 c0=:2.m;7<4$g:96>"a1380(ko52:&ef?4<,oi1>6*id;08 cc=:2.mj7<4$023>7=#99;1>6*>0381?!77;380(<>;:39'553=:2.:<;4=;%333?4<,8:36?5+11;96>"68h097)??b;08 46d2;1/==j52:&24`<53-;;j7<4$033>7=#98;1>6*>1381?!76;380(<?;:39'543=:2.:=;4=;%323?4<,8;36?5+10;96>"69h097)?>b;08 47d2;1/=<j52:&25`<53-;:j7<4$003>7=#9;;1>6*>2381?!75;380(<<;:39'573=:2.:>;4=;%313?4<,8836?5+13;96>"6:h097)?=b;08 44d2;1/=?j52:&26`<53-;9j7<4$013>7=#9:;1>6*>3381?!74;380(<=;:39'563=:2.:?;4=;%303?4<,8936?5+12;96>"6;h097)?<b;38 45d281/=>j51548 43528?h7)?:3;1;?!72<3937)?:5;15?!72>3;>46*>5882?!72i3;0(<8k:04`?!71m3;=o6g>4d83>>o383:17dkk:188m4362900e9;50;9j51`=831b=8>50;9jaf<722c2;7>5$06a><><f8>j6=54i8494?"6<k0246`>4`82?>o>=3:1(<:m:8:8j42f2;10e4:50;&20g<>02d:8l4<;:k220<72-;?n7?96:l20d<732c::94?:%37f?71>2d:8l4>;:k226<72-;?n7?96:l20d<532c::?4?:%37f?71>2d:8l4<;:ma3?6=,8>i6o64n06b>5=<gk<1<7*>4c8a<>h6<h0:76am4;29 42e2k20b<:n:398kg5=83.:8o4m8:l20d<432ei>7>5$06a>g><f8>j6954oc394?"6<k0i46`>4`86?>ie83:1(<:m:c:8j42f2?10clh50;&20g<e02d:8l48;:mba?6=,8>i6o64n06b>==<ghn1<7*>4c8a<>h6<h0276anc;29 42e2k20b<:n:`98kdd=83.:8o4m8:l20d<e32ej57>5$06a>g><f8>j6n54o`:94?"6<k0i46`>4`8g?>if?3:1(<:m:c:8j42f2l10cl850;&20g<e02d:8l4i;:mb1?6=,8>i6o64n06b>46<3fk?6=4+15`9f==i9=k1=<54o`194?"6<k0i46`>4`826>=hi;0;6)?;b;`;?k73i3;876an1;29 42e2k20b<:n:068?jg7290/=9l5b99m51g=9<10cok50;&20g<e02d:8l4>6:9lfa<72-;?n7l7;o37e?7032eio7>5$06a>g><f8>j6<64;n`a>5<#9=h1n55a15c95<=<gkk1<7*>4c8a<>h6<h0:m65`b883>!73j3h37c?;a;3a?>ie=3:1(<:m:c:8j42f28i07bon:18'51d=j11e=9o51e98k<`=83.:8o4m8:l20d<6m21d5h4?:%37f?d?3g;?m7?i;:k2`?6=,8>i6<k4n06b>5=<a8i1<7*>4c82a>h6<h0:76g>b;29 42e28o0b<:n:398m4g=83.:8o4>e:l20d<432c9:7>5$06a>4c<f8>j6954i3794?"6<k0:i6`>4`86?>o5<3:1(<:m:0g8j42f2?10e?=50;&20g<6m2d:8l48;:k16?6=,8>i6<k4n06b>==<a;;1<7*>4c82a>h6<h0276g=0;29 42e28o0b<:n:`98m4`=83.:8o4>e:l20d<e32c:57>5$06a>4c<f8>j6n54i0:94?"6<k0:i6`>4`8g?>o5k3:1(<:m:3f8j42f2910e?l50;&20g<5l2d:8l4>;:k1e?6=,8>i6?j4n06b>7=<a;31<7*>4c81`>h6<h0876g<5;29 42e2;n0b<:n:598m62=83.:8o4=d:l20d<232c8?7>5$06a>7b<f8>j6;54i2094?"6<k09h6`>4`84?>o493:1(<:m:3f8j42f2110e>>50;&20g<5l2d:8l46;:k1b?6=,8>i6?j4n06b>d=<a;o1<7*>4c81`>h6<h0i76g=8;29 42e2;n0b<:n:b98m71=83.:8o4=d:l20d<c32c3o7>5$06a>=b<f8>j6=54i9`94?"6<k03h6`>4`82?>o?13:1(<:m:9f8j42f2;10e5650;&20g<?l2d:8l4<;:k;3?6=,8>i65j4n06b>1=<a1<1<7*>4c8;`>h6<h0>76g75;29 42e21n0b<:n:798m=2=83.:8o47d:l20d<032c3?7>5$06a>=b<f8>j6554i9094?"6<k03h6`>4`8:?>o?93:1(<:m:9f8j42f2h10e5>50;&20g<?l2d:8l4m;:k4a?6=,8>i65j4n06b>f=<a>n1<7*>4c8;`>h6<h0o76g8c;29 42e21n0b<:n:d98m2d=83.:8o47d:l20d<a32c<m7>5$06a>=b<f8>j6<>4;h5:>5<#9=h14i5a15c954=<a>21<7*>4c8;`>h6<h0:>65f7683>!73j32o7c?;a;30?>o0>3:1(<:m:9f8j42f28>07d9::18'51d=0m1e=9o51498m<5=83.:8o47d:l20d<6>21b5?4?:%37f?>c3g;?m7?8;:k:5?6=,8>i65j4n06b>4><3`3;6=4+15`9<a=i9=k1=454i9d94?"6<k03h6`>4`82e>=n0l0;6)?;b;:g?k73i3;i76g7a;29 42e21n0b<:n:0a8?l1a290/=9l58e9m51g=9m10e::50;&20g<?l2d:8l4>e:9j36<72-;?n76k;o37e?7a32en97>5$06a>`0<f8>j6=54od694?"6<k0n:6`>4`82?>ib;3:1(<:m:d48j42f2;10ch<50;&20g<b>2d:8l4<;:k:g?6=,8>i64j4n06b>5=<a0h1<7*>4c8:`>h6<h0:76g6a;29 42e20n0b<:n:398m<?=83.:8o46d:l20d<432enm7>5$06a>`d<f8>j6=54od;94?"6<k0nn6`>4`82?>ib03:1(<:m:d`8j42f2;10ch950;&20g<bj2d:8l4<;:mg=?6=,8>i6io4n06b>5=<gm21<7*>4c8ge>h6<h0:76ak6;29 42e2mk0b<:n:398ka3=83.:8o4ka:l20d<432eo87>5$06a>ag<f8>j6954oe194?"6<k0om6`>4`86?>ic:3:1(<:m:ec8j42f2?10ci?50;&20g<ci2d:8l48;:mg4?6=,8>i6io4n06b>==<gjl1<7*>4c8ge>h6<h0276ale;29 42e2mk0b<:n:`98kfb=83.:8o4ka:l20d<e32ehn7>5$06a>ag<f8>j6n54obc94?"6<k0om6`>4`8g?>id13:1(<:m:ec8j42f2l10cn650;&20g<ci2d:8l4i;:m`3?6=,8>i6io4n06b>46<3fi=6=4+15`9`d=i9=k1=<54ob794?"6<k0om6`>4`826>=hk=0;6)?;b;fb?k73i3;876al3;29 42e2mk0b<:n:068?je5290/=9l5d`9m51g=9<10ch>50;&20g<ci2d:8l4>6:9l`c<72-;?n7jn;o37e?7032eoi7>5$06a>ag<f8>j6<64;nfg>5<#9=h1hl5a15c95<=<gmi1<7*>4c8ge>h6<h0:m65`dc83>!73j3nj7c?;a;3a?>ic?3:1(<:m:ec8j42f28i07bml:18'51d=lh1e=9o51e98kf7=83.:8o4ka:l20d<6m21do=4?:%37f?bf3g;?m7?i;:k22d<72-;?n7?9b:l20d<732c::44?:%37f?71j2d:8l4>;:k22=<72-;?n7?9b:l20d<532c:::4?:%37f?71j2d:8l4<;:k5f?6=,8>i6;m4n06b>5=<a?k1<7*>4c85g>h6<h0:76g98;29 42e2?i0b<:n:398m31=83.:8o49c:l20d<432c=:7>5$06a>3e<f8>j6954i7794?"6<k0=o6`>4`86?>o1<3:1(<:m:7a8j42f2?10e;=50;&20g<1k2d:8l48;:k56?6=,8>i6;m4n06b>==<a?;1<7*>4c85g>h6<h0276g90;29 42e2?i0b<:n:`98m0`=83.:8o49c:l20d<e32c>h7>5$06a>3e<f8>j6n54i4a94?"6<k0=o6`>4`8g?>o2j3:1(<:m:7a8j42f2l10e8o50;&20g<1k2d:8l4i;:k6=?6=,8>i6;m4n06b>46<3`?36=4+15`92f=i9=k1=<54i4594?"6<k0=o6`>4`826>=n=?0;6)?;b;4`?k73i3;876g:5;29 42e2?i0b<:n:068?l33290/=9l56b9m51g=9<10e:<50;&20g<1k2d:8l4>6:9j34<72-;?n78l;o37e?7032c<<7>5$06a>3e<f8>j6<64;h4e>5<#9=h1:n5a15c95<=<a?o1<7*>4c85g>h6<h0:m65f6e83>!73j3<h7c?;a;3a?>o113:1(<:m:7a8j42f28i07d;j:18'51d=>j1e=9o51e98m05=83.:8o49c:l20d<6m21b9?4?:%37f?0d3g;?m7?i;:p515=83>p1<9=:06;?872m3oh70?:e;gg?872m3;?j6s|15694?71s4;<=7h>;<36a?4634;>i7<?;<36a?7a34;>i7?6;<36a?7?34;>i7=?;<36a?4a34;>i7<j;<36a?4?34;>i7<8;<36a??034;>i779;<36a??234;>i77;;<36a??d34;>i77m;<36a??f34;>i776;<36a?73m27:9h4>519>50c=9<;0q~?id;296~X6nm16=8k5c19~w4`b2909wS?ie:?21`<d92wx>=750;0xZ76>34;>i7ml;|q151<72;qU><:4=07f>a1<uz8:47>52z\15==:9<o1ho5rs33:>5<5sW8:563>5d8gg>{t:8k1<7<t^33b?872m3no7p}=1c83>7}Y:8h01<;j:eg8yv46k3:1>vP=1b9>50c=lo1v??k:181[46l27:9h4j0:p5c`=838pR<hi;<36a?e53ty9<=4?:3y]656<58?n6n=4}r035?6=:rT9<<5214g9g1=z{;:96=4={_036>;6=l0h96s|21194?4|V;:870?:e;a5?xu58=0;6?uQ2168943b2j=0q~<?5;296~X58<16=8k5c99~w7612909wS<?6:?21`<d12wx>=950;0xZ76034;>i7mn;|q14=<72;qU>=64=07f>fd<uz8;m7>52z\14d=:9<o1oi5rs32a>5<5sW8;n63>5d8`a>{t:9i1<7<t^32`?872m3im7p}=0e83>7}Y:9n01<;j:e28yv47m3:1>vP=0d9>50c=l81v?>i:181[47n27:9h4k2:p646=838pR???;<36a?b43ty9=<4?:3y]647<58?n6i:4}r026?6=:rT9=?5214g9`0=z{;;86=4={_027>;6=l0o:6s|20794?4|V;;>70?:e;f;?xu59?0;6?uQ2048943b2m30q~?kc;296~X6lj16=8k59d9~w4bc2909wS?kd:?21`<>n2wx=h650;0xZ4c?34;>i7on;|q2b6<72;qU=k=4=07f>g3<uz;m;7>52z\2b2=:9<o1n45rs0d;>5<5sW;m463>5d8ae>{t9o31<7<t^0d:?872m3hi7p}>f`83>7}Y9ok01<;j:ca8yv7aj3:1>vP>fc9>50c=jm1v<hl:181[7ak27:9h4me:p5ac=838pR<jj;<36a?g73ty:hk4?:3y]5a`<58?n6l?4}r3f4?6=:rT:i=5214g9e7=z{8o:6=4={_3f5>;6=l0j?6s|1d094?4|V8o970?:e;c7?xu6m:0;6?uQ1d18943b2h?0q~?j4;296~X6m=16=8k5a79~w4c22909wS?j5:?21`<f?2wx=h850;0xZ4c134;>i7o7;|q2a2<72;qU=h94=07f>d?<uz;n57>52z\2a<=:9<o1mo5rs0gb>5<5sW;nm63>5d8bg>{t9lh1<7<t^0ga?872m3ko7p}>eb83>7}Y9li01<;j:`g8yv7bl3:1>vP>ee9>50c=io1v<kj:181[7bm27:9h4m0:p5``=838pR<ki;<36a?d63ty:j=4?:3y]5c6<58?n6o<4}r3e5?6=:rT:j<5214g9f6=z{8l96=4={_3e6>;6=l0i86s|1g694?4|V8l?70?:e;`5?xu6n<0;6?uQ1g78943b2k=0q~?69;296~X61016=8k5449~w4??2909wS?68:?21`<382wx=ol50;0xZ4de34;>i79<;|q2ff<72;qU=om4=07f>22<uz;h;7>52z\2g2=:9<o1;k5rs0f1>5<5sW;o>63>5d8;e>{t9m<1<7<t^0f5?872m32n7p}>d683>7}Y9m=01<;j:9d8yv7c03:1>vP>d99>50c=191v<j6:181[7c127:9h461:p5ag=838pR<jn;<36a??53ty:ho4?:3y]5ad<58?n64=4}r3a`?6=:rT:ni5214g930=z{8hn6=4={_3aa>;6=l0<:6s|1cd94?4|V8hm70?:e;54?xu6k90;6?uQ1b28943b2>20q~?l1;296~X6k816=8k5789~w4e52909wS?l2:?21`<0i2wx=n=50;0xZ4e434;>i79m;|q2g1<72;qU=n:4=07f>2e<uz;h97>52z\2g0=:9<o1;i5rs0a5>5<5sW;h:63>5d84a>{t9j21<7<t^0a;?872m32;7p}>c883>7}Y9j301<;j:938yv7di3:1>vP>c`9>50c=0;1v<mm:181[7dj27:9h473:p5fe=838pR<ml;<36a?>33ty:oi4?:3y]5fb<58?n65;4}r3`a?6=:rT:oh5214g9<3=z{8im6=4={_3`b>;6=l03;6s|1e294?4|V8n;70?:e;:;?xu6l80;6?uQ1e38943b2130q~?k3;296~X6l:16=8k58c9~w4b32909wS?k4:?21`<?k2wx=5=50;0xZ4>434;>i7=>;|q2<1<72;qU=5:4=07f>64<uz;397>52z\2<0=:9<o1?>5rs0:5>5<5sW;3:63>5d800>{t91=1<7<t^0:4?872m39>7p}>8983>7}Y91201<;j:3;8yv7?13:1>vP>889>50c=:h1v<6n:181[7?i27:9h4=b:p5=d=838pR<6m;<36a?4d3ty9><4?:4y]677<58?n6<8n;<36a?71127:9h4>699>50c=9?=0q~?6a;296~X61h16=8k5539~w4?e2909wS?6b:?21`<2;2wx=l850;0xZ4g134;>i7;j;|q2f4<72;qU=o?4=07f>3?<uz;i97>52z\2f0=:9<o1:i5rs0`5>5<5sW;i:63>5d85a>{t9k=1<7<t^0`4?872m3<m7p}>b983>7}Y9k201<;j:628yv7e13:1>vP>b89>50c=?81v<ln:181[7ei27:9h482:p5<e=838pR<7l;<36a?333ty:5i4?:3y]5<b<58?n68;4}r3:a?6=:rT:5h5214g913=z{83m6=4={_3:b>;6=l0>;6s|1`294?4|V8k;70?:e;7;?xu6i80;6?uQ1`38943b2<30q~?n2;296~X6i;16=8k55`9~w4g42909wS?n3:?21`<2j2wx=l:50;0xZ4g334;>i7;l;|q2e0<72;qU=l;4=07f>0b<uz;j;7>52z\2e2=:9<o19k5rs0c;>5<5sW;j463>5d854>{t9h31<7<t^0c:?872m3<:7p}>a`83>7}Y9hk01<;j:708yv7fj3:1>vP>ac9>50c=>:1v<ol:181[7fk27:9h494:p5db=838pR<ok;<36a?023ty:mh4?:3y]5dc<58?n6;84}r3bb?6=:rT:mk5214g922=z{8h;6=4={_3a4>;6=l0=46s|1c094?4|V8h970?:e;4b?xu6j:0;6?uQ1c18943b2?h0q~?89;296~X6?016=8k5239~w41f2909wS?8a:?21`<5;2wx=:l50;0xZ41e34;>i7<;;|q23f<72;qU=:m4=07f>73<uz;<h7>52z\23a=:9<o1>;5rs05f>5<5sW;<i63>5d82e>{t9>l1<7<t^05e?872m3;i7p}>8183>7}Y91:01<;j:0a8yv7?93:1>vP>809>50c=9m1v??i:186[46n27:9h4>649>50c=9?>01<;j:040?872m3;=>6srn041>5<6sA;>j6sa17194?7|@8?m7p`>6583>4}O9<l0qc?95;295~N6=o1vb<89:182M72n2we=;950;3xL43a3td::54?:0yK50`<ug;=57>51zJ21c=zf8<j6=4>{I36b>{i9?h1<7?tH07e?xh6>j0;6<uG14d8yk71l3:1=vF>5g9~j40b290:wE?:f:m53`=83;pD<;i;|l235<728qC=8h4}o345?6=9rB:9k5rn051>5<6sA;>j6sa16194?7|@8?m7p`>7583>4}O9<l0qc?85;295~N6=o1vb<99:182M72n2we=:950;3xL43a3td:;54?:0yK50`<ug;<57>51zJ21c=zf8=j6=4>{I36b>{i9>h1<7?tH07e?xh6?j0;6<uG14d8yk70l3:1=vF>5g9~j41b290:wE?:f:m52`=83;pD<;i;|l2<5<728qC=8h4}o3;5?6=9rB:9k5rn0:1>5<6sA;>j6sa19194?7|@8?m7p`>8583>4}O9<l0qc?75;295~N6=o1vb<69:182M72n2we=5950;3xL43a3td:454?:0yK50`<ug;357>51zJ21c=zf82j6=4>{I36b>{i91h1<7?tH07e?xh60j0;6<uG14d8yk7?l3:1=vF>5g9~j4>b290:wE?:f:m5=`=83;pD<;i;|l2=5<728qC=8h4}o3:5?6=9rB:9k5rn0;1>5<6sA;>j6sa18194?7|@8?m7p`>9583>4}O9<l0qc?65;295~N6=o1vb<79:182M72n2we=4950;3xL43a3td:554?:0yK50`<ug;257>51zJ21c=zf83j6=4>{I36b>{i90h1<7?tH07e?xh61j0;6<uG14d8yk7>l3:1=vF>5g9~j4?b290:wE?:f:m5<`=83;pD<;i;|l2e5<728qC=8h4}o3b5?6=9rB:9k5rn0c1>5<6sA;>j6sa1`194?7|@8?m7p`>a583>4}O9<l0qc?n5;295~N6=o1vb<o9:182M72n2we=l950;3xL43a3td:m54?:0yK50`<ug;j57>51zJ21c=zf8kj6=4>{I36b>{i9hh1<7?tH07e?xh6ij0;6<uG14d8yk7fl3:1=vF>5g9~j4gb290:wE?:f:m5d`=83;pD<;i;|l2f5<728qC=8h4}o3a5?6=9rB:9k5rn0`1>5<6sA;>j6sa1c194?7|@8?m7p`>b583>4}O9<l0qc?m5;295~N6=o1vb<l9:182M72n2we=o950;3xL43a3td:n54?:0yK50`<ug;i57>51zJ21c=zf8hj6=4>{I36b>{i9kh1<7?tH07e?xh6jj0;6<uG14d8yk7el3:1=vF>5g9~j4db290:wE?:f:m5g`=83;pD<;i;|l2g5<728qC=8h4}o3`5?6=9rB:9k5rn0a1>5<6sA;>j6sa1b194?7|@8?m7p`>c583>4}O9<l0qc?l5;295~N6=o1vb<m9:182M72n2we=n950;3xL43a3td:o54?:0yK50`<ug;h57>51zJ21c=zf8ij6=4>{I36b>{i9jh1<7?tH07e?xh6kj0;6<uG14d8yk7dl3:1=vF>5g9~j4eb290:wE?:f:m5f`=83;pD<;i;|l2`5<728qC=8h4}o3g5?6=9rB:9k5rn0f1>5<6sA;>j6sa1e194?7|@8?m7p`>d583>4}O9<l0qc?k5;295~N6=o1vb<j9:182M72n2we=i950;3xL43a3td:h54?:0yK50`<ug;o57>51zJ21c=zf8nj6=4>{I36b>{i9mh1<7?tH07e?xh6lj0;6<uG14d8yk7cl3:1=vF>5g9~j4bb290:wE?:f:m5a`=83;pD<;i;|l2a5<728qC=8h4}o3f5?6=9rB:9k5rn0g1>5<6sA;>j6sa1d194?7|@8?m7p`>e583>4}O9<l0qc?j5;295~N6=o1vb<k9:182M72n2we=h950;3xL43a3td:i54?:0yK50`<ug;n57>51zJ21c=zf8oj6=4>{I36b>{i9lh1<7?tH07e?xh6mj0;6<uG14d8yk7bl3:1=vF>5g9~j4cb290:wE?:f:m5``=83;pD<;i;|l2b5<728qC=8h4}o3e5?6=9rB:9k5rn0d1>5<6sA;>j6sa1g194?7|@8?m7p`>f583>4}O9<l0qc?i5;295~N6=o1vb<h9:182M72n2we=k950;3xL43a3td:j54?:0yK50`<ug;m57>51zJ21c=zutwKLNu=938:3g258=:vLMLt0|BCT~{GH
\ No newline at end of file
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.6e
$3ga44<,[o}e~g`n;"2*736(-30<=>?0123416<89:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?012345679<1:>54FNQWW>aoii!;9;7>&16926=<H]]Z^X7j`uuc+571=8 ;?7<:5IORVP?GCL[K#=>4?)06851<NFY__6LJKRC*27?6.991:6D@_UU8tad.729#:<6?5IORVP?qbj!:1<$?=;209MKVR\3NBM%=>:1+26>552@D[YY4KIC*05?6.9:18>7GAPTV9`lhe :;1<$?<;209KPRW]]0OCL&<1;2*56=4:3E^X][[:EMA,67=8 ;>7><5OTVSQQ<cg|~i$>?50(32?1<NFY__6IG_A)194,763=0BB][[:EKSF-5=8 ;;794FNQWW>RCF :0;%<>44;KMTPR=_LH#?7>&1397>JSSX\^1HB^N(283-44<<3E^X][[:EMSF-5=8 l0:~bw44vecb2?<$8:>695IORVP?gcl{k#:7>&139:>LHW]]0jhi|m(983-==FLMXJ$='7;@FGVD.6!01JHI\N(02*=>GCL[K#=<'6;@FGVD.6: 30MIJ]A)30-g=FLMXJ$<=50(:8EABUI!8"46OKDSC+7,><IMNYM%:&8:CG@WG/= 20MIJ]A)4*<>GCL[K#;$64AEFQE->.02KOH_O'9(:8EABUJ!:"46OKDS@+5,?<IMNYN%??)89B@ATE 8;"56OKDS@+57/>3HNO^O&>3(`8EABUJ!;86='7;@FGVG.5!11JHI\M(2+;?DBCZK"?%55NDEPA,0/?3HNO^O&9)99B@ATE >#37LJKRC*;-==FLMXI$4'<;@NO<>DR[VCEJB<4CD31?FNBKBUGENKASD]W]UC33JF@<;5LLJ3;43=DDB8<<85LLJ0[<>EKC;R:4=;4CMI:41=DDBK>7NBDA058GIMF9M8<7NBDA0F73>EKCH;O495LLJ@6?FJLJ8?0OAEL149@HNB6=2IGGIXl;BNH@SYCA_COI85LLJD[<>EKCOR:4=74CNONMQRBL8>0OB\J_FGMAWGSAFDTECH@7:AQADRBLj1OMYOPWHFWLZGd3MK_MRYFDUJ\F3=CAH";%;5KI@*2-2=CAH":<$94DHC+54/03MCJ$<<&7:FJE-74!>1OEL&>4(58@LG/9<#<7IGN(04*3>BNI!;<%:5KI@*2<,1<L@K#=4'9;EKB,7/03MCJ$?>&7:FJE-46!>1OEL&=2(58@LG/::#<7IGN(36*3>BNI!8>%:5KI@*12,1<L@K#>:'8;EKB,7>.?2NBM%<6)79GMD.4!>1OEL&<0(58@LG/;8#27IGN(2394,0<L@K#8$84DHC+1,0<L@K#:$84DHC+3,0<L@K#4$84DHC+=,0<L@H#<$84DH@+5,1<L@H#=='8;EKA,47.?2NBN%?=)69GMG.6; =0HDL'15+4?AOE 8?";6JFB)35-2=CAK":;$94DH@+5=/03MCI$<7&6:FJF-4.?2NBN%<?)69GMG.59 =0HDL'23+4?AOE ;9";6JFB)07-2=CAK"99$94DH@+63/03MCI$?9&7:FJF-4?!>1OEO&=9(48@LD/; =0HDL'31+4?AOE :;"56JFB)12>5/13MCI$9'9;EKA,0/13MCI$;'9;EKA,2/13MCI$5'9;EKA,</03MC[M%>&7:FJTD.6!>1OE]O'2(58@LVF :#27IG_A)194,1<L@ZI$='8;EKSF-7.?2NB\O&=)69GMUD/; 30HD^M(283-3=CGH";%;5KO@*2-2=CGH":<$94DNC+54/03MEJ$<<&7:FLE-74!>1OCL&>4(58@JG/9<#<7IAN(04*3>BHI!;<%:5KO@*2<,1<LFK#=4'9;EMB,7/03MEJ$?>&7:FLE-46!>1OCL&=2(58@JG/::#<7IAN(36*3>BHI!8>%:5KO@*12,1<LFK#>:'8;EMB,7>.?2NDM%<6)79GKD.4!>1OCL&<0(58@JG/;8#27IAN(2394,0<LFK#8$84DNC+1,0<LFK#:$84DNC+3,0<LFK#4$84DNC+=,1<LFKT^HI9;EMA,5/13MEI$<'8;EMA,46.?2NDN%?>)69GKG.6: =0HBL'12+4?AIE 8>";6J@B)36-2=CGK"::$94DN@+52/03MEI$<6&7:FLF-7>!?1OCO&=)69GKG.58 =0HBL'20+4?AIE ;8";6J@B)00-2=CGK"98$94DN@+60/03MEI$?8&7:FLF-40!>1OCO&=8(58@JD/:0#=7IAM(2+4?AIE ::";6J@B)12-<=CGK"8=7>&6:FLF-2.>2NDN%;&6:FLF-0.>2NDN%9&6:FLF->.>2NDN%7&7:FLFZTBO>1OC]O'0(58@JVF 8#<7IA_A)0*3>BHXH"8%45KOQC+7?6.?2ND\O&?)69GKUD/9 =0HB^M(3+4?AIWJ!9"56J@PC*0>5/43LDJ?6KABc9FJZTT\[KFSLl4EO]QWQTFEVH>7KOCSD38C6=@FM20ECG[P^23<>OIA]ZT<<64IOKWTZ6502CEEY^P02:8MKOSXV:?46GAIUR\40><AGC_\R>98:KMMQVX8>=0ECG[_124?LHN\V::;6GAIU]362=NF@^T<>94IOKW[5203@DBXR>:7:KMMQY7>>1BBDZP0658MKOSW92<7D@FT^2:3>OIA]U;M:5FNHV\4G1<AGC_S=M8;HLJPZ6C?2CEEYQ?E69JJLRX8O=0ECG[_024?LHN\V;:;6GAIU]262=NF@^T=>94IOKW[4203@DBXR?:7:KMMQY6>>1BBDZP1658MKOSW82<7D@FT^3:3>OIA]U:M:5FNHV\5G1<AGC_S<M8;HLJPZ7C?2CEEYQ>E69JJLRX9O=0ECG[_324?LHN\V8:;6GAIU]162=NF@^T>>94IOKW[7203@DBXR<:7:KMMQY5>>1BBDZP2658MKOSW;2<7D@FT^0:3>OIA]U9M:5FNHV\6G1<AGC_S?M8;HLJPZ4C?2CEEYQ=E69JJLRX:O=0ECG[_224?LHN\V9:;6GAIU]062=NF@^T?>94IOKW[6203@DBXR=:7:KMMQY4>>1BBDZP3658MKOSW:2<7D@FT^1:3>OIA]U8M:5FNHV\7G1<AGC_S>M8;HLJPZ5C?2CEEYQ<E69JJLRX;O<0ECG[_@48MKOSWK30ECG[_GKOA3=KGHNNH;5COBIF@2=KGNCHMAm4M`hlvScu{`eeo6CfnnpUawungg80B=<4N058J@RPG[A?7CAAE69L*16cWE;0\95_ASVb?UOIWK_XEIVm;QKM[GSTFHGN:6^\DNLFe>TFEK;=NZK]6:PFCFCF>2XNKNKM4:PPPD2<ZZ^I;6\\TU[SA`=U[]U[^DA]IU[\E`=U[]U[^DA]IU[\F45<[@GTOBBCIRKLJZEOMJAj7^GB_EGUMFC13ZE^^NK7;RRBVQGI>>1X^[OC_@58WWPFDVH=7^ZNTTQ7?V_IK=1_U]K83:W3+}usWkf`S`kb_fgmawgsg{%lblzfvd`nc+hf|`|nSobd_lgn[bci'kgei lsup,vdkkgfzP<P }al,q+v0Xffceey }al-WVPCXLY$[^DC>8/pbi25<]9%syQmlj]nahY`mgoymya}/flbplpbjdm%blzfvd]ahnYjmdUlic!yamkg*fusz&xjaaa`pZ3^*wgj&{%x:R``iokw*wgj']X^IRJ_.QPJI4>)zhg<?6[?/yqw[gjlWdofSjkaescwkw)`fh~bzhlbg/lbplpbWkf`S`kb_fgm+sgkam$hy| r`ookjv\:T$ym` }/r4\jjoia}$ym`![RTG\@U(WZ@G:4#|nm618Q5){}Ui`fQbel]dakcui}ey#j`nthtffha)fh~bzhQmlj]nahY`mg%}magk.bqwv*tfeeed|V=R.scn*w)t>Vddecg{.scn+QTRMVN["]\FM0:-vdkd3\YN^RXFSH@OA6=QKJ30ZDKX_U[SA3=PMH";%;5XE@*2-3=PMH"9%;5XE@*0-==PMH"86='9;VGA,5/13^OI$<'9;VGA,7/13^OI$>'7;VGA,6<7!k1\^DZJ_GKQWQe<_[C_IRC@DD]Bg>QUA]OTABJJ_C3g?]OKAGR&TIL/0/3#WQSE(9$:,L]LIH48\VRKAK=0T^ZPGOF4?]USW_IHn6VPCNPF[LHAG?1ShoQFdg9[`mYWz`g]i}foo33?]bjWDkacXjrrklj46<PmgTAd``rWgqwlii;2Rxx55ndepb,5/?3hno~l&>)99b`atf ;#37ljkr`*0-==flmxj$9'7;`fgvd.2!11jhi|n(7+b?dbczh"=6='7;`fgvg.7!11jhi|m(0+;?dbczk"9%55ndepa,6/?3hno~o&;)99b`ate <#37ljkrc*5-==flmxi$:'7;`fgvg.?!h1jhi|m(983-4><jeaTahcPgdl\c`hbz`iTo~z}199ahnYjmdUlicQrho\slbs`V;:46lck^ofiZabfVzye`Qxievk[77?3kf`S`kb_fgm[utneV}bhyfP30:8fimXelgTkh`Ppskn[roc|aU?=i5mlj]nahY`mgU{~dcPwscst`tX{?U:=i5mlj]nahY`mgU{~dcPwscst`tX{?U9=i5mlj]nahY`mgU{~dcPwscst`tX{?U8=i5mlj]nahY`mgU{~dcPwscst`tX{?U?j6lck^ofiZabfV~d|<>4bmi\i`kXoldTz;Q>2b9ahnYjmdUlicQy6^3/$]okagr+OB\J Fgmawgsg{*:?#?>4:`ooZkbeVmnbRx9_0]{wq773kf`S`kb_fgm[s0X:;h0naePmdo\c`hX~?U9 obd_lgn[bciW<T=!@@ND.MKKC3ko1i`fQbel]dakYq>V8'naePmdo\c`hX~?U: vmPaefqeZqnl}b6;!mPaefqfZqnl}b65!mPamelvlroe4;'oRowi^kg[roc|a7? nQnxh]phdpbW}s{i0>#c^c{mZr~xl7: nQmyug\wl|b50&hSnabmnl\gim:8%iThhhnumv\`drf59&hSig|acnf[rgufVhczRm`lm?3(fYcazki`hQxasl\fmpXzhdli0>#c^goegiui}cdbRjfr<-bbv)dm{d%oe!jnf-f`d)dlzU~h||/fdfvkgil&zycgkltr-w`f)tzj%b|Rm`rdq,i`kXkfxn#yc/^ad+**dWokfeaw2sqcqpdh1$jUcm~Qnxh]j`86+kVbjRkaa<2/gZnf{Voen0>#c^jbwZoiblii|20-a\lduXelgTcxzuu]qabuXi4:'oRfns^ofiZir|ySkhs^`>5)eX`hyTaxvPotvsqqYumnyTm0>#c^jbwZkrpVe~x}{{_sgdwZd:8%iTdl}Prde`ad;7$jUcm~Q}efaff86+kVbjR||t`?3(fYoizUyyl20-a\lduX{flinmPiorvpZtbozUj1="l_icp[via|lihSb{{ptv\v`atWk7; nQfnhv\bljbWgkfi0``_bmf[cokmVfdmikk,b]jjlrfWkg1="l_hljpgYqie7; nQfnugqbdebW}s{i0>#c^nleaYnf`~Tjdbj=1.`[hcjW}s{i0<#c^ov|ZvnxlfbbhQ|t`efw86+kVzye`Q{yqg>5)eXzlkoSikti]b944?$jUyiljPddrwlZd:=88'oR|jae]tmaroWh7:>5"l_sgb`Zqnl}bTn0==,b]qwqYwz`eyeywPa<AF(fYu{}U{~da}iu{\f8EB$jUyyQ{yqg>W\HD$jUyy|nm^c>4)eXzz~ym`Qm=1.`[vojWjeg`d}foo]`l`el5HFG nQzsd]a}qcXlk6<!mPurg\f|rbW~oi1="l_tqf[acai|fSio{a<2/gZstmVoho0>#c^wpaZuhn}oho0>#c^ufeZqnl}b6=!mPwd`\slbs`4;'oRy}iug\``vs`Vk6=?6#c^uqmqcXllzdRl2500/gZqua}oTabjj_`?TVLRBWOCY_Y"l_vpjp`YjgmoTn0Y]IUG\BLTT\%iT{g{e^uj`qnXi4;94!mPwskwaZqnl}bTn0==,b]{``pnklljadbv=rrbvqgi>t;87obd_lgn[lhw}}Ui`bmd159ahnYjmdUdyy~zt^`okfm33jf`m95llj`4?aoii!:";6jfn`*2-==cagk#=='6;ekme-778 30hd`n(022-<=cagk#==<&9:fjjd.68:#27igaa)330,?<l`dj$<>:)89gmkg/99<"56jfn`*242/>3mcem%??8(;8`lhf 8:2%55kioc+54/>3mcem%?>0(;8`lhf 8;:%45kioc+544.12nbbl&>12+:?aoii!;:8$74dhlb,472!01oeco'104*=>bnfh":=:'6;ekme-760 30hd`n(03:-==cagk#=?'6;ekme-758 30hd`n(002-<=cagk#=?<&9:fjjd.6::#27igaa)310,?<l`dj$<<:)89gmkg/9;<"56jfn`*262/e3mcem%?=7;2*<>bnfh":?$64dhlb,42.02nbbl&>5(:8`lhf 8<"46jfn`*23,><l`dj$<6&8:fjjd.61 =0hd`n(3+;?aoii!8;%55kioc+64/?3mcem%<=)99gmkg/::#37igaa)07-==cagk#>8'7;ekme-41!11oeco'26+;?aoii!83%55kioc+6</03mcem%=&8:fjjd.48 20hd`n(23*<>bnfh"8>$64dhlb,65.02nbbl&<4(:8`lhf :?"46jfn`*02,><l`dj$>9&8:fjjd.40 20hd`n(2;*3>bnfh"?%55kioc+05/?3mcem%:>)99gmkg/<;#37igaa)60-==cagk#89'7;ekme-22!11oeco'47+;?aoii!><%55kioc+0=/?3mcem%:6)69gmkg/= 20hd`n(42*<>bnfh">=$64dhlb,04.02nbbl&:3(:8`lhf <>"46jfn`*61,><l`dj$88&8:fjjd.2? 20hd`n(4:*<>bnfh">5$94dhlb,3/?3mcem%8?)99gmkg/>8#37igaa)41-==cagk#:>'7;ekme-03!11oeco'64+;?aoii!<=%55kioc+22/?3mcem%87)99gmkg/>0#<7igaa)5*<>bnfh"<<$64dhlb,27.02nbbl&82(:8`lhf >9"46jfn`*40,><l`dj$:;&8:fjjd.0> 20hd`n(65*<>bnfh"<4$64dhlb,2?.?2nbbl&7)99gmkg/09#37igaa):2-==cagk#4?'7;ekme->4!11oeco'85+;?aoii!2>%55kioc+<3/?3mcem%68)99gmkg/01#37igaa)::-2=cagk#5$64dhlb,<6.02nbbl&61(:8`lhf 08"46jfn`*:7,><l`dj$4:&8:fjjd.>= 20hd`n(84*<>bnfh"2;$64dhlb,<>.02nbbl&69(58`lhe 9#<7igab)3*<>bnfk":<$64dhla,47.02nbbo&>2(:8`lhe 89"46jfnc*20,><l`di$<;&8:fjjg.6> 20hd`m(05*<>bnfk":4$64dhla,4?.?2nbbo&=)99gmkd/:9#37igab)02-==cagh#>?'7;ekmf-44!11oecl'25+;?aoij!8>%55kio`+63/?3mcen%<8)99gmkd/:1#37igab)0:-2=cagh#?$64dhla,66.02nbbo&<1(c8`lhe :;1<$94dhla,1/03mcen%;&7:fjjg.1!>1oecl'7(58`lhe 1#<7igab);*<>bh}}k#<$64dnwwe-7.12ndyyo'11+b?air|h":<='n;emvpd.688#j7iazt`*247/f3me~xl&>02+b?air|h":<9'n;emvpd.68<#j7iazt`*243/f3me~xl&>06+b?air|h":<5'n;emvpd.680#27iazt`*25,g<lfm%?>0(c8`jssi!;:=$o4dnwwe-76: k0hb{{a)327,g<lfm%?>4(c8`jssi!;:9$o4dnwwe-76> k0hb{{a)323,g<lfm%?>8(c8`jssi!;:5$74dnwwe-75!h1ocxzn(003-d=cg|~j$<<>)`9gkprf 889%l5kotvb,444!h1ocxzn(007-d=cg|~j$<<:)`9gkprf 88=%l5kotvb,440!j1ocxzn(004>5/>3me~xl&>3(;8`jssi!;?%45kotvb,43.12ndyyo'17+:?air|h":;$74dnwwe-7?!01ocxzn(0;*<>bh}}k#>$74dnwwe-47!01ocxzn(33*=>bh}}k#>?'6;emvpd.5; 30hb{{a)07-<=cg|~j$?;&9:flqqg/:?#27iazt`*13,?<lfm%<7)89gkprf ;3"46j`uuc+7,?<lfm%=?)89gkprf :;"56j`uuc+77/>3me~xl&<3(;8`jssi!9?%45kotvb,63.12ndyyo'37+:?air|h"8;$74dnwwe-5?!01ocxzn(2;*<>bh}}k#8$74dnwwe-27!01ocxzn(53*=>bh}}k#8?'6;emvpd.3; 30hb{{a)67-<=cg|~j$9;&9:flqqg/<?#27iazt`*73,?<lfm%:7)89gkprf =3"46j`uuc+1,?<lfm%;?)89gkprf <;"56j`uuc+17/>3me~xl&:3(;8`jssi!??%45kotvb,03.12ndyyo'57+:?air|h">;$74dnwwe-3?!01ocxzn(4;*<>bh}}k#:$74dnwwe-07!01ocxzn(73*=>bh}}k#:?'6;emvpd.1; 30hb{{a)47-<=cg|~j$;;&9:flqqg/>?#27iazt`*53,?<lfm%87)89gkprf ?3"46j`uuc+3,?<lfm%9?)89gkprf >;"56j`uuc+37/>3me~xl&83(;8`jssi!=?%45kotvb,23.12ndyyo'77+:?air|h"<;$74dnwwe-1?!01ocxzn(6;*<>bh}}k#4$74dnwwe->7!01ocxzn(93*=>bh}}k#4?'6;emvpd.?; 30hb{{a):7-<=cg|~j$5;&9:flqqg/0?#27iazt`*;3,?<lfm%67)89gkprf 13"46j`uuc+=,?<lfm%7?)89gkprf 0;"56j`uuc+=7/>3me~xl&63(;8`jssi!3?%45kotvb,<3.12ndyyo'97+:?air|h"2;$74dnwwe-??!01ocxzn(8;*<>bh}}h#<$64dnwwf-7.12ndyyl'11+:?air|k":=$74dnwwf-75!01ocxzm(01*=>bh}}h#=9'6;emvpg.6= 30hb{{b)35-<=cg|~i$<9&9:flqqd/91#27iaztc*2=,><lfn%<&9:flqqd/:9#27iaztc*15,?<lfn%<=)89gkpre ;9"56j`uu`+61/>3me~xo&=5(;8`jssj!8=%45kotva,71.12ndyyl'29+:?air|k"95$64dnwwf-5.12ndyyl'31+:?air|k"8=$l4dnwwf-5629#37iaztc*7-==cg|~i$8'7;emvpg.1!11ocxzm(6+;?air|k"3%55kotva,</?3gmhnxgcd79tad.7!11|il&?:1+5?rce 9#37zkm(183-xFGx>:87MNw18`9B?2=9rY?j7?8b;373?74:mo2i7?9b62xj41>281e=:o56:&232<6?;1v_9j516`9511=9:8oi4k517`g6>U6;l09i;4?:011``?b28<h=k5\4e81a3<72899hh7j:04`60=c90h1<7?51zQ7b?70j3;?;7?<2eg:a?71j>i0zY?:7;295?7=9<<p_9h516`9511=9:8oi4k517`4g>"6>=0:8=5Y16:96~s6<80:7x?;2;28y!7313;>7o?6b;29502=>3;>:vF>639'50b=90h0V>958z5953<4210:;7l54;g9y!70>3;256*<9;3:g>"3m3;2h6g=e683>!73j38n46`>4`83?>o60;0;6)?;b;3;7>h6<h0;76g>8083>!73j3;3?6`>4`82?>o6090;6)?;b;3;7>h6<h0976g>7g83>!73j3;3?6`>4`80?>o6?l0;6)?;b;3;7>h6<h0?76g>7e83>!73j3;3?6`>4`86?>o6?j0;6)?;b;3;7>h6<h0=76g>c383>!73j3;h?6`>4`83?>o6k80;6)?;b;3`7>h6<h0:76g>c183>!73j3;h?6`>4`81?>o6jo0;6)?;b;3`7>h6<h0876g>bd83>!73j3;h?6`>4`87?>o6jm0;6)?;b;3`7>h6<h0>76g>bb83>!73j3;h?6`>4`85?>o6jk0;6)?;b;3`7>h6<h0<76g>b883>!73j3;h?6`>4`8;?>o6j10;6)?;b;3`7>h6<h0276g>b683>!73j3;h?6`>4`8b?>o6j?0;6)?;b;3`7>h6<h0i76g>b483>!73j3;h?6`>4`8`?>o6j=0;6)?;b;3`7>h6<h0o76g>b283>!73j3;h?6`>4`8f?>o6j;0;6)?;b;3`7>h6<h0m76g>b083>!73j3;h?6`>4`824>=n9k:1<7*>4c82g6=i9=k1=<54i0cf>5<#9=h1=n=4n06b>44<3`;jh7>5$06a>4e43g;?m7?<;:k2ef<72-;?n7?l3:l20d<6<21b=ll50;&20g<6k:1e=9o51498m4gf290/=9l51b18j42f28<07d?n9;29 42e28i87c?;a;34?>o6i10;6)?;b;3`7>h6<h0:465f1`594?"6<k0:o>5a15c95<=<a8k=6=4+15`95f5<f8>j6<o4;h3b1?6=,8>i6<m<;o37e?7e32c9>?4?:%37f?7d;2d:8l4>c:9j677=83.:8o4>c29m51g=9m10e?<?:18'51d=9j90b<:n:0g8?l46n3:1(<:m:0a0?k73i3;m76g=1d83>!73j3;h?6`>4`814>=n:8n1<7*>4c82g6=i9=k1><54i33`>5<#9=h1=n=4n06b>74<3`8:n7>5$06a>4e43g;?m7<<;:k15d<72-;?n7?l3:l20d<5<21b><750;&20g<6k:1e=9o52498m770290/=9l51b18j42f2;<07d<>6;29 42e28i87c?;a;04?>o59<0;6)?;b;3`7>h6<h09465f20694?"6<k0:o>5a15c96<=<a;;86=4+15`95f5<f8>j6?o4;h026?6=,8>i6<m<;o37e?4e32c9=<4?:%37f?7d;2d:8l4=c:9j646=83.:8o4>c29m51g=:m10e?>i:18'51d=9j90b<:n:3g8?l47m3:1(<:m:0a0?k73i38m76g=0b83>!73j3;h?6`>4`804>=n:9h1<7*>4c82g6=i9=k1?<54i32b>5<#9=h1=n=4n06b>64<3`8;57>5$06a>4e43g;?m7=<;:k14=<72-;?n7?l3:l20d<4<21b>=950;&20g<6k:1e=9o53498m761290/=9l51b18j42f2:<07d<?5;29 42e28i87c?;a;14?>o58=0;6)?;b;3`7>h6<h08465f21194?"6<k0:o>5a15c97<=<a;::6=4+15`95f5<f8>j6>o4;h034?6=,8>i6<m<;o37e?5e32c:jk4?:%37f?7d;2d:8l4<c:9j5cc=83.:8o4>c29m51g=;m10e<hk:18'51d=9j90b<:n:2g8?l7ak3:1(<:m:0a0?k73i39m76g>fc83>!73j3;h?6`>4`874>=n9ok1<7*>4c82g6=i9=k18<54i0d:>5<#9=h1=n=4n06b>14<3`;m47>5$06a>4e43g;?m7:<;:k2b3<72-;?n7?l3:l20d<3<21b=k;50;&20g<6k:1e=9o54498m4`3290/=9l51b18j42f2=<07d?i3;29 42e28i87c?;a;64?>o6n;0;6)?;b;3`7>h6<h0?465f1g394?"6<k0:o>5a15c90<=<a8l;6=4+15`95f5<f8>j69o4;h3fb?6=,8>i6<m<;o37e?2e32c:ih4?:%37f?7d;2d:8l4;c:9j5`b=83.:8o4>c29m51g=<m10e<km:18'51d=9j90b<:n:5g8?l7bi3:1(<:m:0a0?k73i3>m76g>e883>!73j3;h?6`>4`864>=n9l21<7*>4c82g6=i9=k19<54i0g4>5<#9=h1=n=4n06b>04<3`;n:7>5$06a>4e43g;?m7;<;:k2a0<72-;?n7?l3:l20d<2<21b=h:50;&20g<6k:1e=9o55498m4c4290/=9l51b18j42f2<<07d?j2;29 42e28i87c?;a;74?>o6m90;6)?;b;3`7>h6<h0>465f1ed94?"6<k0:o>5a15c91<=<a8nn6=4+15`95f5<f8>j68o4;h3g`?6=,8>i6<m<;o37e?3e32c:hn4?:%37f?7d;2d:8l4:c:9j5ad=83.:8o4>c29m51g==m10e<jn:18'51d=9j90b<:n:4g8?l7c13:1(<:m:0a0?k73i3?m76g>d983>!73j3;h?6`>4`854>=n9m=1<7*>4c82g6=i9=k1:<54i0f6>5<#9=h1=n=4n06b>34<3`;o87>5$06a>4e43g;?m78<;:k2`6<72-;?n7?l3:l20d<1<21b=i<50;&20g<6k:1e=9o56498m4b6290/=9l51b18j42f2?<07d?k0;29 42e28i87c?;a;44?>o6ko0;6)?;b;3`7>h6<h0=465f1bg94?"6<k0:o>5a15c92<=<a8io6=4+15`95f5<f8>j6;o4;h3`g?6=,8>i6<m<;o37e?0e32c:ol4?:%37f?7d;2d:8l49c:9j5f?=83.:8o4>c29m51g=>m10e<m7:18'51d=9j90b<:n:7g8?l7d?3:1(<:m:0a0?k73i3<m76g>c783>!73j3;h?6`>4`844>=n9j?1<7*>4c82g6=i9=k1;<54i0a7>5<#9=h1=n=4n06b>24<3`;im7>5$06a>4e43g;?m79<;:k2ec<72-;?n7?l3:l20d<0<21b=l:50;&20g<6k:1e=9o57498m77?290/=9l51b18j42f2><07d<?d;29 42e28i87c?;a;54?>o58;0;6)?;b;3`7>h6<h0<465f1g594?"6<k0:o>5a15c93<=<a8oh6=4+15`95f5<f8>j6:o4;h3f5?6=,8>i6<m<;o37e?1e32c:h;4?:%37f?7d;2d:8l48c:9j5fd=83.:8o4>c29m51g=?m10e<o<:18'51d=9j90b<:n:6g8?l7f:3:1(<:m:0a0?k73i3=m76g=e883>!73j38nm6`>4`83?>o60j0;6)?;b;3;`>h6<h0;76g>8c83>!73j3;3h6`>4`82?>o60h0;6)?;b;3;`>h6<h0976g>8883>!73j3;3h6`>4`80?>o6010;6)?;b;3;`>h6<h0?76g>8683>!73j3;3h6`>4`86?>o60?0;6)?;b;3;`>h6<h0=76g>8483>!73j3;3h6`>4`84?>o60=0;6)?;b;3;`>h6<h0376g=3b83>!73j388h6`>4`83?>o5;k0;6)?;b;00`>h6<h0:76g=3883>!73j388h6`>4`81?>o5;10;6)?;b;00`>h6<h0876g=3683>!73j388h6`>4`87?>o5;?0;6)?;b;00`>h6<h0>76g=3483>!73j388h6`>4`85?>o5;=0;6)?;b;00`>h6<h0<76g=3283>!73j388h6`>4`8;?>o5;;0;6)?;b;00`>h6<h0276g=3083>!73j388h6`>4`8b?>o5;90;6)?;b;00`>h6<h0i76g=2d83>!73j388h6`>4`8`?>o5:m0;6)?;b;00`>h6<h0o76g=2b83>!73j388h6`>4`8f?>o5:k0;6)?;b;00`>h6<h0m76g=2`83>!73j388h6`>4`824>=n:;31<7*>4c817a=i9=k1=<54i30;>5<#9=h1>>j4n06b>44<3`89;7>5$06a>75c3g;?m7?<;:k163<72-;?n7<<d:l20d<6<21b>?;50;&20g<5;m1e=9o51498m724290/=9l522f8j42f28<07d<;2;29 42e2;9o7c?;a;34?>o5<80;6)?;b;00`>h6<h0:465f25294?"6<k09?i5a15c95<=<a;9m6=4+15`966b<f8>j6<o4;h00a?6=,8>i6?=k;o37e?7e32c9?l4?:%37f?44l2d:8l4>c:9j67`=83.:8o4=3e9m51g=9m10e?<;:18'51d=::n0b<:n:0g8?l45;3:1(<:m:31g?k73i3;m76g>a183>>o6i80;66a=6583>!73j38=96`>4`83?>i5>:0;6)?;b;051>h6<h0:76a=6383>!73j38=96`>4`81?>i5>80;6)?;b;051>h6<h0876a=6183>!73j38=96`>4`87?>i5=o0;6)?;b;051>h6<h0>76a=5d83>!73j38=96`>4`85?>i5=m0;6)?;b;051>h6<h0<76a=5c83>!73j38=96`>4`8;?>i5=h0;6)?;b;051>h6<h0276a=5883>!73j38=96`>4`8b?>i5=10;6)?;b;051>h6<h0i76a=5683>!73j38=96`>4`8`?>i5=?0;6)?;b;051>h6<h0o76a=5483>!73j38=96`>4`8f?>i5==0;6)?;b;051>h6<h0m76a=5283>!73j38=96`>4`824>=h:<81<7*>4c8120=i9=k1=<54o373>5<#9=h1>;;4n06b>44<3f8?j7>5$06a>7023g;?m7?<;:m10`<72-;?n7<95:l20d<6<21d>9j50;&20g<5><1e=9o51498k72d290/=9l52778j42f28<07b<;b;29 42e2;<>7c?;a;34?>i5<h0;6)?;b;051>h6<h0:465`25;94?"6<k09:85a15c95<=<g;>36=4+15`9633<f8>j6<o4;n073?6=,8>i6?8:;o37e?7e32e9o94?:%37f?41=2d:8l4>c:9l6f5=83.:8o4=649m51g=9m10c?m=:18'51d=:??0b<:n:0g8?j4d93:1(<:m:346?k73i3;m76a=c183>!73j38=96`>4`814>=h:kl1<7*>4c8120=i9=k1><54o3`f>5<#9=h1>;;4n06b>74<3f8ih7>5$06a>7023g;?m7<<;:m1ff<72-;?n7<95:l20d<5<21d>ol50;&20g<5><1e=9o52498k7d>290/=9l52778j42f2;<07b<m8;29 42e2;<>7c?;a;04?>i5j>0;6)?;b;051>h6<h09465`2c494?"6<k09:85a15c96<=<g;h>6=4+15`9633<f8>j6?o4;n0a0?6=,8>i6?8:;o37e?4e32e9n>4?:%37f?41=2d:8l4=c:9l6g4=83.:8o4=649m51g=:m10c?l>:18'51d=:??0b<:n:3g8?j4e83:1(<:m:346?k73i38m76a=ad83>!73j38=96`>4`804>=h:hn1<7*>4c8120=i9=k1?<54o3c`>5<#9=h1>;;4n06b>64<3f8jn7>5$06a>7023g;?m7=<;:m1ed<72-;?n7<95:l20d<4<21d>l750;&20g<5><1e=9o53498k7g?290/=9l52778j42f2:<07b<n7;29 42e2;<>7c?;a;14?>i5i?0;6)?;b;051>h6<h08465`2`794?"6<k09:85a15c97<=<g;k86=4+15`9633<f8>j6>o4;n0b6?6=,8>i6?8:;o37e?5e32e9m<4?:%37f?41=2d:8l4<c:9l6d6=83.:8o4=649m51g=;m10c?7i:18'51d=:??0b<:n:2g8?j4>m3:1(<:m:346?k73i39m76a=9e83>!73j38=96`>4`874>=h:0i1<7*>4c8120=i9=k18<54o3;a>5<#9=h1>;;4n06b>14<3f82m7>5$06a>7023g;?m7:<;:m1==<72-;?n7<95:l20d<3<21d>4950;&20g<5><1e=9o54498k7?1290/=9l52778j42f2=<07b<65;29 42e2;<>7c?;a;64?>i51=0;6)?;b;051>h6<h0?465`28194?"6<k09:85a15c90<=<g;396=4+15`9633<f8>j69o4;n0:5?6=,8>i6?8:;o37e?2e32e95=4?:%37f?41=2d:8l4;c:9l6=`=83.:8o4=649m51g=<m10c?6k:18'51d=:??0b<:n:5g8?j4?k3:1(<:m:346?k73i3>m76a=8c83>!73j38=96`>4`864>=h:1k1<7*>4c8120=i9=k19<54o3::>5<#9=h1>;;4n06b>04<3f8347>5$06a>7023g;?m7;<;:m1<2<72-;?n7<95:l20d<2<21d>5850;&20g<5><1e=9o55498k7>2290/=9l52778j42f2<<07b<74;29 42e2;<>7c?;a;74?>i50;0;6)?;b;051>h6<h0>465`29394?"6<k09:85a15c91<=<g;2;6=4+15`9633<f8>j68o4;n04b?6=,8>i6?8:;o37e?3e32e9;h4?:%37f?41=2d:8l4:c:9l62b=83.:8o4=649m51g==m10c?9l:18'51d=:??0b<:n:4g8?j40j3:1(<:m:346?k73i3?m76a=7`83>!73j38=96`>4`854>=h:>31<7*>4c8120=i9=k1:<54o354>5<#9=h1>;;4n06b>34<3f8<:7>5$06a>7023g;?m78<;:m130<72-;?n7<95:l20d<1<21d>::50;&20g<5><1e=9o56498k714290/=9l52778j42f2?<07b<82;29 42e2;<>7c?;a;44?>i5?80;6)?;b;051>h6<h0=465`26294?"6<k09:85a15c92<=<g;<m6=4+15`9633<f8>j6;o4;n05a?6=,8>i6?8:;o37e?0e32e9:n4?:%37f?41=2d:8l49c:9l63d=83.:8o4=649m51g=>m10c?8n:18'51d=:??0b<:n:7g8?j4113:1(<:m:346?k73i3<m76a=6983>!73j38=96`>4`844>=h:?=1<7*>4c8120=i9=k1;<54o345>5<#9=h1>;;4n06b>24<3f8>o7>5$06a>7023g;?m79<;:m114<72-;?n7<95:l20d<0<21d>9850;&20g<5><1e=9o57498k7df290/=9l52778j42f2><07b<nf;29 42e2;<>7c?;a;54?>i5i=0;6)?;b;051>h6<h0<465`28;94?"6<k09:85a15c93<=<g;2n6=4+15`9633<f8>j6:o4;n0;7?6=,8>i6?8:;o37e?1e32e9;54?:%37f?41=2d:8l48c:9l63b=83.:8o4=649m51g=?m10c?:::18'51d=:??0b<:n:6g8?j43<3:1(<:m:346?k73i3=m76a=dd83>!73j38oj6`>4`83?>i5lm0;6)?;b;0gb>h6<h0:76a=dc83>!73j38oj6`>4`81?>i5lh0;6)?;b;0gb>h6<h0876a=d883>!73j38oj6`>4`87?>i5l10;6)?;b;0gb>h6<h0>76a=d683>!73j38oj6`>4`85?>i5l?0;6)?;b;0gb>h6<h0<76a=d483>!73j38oj6`>4`8;?>i5l=0;6)?;b;0gb>h6<h0276a=d283>!73j38oj6`>4`8b?>i5l;0;6)?;b;0gb>h6<h0i76a=d183>!73j38oj6`>4`8`?>i5ko0;6)?;b;0gb>h6<h0o76a=cd83>!73j38oj6`>4`8f?>i5km0;6)?;b;0gb>h6<h0m76a=cb83>!73j38oj6`>4`824>=h:jh1<7*>4c81`c=i9=k1=<54o3ab>5<#9=h1>ih4n06b>44<3f8h57>5$06a>7ba3g;?m7?<;:m1g=<72-;?n7<kf:l20d<6<21d>n950;&20g<5lo1e=9o51498k7c2290/=9l52ed8j42f28<07b<j4;29 42e2;nm7c?;a;34?>i5m:0;6)?;b;0gb>h6<h0:465`2d094?"6<k09hk5a15c95<=<g;o:6=4+15`96a`<f8>j6<o4;n0f4?6=,8>i6?ji;o37e?7e32e9hn4?:%37f?4cn2d:8l4>c:9l6a7=83.:8o4=dg9m51g=9m10c?m9:18'51d=:ml0b<:n:0g8?j4d=3:1(<:m:3fe?k73i3;m76l>7483>4<729q/=8j51718L4143A;=>6a>4983>>{e9>>1<7?50;2x 43c2o80D<9<;I356>ia93:17pl>5d83>ge=83:p(<;k:06g?M70;2B::?5U368`0<12o0:?7??:06954<d2h0o6<<59;m15<5<2d>=774ncd94>hb93;0(hk5f19'ac<a82.m?7<4$g696>"a=380(k852:&e3?4<,o21>6*i9;08 cg=:2.mn7<4$ga96>"al380(kk52:&eb?4<,8:;6?5+11396>"68;097)??3;08 4632;1/==;52:&243<53-;;;7<4$02;>7=#9931>6*>0`81?!77j380(<>l:39'55b=:2.:<h4=;%33b?4<,8;;6?5+10396>"69;097)?>3;08 4732;1/=<;52:&253<53-;:;7<4$03;>7=#9831>6*>1`81?!76j380(<?l:39'54b=:2.:=h4=;%32b?4<,88;6?5+13396>"6:;097)?=3;08 4432;1/=?;52:&263<53-;9;7<4$00;>7=#9;31>6*>2`81?!75j380(<<l:39'57b=:2.:>h4=;%31b?4<,89;6?5+12396>"6;;097)?<3;08 4532;1/=>;52:&273<53-;8;7<4$01;>7=#9:31>6*>3`81?!74j3;0(<=l:09'56b=9=<0(<;=:07`?!72;3937)?:4;1;?!72=39=7)?:6;36<>"6=00:7)?:a;38 41728<m7)?81;35b>o6<l0;66g;0;29?lcc2900e<;>:188m13=831b=9h50;9j506=831bin4?::k:3?6=,8>i6464n06b>5=<a0<1<7*>4c8:<>h6<h0:76g65;29 42e2020b<:n:398m<2=83.:8o468:l20d<432c::54?:%37f?7112d:8l4?;:k222<72-;?n7?99:l20d<632c::;4?:%37f?7112d:8l4=;:k220<72-;?n7?99:l20d<432ei;7>5$06a>g><f8>j6=54oc494?"6<k0i46`>4`82?>ie<3:1(<:m:c:8j42f2;10co=50;&20g<e02d:8l4<;:ma6?6=,8>i6o64n06b>1=<gk;1<7*>4c8a<>h6<h0>76am0;29 42e2k20b<:n:798kd`=83.:8o4m8:l20d<032eji7>5$06a>g><f8>j6554o`f94?"6<k0i46`>4`8:?>ifk3:1(<:m:c:8j42f2h10cll50;&20g<e02d:8l4m;:mb=?6=,8>i6o64n06b>f=<gh21<7*>4c8a<>h6<h0o76an7;29 42e2k20b<:n:d98kd0=83.:8o4m8:l20d<a32ej97>5$06a>g><f8>j6<>4;nc7>5<#9=h1n55a15c954=<gh91<7*>4c8a<>h6<h0:>65`a383>!73j3h37c?;a;30?>if93:1(<:m:c:8j42f28>07bo?:18'51d=j11e=9o51498kgc=83.:8o4m8:l20d<6>21dni4?:%37f?d?3g;?m7?8;:mag?6=,8>i6o64n06b>4><3fhi6=4+15`9f==i9=k1=454occ94?"6<k0i46`>4`82e>=hj00;6)?;b;`;?k73i3;i76am5;29 42e2k20b<:n:0a8?jgf290/=9l5b99m51g=9m10c4h50;&20g<e02d:8l4>e:9l=`<72-;?n7l7;o37e?7a32c:h7>5$06a>4c<f8>j6=54i0a94?"6<k0:i6`>4`82?>o6j3:1(<:m:0g8j42f2;10e<o50;&20g<6m2d:8l4<;:k12?6=,8>i6<k4n06b>1=<a;?1<7*>4c82a>h6<h0>76g=4;29 42e28o0b<:n:798m75=83.:8o4>e:l20d<032c9>7>5$06a>4c<f8>j6554i3394?"6<k0:i6`>4`8:?>o583:1(<:m:0g8j42f2h10e<h50;&20g<6m2d:8l4m;:k2=?6=,8>i6<k4n06b>f=<a821<7*>4c82a>h6<h0o76g=c;29 42e2;n0b<:n:198m7d=83.:8o4=d:l20d<632c9m7>5$06a>7b<f8>j6?54i3;94?"6<k09h6`>4`80?>o4=3:1(<:m:3f8j42f2=10e>:50;&20g<5l2d:8l4:;:k07?6=,8>i6?j4n06b>3=<a:81<7*>4c81`>h6<h0<76g<1;29 42e2;n0b<:n:998m66=83.:8o4=d:l20d<>32c9j7>5$06a>7b<f8>j6l54i3g94?"6<k09h6`>4`8a?>o503:1(<:m:3f8j42f2j10e?950;&20g<5l2d:8l4k;:k;g?6=,8>i65j4n06b>5=<a1h1<7*>4c8;`>h6<h0:76g79;29 42e21n0b<:n:398m=>=83.:8o47d:l20d<432c3;7>5$06a>=b<f8>j6954i9494?"6<k03h6`>4`86?>o?=3:1(<:m:9f8j42f2?10e5:50;&20g<?l2d:8l48;:k;7?6=,8>i65j4n06b>==<a181<7*>4c8;`>h6<h0276g71;29 42e21n0b<:n:`98m=6=83.:8o47d:l20d<e32c<i7>5$06a>=b<f8>j6n54i6f94?"6<k03h6`>4`8g?>o0k3:1(<:m:9f8j42f2l10e:l50;&20g<?l2d:8l4i;:k4e?6=,8>i65j4n06b>46<3`=26=4+15`9<a=i9=k1=<54i6:94?"6<k03h6`>4`826>=n?>0;6)?;b;:g?k73i3;876g86;29 42e21n0b<:n:068?l12290/=9l58e9m51g=9<10e4=50;&20g<?l2d:8l4>6:9j=7<72-;?n76k;o37e?7032c2=7>5$06a>=b<f8>j6<64;h;3>5<#9=h14i5a15c95<=<a1l1<7*>4c8;`>h6<h0:m65f8d83>!73j32o7c?;a;3a?>o?i3:1(<:m:9f8j42f28i07d9i:18'51d=0m1e=9o51e98m22=83.:8o47d:l20d<6m21b;>4?:%37f?>c3g;?m7?i;:mf1?6=,8>i6h84n06b>5=<gl>1<7*>4c8f2>h6<h0:76aj3;29 42e2l<0b<:n:398k`4=83.:8o4j6:l20d<432c2o7>5$06a><b<f8>j6=54i8`94?"6<k02h6`>4`82?>o>i3:1(<:m:8f8j42f2;10e4750;&20g<>l2d:8l4<;:mfe?6=,8>i6hl4n06b>5=<gl31<7*>4c8ff>h6<h0:76aj8;29 42e2lh0b<:n:398k`1=83.:8o4jb:l20d<432eo57>5$06a>ag<f8>j6=54oe:94?"6<k0om6`>4`82?>ic>3:1(<:m:ec8j42f2;10ci;50;&20g<ci2d:8l4<;:mg0?6=,8>i6io4n06b>1=<gm91<7*>4c8ge>h6<h0>76ak2;29 42e2mk0b<:n:798ka7=83.:8o4ka:l20d<032eo<7>5$06a>ag<f8>j6554obd94?"6<k0om6`>4`8:?>idm3:1(<:m:ec8j42f2h10cnj50;&20g<ci2d:8l4m;:m`f?6=,8>i6io4n06b>f=<gjk1<7*>4c8ge>h6<h0o76al9;29 42e2mk0b<:n:d98kf>=83.:8o4ka:l20d<a32eh;7>5$06a>ag<f8>j6<>4;na5>5<#9=h1hl5a15c954=<gj?1<7*>4c8ge>h6<h0:>65`c583>!73j3nj7c?;a;30?>id;3:1(<:m:ec8j42f28>07bm=:18'51d=lh1e=9o51498k`6=83.:8o4ka:l20d<6>21dhk4?:%37f?bf3g;?m7?8;:mga?6=,8>i6io4n06b>4><3fno6=4+15`9`d=i9=k1=454oea94?"6<k0om6`>4`82e>=hlk0;6)?;b;fb?k73i3;i76ak7;29 42e2mk0b<:n:0a8?jed290/=9l5d`9m51g=9m10cn?50;&20g<ci2d:8l4>e:9lg5<72-;?n7jn;o37e?7a32c::i4?:%37f?71m2d:8l4?;:k22f<72-;?n7?9e:l20d<632c::o4?:%37f?71m2d:8l4=;:k22d<72-;?n7?9e:l20d<432c=n7>5$06a>3e<f8>j6=54i7c94?"6<k0=o6`>4`82?>o103:1(<:m:7a8j42f2;10e;950;&20g<1k2d:8l4<;:k52?6=,8>i6;m4n06b>1=<a??1<7*>4c85g>h6<h0>76g94;29 42e2?i0b<:n:798m35=83.:8o49c:l20d<032c=>7>5$06a>3e<f8>j6554i7394?"6<k0=o6`>4`8:?>o183:1(<:m:7a8j42f2h10e8h50;&20g<1k2d:8l4m;:k6`?6=,8>i6;m4n06b>f=<a<i1<7*>4c85g>h6<h0o76g:b;29 42e2?i0b<:n:d98m0g=83.:8o49c:l20d<a32c>57>5$06a>3e<f8>j6<>4;h7;>5<#9=h1:n5a15c954=<a<=1<7*>4c85g>h6<h0:>65f5783>!73j3<h7c?;a;30?>o2=3:1(<:m:7a8j42f28>07d;;:18'51d=>j1e=9o51498m24=83.:8o49c:l20d<6>21b;<4?:%37f?0d3g;?m7?8;:k44?6=,8>i6;m4n06b>4><3`<m6=4+15`92f=i9=k1=454i7g94?"6<k0=o6`>4`82e>=n>m0;6)?;b;4`?k73i3;i76g99;29 42e2?i0b<:n:0a8?l3b290/=9l56b9m51g=9m10e8=50;&20g<1k2d:8l4>e:9j17<72-;?n78l;o37e?7a32wi=8h50;``>5<7s-;>h7?;d:J236=O9?80V>95cz792?`=9:0:<7?;:039g?g=l3;9644rn42961=i=8027cli:19ma4<63-on6k>4$dd9b5=#n:097)h;:39'b0<53-l=6?5+f681?!`?2;1/j44=;%db>7=#nk097)hl:39'ba<53-ln6?5+fg81?!778380(<>>:39'554=:2.:<>4=;%330?4<,8:>6?5+11496>"68>097)??8;08 46>2;1/==o52:&24g<53-;;o7<4$02g>7=#99o1>6*>0g81?!768380(<?>:39'544=:2.:=>4=;%320?4<,8;>6?5+10496>"69>097)?>8;08 47>2;1/=<o52:&25g<53-;:o7<4$03g>7=#98o1>6*>1g81?!758380(<<>:39'574=:2.:>>4=;%310?4<,88>6?5+13496>"6:>097)?=8;08 44>2;1/=?o52:&26g<53-;9o7<4$00g>7=#9;o1>6*>2g81?!748380(<=>:39'564=:2.:?>4=;%300?4<,89>6?5+12496>"6;>097)?<8;08 45>2;1/=>o52:&27g<63-;8o7?4$01g>4213-;>>7?:c:&216<402.:994<8:&210<4>2.:9;4>599'50?=92.:9l4>;%344?71n2.:;<4>6g9j51c=831b8=4?::kf`?6=3`;>=7>5;h66>5<<a8>m6=44i073>5<<ali1<75f9683>!73j3337c?;a;28?l?1290/=9l5999m51g=921b584?:%37f???3g;?m7<4;h;7>5<#9=h1555a15c97>=n9?21<7*>4c822<=i9=k1<65f17594?"6<k0::45a15c95>=n9?<1<7*>4c822<=i9=k1>65f17794?"6<k0::45a15c97>=hj>0;6)?;b;`;?k73i3:07bl9:18'51d=j11e=9o51:9lf1<72-;?n7l7;o37e?4<3fh86=4+15`9f==i9=k1?65`b383>!73j3h37c?;a;68?jd6290/=9l5b99m51g==21dn=4?:%37f?d?3g;?m784;nce>5<#9=h1n55a15c93>=hil0;6)?;b;`;?k73i3207bok:18'51d=j11e=9o59:9lef<72-;?n7l7;o37e?g<3fki6=4+15`9f==i9=k1n65`a883>!73j3h37c?;a;a8?jg?290/=9l5b99m51g=l21dm:4?:%37f?d?3g;?m7k4;nc5>5<#9=h1n55a15c9b>=hi<0;6)?;b;`;?k73i3;;76an4;29 42e2k20b<:n:038?jg4290/=9l5b99m51g=9;10cl<50;&20g<e02d:8l4>3:9le4<72-;?n7l7;o37e?7332ej<7>5$06a>g><f8>j6<;4;n`f>5<#9=h1n55a15c953=<gkn1<7*>4c8a<>h6<h0:;65`bb83>!73j3h37c?;a;3;?>iej3:1(<:m:c:8j42f28307bln:18'51d=j11e=9o51`98kg?=83.:8o4m8:l20d<6j21dn84?:%37f?d?3g;?m7?l;:mbe?6=,8>i6o64n06b>4b<3f3m6=4+15`9f==i9=k1=h54o8g94?"6<k0i46`>4`82b>=n9m0;6)?;b;3f?k73i3:07d?l:18'51d=9l1e=9o51:9j5g<72-;?n7?j;o37e?4<3`;j6=4+15`95`=i9=k1?65f2783>!73j3;n7c?;a;68?l42290/=9l51d9m51g==21b>94?:%37f?7b3g;?m784;h00>5<#9=h1=h5a15c93>=n:;0;6)?;b;3f?k73i3207d<>:18'51d=9l1e=9o59:9j65<72-;?n7?j;o37e?g<3`;m6=4+15`95`=i9=k1n65f1883>!73j3;n7c?;a;a8?l7?290/=9l51d9m51g=l21b>n4?:%37f?4c3g;?m7>4;h0a>5<#9=h1>i5a15c95>=n:h0;6)?;b;0g?k73i3807d<6:18'51d=:m1e=9o53:9j70<72-;?n7<k;o37e?2<3`9?6=4+15`96a=i9=k1965f3283>!73j38o7c?;a;48?l55290/=9l52e9m51g=?21b?<4?:%37f?4c3g;?m764;h13>5<#9=h1>i5a15c9=>=n:o0;6)?;b;0g?k73i3k07d<j:18'51d=:m1e=9o5b:9j6=<72-;?n7<k;o37e?e<3`8<6=4+15`96a=i9=k1h65f8b83>!73j32o7c?;a;28?l>e290/=9l58e9m51g=921b444?:%37f?>c3g;?m7<4;h:;>5<#9=h14i5a15c97>=n0>0;6)?;b;:g?k73i3>07d69:18'51d=0m1e=9o55:9j<0<72-;?n76k;o37e?0<3`2?6=4+15`9<a=i9=k1;65f8283>!73j32o7c?;a;:8?l>5290/=9l58e9m51g=121b4<4?:%37f?>c3g;?m7o4;h:3>5<#9=h14i5a15c9f>=n?l0;6)?;b;:g?k73i3i07d9k:18'51d=0m1e=9o5d:9j3f<72-;?n76k;o37e?c<3`=i6=4+15`9<a=i9=k1j65f7`83>!73j32o7c?;a;33?>o013:1(<:m:9f8j42f28;07d97:18'51d=0m1e=9o51398m21=83.:8o47d:l20d<6;21b;;4?:%37f?>c3g;?m7?;;:k41?6=,8>i65j4n06b>43<3`386=4+15`9<a=i9=k1=;54i8094?"6<k03h6`>4`823>=n180;6)?;b;:g?k73i3;376g60;29 42e21n0b<:n:0;8?l>a290/=9l58e9m51g=9h10e5k50;&20g<?l2d:8l4>b:9j<d<72-;?n76k;o37e?7d32c<j7>5$06a>=b<f8>j6<j4;h57>5<#9=h14i5a15c95`=<a>91<7*>4c8;`>h6<h0:j65`e483>!73j3o=7c?;a;28?jc3290/=9l5e79m51g=921di>4?:%37f?c13g;?m7<4;ng1>5<#9=h1i;5a15c97>=n1j0;6)?;b;;g?k73i3:07d7m:18'51d=1m1e=9o51:9j=d<72-;?n77k;o37e?4<3`326=4+15`9=a=i9=k1?65`e`83>!73j3oi7c?;a;28?jc>290/=9l5ec9m51g=921di54?:%37f?ce3g;?m7<4;ng4>5<#9=h1io5a15c97>=hl00;6)?;b;fb?k73i3:07bj7:18'51d=lh1e=9o51:9l`3<72-;?n7jn;o37e?4<3fn>6=4+15`9`d=i9=k1?65`d583>!73j3nj7c?;a;68?jb4290/=9l5d`9m51g==21dh?4?:%37f?bf3g;?m784;nf2>5<#9=h1hl5a15c93>=hl90;6)?;b;fb?k73i3207bmi:18'51d=lh1e=9o59:9lg`<72-;?n7jn;o37e?g<3fio6=4+15`9`d=i9=k1n65`cc83>!73j3nj7c?;a;a8?jef290/=9l5d`9m51g=l21do44?:%37f?bf3g;?m7k4;na;>5<#9=h1hl5a15c9b>=hk>0;6)?;b;fb?k73i3;;76al6;29 42e2mk0b<:n:038?je2290/=9l5d`9m51g=9;10cn:50;&20g<ci2d:8l4>3:9lg6<72-;?n7jn;o37e?7332eh>7>5$06a>ag<f8>j6<;4;ng3>5<#9=h1hl5a15c953=<gml1<7*>4c8ge>h6<h0:;65`dd83>!73j3nj7c?;a;3;?>icl3:1(<:m:ec8j42f28307bjl:18'51d=lh1e=9o51`98kad=83.:8o4ka:l20d<6j21dh:4?:%37f?bf3g;?m7?l;:m`g?6=,8>i6io4n06b>4b<3fi:6=4+15`9`d=i9=k1=h54ob294?"6<k0om6`>4`82b>=n9?n1<7*>4c822`=i9=k1<65f17a94?"6<k0::h5a15c95>=n9?h1<7*>4c822`=i9=k1>65f17c94?"6<k0::h5a15c97>=n>k0;6)?;b;4`?k73i3:07d8n:18'51d=>j1e=9o51:9j2=<72-;?n78l;o37e?4<3`<<6=4+15`92f=i9=k1?65f6783>!73j3<h7c?;a;68?l02290/=9l56b9m51g==21b:94?:%37f?0d3g;?m784;h40>5<#9=h1:n5a15c93>=n>;0;6)?;b;4`?k73i3207d8>:18'51d=>j1e=9o59:9j25<72-;?n78l;o37e?g<3`?m6=4+15`92f=i9=k1n65f5e83>!73j3<h7c?;a;a8?l3d290/=9l56b9m51g=l21b9o4?:%37f?0d3g;?m7k4;h7b>5<#9=h1:n5a15c9b>=n=00;6)?;b;4`?k73i3;;76g:8;29 42e2?i0b<:n:038?l30290/=9l56b9m51g=9;10e8850;&20g<1k2d:8l4>3:9j10<72-;?n78l;o37e?7332c>87>5$06a>3e<f8>j6<;4;h51>5<#9=h1:n5a15c953=<a>;1<7*>4c85g>h6<h0:;65f7183>!73j3<h7c?;a;3;?>o1n3:1(<:m:7a8j42f28307d8j:18'51d=>j1e=9o51`98m3b=83.:8o49c:l20d<6j21b:44?:%37f?0d3g;?m7?l;:k6a?6=,8>i6;m4n06b>4b<3`?86=4+15`92f=i9=k1=h54i4094?"6<k0=o6`>4`82b>=zj8<;6=4mc;294~"6=m0:8i5G1618L4053S9<6nu::78e>45=990:87?>:b8b>a<6:331qc;?:368j07=12dij7>4nd395>"bm3l;7)ki:g28 c5=:2.m87<4$g796>"a>380(k952:&e<?4<,o31>6*ia;08 cd=:2.mo7<4$gf96>"am380(kh52:&245<53-;;=7<4$021>7=#9991>6*>0581?!77=380(<>9:39'551=:2.:<54=;%33=?4<,8:j6?5+11`96>"68j097)??d;08 46b2;1/==h52:&255<53-;:=7<4$031>7=#9891>6*>1581?!76=380(<?9:39'541=:2.:=54=;%32=?4<,8;j6?5+10`96>"69j097)?>d;08 47b2;1/=<h52:&265<53-;9=7<4$001>7=#9;91>6*>2581?!75=380(<<9:39'571=:2.:>54=;%31=?4<,88j6?5+13`96>"6:j097)?=d;08 44b2;1/=?h52:&275<53-;8=7<4$011>7=#9:91>6*>3581?!74=380(<=9:39'561=:2.:?54=;%30=?4<,89j6?5+12`95>"6;j0:7)?<d;372>"6=;0:9n5+14197==#9<>1?55+147973=#9<<1=864$07:>4=#9<k1=6*>71822c=#9>;1=;h4i06f>5<<a=:1<75fee83>>o6=80;66g;5;29?l73n3:17d?:0;29?lcd2900e4950;&20g<>02d:8l4?;:k:2?6=,8>i6464n06b>4=<a0?1<7*>4c8:<>h6<h0976g64;29 42e2020b<:n:298m40?290/=9l517;8j42f2910e<88:18'51d=9?30b<:n:098m401290/=9l517;8j42f2;10e<8::18'51d=9?30b<:n:298kg1=83.:8o4m8:l20d<732ei:7>5$06a>g><f8>j6<54oc694?"6<k0i46`>4`81?>ie;3:1(<:m:c:8j42f2:10co<50;&20g<e02d:8l4;;:ma5?6=,8>i6o64n06b>0=<gk:1<7*>4c8a<>h6<h0=76anf;29 42e2k20b<:n:698kdc=83.:8o4m8:l20d<?32ejh7>5$06a>g><f8>j6454o`a94?"6<k0i46`>4`8b?>ifj3:1(<:m:c:8j42f2k10cl750;&20g<e02d:8l4l;:mb<?6=,8>i6o64n06b>a=<gh=1<7*>4c8a<>h6<h0n76an6;29 42e2k20b<:n:g98kd3=83.:8o4m8:l20d<6821dm94?:%37f?d?3g;?m7?>;:mb7?6=,8>i6o64n06b>44<3fk96=4+15`9f==i9=k1=>54o`394?"6<k0i46`>4`820>=hi90;6)?;b;`;?k73i3;>76ame;29 42e2k20b<:n:048?jdc290/=9l5b99m51g=9>10com50;&20g<e02d:8l4>8:9lfg<72-;?n7l7;o37e?7>32eim7>5$06a>g><f8>j6<o4;n`:>5<#9=h1n55a15c95g=<gk?1<7*>4c8a<>h6<h0:o65`a`83>!73j3h37c?;a;3g?>i>n3:1(<:m:c:8j42f28o07b7j:18'51d=j11e=9o51g98m4b=83.:8o4>e:l20d<732c:o7>5$06a>4c<f8>j6<54i0`94?"6<k0:i6`>4`81?>o6i3:1(<:m:0g8j42f2:10e?850;&20g<6m2d:8l4;;:k11?6=,8>i6<k4n06b>0=<a;>1<7*>4c82a>h6<h0=76g=3;29 42e28o0b<:n:698m74=83.:8o4>e:l20d<?32c9=7>5$06a>4c<f8>j6454i3294?"6<k0:i6`>4`8b?>o6n3:1(<:m:0g8j42f2k10e<750;&20g<6m2d:8l4l;:k2<?6=,8>i6<k4n06b>a=<a;i1<7*>4c81`>h6<h0;76g=b;29 42e2;n0b<:n:098m7g=83.:8o4=d:l20d<532c957>5$06a>7b<f8>j6>54i2794?"6<k09h6`>4`87?>o4<3:1(<:m:3f8j42f2<10e>=50;&20g<5l2d:8l49;:k06?6=,8>i6?j4n06b>2=<a:;1<7*>4c81`>h6<h0376g<0;29 42e2;n0b<:n:898m7`=83.:8o4=d:l20d<f32c9i7>5$06a>7b<f8>j6o54i3:94?"6<k09h6`>4`8`?>o5?3:1(<:m:3f8j42f2m10e5m50;&20g<?l2d:8l4?;:k;f?6=,8>i65j4n06b>4=<a131<7*>4c8;`>h6<h0976g78;29 42e21n0b<:n:298m=1=83.:8o47d:l20d<332c3:7>5$06a>=b<f8>j6854i9794?"6<k03h6`>4`85?>o?<3:1(<:m:9f8j42f2>10e5=50;&20g<?l2d:8l47;:k;6?6=,8>i65j4n06b><=<a1;1<7*>4c8;`>h6<h0j76g70;29 42e21n0b<:n:c98m2c=83.:8o47d:l20d<d32c<h7>5$06a>=b<f8>j6i54i6a94?"6<k03h6`>4`8f?>o0j3:1(<:m:9f8j42f2o10e:o50;&20g<?l2d:8l4>0:9j3<<72-;?n76k;o37e?7632c<47>5$06a>=b<f8>j6<<4;h54>5<#9=h14i5a15c956=<a><1<7*>4c8;`>h6<h0:865f7483>!73j32o7c?;a;36?>o>;3:1(<:m:9f8j42f28<07d7=:18'51d=0m1e=9o51698m<7=83.:8o47d:l20d<6021b5=4?:%37f?>c3g;?m7?6;:k;b?6=,8>i65j4n06b>4g<3`2n6=4+15`9<a=i9=k1=o54i9c94?"6<k03h6`>4`82g>=n?o0;6)?;b;:g?k73i3;o76g84;29 42e21n0b<:n:0g8?l14290/=9l58e9m51g=9o10ch;50;&20g<b>2d:8l4?;:mf0?6=,8>i6h84n06b>4=<gl91<7*>4c8f2>h6<h0976aj2;29 42e2l<0b<:n:298m<e=83.:8o46d:l20d<732c2n7>5$06a><b<f8>j6<54i8c94?"6<k02h6`>4`81?>o>13:1(<:m:8f8j42f2:10cho50;&20g<bj2d:8l4?;:mf=?6=,8>i6hl4n06b>4=<gl21<7*>4c8ff>h6<h0976aj7;29 42e2lh0b<:n:298ka?=83.:8o4ka:l20d<732eo47>5$06a>ag<f8>j6<54oe494?"6<k0om6`>4`81?>ic=3:1(<:m:ec8j42f2:10ci:50;&20g<ci2d:8l4;;:mg7?6=,8>i6io4n06b>0=<gm81<7*>4c8ge>h6<h0=76ak1;29 42e2mk0b<:n:698ka6=83.:8o4ka:l20d<?32ehj7>5$06a>ag<f8>j6454obg94?"6<k0om6`>4`8b?>idl3:1(<:m:ec8j42f2k10cnl50;&20g<ci2d:8l4l;:m`e?6=,8>i6io4n06b>a=<gj31<7*>4c8ge>h6<h0n76al8;29 42e2mk0b<:n:g98kf1=83.:8o4ka:l20d<6821do;4?:%37f?bf3g;?m7?>;:m`1?6=,8>i6io4n06b>44<3fi?6=4+15`9`d=i9=k1=>54ob194?"6<k0om6`>4`820>=hk;0;6)?;b;fb?k73i3;>76aj0;29 42e2mk0b<:n:048?jba290/=9l5d`9m51g=9>10cik50;&20g<ci2d:8l4>8:9l`a<72-;?n7jn;o37e?7>32eoo7>5$06a>ag<f8>j6<o4;nfa>5<#9=h1hl5a15c95g=<gm=1<7*>4c8ge>h6<h0:o65`cb83>!73j3nj7c?;a;3g?>id93:1(<:m:ec8j42f28o07bm?:18'51d=lh1e=9o51g98m40c290/=9l517g8j42f2910e<8l:18'51d=9?o0b<:n:098m40e290/=9l517g8j42f2;10e<8n:18'51d=9?o0b<:n:298m3d=83.:8o49c:l20d<732c=m7>5$06a>3e<f8>j6<54i7:94?"6<k0=o6`>4`81?>o1?3:1(<:m:7a8j42f2:10e;850;&20g<1k2d:8l4;;:k51?6=,8>i6;m4n06b>0=<a?>1<7*>4c85g>h6<h0=76g93;29 42e2?i0b<:n:698m34=83.:8o49c:l20d<?32c==7>5$06a>3e<f8>j6454i7294?"6<k0=o6`>4`8b?>o2n3:1(<:m:7a8j42f2k10e8j50;&20g<1k2d:8l4l;:k6g?6=,8>i6;m4n06b>a=<a<h1<7*>4c85g>h6<h0n76g:a;29 42e2?i0b<:n:g98m0?=83.:8o49c:l20d<6821b954?:%37f?0d3g;?m7?>;:k63?6=,8>i6;m4n06b>44<3`?=6=4+15`92f=i9=k1=>54i4794?"6<k0=o6`>4`820>=n==0;6)?;b;4`?k73i3;>76g82;29 42e2?i0b<:n:048?l16290/=9l56b9m51g=9>10e:>50;&20g<1k2d:8l4>8:9j2c<72-;?n78l;o37e?7>32c=i7>5$06a>3e<f8>j6<o4;h4g>5<#9=h1:n5a15c95g=<a?31<7*>4c85g>h6<h0:o65f5d83>!73j3<h7c?;a;3g?>o2;3:1(<:m:7a8j42f28o07d;=:18'51d=>j1e=9o51g98yg7193:1nn4?:1y'50b=9=n0D<9<;I356>\4?3ip9785f;30>46=9=0:=7m5a;f957<>2td><7<;;o72><=ijo0;7ck>:09'a`<a82.nj7h?;%d0>7=#n=097)h::39'b3<53-l<6?5+f981?!`>2;1/jl4=;%da>7=#nj097)hk:39'b`<53-lm6?5+11296>"688097)??2;08 4642;1/==:52:&240<53-;;:7<4$024>7=#9921>6*>0881?!77i380(<>m:39'55e=:2.:<i4=;%33a?4<,8:m6?5+10296>"698097)?>2;08 4742;1/=<:52:&250<53-;::7<4$034>7=#9821>6*>1881?!76i380(<?m:39'54e=:2.:=i4=;%32a?4<,8;m6?5+13296>"6:8097)?=2;08 4442;1/=?:52:&260<53-;9:7<4$004>7=#9;21>6*>2881?!75i380(<<m:39'57e=:2.:>i4=;%31a?4<,88m6?5+12296>"6;8097)?<2;08 4542;1/=>:52:&270<53-;8:7<4$014>7=#9:21>6*>3881?!74i380(<=m:09'56e=92.:?i4>479'504=9<i0(<;<:2:8 4332:20(<;::248 43128?37)?:9;38 43f281/=:>517d8 41628<m7d?;e;29?l272900ehj50;9j507=831b884?::k20c<722c:9=4?::kfg?6=3`3<6=4+15`9===i9=k1<65f9783>!73j3337c?;a;38?l?2290/=9l5999m51g=:21b594?:%37f???3g;?m7=4;h35<?6=,8>i6<86;o37e?6<3`;=;7>5$06a>40>3g;?m7?4;h352?6=,8>i6<86;o37e?4<3`;=97>5$06a>40>3g;?m7=4;n`4>5<#9=h1n55a15c94>=hj?0;6)?;b;`;?k73i3;07bl;:18'51d=j11e=9o52:9lf6<72-;?n7l7;o37e?5<3fh96=4+15`9f==i9=k1865`b083>!73j3h37c?;a;78?jd7290/=9l5b99m51g=>21dmk4?:%37f?d?3g;?m794;ncf>5<#9=h1n55a15c9<>=him0;6)?;b;`;?k73i3307bol:18'51d=j11e=9o5a:9leg<72-;?n7l7;o37e?d<3fk26=4+15`9f==i9=k1o65`a983>!73j3h37c?;a;f8?jg0290/=9l5b99m51g=m21dm;4?:%37f?d?3g;?m7h4;nc6>5<#9=h1n55a15c955=<gh>1<7*>4c8a<>h6<h0:=65`a283>!73j3h37c?;a;31?>if:3:1(<:m:c:8j42f28907bo>:18'51d=j11e=9o51598kd6=83.:8o4m8:l20d<6=21dnh4?:%37f?d?3g;?m7?9;:ma`?6=,8>i6o64n06b>41<3fhh6=4+15`9f==i9=k1=554oc`94?"6<k0i46`>4`82=>=hjh0;6)?;b;`;?k73i3;j76am9;29 42e2k20b<:n:0`8?jd2290/=9l5b99m51g=9j10clo50;&20g<e02d:8l4>d:9l=c<72-;?n7l7;o37e?7b32e2i7>5$06a>g><f8>j6<h4;h3g>5<#9=h1=h5a15c94>=n9j0;6)?;b;3f?k73i3;07d?m:18'51d=9l1e=9o52:9j5d<72-;?n7?j;o37e?5<3`8=6=4+15`95`=i9=k1865f2483>!73j3;n7c?;a;78?l43290/=9l51d9m51g=>21b>>4?:%37f?7b3g;?m794;h01>5<#9=h1=h5a15c9<>=n:80;6)?;b;3f?k73i3307d<?:18'51d=9l1e=9o5a:9j5c<72-;?n7?j;o37e?d<3`;26=4+15`95`=i9=k1o65f1983>!73j3;n7c?;a;f8?l4d290/=9l52e9m51g=821b>o4?:%37f?4c3g;?m7?4;h0b>5<#9=h1>i5a15c96>=n:00;6)?;b;0g?k73i3907d=::18'51d=:m1e=9o54:9j71<72-;?n7<k;o37e?3<3`986=4+15`96a=i9=k1:65f3383>!73j38o7c?;a;58?l56290/=9l52e9m51g=021b?=4?:%37f?4c3g;?m774;h0e>5<#9=h1>i5a15c9e>=n:l0;6)?;b;0g?k73i3h07d<7:18'51d=:m1e=9o5c:9j62<72-;?n7<k;o37e?b<3`2h6=4+15`9<a=i9=k1<65f8c83>!73j32o7c?;a;38?l>>290/=9l58e9m51g=:21b454?:%37f?>c3g;?m7=4;h:4>5<#9=h14i5a15c90>=n0?0;6)?;b;:g?k73i3?07d6::18'51d=0m1e=9o56:9j<1<72-;?n76k;o37e?1<3`286=4+15`9<a=i9=k1465f8383>!73j32o7c?;a;;8?l>6290/=9l58e9m51g=i21b4=4?:%37f?>c3g;?m7l4;h5f>5<#9=h14i5a15c9g>=n?m0;6)?;b;:g?k73i3n07d9l:18'51d=0m1e=9o5e:9j3g<72-;?n76k;o37e?`<3`=j6=4+15`9<a=i9=k1==54i6;94?"6<k03h6`>4`825>=n?10;6)?;b;:g?k73i3;976g87;29 42e21n0b<:n:018?l11290/=9l58e9m51g=9=10e:;50;&20g<?l2d:8l4>5:9j=6<72-;?n76k;o37e?7132c2>7>5$06a>=b<f8>j6<94;h;2>5<#9=h14i5a15c95==<a0:1<7*>4c8;`>h6<h0:565f8g83>!73j32o7c?;a;3b?>o?m3:1(<:m:9f8j42f28h07d6n:18'51d=0m1e=9o51b98m2`=83.:8o47d:l20d<6l21b;94?:%37f?>c3g;?m7?j;:k47?6=,8>i65j4n06b>4`<3fo>6=4+15`9a3=i9=k1<65`e583>!73j3o=7c?;a;38?jc4290/=9l5e79m51g=:21di?4?:%37f?c13g;?m7=4;h;`>5<#9=h15i5a15c94>=n1k0;6)?;b;;g?k73i3;07d7n:18'51d=1m1e=9o52:9j=<<72-;?n77k;o37e?5<3foj6=4+15`9ag=i9=k1<65`e883>!73j3oi7c?;a;38?jc?290/=9l5ec9m51g=:21di:4?:%37f?ce3g;?m7=4;nf:>5<#9=h1hl5a15c94>=hl10;6)?;b;fb?k73i3;07bj9:18'51d=lh1e=9o52:9l`0<72-;?n7jn;o37e?5<3fn?6=4+15`9`d=i9=k1865`d283>!73j3nj7c?;a;78?jb5290/=9l5d`9m51g=>21dh<4?:%37f?bf3g;?m794;nf3>5<#9=h1hl5a15c9<>=hko0;6)?;b;fb?k73i3307bmj:18'51d=lh1e=9o5a:9lga<72-;?n7jn;o37e?d<3fii6=4+15`9`d=i9=k1o65`c`83>!73j3nj7c?;a;f8?je>290/=9l5d`9m51g=m21do54?:%37f?bf3g;?m7h4;na4>5<#9=h1hl5a15c955=<gj<1<7*>4c8ge>h6<h0:=65`c483>!73j3nj7c?;a;31?>id<3:1(<:m:ec8j42f28907bm<:18'51d=lh1e=9o51598kf4=83.:8o4ka:l20d<6=21di=4?:%37f?bf3g;?m7?9;:mgb?6=,8>i6io4n06b>41<3fnn6=4+15`9`d=i9=k1=554oef94?"6<k0om6`>4`82=>=hlj0;6)?;b;fb?k73i3;j76akb;29 42e2mk0b<:n:0`8?jb0290/=9l5d`9m51g=9j10cnm50;&20g<ci2d:8l4>d:9lg4<72-;?n7jn;o37e?7b32eh<7>5$06a>ag<f8>j6<h4;h35`?6=,8>i6<8j;o37e?6<3`;=o7>5$06a>40b3g;?m7?4;h35f?6=,8>i6<8j;o37e?4<3`;=m7>5$06a>40b3g;?m7=4;h4a>5<#9=h1:n5a15c94>=n>h0;6)?;b;4`?k73i3;07d87:18'51d=>j1e=9o52:9j22<72-;?n78l;o37e?5<3`<=6=4+15`92f=i9=k1865f6483>!73j3<h7c?;a;78?l03290/=9l56b9m51g=>21b:>4?:%37f?0d3g;?m794;h41>5<#9=h1:n5a15c9<>=n>80;6)?;b;4`?k73i3307d8?:18'51d=>j1e=9o5a:9j1c<72-;?n78l;o37e?d<3`?o6=4+15`92f=i9=k1o65f5b83>!73j3<h7c?;a;f8?l3e290/=9l56b9m51g=m21b9l4?:%37f?0d3g;?m7h4;h7:>5<#9=h1:n5a15c955=<a<21<7*>4c85g>h6<h0:=65f5683>!73j3<h7c?;a;31?>o2>3:1(<:m:7a8j42f28907d;::18'51d=>j1e=9o51598m02=83.:8o49c:l20d<6=21b;?4?:%37f?0d3g;?m7?9;:k45?6=,8>i6;m4n06b>41<3`=;6=4+15`92f=i9=k1=554i7d94?"6<k0=o6`>4`82=>=n>l0;6)?;b;4`?k73i3;j76g9d;29 42e2?i0b<:n:0`8?l0>290/=9l56b9m51g=9j10e8k50;&20g<1k2d:8l4>d:9j16<72-;?n78l;o37e?7b32c>>7>5$06a>3e<f8>j6<h4;|q206<72mq6=:;515:8943b2li01<;j:df8943b28>m70?:f;g`?872n3oo70?:f;37b>;6>90no63>618f`>;6>90:8k521739af=:9?;1ii52173951`<uz;?87>5bey>522=n816=8k51e9>50c=9j16=8k5209>50c=:916=8k51g9>50c=9016=8k5199>50c=:j16=8k52c9>50c=:l16=8k5299>50c=:>16=8k58b9>50c=0k16=8k5889>50c=0116=8k5869>50c=0?16=8k5849>50c=0=16=8k5829>50c=0;16=8k5809>50c=0916=8k57d9>50c=?m16=8k57b9>50c=?k16=8k57`9>50c=?016=8k5799>50c=?>16=8k5779>50c=?<16=8k5929>50c=1;16=8k59b9>50c=1k16=8k59`9>50c=9=o01<;j:073?872m3;>=63>5g82`>;6=o0:o63>5g815>;6=o09<63>5g82b>;6=o0:563>5g82<>;6=o09o63>5g81f>;6=o09i63>5g81<>;6=o09;63>5g8;g>;6=o03n63>5g8;=>;6=o03463>5g8;3>;6=o03:63>5g8;1>;6=o03863>5g8;7>;6=o03>63>5g8;5>;6=o03<63>5g84a>;6=o0<h63>5g84g>;6=o0<n63>5g84e>;6=o0<563>5g84<>;6=o0<;63>5g842>;6=o0<963>5g8:7>;6=o02>63>5g8:g>;6=o02n63>5g8:e>;6=o0:8h5214d9506<58?m6<;>;<354?7c34;=<7?l;<354?4634;=<7<?;<354?7a34;=<7?6;<354?7?34;=<7<l;<354?4e34;=<7<j;<354?4?34;=<7<8;<354?>d34;=<76m;<354?>>34;=<767;<354?>034;=<769;<354?>234;=<76;;<354?>434;=<76=;<354?>634;=<76?;<354?1b34;=<79k;<354?1d34;=<79m;<354?1f34;=<796;<354?1?34;=<798;<354?1134;=<79:;<354??434;=<77=;<354??d34;=<77m;<354??f34;=<7?;e:?225<6=916=;>51438940628n01<8>:0a894062;;01<8>:328940628l01<8>:0;8940628201<8>:3a894062;h01<8>:3g894062;201<8>:35894062?h01<8>:7c894062?201<8>:70894062?;01<8>:72894062<301<8>:4:894062<=01<8>:62894062?l01<8>:7g8940621i01<8>:9`8940621301<8>:9:8940621=01<8>:948940621?01<8>:968940621901<8>:908940621;01<8>:92894062>o01<8>:6f894062>i01<8>:6`894062>k01<8>:6;894062>201<8>:65894062><01<8>:678940620901<8>:808940620;01<8>:828940621l01<8>:858940620<01<8>:878940620>01<8>:8a8940620h01<8>:8c8940620301<8>:06f?87193;><63>608214=z{;i>6=4={_0`1>;6=l0h<6s|2b494?4|V;i=70?:e;a2?xu5l80;6?uQ2e38943b2ji0q~<kc;296~X5lj16=8k5d69~w7c72909wS<j0:?21`<cj2wx>h?50;0xZ7c634;>i7jl;|q1a7<72;qU>h<4=07f>ab<uz8n?7>52z\1a6=:9<o1hh5rs3g7>5<5sW8n863>5d8f3>{t:l?1<7<t^3g6?872n3i;7p}=c683>7}Y:j=01<;i:b38yv4d03:1>vP=c99>50`=kj1v?m6:181[4d127:9k4k7:p6fg=838pR?mn;<36b?be3ty9oo4?:3y]6fd<58?m6im4}r0`g?6=:rT9on5214d9`a=z{;io6=4={_0``>;6=o0oi6s|2bg94?4|V;in70?:f;g4?xu5ko0;6?uQ2bd894072j:0q~<k0;296~X5l916=;>5c09~w7b52909wS<k2:?225<dk2wx>i=50;0xZ7b434;=<7j8;|q1`1<72;qU>i:4=043>ad<uz8o97>52z\1`0=:9?:1hn5rs3f5>5<5sW8o:63>618g`>{t:m=1<7<t^3f4?87183nn7p}=d983>7}Y:m201<8?:d58yv4c13:1>vP=d89>537=k91v?jn:181[4ci27::<4l1:p6ad=838pR?jm;<355?ed3ty9hi4?:3y]6ab<58<:6i94}r0ga?6=:rT9hh521739`g=z{;>?6=4={_070>;6=l02i6s|25794?4|V;>>70?:e;;e?xu5>m0;6?uQ27f8943b2hk0q~<88;296~X5?116=8k5b49~w7>42909wS<73:?21`<e12wx>5k50;0xZ7>b34;>i7ln;|q1=<<72;qU>474=07f>gd<uz8j87>52z\1e1=:9<o1nn5rs3ce>5<5sW8jj63>5d8f6>{t:kk1<7<t^3`b?872n33n7p}=4783>7}Y:=<01<;i:8d8yv4293:1>vP=509>50`=ih1v?;l:181[42k27:9k4m5:p630=838pR?89;<36b?d>3ty9::4?:3y]631<58?m6oo4}r05<?6=:rT9:55214d9fg=z{;<26=4={_05=>;6=o0io6s|27c94?4|V;<j70?:f;g1?xu5>k0;6?uQ27`8940720o0q~<9c;296~X5>j16=;>59g9~w70b2909wS<9e:?225<fi2wx>;h50;0xZ70a34;=<7l:;|q135<72;qU>:>4=043>g?<uz8<=7>52z\134=:9?:1nl5rs351>5<5sW8<>63>618af>{t:>91<7<t^350?87183hh7p}=7583>7}Y:>>01<8?:d08yv40=3:1>vP=749>537=1l1v?99:181[40>27::<46f:p621=838pR?98;<355?gf3ty9;44?:3y]62?<58<:6o;4}r04e?6=:rT9;l521739f<=z{;=i6=4={_04f>;6=l0ih6s|26a94?4|V;=h70?:e;`f?xu5?m0;6?uQ26f8943b2h:0q~<8e;296~X5?l16=8k5a09~w71a2909wS<8f:?21`<f:2wx>5>50;0xZ7>734;>i7o<;|q1<4<72;qU>5?4=07f>d2<uz83>7>52z\1<7=:9<o1m85rs3:7>5<5sW83863>5d8f7>{t:1?1<7<t^3:6?872n3ho7p}=8783>7}Y:1<01<;i:cg8yv4??3:1>vP=869>50`=i91v?67:181[4?027:9k4n1:p6=?=838pR?66;<36b?g53ty94l4?:3y]6=g<58?m6l=4}r0;f?6=:rT94o5214d9e1=z{;2h6=4={_0;g>;6=o0j96s|29f94?4|V;2o70?:f;g0?xu50o0;6?uQ29d894072kn0q~<60;296~X51916=;>5bd9~w7?62909wS<61:?225<f82wx>4<50;0xZ7?534;=<7o>;|q1=6<72;qU>4=4=043>d4<uz8287>52z\1=1=:9?:1m>5rs3;6>5<5sW82963>618b0>{t:0<1<7<t^3;5?87183k>7p}=9683>7}Y:0=01<8?:d18yv4>03:1>vP=999>537=jm1v?7n:181[4>i27::<4me:p6<d=838pR?7m;<355?g73ty95n4?:3y]6<e<58<:6l?4}r0:`?6=:rT95i521739e7=z{;3n6=4={_0:a>;6=l0j:6s|28d94?4|V;3m70?:e;c4?xu5i90;6?uQ2`28943b2h20q~<n1;296~X5i816=8k5a89~w7g52909wS<n2:?21`<fj2wx>l=50;0xZ7g434;>i7ol;|q1e0<72;qU>l;4=07f>db<uz8j:7>52z\1e3=:9<o1mh5rs3c4>5<5sW8j;63>5d8f0>{t:h21<7<t^3c;?872n3k=7p}=a883>7}Y:h301<;i:`58yv4fi3:1>vP=a`9>50`=i11v?om:181[4fj27:9k4n9:p6de=838pR?ol;<36b?ge3ty9mi4?:3y]6db<58?m6lm4}r0ba?6=:rT9mh5214d9ea=z{;h;6=4={_0a4>;6=o0ji6s|2c394?4|V;h:70?:f;g7?xu5j;0;6?uQ2c0894072h<0q~<m3;296~X5j:16=;>5a69~w7d32909wS<m4:?225<f02wx>o;50;0xZ7d234;=<7o6;|q1f3<72;qU>o84=043>dd<uz8i;7>52z\1f2=:9?:1mn5rs3`;>5<5sW8i463>618b`>{t:k31<7<t^3`:?87183kn7p}=bc83>7}Y:kh01<8?:d68yv4ek3:1>vP=bb9>537=i?1v?lk:181[4el27::<4n7:p6gc=838pR?lj;<355?g?3ty9nk4?:3y]6g`<58<:6l74}r0`4?6=:rT9o=521739eg=z{;i:6=4={_0`5>;6=l0jj6s|2b094?4|V;i970?:e;`3?xu5k:0;6?uQ2b18943b2k;0q~<l4;296~X5k=16=8k5b39~w7202909wS<;7:?21`<e;2wx>9650;0xZ72?34;>i7l;;|q10<<72;qU>974=07f>g0<uz8?m7>52z\10d=:9<o1n:5rs36a>5<5sW8?n63>5d8f1>{t:=i1<7<t^36`?872n3km7p}=4e83>7}Y:=n01<;i:c28yv43m3:1>vP=4d9>50`=j81v?:i:181[43n27:9k4m2:p606=838pR?;?;<36b?d43ty99?4?:3y]604<58?m6o:4}r067?6=:rT99>5214d9f3=z{;??6=4={_060>;6=o0i;6s|24794?4|V;?>70?:f;g6?xu5=?0;6?uQ244894072hl0q~<:7;296~X5=>16=;>5b19~w73?2909wS<:8:?225<e92wx>8750;0xZ73>34;=<7l=;|q11d<72;qU>8o4=043>g5<uz8>n7>52z\11g=:9?:1n95rs37g>5<5sW8>h63>618a2>{t:<o1<7<t^37f?87183h<7p}=5g83>7}Y:<l01<8?:d78yv4183:1>vP=619>537=io1v?8>:181[41927::<4m0:p634=838pR?8=;<355?d63ty9:>4?:3y]635<58<:6o<4}r050?6=:rT9:9521739f6=z{8k:6=4:{_3b5>;6=l0?963>5g871>;6>90?963>60871>{t9h:1<7;t^0c3?872m3>;70?:f;63?87183>;70?91;63?xu5::0;6?uQ2318943b2>90q~<=4;296~X5:=16=8k5759~w74a2909wS<=f:?21`<0n2wx>>o50;0xZ75f34;>i76n;|q17`<72;qU>>k4=07f>=c<uz88j7>52z\17c=:9<o14k5rs363>5<5sW8?<63>5d8:4>{t:=;1<7<t^362?872m33:7p}=4383>7}Y:=801<;j:8;8yv43;3:1>vP=429>50`=?:1v?<::181[45=27:9k484:p670=838pR?<9;<36b?1a3ty9>:4?:3y]671<58?m65o4}r01<?6=:rT9>55214d9<`=z{;826=4={_01=>;6=o03j6s|23c94?4|V;8j70?:f;;3?xu5:k0;6?uQ23`8943a20;0q~<=c;296~X5:j16=8h5989~w74c2909wS<=d:?225<0;2wx>?k50;0xZ74b34;=<79;;|q175<72;qU>>>4=043>2`<uz88=7>52z\174=:9?:14l5rs311>5<5sW88>63>618;a>{t::91<7<t^310?871832m7p}=3583>7}Y::>01<8?:828yv44=3:1>vP=349>536=181v?=9:181[44>27::=469:p661=838pR?=8;<355?143ty9?54?:3y]66><58<:6::4}r00=?6=:rT9?45217393c=z{;9i6=4={_00f>;6>803m6s|22a94?4|V;9h70?91;:f?xu60=0;68uQ1968943b2;l01<;i:3d894072;l01<8>:3d8yv7?=3:19vP>849>50c=;916=8h5319>536=;916=;?5319~w4>1290>wS?76:?21`<4927:9k4<1:?225<4927::<4<1:p5=1=83?pR<68;<36a?5534;>j7==;<354?5534;==7==;|q2<=<72<qU=564=07f>65<58?m6>=4=043>65<58<:6>=4}r3;=?6==rT:445214g971=:9<l1?952172971=:9?;1?95rs0:b>5<2sW;3m63>5d801>;6=o08963>61801>;6>80896s|19`94?3|V82i70?:e;0:?872n38270?90;0:?87193827p}>8b83>0}Y91i01<;j:3c8943a2;k01<8?:3c894062;k0q~<j9;2954}Y:l301<;j:04g?872m3;=o63>5d822g=:9<o1=;o4=07e>40c34;>j7?9c:?21c<6>k16=8h517c8940728<o70?90;35g>;6>90::o52172953g<58<:6<8k;<355?71k27::<4>6c9>537=9?k0q~?n2;296~X6i;16=8k5539~w4g42909wS?n3:?21`<2;2wx=nl50;0xZ4ee34;>i7;j;|q2`3<72;qU=i84=07f>3?<uz;n=7>52z\2a4=:9<o1:i5rs0g`>5<5sW;no63>5d85a>{t9o=1<7<t^0d4?872m3<m7p}=0383>7}Y:9801<;j:628yv47l3:1>vP=0e9>50c=1=1v??7:181[46027:9k4:2:p5d2=838pR<o;;<36b?343ty:mk4?:3y]5d`<58?m68k4}r3ae?6=:rT:nl5214d92<=z{8i?6=4={_3`0>;6=o0=h6s|1b794?4|V8i>70?:f;4f?xu6k?0;6?uQ1b48943a2?l0q~?l7;296~X6k>16=8h5719~w4e?2909wS?l8:?21c<><2wx=n750;0xZ4e>34;=<7;=;|q2gd<72;qU=no4=043>05<uz;ho7>52z\2gf=:9?:19h5rs0ag>5<5sW;hh63>6185=>{t9jo1<7<t^0af?87183<o7p}>cg83>7}Y9jl01<8?:7g8yv7c83:1>vP>d19>536=>o1v<j>:181[7c927::=480:p5a4=838pR<j=;<354??33ty:h>4?:3y]5a5<58<:68<4}r3g0?6=:rT:h952173916=z{8n>6=4={_3g1>;6>80>i6s|1e594?4|V8n<70?91;4:?xu6l10;6?uQ1e:894062?n0q~?k9;296~X6l016=8k5709~w4bf2909wS?ka:?21`<0:2wx=il50;0xZ4be34;>i7;;;|q2`f<72;qU=im4=07f>03<uz;oh7>52z\2`a=:9<o19;5rs0ff>5<5sW;oi63>5d863>{t9ml1<7<t^0fe?872m3?37p}>e183>7}Y9l:01<;j:4;8yv7b:3:1>vP>e39>50c=1<1v<k<:181[7b;27:9k481:p5`2=838pR<k;;<36b?153ty:i84?:3y]5`3<58?m68:4}r3f2?6=:rT:i;5214d910=z{8o<6=4={_3f3>;6=o0>:6s|1d:94?4|V8o370?:f;74?xu6m00;6?uQ1d;8943a2<20q~?ja;296~X6mh16=8h5589~w4ce2909wS?jb:?21c<>=2wx=hj50;0xZ4cc34;=<79>;|q2a`<72;qU=hk4=043>24<uz;nj7>52z\2ac=:9?:1995rs0d3>5<5sW;m<63>61861>{t9o;1<7<t^0d2?87183?=7p}>f383>7}Y9o801<8?:458yv7a;3:1>vP>f29>536==11v<h;:181[7a<27::=4:9:p5c3=838pR<h:;<354??23ty:j;4?:3y]5c0<58<:6:?4}r3e<?6=:rT:j552173937=z{8l26=4={_3e=>;6>80>86s|1gc94?4|V8lj70?91;76?xu6nk0;6?uQ1g`894062<<0q~?ic;296~X6nj16=8k55`9~w4`c2909wS?id:?21`<2j2wx=kk50;0xZ4`b34;>i7;l;|q2bc<72;qU=kh4=07f>0b<uz8;<7>52z\145=:9<o19k5rs322>5<5sW8;=63>5d854>{t:991<7<t^320?872m3<:7p}=0583>7}Y:9>01<;j:708yv47=3:1>vP=049>50c=1?1v?>9:181[47>27:9k4:a:p651=838pR?>8;<36b?3e3ty9<54?:3y]65><58?m68m4}r03=?6=:rT9<45214d91a=z{;:j6=4={_03e>;6=o0>j6s|21`94?4|V;:i70?:f;43?xu58j0;6?uQ21a8943a2?;0q~<?e;296~X58l16=8h5639~w76a2909wS<?f:?21c<>>2wx><>50;0xZ77734;=<7;n;|q154<72;qU><?4=043>0d<uz8:>7>52z\157=:9?:19n5rs330>5<5sW8:?63>6186`>{t:8>1<7<t^337?87183?m7p}=1483>7}Y:8?01<8?:728yv46>3:1>vP=179>536=>81v??8:181[46?27::=492:p64?=838pR??6;<354??13ty9=l4?:3y]64g<58<:68o4}r02f?6=:rT9=o5217391g=z{;;h6=4={_02g>;6>80>o6s|20f94?4|V;;o70?91;7g?xu59l0;6?uQ20g894062<l0q~<>f;296~X59o16=8k5629~w7472909wS<=0:?21`<1<2wx>??50;0xZ74634;>i78:;|q167<72;qU>?<4=07f>30<uz;j97>52z\2e0=:9<o1::5rs0c5>5<5sW;j:63>5d85<>{t9h=1<7<t^0c4?872m3<j7p}>a983>7}Y9h201<;j:7`8yv7f13:1>vP>a89>50c=1>1v<on:181[7fi27:9k493:p5dd=838pR<om;<36b?033ty:mn4?:3y]5de<58?m6;;4}r3b`?6=:rT:mi5214d923=z{8kn6=4={_3ba>;6=o0=;6s|1c294?4|V8h;70?:f;4;?xu6j80;6?uQ1c38943a2?k0q~?m2;296~X6j;16=8h56c9~w4d42909wS?m3:?21c<>?2wx=o:50;0xZ4d334;=<78<;|q2f0<72;qU=o;4=043>32<uz;i:7>52z\2f3=:9?:1:85rs0`4>5<5sW;i;63>61852>{t9k21<7<t^0`;?87183<<7p}>b883>7}Y9k301<8?:7:8yv7ej3:1>vP>bc9>536=>h1v<ll:181[7ek27::=49b:p5gb=838pR<lk;<354??03ty:nh4?:3y]5gc<58<:6;=4}r3ab?6=:rT:nk52173921=z{8i;6=4={_3`4>;6>80=96s|1b394?4|V8i:70?91;45?xu6k;0;6?uQ1b0894062?=0q~?8c;291~X6?j16=8k5239>50`=:;16=;>5239>537=:;1v<9k:186[70l27:9h4=3:?21c<5;27::=4=3:?224<5;2wx=:k50;7xZ41b34;>i7<;;<36b?4334;=<7<;;<355?433ty:;k4?:4y]52`<58?n6?;4=07e>73<58<;6?;4=042>73<uz;3<7>55z\2<5=:9<o1>;5214d963=:9?:1>;52173963=z{82:6=4:{_3;5>;6=l0:m63>5g82e>;6>90:m63>6082e>{t9181<7;t^0:1?872m3;i70?:f;3a?87183;i70?91;3a?xu5m>0;6<?t^3g4?872m3;=463>5d8222=:9<o1=;84=07f>40234;>j7?98:?21c<6>>16=8h51748943a28<>70?90;35<>;6>90:::521729530<58<;6<8:;<355?71027::<4>669>537=9?<01<8>:046?x{i<<=1<7?tH041?xh3=10;6<uG1708yk2213:1=vF>639~j13f290:wE?92:m00d=83;pD<8=;|l71f<728qC=;<4}o66`?6=9rB::?5rn57f>5<6sA;=>6sa44d94?7|@8<97p`;6183>4}O9?80qc:91;295~N6>;1vb98=:182M71:2we8;=50;3xL4053td?:94?:0yK534<ug>=97>51zJ227=zf=<=6=4>{I356>{i<?=1<7?tH041?xh3>10;6<uG1708yk2113:1=vF>639~j10f290:wE?92:m03d=83;pD<8=;|l72f<728qC=;<4}o65`?6=9rB::?5rn54f>5<6sA;=>6sa47d94?7|@8<97p`;7183>4}O9?80qc:81;295~N6>;1vb99=:182M71:2we8:=50;3xL4053td?;94?:0yK534<ug><97>51zJ227=zf===6=4>{I356>{i<>=1<7?tH041?xh3?10;6<uG1708yk2013:1=vF>639~j11f290:wE?92:m02d=83;pD<8=;|l73f<728qC=;<4}o64`?6=9rB::?5rn55f>5<6sA;=>6sa46d94?7|@8<97p`;8183>4}O9?80qc:71;295~N6>;1vb96=:182M71:2we85=50;3xL4053td?494?:0yK534<ug>397>51zJ227=zf=2=6=4>{I356>{i<1=1<7?tH041?xh3010;6<uG1708yk2?13:1=vF>639~j1>f290:wE?92:m0=d=83;pD<8=;|l7<f<728qC=;<4}o6;`?6=9rB::?5rn5:f>5<6sA;=>6sa49d94?7|@8<97p`;9183>4}O9?80qc:61;295~N6>;1vb97=:182M71:2we84=50;3xL4053td?594?:0yK534<ug>297>51zJ227=zf=3=6=4>{I356>{i<0=1<7?tH041?xh3110;6<uG1708yk2>13:1=vF>639~j1?f290:wE?92:m0<d=83;pD<8=;|l7=f<728qC=;<4}o6:`?6=9rB::?5rn5;f>5<6sA;=>6sa48d94?7|@8<97p`;a183>4}O9?80qc:n1;295~N6>;1vb9o=:182M71:2we8l=50;3xL4053td?m94?:0yK534<ug>j97>51zJ227=zf=k=6=4>{I356>{i<h=1<7?tH041?xh3i10;6<uG1708yk2f13:1=vF>639~j1gf290:wE?92:m0dd=83;pD<8=;|l7ef<728qC=;<4}o6b`?6=9rB::?5rn5cf>5<6sA;=>6sa4`d94?7|@8<97p`;b183>4}O9?80qc:m1;295~N6>;1vb9l=:182M71:2we8o=50;3xL4053td?n94?:0yK534<ug>i97>51zJ227=zf=h=6=4>{I356>{i<k=1<7?tH041?xh3j10;6<uG1708yk2e13:1=vF>639~j1df290:wE?92:m0gd=83;pD<8=;|l7ff<728qC=;<4}o6a`?6=9rB::?5rn5`f>5<6sA;=>6sa4cd94?7|@8<97p`;c183>4}O9?80qc:l1;295~N6>;1vb9m=:182M71:2we8n=50;3xL4053td?o94?:0yK534<ug>h97>51zJ227=zf=i=6=4>{I356>{i<j=1<7?tH041?xh3k10;6<uG1708yk2d13:1=vF>639~j1ef290:wE?92:m0fd=83;pD<8=;|l7gf<728qC=;<4}o6``?6=9rB::?5rn5af>5<6sA;=>6sa4bd94?7|@8<97p`;d183>4}O9?80qc:k1;295~N6>;1vb9j=:182M71:2we8i=50;3xL4053td?h94?:0yK534<ug>o97>51zJ227=zf=n=6=4>{I356>{i<m=1<7?tH041?xh3l10;6<uG1708yk2c13:1=vF>639~j1bf290:wE?92:m0ad=83;pD<8=;|l7`f<728qC=;<4}o6g`?6=9rB::?5rn5ff>5<6sA;=>6sa4ed94?7|@8<97p`;e183>4}O9?80qc:j1;295~N6>;1vb9k=:182M71:2we8h=50;3xL4053td?i94?:0yK534<ug>n97>51zJ227=zf=o=6=4>{I356>{i<l=1<7?tH041?xh3m10;6<uG1708yk2b13:1=vF>639~j1cf290:wE?92:m0`d=83;pD<8=;|l7af<728qC=;<4}o6f`?6=9rB::?5rn5gf>5<6sA;=>6sa4dd94?7|@8<97p`;f183>4}O9?80qc:i1;295~N6>;1vb9h=:182M71:2we8k=50;3xL4053td?j94?:0yK534<ug>m97>51zJ227=zf=l=6=4>{I356>{i<o=1<7?tH041?xh3n10;6<uG1708yk2a13:1=vF>639~j1`f290:wE?92:m0cd=83;pD<8=;|l7bf<728qC=;<4}o6e`?6=9rB::?5rn5df>5<6sA;=>6sa4gd94?7|@8<97p`:0183>4}O9?80qc;?1;295~N6>;1vb8>=:182M71:2we9==50;3xL4053td><94?:0yK534<ug?;97>51zJ227=zf<:=6=4>{I356>{i=9=1<7?tH041?xh2810;6<uG1708yk3713:1=vF>639~j06f290:wE?92:m15d=83;pD<8=;|l64f<728qC=;<4}o73`?6=9rB::?5rn42f>5<6sA;=>6sa51d94?7|@8<97p`:1183>4}O9?80qc;>1;295~N6>;1vb8?=:182M71:2we9<=50;3xL4053td>=94?:0yK534<ug?:97>51zJ227=zf<;=6=4>{I356>{i=8=1<7?tH041?xh2910;6<uG1708yk3613:1=vF>639~j07f290:wE?92:m14d=83;pD<8=;|l65f<728qC=;<4}o72`?6=9rB::?5rn43f>5<6sA;=>6sa50d94?7|@8<97p`:2183>4}O9?80qc;=1;295~N6>;1vb8<=:182M71:2we9?=50;3xL4053td>>94?:0yK534<ug?997>51zJ227=zf<8=6=4>{I356>{i=;=1<7?tH041?xh2:10;6<uG1708yk3513:1=vF>639~j04f290:wE?92:m17d=83;pD<8=;|l66f<728qC=;<4}o71`?6=9rB::?5rn40f>5<6sA;=>6sa53d94?7|@8<97p`:3183>4}O9?80qc;<1;295~N6>;1vb8==:182M71:2we9>=50;3xL4053td>?94?:0yK534<ug?897>51zJ227=zf<9=6=4>{I356>{i=:=1<7?tH041?xh2;10;6<uG1708yk3413:1=vF>639~j05f290:wE?92:m16d=83;pD<8=;|l67f<728qC=;<4}o70`?6=9rB::?5rn41f>5<6sA;=>6sa52d94?7|@8<97p`:4183>4}O9?80qc;;1;295~N6>;1vb8:=:182M71:2we99=50;3xL4053td>894?:0yK534<ug??97>51zJ227=zf<>=6=4>{I356>{i===1<7?tH041?xh2<10;6<uG1708yk3313:1=vF>639~j02f290:wE?92:m11d=83;pD<8=;|l60f<728qC=;<4}o77`?6=9rB::?5rn46f>5<6sA;=>6sa55d94?7|@8<97p`:5183>4}O9?80qc;:1;295~N6>;1vb8;=:182M71:2we98=50;3xL4053td>994?:0yK534<ug?>97>51zJ227=zf<?=6=4>{I356>{i=<=1<7?tH041?xh2=10;6<uG1708yk3213:1=vF>639~j03f290:wE?92:m10d=83;pD<8=;|l61f<728qC=;<4}o76`?6=9rB::?5rn47f>5<6sA;=>6sa54d94?7|@8<97p`:6183>4}O9?80qc;91;295~N6>;1vb88=:182M71:2we9;=50;3xL4053td>:94?:0yK534<ug?=97>51zJ227=zf<<=6=4>{I356>{i=?=1<7?tH041?xh2>10;6<uG1708yk3113:1=vF>639~j00f290:wE?92:m13d=83;pD<8=;|l62f<728qC=;<4}o75`?6=9rB::?5rn44f>5<6sA;=>6sa57d94?7|@8<97p`:7183>4}O9?80qc;81;295~N6>;1vb89=:182M71:2we9:=50;3xL4053td>;94?:0yK534<ug?<97>51zJ227=zf<==6=4>{I356>{i=>=1<7?tH041?xh2?10;6<uG1708yk3013:1=vF>639~j01f290:wE?92:m12d=83;pD<8=;|l63f<728qC=;<4}o74`?6=9rB::?5rn45f>5<6sA;=>6sa56d94?7|@8<97p`:8183>4}O9?80qc;71;295~N6>;1vb86=:182M71:2we95=50;3xL4053td>494?:0yK534<ug?397>51zJ227=zf<2=6=4>{I356>{i=1=1<7?tH041?xh2010;6<uG1708yk3?13:1=vF>639~j0>f290:wE?92:m1=d=83;pD<8=;|l6<f<728qC=;<4}o7;`?6=9rB::?5rn4:f>5<6sA;=>6sa59d94?7|@8<97p`:9183>4}O9?80qc;61;295~N6>;1vb87=:182M71:2we94=50;3xL4053td>594?:0yK534<ug?297>51zJ227=zf<3=6=4>{I356>{i=0=1<7?tH041?xh2110;6<uG1708yk3>13:1=vF>639~j0?f290:wE?92:m1<d=83;pD<8=;|l6=f<728qC=;<4}o7:`?6=9rB::?5rn4;f>5<6sA;=>6sa58d94?7|@8<97p`:a183>4}O9?80qc;n1;295~N6>;1vb8o=:182M71:2we9l=50;3xL4053td>m94?:0yK534<ug?j97>51zJ227=zf<k=6=4>{I356>{i=h=1<7?tH041?xh2i10;6<uG1708yk3f13:1=vF>639~j0gf290:wE?92:m1dd=83;pD<8=;|l6ef<728qC=;<4}|~DEE|?991mo?89042yEFEs9wKL]ur@A
\ No newline at end of file
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.6e
$3g:44<,[o}e~g`n;"2*736(-30<=>?0123416<89:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?012345679<1:>54FNQWW>aoii!;9;7>&16926=<H]]Z^X7j`uuc+571=8 ;?7<:5IORVP?GCL[K#=>4?)06851<NFY__6LJKRC*27?6.991:6D@_UU8tad.729#:<6?5IORVP?qbj!:1<$?=;209MKVR\3NBM%=>:1+26>552@D[YY4KIC*05?6.9:18>7GAPTV9`lhe :;1<$?<;209KPRW]]0OCL&<1;2*56=4:3E^X][[:EMA,67=8 ;>7><5OTVSQQ<cg|~i$>?50(32?1<NFY__6IG_A)194,763=0BB][[:EKSF-5=8 ;;794FNQWW>RCF :0;%<>44;KMTPR=_LH#?7>&1397>JSSX\^1HB^N(283-44<<3E^X][[:EMSF-5=8 l0:~bw44vecb2?<$8:>695IORVP?gcl{k#:7>&139:>LHW]]0jhi|m(983-==FLMXJ$='7;@FGVD.6!01JHI\N(02*=>GCL[K#=<'6;@FGVD.6: 30MIJ]A)30-g=FLMXJ$<=50(:8EABUI!8"46OKDSC+7,><IMNYM%:&8:CG@WG/= 20MIJ]A)4*<>GCL[K#;$64AEFQE->.02KOH_O'9(:8EABUJ!:"46OKDS@+5,?<IMNYN%??)89B@ATE 8;"56OKDS@+57/>3HNO^O&>3(`8EABUJ!;86='7;@FGVG.5!11JHI\M(2+;?DBCZK"?%55NDEPA,0/?3HNO^O&9)99B@ATE >#37LJKRC*;-==FLMXI$4'<;@NO<>DR[VCEJB<4CD31?FNBKBUGENKASD]W]UC33JF@<;5LLJ3;43=DDB8<<85LLJ0[<>EKC;R:4=;4CMI:41=DDBK>7NBDA058GIMF9M8<7NBDA0F73>EKCH;O495LLJ@6?FJLJ8?0OAEL149@HNB6=2IGGIXl;BNH@SYCA_COI85LLJD[<>EKCOR:4=74CNONMQRBL8>0OB\J_FGMAWGSAFDTECH@7:AQADRBLj1OMYOPWHFWLZGd3MK_MRYFDUJ\F3=CAH";%;5KI@*2-2=CAH":<$94DHC+54/03MCJ$<<&7:FJE-74!>1OEL&>4(58@LG/9<#<7IGN(04*3>BNI!;<%:5KI@*2<,1<L@K#=4'9;EKB,7/03MCJ$?>&7:FJE-46!>1OEL&=2(58@LG/::#<7IGN(36*3>BNI!8>%:5KI@*12,1<L@K#>:'8;EKB,7>.?2NBM%<6)79GMD.4!>1OEL&<0(58@LG/;8#27IGN(2394,0<L@K#8$84DHC+1,0<L@K#:$84DHC+3,0<L@K#4$84DHC+=,0<L@H#<$84DH@+5,1<L@H#=='8;EKA,47.?2NBN%?=)69GMG.6; =0HDL'15+4?AOE 8?";6JFB)35-2=CAK":;$94DH@+5=/03MCI$<7&6:FJF-4.?2NBN%<?)69GMG.59 =0HDL'23+4?AOE ;9";6JFB)07-2=CAK"99$94DH@+63/03MCI$?9&7:FJF-4?!>1OEO&=9(48@LD/; =0HDL'31+4?AOE :;"56JFB)12>5/13MCI$9'9;EKA,0/13MCI$;'9;EKA,2/13MCI$5'9;EKA,</03MC[M%>&7:FJTD.6!>1OE]O'2(58@LVF :#27IG_A)194,1<L@ZI$='8;EKSF-7.?2NB\O&=)69GMUD/; 30HD^M(283-3=CGH";%;5KO@*2-2=CGH":<$94DNC+54/03MEJ$<<&7:FLE-74!>1OCL&>4(58@JG/9<#<7IAN(04*3>BHI!;<%:5KO@*2<,1<LFK#=4'9;EMB,7/03MEJ$?>&7:FLE-46!>1OCL&=2(58@JG/::#<7IAN(36*3>BHI!8>%:5KO@*12,1<LFK#>:'8;EMB,7>.?2NDM%<6)79GKD.4!>1OCL&<0(58@JG/;8#27IAN(2394,0<LFK#8$84DNC+1,0<LFK#:$84DNC+3,0<LFK#4$84DNC+=,1<LFKT^HI9;EMA,5/13MEI$<'8;EMA,46.?2NDN%?>)69GKG.6: =0HBL'12+4?AIE 8>";6J@B)36-2=CGK"::$94DN@+52/03MEI$<6&7:FLF-7>!?1OCO&=)69GKG.58 =0HBL'20+4?AIE ;8";6J@B)00-2=CGK"98$94DN@+60/03MEI$?8&7:FLF-40!>1OCO&=8(58@JD/:0#=7IAM(2+4?AIE ::";6J@B)12-<=CGK"8=7>&6:FLF-2.>2NDN%;&6:FLF-0.>2NDN%9&6:FLF->.>2NDN%7&7:FLFZTBO>1OC]O'0(58@JVF 8#<7IA_A)0*3>BHXH"8%45KOQC+7?6.?2ND\O&?)69GKUD/9 =0HB^M(3+4?AIWJ!9"56J@PC*0>5/43LDJ?6KABc9FJZTT\[KFSLl4EO]QWQTFEVH>7KOCSD38C6=@FM20ECG[P^23<>OIA]ZT<<64IOKWTZ6502CEEY^P02:8MKOSXV:?46GAIUR\40><AGC_\R>98:KMMQVX8>=0ECG[_124?LHN\V::;6GAIU]362=NF@^T<>94IOKW[5203@DBXR>:7:KMMQY7>>1BBDZP0658MKOSW92<7D@FT^2:3>OIA]U;M:5FNHV\4G1<AGC_S=M8;HLJPZ6C?2CEEYQ?E69JJLRX8O=0ECG[_024?LHN\V;:;6GAIU]262=NF@^T=>94IOKW[4203@DBXR?:7:KMMQY6>>1BBDZP1658MKOSW82<7D@FT^3:3>OIA]U:M:5FNHV\5G1<AGC_S<M8;HLJPZ7C?2CEEYQ>E69JJLRX9O=0ECG[_324?LHN\V8:;6GAIU]162=NF@^T>>94IOKW[7203@DBXR<:7:KMMQY5>>1BBDZP2658MKOSW;2<7D@FT^0:3>OIA]U9M:5FNHV\6G1<AGC_S?M8;HLJPZ4C?2CEEYQ=E69JJLRX:O=0ECG[_224?LHN\V9:;6GAIU]062=NF@^T?>94IOKW[6203@DBXR=:7:KMMQY4>>1BBDZP3658MKOSW:2<7D@FT^1:3>OIA]U8M:5FNHV\7G1<AGC_S>M8;HLJPZ5C?2CEEYQ<E69JJLRX;O<0ECG[_@48MKOSWK30ECG[_GKOA3=KGHNNH;5COBIF@2=KGNCHMAm4M`hlvScu{`eeo6CfnnpUawungg80B<94NDVTKWM33GEEI:5@.52g[I2<XHX_m6^FN^@VWLB_j2ZBBRLZSOCNA3=W[MEEIl5]AL@22GQBZ?1YIJMJA79QABEBJ=1Y_YO;;SQWF2=U[]^R\Hk4RRV\TWOHZ@^RSLk4RRV\TWOHZ@^RSO?<;RKN[FIKD@YBCCQLHDAHe>UNEVNNZDMJ6:QLQWEB02Y[M_ZNN758WWPFDVK<7^\YAM]A2>USI]_X86]VNB68P\VB?:1^<"v|t^`ooZkbeVmnbh|ntnp,ckgsaoiaj aaukuaZdkcVgnaRijn.tbhlb)kz~y#oblnms_5[)zhg%~"}9_omjjlr)zhg$X_[J_ER-TWOJ91$ym`9<;T2,|vrXjeaTahcPgdlfvdrhz&memygyecod*kgsaoTnaePmdo\c`h(~hfbh#m|ts-qehjhgyQ:Q#|nm/p,w3Yig`dbx#|nm.VQQ@YCX'ZYE@?7.scn36=R8&rxxRlck^ofiZabflxjxb| gocwmsceen$emygye^`ooZkbeVmnb"xnlhf-gvru'{kf`ba[3_-vdk)z&y=Scafnhv-vdk(\[_NSI^!PSKN5=(uid=87X> xrv\fimXelgTkh`jr`vlv*aii}c}ioch.ocwmscXjeaTahcPgdl,rdjnl'ixx!}alnlku]4U'xja#| s7]mklhn|'xja"Z]UD]GT+VUAD;3"obc:WPAWYQAZCI@H74VHGT[Q_WM?1\IL&?)79TAD.6!?1\IL&=)79TAD.4!11\IL&<:1+5?RCE 9#=7ZKM(0+5?RCE ;#=7ZKM(2+;?RCE :0;%o5XRHVF[COU[]i0[_G[E^OL@@YFk2]YEYKPMNFF[G7c3QCGECV"XE@#4+7'[]_I,= > @Q@ML0<PZ^GEO94XRV\CKBe3QUHC_KPIODL2>^cjVCoj6Vkh^RqmhPbzzcdb<>4Xeo\Idlhz_oydaa119[`hYJageyZh||inl0?]us02koho'0(:8eabui!;"46okdsc+6,><imnym%=&8:cg`wg/< 20mij}a)7*<>gcl{k#:$o4aefqe-0=8 20mij}b)2*<>gcl{h#=$64aefqf-4.02kohl'3(:8eabuj!>"46okds`+1,><imnyn%8&8:cg`wd/? 20mij}b):*e>gcl{h#47>&199ahnYjmdUlicQheogqmfYd{}x:46lck^ofiZabfVzye`Qxievk[47?3kf`S`kb_fgm[utneV}bhyfP20:8fimXelgTkh`Ppskn[roc|aU8=55mlj]nahY`mgU{~dcPwhfwlZ26l2hggRcjm^efjZvuadU|~l~es]p2Z76l2hggRcjm^efjZvuadU|~l~es]p2Z46l2hggRcjm^efjZvuadU|~l~es]p2Z56l2hggRcjm^efjZvuadU|~l~es]p2Z2a3kf`S`kb_fgm[qiw991i`fQbel]dakYq>V;9o6lck^ofiZabfV|=S<"/Xhnjj}&DG[O+Kh`jr`vlv%74&8;?7obd_lgn[bciW<T=Rv|t028fimXelgTkh`Pv7]06g=edbUfi`Qheo]u2Z5+jeaTahcPgdl\r3Y6$GEEI!@@ND6`b>dkcVgnaRijn^t5[6*edbUfi`Qheo]u2Z7+sjUjhi|n_vkgpm;0$jUjhi|m_vkgpm;>$jUj`ja}iujn94*dWhrbSdjPwhfwl82+kVkseR}cawg\p|vb59&hSlvf_u{sa87+kVhrxhQ|i{g>=)eXkfgfccQllj?3(fYcmok~`yQkauc>4)eXl`yjnakPw`pm[gnqWjeg`0>#c^fjwddkmV}j~cQmhw]qekab59&hShbnbnpbpliiWmcy1"ois.afvk(d`&oek"kka.agwZstm{y$kkk}n`lg+uthbli"zkc.qqg*owWjeyi~!bel]`kwc(|dz$Sni /-a\bdkndp7x|l|{ao4/gZnf{VkseRgk=1.`[mgtWldj1<"l_icp[`he58&hSeo|_hliafrbz{7; nQgar]nahYh}}z~xR|jgr]b95*dWakxS`kb_nwwtprXzlmxSo3>,b]kevYj}qUdyy~zt^pfcvYf59&hSeo|_lw{[jssx|~T~hi|_c?3(fYoizUyijmja<2/gZnf{Vxnknkm=1.`[mgtW{ym0>#c^jbwZtt|k7; nQgar]pkcrbkjUbb}{{_sgdwZg:8%iTdl}PsndwafeXg|~{yyQ}efq\f86+kVceeyQiimg\jdkb5geTobkPfhnf[iiflln'oRgaiuc\rdj:8%iTecg{b^tbh86+kVcexh|iabg\p|vb59&hSaand^kmmqYaaeo6<!mPmdo\p|vb5;&hS`{w_qksaioimVymjk|=1.`[utneV~r|h3>,b]qadbXllzdRo213:/gZtbimUoi}zg_c?657*dW{ojhRyfduj\e8750%iT~hok_vkgpmYe5:8'oR||t^rqmjtn|pUj1NK#c^pppZvuafxbxtQm=BG/gZtt|V~r|h3\YOA/gZtt|{kfSl3?,b]qwqtfeVh6<!mPsho\gjjkazcdbRmgebi>EIJ+kVxiRlvtd]tad;7$jU~hQmyug\s`d:8%iTy~kPdddbqirXlh~j1="l_tqf[`ed59&hSx}j_rmep`ed59&hSzkn_vkgpm;6$jU|ioQxievk94*dW~xbxhQkeqvk[d;6:1&hSz|ftd]gauroWk7>=?"l_vpjp`YjgmoTm0Y]IUG\BLTT\%iT{g{e^ol``Ye5^XBXHQIISQW(fYpz`~nSzgkti]b944?$jU|~dzj_vkgpmYe5:8'oRvkewk`acgjaes6}o}t`l5y45<jeaTahcPiorvpZdkgja:86lck^ofiZir|ySob`cj68gimf<2iggo94dhlb,5/03mcem%?&8:fjjd.68 30hd`n(023-<=cagk#==?&9:fjjd.68;#27igaa)337,?<l`dj$<>;)89gmkg/99?"56jfn`*243/>3mcem%??7(;8`lhf 8:3%45kioc+55?.02nbbl&>1(;8`lhf 8;;%45kioc+547.12nbbl&>13+:?aoii!;:?$74dhlb,473!01oeco'107*=>bnfh":=;'6;ekme-76? 30hd`n(03;-<=cagk#=<7&8:fjjd.6: 30hd`n(003-<=cagk#=??&9:fjjd.6:;#27igaa)317,?<l`dj$<<;)89gmkg/9;?"56jfn`*263/>3mcem%?=7(`8`lhf 88<6='7;ekme-74!11oeco'15+;?aoii!;>%55kioc+53/?3mcem%?8)99gmkg/91#37igaa)3:-2=cagk#>$64dhlb,76.02nbbl&=1(:8`lhf ;8"46jfn`*17,><l`dj$?:&8:fjjd.5= 20hd`n(34*<>bnfh"9;$64dhlb,7>.02nbbl&=9(58`lhf :#37igaa)13-==cagk#?<'7;ekme-55!11oeco'32+;?aoii!9?%55kioc+70/?3mcem%=9)99gmkg/;>#37igaa)1;-==cagk#?4'8;ekme-2.02nbbl&;0(:8`lhf =;"46jfn`*76,><l`dj$9=&8:fjjd.3< 20hd`n(57*<>bnfh"?:$64dhlb,11.02nbbl&;8(:8`lhf =3";6jfn`*6-==cagk#9='7;ekme-36!11oeco'53+;?aoii!?8%55kioc+11/?3mcem%;:)99gmkg/=?#37igaa)74-==cagk#95'7;ekme-3>!>1oeco'6(:8`lhf ?:"46jfn`*55,><l`dj$;<&8:fjjd.1; 20hd`n(76*<>bnfh"=9$64dhlb,30.02nbbl&97(:8`lhf ?2"46jfn`*5=,1<l`dj$:'7;ekme-17!11oeco'70+;?aoii!=9%55kioc+36/?3mcem%9;)99gmkg/?<#37igaa)55-==cagk#;:'7;ekme-1?!11oeco'78+4?aoii!2"46jfn`*;4,><l`dj$5?&8:fjjd.?: 20hd`n(91*<>bnfh"38$64dhlb,=3.02nbbl&76(:8`lhf 1="46jfn`*;<,><l`dj$57&7:fjjd.>!11oeco'91+;?aoii!3:%55kioc+=7/?3mcem%7<)99gmkg/1=#37igaa);6-==cagk#5;'7;ekme-?0!11oeco'99+;?aoii!32%:5kio`+4,1<l`di$<'7;ekmf-77!11oecl'10+;?aoij!;9%55kio`+56/?3mcen%?;)99gmkd/9<#37igab)35-==cagh#=:'7;ekmf-7?!11oecl'18+4?aoij!8"46jfnc*14,><l`di$??&8:fjjg.5: 20hd`m(31*<>bnfk"98$64dhla,73.02nbbo&=6(:8`lhe ;="46jfnc*1<,><l`di$?7&7:fjjg.4!11oecl'31+;?aoij!9:%l5kio`+74<7!>1oecl'4(58`lhe <#<7igab)4*3>bnfk"<%:5kio`+<,1<l`di$4'7;emvpd.7!11ocxzn(0+:?air|h":<$o4dnwwe-778 k0hb{{a)335,g<lfm%??2(c8`jssi!;;?$o4dnwwe-77< k0hb{{a)331,g<lfm%??6(c8`jssi!;;;$o4dnwwe-770 k0hb{{a)33=,?<lfm%?>)`9gkprf 8;;%l5kotvb,476!h1ocxzn(031-d=cg|~j$<?<)`9gkprf 8;?%l5kotvb,472!h1ocxzn(035-d=cg|~j$<?8)`9gkprf 8;3%l5kotvb,47>!01ocxzn(00*e>bh}}k#=?>&a:flqqg/9;;"m6j`uuc+574.i2ndyyo'131*e>bh}}k#=?:&a:flqqg/9;?"m6j`uuc+570.i2ndyyo'135*g>bh}}k#=?950(;8`jssi!;8%45kotvb,42.12ndyyo'14+:?air|h"::$74dnwwe-70!01ocxzn(0:*=>bh}}k#=4'7;emvpd.5!01ocxzn(32*=>bh}}k#><'6;emvpd.5: 30hb{{a)00-<=cg|~j$?:&9:flqqg/:<#27iazt`*12,?<lfm%<8)89gkprf ;2"56j`uuc+6</?3me~xl&<)89gkprf ::"56j`uuc+74/>3me~xl&<2(;8`jssi!98%45kotvb,62.12ndyyo'34+:?air|h"8:$74dnwwe-50!01ocxzn(2:*=>bh}}k#?4'7;emvpd.3!01ocxzn(52*=>bh}}k#8<'6;emvpd.3: 30hb{{a)60-<=cg|~j$9:&9:flqqg/<<#27iazt`*72,?<lfm%:8)89gkprf =2"56j`uuc+0</?3me~xl&:)89gkprf <:"56j`uuc+14/>3me~xl&:2(;8`jssi!?8%45kotvb,02.12ndyyo'54+:?air|h">:$74dnwwe-30!01ocxzn(4:*=>bh}}k#94'7;emvpd.1!01ocxzn(72*=>bh}}k#:<'6;emvpd.1: 30hb{{a)40-<=cg|~j$;:&9:flqqg/><#27iazt`*52,?<lfm%88)89gkprf ?2"56j`uuc+2</?3me~xl&8)89gkprf >:"56j`uuc+34/>3me~xl&82(;8`jssi!=8%45kotvb,22.12ndyyo'74+:?air|h"<:$74dnwwe-10!01ocxzn(6:*=>bh}}k#;4'7;emvpd.?!01ocxzn(92*=>bh}}k#4<'6;emvpd.?: 30hb{{a):0-<=cg|~j$5:&9:flqqg/0<#27iazt`*;2,?<lfm%68)89gkprf 12"56j`uuc+<</?3me~xl&6)89gkprf 0:"56j`uuc+=4/>3me~xl&62(;8`jssi!38%45kotvb,<2.12ndyyo'94+:?air|h"2:$74dnwwe-?0!01ocxzn(8:*=>bh}}k#54'7;emvpg.7!11ocxzm(0+:?air|k":<$74dnwwf-76!01ocxzm(00*=>bh}}h#=>'6;emvpg.6< 30hb{{b)36-<=cg|~i$<8&9:flqqd/9>#27iaztc*2<,?<lfn%?6)99gkpre ;#27iaztc*14,?<lfn%<>)89gkpre ;8"56j`uu`+66/>3me~xo&=4(;8`jssj!8>%45kotva,70.12ndyyl'26+:?air|k"94$74dnwwf-4>!11ocxzm(2+:?air|k"8<$74dnwwf-56!k1ocxzm(2394,><lfn%:&8:flqqd/= 20hb{{b)4*<>bh}}h#;$64dnwwf->.02ndyyl'9(18akg43ldi46`hccwjha0<lk#<$64wdc+4?6.>2}nn%>&8:uff-6=8 wKL}9?5:BC|4?02O0?6<u\4g8232<6<?0:??jj9g811a>bsg;<97?4n055>3=#9>91=;h4}R6g>41028>=6<==dd;e>73c1j1X=>k52d694?74:mo2j7<:d`78W1b=:l>1<7?<2eg:b?42lh20h<78:182>4}T<o0:;:4>478277bb1o099i7?;wV210<7280:6<;8{R6e>41028>=6<==dd;e>73c191/=;?51528R4132;q~=9?51:w207<73t.:8:4>5:`2=2<728?=684>56yK536<,8?i6<78;[14>=}028<1?765168a>1<b2t.:;?4>949'7<<6111/8h4>989j6`3=83.:844=e79m51>=821b=:k50;&20<<6?o1e=9650:9j52b=83.:844>7g9m51>=921b=:m50;&20<<6?o1e=9652:9j52d=83.:844>7g9m51>=;21b=:o50;&20<<6?o1e=9654:9j52?=83.:844>7g9m51>==21b=:650;&20<<6?o1e=9656:9j5gc=83.:844>bg9m51>=821b=oj50;&20<<6jo1e=9651:9j5ge=83.:844>bg9m51>=:21b=ol50;&20<<6jo1e=9653:9j5gg=83.:844>bg9m51>=<21b=o750;&20<<6jo1e=9655:9j5g>=83.:844>bg9m51>=>21b=o950;&20<<6jo1e=9657:9j5g3=83.:844>bg9m51>=021b=o:50;&20<<6jo1e=9659:9j5g5=83.:844>bg9m51>=i21b=o<50;&20<<6jo1e=965b:9j5g7=83.:844>bg9m51>=k21b=o>50;&20<<6jo1e=965d:9j5d`=83.:844>bg9m51>=m21b=lk50;&20<<6jo1e=965f:9j5db=83.:844>bg9m51>=9910e<ol:18'51?=9kl0b<:7:038?l7fi3:1(<:6:0`e?k7303;976g>a883>!7313;ij6`>49827>=n9h21<7*>4882fc=i9=21=954i0c4>5<#9=31=oh4n06;>43<3`;j:7>5$06:>4da3g;?47?9;:k2e0<72-;?57?mf:l20=<6?21b=l:50;&20<<6jo1e=9651998m4g4290/=9751cd8j42?28307d?n2;29 42>28hm7c?;8;3b?>o6i80;6)?;9;3ab>h6<10:n65f20g94?"6<00:nk5a15:95f=<a;;o6=4+15;95g`<f8>36<j4;h02g?6=,8>26<li;o37<?7b32c9=o4?:%37=?7en2d:854>f:9j64g=83.:844>bg9m51>=:910e??6:18'51?=9kl0b<:7:338?l4603:1(<:6:0`e?k73038976g=1683>!7313;ij6`>49817>=n:8<1<7*>4882fc=i9=21>954i336>5<#9=31=oh4n06;>73<3`8:?7>5$06:>4da3g;?47<9;:k157<72-;?57?mf:l20=<5?21b><?50;&20<<6jo1e=9652998m777290/=9751cd8j42?2;307d<?f;29 42>28hm7c?;8;0b?>o58l0;6)?;9;3ab>h6<109n65f21f94?"6<00:nk5a15:96f=<a;:h6=4+15;95g`<f8>36?j4;h03f?6=,8>26<li;o37<?4b32c9<l4?:%37=?7en2d:854=f:9j65>=83.:844>bg9m51>=;910e?>8:18'51?=9kl0b<:7:238?l47>3:1(<:6:0`e?k73039976g=0483>!7313;ij6`>49807>=n:9>1<7*>4882fc=i9=21?954i320>5<#9=31=oh4n06;>63<3`8;>7>5$06:>4da3g;?47=9;:k144<72-;?57?mf:l20=<4?21b>=>50;&20<<6jo1e=9653998m4`a290/=9751cd8j42?2:307d?id;29 42>28hm7c?;8;1b?>o6nj0;6)?;9;3ab>h6<108n65f1g`94?"6<00:nk5a15:97f=<a8lj6=4+15;95g`<f8>36>j4;h3e=?6=,8>26<li;o37<?5b32c:j54?:%37=?7en2d:854<f:9j5c1=83.:844>bg9m51>=<910e<h9:18'51?=9kl0b<:7:538?l7a=3:1(<:6:0`e?k7303>976g>f583>!7313;ij6`>49877>=n9o81<7*>4882fc=i9=218954i0d2>5<#9=31=oh4n06;>13<3`;m<7>5$06:>4da3g;?47:9;:k2ac<72-;?57?mf:l20=<3?21b=hk50;&20<<6jo1e=9654998m4cc290/=9751cd8j42?2=307d?jc;29 42>28hm7c?;8;6b?>o6mk0;6)?;9;3ab>h6<10?n65f1dc94?"6<00:nk5a15:90f=<a8o26=4+15;95g`<f8>369j4;h3f3?6=,8>26<li;o37<?2b32c:i;4?:%37=?7en2d:854;f:9j5`3=83.:844>bg9m51>==910e<k;:18'51?=9kl0b<:7:438?l7b;3:1(<:6:0`e?k7303?976g>e383>!7313;ij6`>49867>=n9l;1<7*>4882fc=i9=219954i0g3>5<#9=31=oh4n06;>03<3`;oj7>5$06:>4da3g;?47;9;:k2``<72-;?57?mf:l20=<2?21b=im50;&20<<6jo1e=9655998m4be290/=9751cd8j42?2<307d?ka;29 42>28hm7c?;8;7b?>o6l00;6)?;9;3ab>h6<10>n65f1e:94?"6<00:nk5a15:91f=<a8n<6=4+15;95g`<f8>368j4;h3g2?6=,8>26<li;o37<?3b32c:h84?:%37=?7en2d:854:f:9j5a2=83.:844>bg9m51>=>910e<j<:18'51?=9kl0b<:7:738?l7c93:1(<:6:0`e?k7303<976g>d183>!7313;ij6`>49857>=n9jl1<7*>4882fc=i9=21:954i0af>5<#9=31=oh4n06;>33<3`;hh7>5$06:>4da3g;?4789;:k2gf<72-;?57?mf:l20=<1?21b=nl50;&20<<6jo1e=9656998m4ef290/=9751cd8j42?2?307d?l9;29 42>28hm7c?;8;4b?>o6k10;6)?;9;3ab>h6<10=n65f1b494?"6<00:nk5a15:92f=<a8i>6=4+15;95g`<f8>36;j4;h3`0?6=,8>26<li;o37<?0b32c:o>4?:%37=?7en2d:8549f:9j5f4=83.:844>bg9m51>=?910e<m>:18'51?=9kl0b<:7:638?l7d83:1(<:6:0`e?k7303=976g>b783>!7313;ij6`>49847>=n9hh1<7*>4882fc=i9=21;954i0c3>5<#9=31=oh4n06;>23<3`8:87>5$06:>4da3g;?4799;:k14<<72-;?57?mf:l20=<0?21b=kk50;&20<<6jo1e=9657998m4`4290/=9751cd8j42?2>307d?j8;29 42>28hm7c?;8;5b?>o6lm0;6)?;9;3ab>h6<10<n65f1e094?"6<00:nk5a15:93f=<a8i<6=4+15;95g`<f8>36:j4;h3:b?6=,8>26<li;o37<?1b32c:5h4?:%37=?7en2d:8548f:9j6`1=83.:844=e99m51>=821b=5650;&20<<6001e=9650:9j5=1=83.:844>889m51>=921b=5850;&20<<6001e=9652:9j5=3=83.:844>889m51>=;21b=5:50;&20<<6001e=9654:9j5=5=83.:844>889m51>==21b=5<50;&20<<6001e=9656:9j5=7=83.:844>889m51>=?21b=5>50;&20<<6001e=9658:9j66>=83.:844=389m51>=821b>>950;&20<<5;01e=9651:9j663=83.:844=389m51>=:21b>>:50;&20<<5;01e=9653:9j665=83.:844=389m51>=<21b>><50;&20<<5;01e=9655:9j667=83.:844=389m51>=>21b>>>50;&20<<5;01e=9657:9j67`=83.:844=389m51>=021b>?k50;&20<<5;01e=9659:9j67b=83.:844=389m51>=i21b>?m50;&20<<5;01e=965b:9j67g=83.:844=389m51>=k21b>?750;&20<<5;01e=965d:9j67>=83.:844=389m51>=m21b>?950;&20<<5;01e=965f:9j670=83.:844=389m51>=9910e?<::18'51?=::30b<:7:038?l45<3:1(<:6:31:?k7303;976g=2283>!73138856`>49827>=n:;81<7*>48817<=i9=21=954i302>5<#9=31>>74n06;>43<3`88j7>5$06:>75>3g;?47?9;:k17`<72-;?57<<9:l20=<6?21b>>j50;&20<<5;01e=9651998m75d290/=97522;8j42?28307d<<b;29 42>2;927c?;8;3b?>o5;h0;6)?;9;00=>h6<10:n65f22494?"6<009?45a15:95f=<a;8i6=4+15;966?<f8>36<j4;h014?6=,8>26?=6;o37<?7b32c9=k4?:%37=?4412d:854>f:9j5<e=831b>h<50;9j5<b=831b>h=50;9l636=83.:844=609m51>=821d>8h50;&20<<5>81e=9651:9l60c=83.:844=609m51>=:21d>8j50;&20<<5>81e=9653:9l60e=83.:844=609m51>=<21d>8l50;&20<<5>81e=9655:9l60g=83.:844=609m51>=>21d>8750;&20<<5>81e=9657:9l601=83.:844=609m51>=021d>8850;&20<<5>81e=9659:9l603=83.:844=609m51>=i21d>8:50;&20<<5>81e=965b:9l605=83.:844=609m51>=k21d>8<50;&20<<5>81e=965d:9l607=83.:844=609m51>=m21d>8>50;&20<<5>81e=965f:9l61`=83.:844=609m51>=9910c?:j:18'51?=:?;0b<:7:038?j43k3:1(<:6:342?k7303;976a=4c83>!73138==6`>49827>=h:=k1<7*>488124=i9=21=954o36:>5<#9=31>;?4n06;>43<3f8?47>5$06:>7063g;?47?9;:m102<72-;?57<91:l20=<6?21d>9850;&20<<5>81e=9651998k722290/=9752738j42?28307b<;4;29 42>2;<:7c?;8;3b?>i5<:0;6)?;9;055>h6<10:n65`2b294?"6<009:<5a15:95f=<g;hm6=4+15;9637<f8>36<j4;n0aa?6=,8>26?8>;o37<?7b32e9ni4?:%37=?4192d:854>f:9l6ge=83.:844=609m51>=:910c?lm:18'51?=:?;0b<:7:338?j4ei3:1(<:6:342?k73038976a=b883>!73138==6`>49817>=h:k21<7*>488124=i9=21>954o3`4>5<#9=31>;?4n06;>73<3f8i97>5$06:>7063g;?47<9;:m1f1<72-;?57<91:l20=<5?21d>o=50;&20<<5>81e=9652998k7d5290/=9752738j42?2;307b<m1;29 42>2;<:7c?;8;0b?>i5j90;6)?;9;055>h6<109n65`2`d94?"6<009:<5a15:96f=<g;kn6=4+15;9637<f8>36?j4;n0b`?6=,8>26?8>;o37<?4b32e9mn4?:%37=?4192d:854=f:9l6dg=83.:844=609m51>=;910c?o6:18'51?=:?;0b<:7:238?j4f03:1(<:6:342?k73039976a=a683>!73138==6`>49807>=h:h<1<7*>488124=i9=21?954o3c6>5<#9=31>;?4n06;>63<3f8j87>5$06:>7063g;?47=9;:m1e6<72-;?57<91:l20=<4?21d>l<50;&20<<5>81e=9653998k7g6290/=9752738j42?2:307b<6f;29 42>2;<:7c?;8;1b?>i51l0;6)?;9;055>h6<108n65`28f94?"6<009:<5a15:97f=<g;3h6=4+15;9637<f8>36>j4;n0:f?6=,8>26?8>;o37<?5b32e95l4?:%37=?4192d:854<f:9l6<?=83.:844=609m51>=<910c?77:18'51?=:?;0b<:7:538?j4>?3:1(<:6:342?k7303>976a=9783>!73138==6`>49877>=h:0>1<7*>488124=i9=218954o3;0>5<#9=31>;?4n06;>13<3f82>7>5$06:>7063g;?47:9;:m1=4<72-;?57<91:l20=<3?21d>4>50;&20<<5>81e=9654998k7>a290/=9752738j42?2=307b<7e;29 42>2;<:7c?;8;6b?>i50m0;6)?;9;055>h6<10?n65`29a94?"6<009:<5a15:90f=<g;2i6=4+15;9637<f8>369j4;n0;=?6=,8>26?8>;o37<?2b32e9454?:%37=?4192d:854;f:9l6=1=83.:844=609m51>==910c?69:18'51?=:?;0b<:7:438?j4?=3:1(<:6:342?k7303?976a=8583>!73138==6`>49867>=h:191<7*>488124=i9=219954o3:1>5<#9=31>;?4n06;>03<3f83=7>5$06:>7063g;?47;9;:m1<5<72-;?57<91:l20=<2?21d>:k50;&20<<5>81e=9655998k71c290/=9752738j42?2<307b<8c;29 42>2;<:7c?;8;7b?>i5?k0;6)?;9;055>h6<10>n65`26c94?"6<009:<5a15:91f=<g;=26=4+15;9637<f8>368j4;n04<?6=,8>26?8>;o37<?3b32e9;:4?:%37=?4192d:854:f:9l620=83.:844=609m51>=>910c?9::18'51?=:?;0b<:7:738?j40;3:1(<:6:342?k7303<976a=7383>!73138==6`>49857>=h:>;1<7*>488124=i9=21:954o353>5<#9=31>;?4n06;>33<3f8=j7>5$06:>7063g;?4789;:m12`<72-;?57<91:l20=<1?21d>;j50;&20<<5>81e=9656998k70d290/=9752738j42?2?307b<9b;29 42>2;<:7c?;8;4b?>i5>h0;6)?;9;055>h6<10=n65`27:94?"6<009:<5a15:92f=<g;<<6=4+15;9637<f8>36;j4;n052?6=,8>26?8>;o37<?0b32e9:84?:%37=?4192d:8549f:9l632=83.:844=609m51>=?910c?8<:18'51?=:?;0b<:7:638?j41:3:1(<:6:342?k7303=976a=5983>!73138==6`>49847>=h:=n1<7*>488124=i9=21;954o361>5<#9=31>;?4n06;>23<3f8i:7>5$06:>7063g;?4799;:m1eg<72-;?57<91:l20=<0?21d>l>50;&20<<5>81e=9657998k7?2290/=9752738j42?2>307b<7a;29 42>2;<:7c?;8;5b?>i5?o0;6)?;9;055>h6<10<n65`26694?"6<009:<5a15:93f=<g;<26=4+15;9637<f8>36:j4;n075?6=,8>26?8>;o37<?1b32e98=4?:%37=?4192d:8548f:9l6ag=83.:844=dc9m51>=821d>i750;&20<<5lk1e=9651:9l6a1=83.:844=dc9m51>=:21d>i850;&20<<5lk1e=9653:9l6a3=83.:844=dc9m51>=<21d>i:50;&20<<5lk1e=9655:9l6a5=83.:844=dc9m51>=>21d>i<50;&20<<5lk1e=9657:9l6a7=83.:844=dc9m51>=021d>i>50;&20<<5lk1e=9659:9l6f`=83.:844=dc9m51>=i21d>nk50;&20<<5lk1e=965b:9l6fe=83.:844=dc9m51>=k21d>nl50;&20<<5lk1e=965d:9l6fg=83.:844=dc9m51>=m21d>n750;&20<<5lk1e=965f:9l6f>=83.:844=dc9m51>=9910c?m8:18'51?=:mh0b<:7:038?j4d>3:1(<:6:3fa?k7303;976a=c483>!73138on6`>49827>=h:j>1<7*>4881`g=i9=21=954o3a0>5<#9=31>il4n06;>43<3f8n=7>5$06:>7be3g;?47?9;:m1a5<72-;?57<kb:l20=<6?21d>ih50;&20<<5lk1e=9651998k7bb290/=9752e`8j42?28307b<kd;29 42>2;ni7c?;8;3b?>i5lj0;6)?;9;0gf>h6<10:n65`2e:94?"6<009ho5a15:95f=<g;io6=4+15;96ad<f8>36<j4;n0`6?6=,8>26?jm;o37<?7b32e9o<4?:%37=?4cj2d:854>f:9a527=83;1<7>t$07a>c4<@8=;7E?90:me5?6=3th:9n4?:ca94?6|,8?i6<:m;I344>N6>91Q?:4l{485>c<6;3;;6<:5108`>d<c288157sa51810>h29330boh50:lf5?7<,lo1j=5+eg8e4>"a;380(k:52:&e1?4<,o<1>6*i7;08 c>=:2.m57<4$gc96>"aj380(km52:&e`?4<,oo1>6*if;08 4672;1/==?52:&247<53-;;?7<4$027>7=#99?1>6*>0781?!77?380(<>7:39'55?=:2.:<l4=;%33f?4<,8:h6?5+11f96>"68l097)??f;08 4772;1/=<?52:&257<53-;:?7<4$037>7=#98?1>6*>1781?!76?380(<?7:39'54?=:2.:=l4=;%32f?4<,8;h6?5+10f96>"69l097)?>f;08 4472;1/=??52:&267<53-;9?7<4$007>7=#9;?1>6*>2781?!75?380(<<7:39'57?=:2.:>l4=;%31f?4<,88h6?5+13f96>"6:l097)?=f;08 4572;1/=>?52:&277<53-;8?7<4$017>7=#9:?1>6*>3781?!74?380(<=7:39'56?=:2.:?l4=;%30f?7<,89h6<5+12f9513<,8?;6<;n;%365?5?3-;>>7=7;%367?513-;>87?:6:&212<63-;>47?4$04g>40d3-;=i7?9c:k20f<722c?<7>5;hgg>5<<a8>m6=44i5794?=n9=n1<75f15g94?=nmj0;66g67;29 42>2020b<:7:198m<0=83.:84468:l20=<632c297>5$06:><><f8>36?54i8694?"6<00246`>4980?>o6><0;6)?;9;352>h6<10;76g>6583>!7313;=:6`>4982?>o6>:0;6)?;9;352>h6<10976g>6383>!7313;=:6`>4980?>ie?3:1(<:6:c:8j42?2910co850;&20<<e02d:854>;:ma0?6=,8>26o64n06;>7=<gk91<7*>488a<>h6<10876am2;29 42>2k20b<:7:598kg7=83.:844m8:l20=<232ei<7>5$06:>g><f8>36;54o`d94?"6<00i46`>4984?>ifm3:1(<:6:c:8j42?2110clj50;&20<<e02d:8546;:mbg?6=,8>26o64n06;>d=<ghh1<7*>488a<>h6<10i76an9;29 42>2k20b<:7:b98kd>=83.:844m8:l20=<c32ej;7>5$06:>g><f8>36h54o`494?"6<00i46`>498e?>if=3:1(<:6:c:8j42?28:07bo;:18'51?=j11e=9651098kd5=83.:844m8:l20=<6:21dm?4?:%37=?d?3g;?47?<;:mb5?6=,8>26o64n06;>42<3fk;6=4+15;9f==i9=21=854ocg94?"6<00i46`>49822>=hjm0;6)?;9;`;?k7303;<76amc;29 42>2k20b<:7:0:8?jde290/=975b99m51>=9010coo50;&20<<e02d:854>a:9lf<<72-;?57l7;o37<?7e32ei97>5$06:>g><f8>36<m4;ncb>5<#9=31n55a15:95a=<g0l1<7*>488a<>h6<10:i65`9d83>!7313h37c?;8;3e?>o6l3:1(<:6:0g8j42?2910e<m50;&20<<6m2d:854>;:k2f?6=,8>26<k4n06;>7=<a8k1<7*>4882a>h6<10876g=6;29 42>28o0b<:7:598m73=83.:844>e:l20=<232c987>5$06:>4c<f8>36;54i3194?"6<00:i6`>4984?>o5:3:1(<:6:0g8j42?2110e??50;&20<<6m2d:8546;:k14?6=,8>26<k4n06;>d=<a8l1<7*>4882a>h6<10i76g>9;29 42>28o0b<:7:b98m4>=83.:844>e:l20=<c32c9o7>5$06:>7b<f8>36=54i3`94?"6<009h6`>4982?>o5i3:1(<:6:3f8j42?2;10e?750;&20<<5l2d:854<;:k01?6=,8>26?j4n06;>1=<a:>1<7*>4881`>h6<10>76g<3;29 42>2;n0b<:7:798m64=83.:844=d:l20=<032c8=7>5$06:>7b<f8>36554i2294?"6<009h6`>498:?>o5n3:1(<:6:3f8j42?2h10e?k50;&20<<5l2d:854m;:k1<?6=,8>26?j4n06;>f=<a;=1<7*>4881`>h6<10o76g7c;29 42>21n0b<:7:198m=d=83.:8447d:l20=<632c357>5$06:>=b<f8>36?54i9:94?"6<003h6`>4980?>o??3:1(<:6:9f8j42?2=10e5850;&20<<?l2d:854:;:k;1?6=,8>265j4n06;>3=<a1>1<7*>488;`>h6<10<76g73;29 42>21n0b<:7:998m=4=83.:8447d:l20=<>32c3=7>5$06:>=b<f8>36l54i9294?"6<003h6`>498a?>o0m3:1(<:6:9f8j42?2j10e:j50;&20<<?l2d:854k;:k4g?6=,8>265j4n06;>`=<a>h1<7*>488;`>h6<10m76g8a;29 42>21n0b<:7:028?l1>290/=9758e9m51>=9810e:650;&20<<?l2d:854>2:9j32<72-;?576k;o37<?7432c<:7>5$06:>=b<f8>36<:4;h56>5<#9=314i5a15:950=<a091<7*>488;`>h6<10::65f9383>!73132o7c?;8;34?>o>93:1(<:6:9f8j42?28207d7?:18'51?=0m1e=9651898m=`=83.:8447d:l20=<6i21b4h4?:%37=?>c3g;?47?m;:k;e?6=,8>265j4n06;>4e<3`=m6=4+15;9<a=i9=21=i54i6694?"6<003h6`>4982a>=n?:0;6)?;9;:g?k7303;m76aj5;29 42>2l<0b<:7:198k`2=83.:844j6:l20=<632en?7>5$06:>`0<f8>36?54od094?"6<00n:6`>4980?>o>k3:1(<:6:8f8j42?2910e4l50;&20<<>l2d:854>;:k:e?6=,8>264j4n06;>7=<a031<7*>488:`>h6<10876aja;29 42>2lh0b<:7:198k`?=83.:844jb:l20=<632en47>5$06:>`d<f8>36?54od594?"6<00nn6`>4980?>ic13:1(<:6:ec8j42?2910ci650;&20<<ci2d:854>;:mg2?6=,8>26io4n06;>7=<gm?1<7*>488ge>h6<10876ak4;29 42>2mk0b<:7:598ka5=83.:844ka:l20=<232eo>7>5$06:>ag<f8>36;54oe394?"6<00om6`>4984?>ic83:1(<:6:ec8j42?2110cnh50;&20<<ci2d:8546;:m`a?6=,8>26io4n06;>d=<gjn1<7*>488ge>h6<10i76alb;29 42>2mk0b<:7:b98kfg=83.:844ka:l20=<c32eh57>5$06:>ag<f8>36h54ob:94?"6<00om6`>498e?>id?3:1(<:6:ec8j42?28:07bm9:18'51?=lh1e=9651098kf3=83.:844ka:l20=<6:21do94?:%37=?bf3g;?47?<;:m`7?6=,8>26io4n06;>42<3fi96=4+15;9`d=i9=21=854od294?"6<00om6`>49822>=hlo0;6)?;9;fb?k7303;<76ake;29 42>2mk0b<:7:0:8?jbc290/=975d`9m51>=9010cim50;&20<<ci2d:854>a:9l`g<72-;?57jn;o37<?7e32eo;7>5$06:>ag<f8>36<m4;na`>5<#9=31hl5a15:95a=<gj;1<7*>488ge>h6<10:i65`c183>!7313nj7c?;8;3e?>o6>h0;6)?;9;35f>h6<10;76g>6883>!7313;=n6`>4982?>o6>10;6)?;9;35f>h6<10976g>6683>!7313;=n6`>4980?>o1j3:1(<:6:7a8j42?2910e;o50;&20<<1k2d:854>;:k5<?6=,8>26;m4n06;>7=<a?=1<7*>4885g>h6<10876g96;29 42>2?i0b<:7:598m33=83.:8449c:l20=<232c=87>5$06:>3e<f8>36;54i7194?"6<00=o6`>4984?>o1:3:1(<:6:7a8j42?2110e;?50;&20<<1k2d:8546;:k54?6=,8>26;m4n06;>d=<a<l1<7*>4885g>h6<10i76g:d;29 42>2?i0b<:7:b98m0e=83.:8449c:l20=<c32c>n7>5$06:>3e<f8>36h54i4c94?"6<00=o6`>498e?>o213:1(<:6:7a8j42?28:07d;7:18'51?=>j1e=9651098m01=83.:8449c:l20=<6:21b9;4?:%37=?0d3g;?47?<;:k61?6=,8>26;m4n06;>42<3`??6=4+15;92f=i9=21=854i6094?"6<00=o6`>49822>=n?80;6)?;9;4`?k7303;<76g80;29 42>2?i0b<:7:0:8?l0a290/=9756b9m51>=9010e;k50;&20<<1k2d:854>a:9j2a<72-;?578l;o37<?7e32c=57>5$06:>3e<f8>36<m4;h7f>5<#9=31:n5a15:95a=<a<91<7*>4885g>h6<10:i65f5383>!7313<h7c?;8;3e?>{e9<n1<7ll:183!72j3;?n6F>719K536<R:=1ov;56;d956<683;?6<?5c;c9`?75200vb8>5259m14<>3ghm6=5ae082?!cb2o:0(hh5f19'b6<53-l?6?5+f481?!`12;1/j:4=;%d;>7=#n0097)hn:39'bg<53-lh6?5+fe81?!`b2;1/jk4=;%334?4<,8::6?5+11096>"68:097)??4;08 4622;1/==852:&242<53-;;47<4$02:>7=#99k1>6*>0c81?!77k380(<>k:39'55c=:2.:<k4=;%324?4<,8;:6?5+10096>"69:097)?>4;08 4722;1/=<852:&252<53-;:47<4$03:>7=#98k1>6*>1c81?!76k380(<?k:39'54c=:2.:=k4=;%314?4<,88:6?5+13096>"6::097)?=4;08 4422;1/=?852:&262<53-;947<4$00:>7=#9;k1>6*>2c81?!75k380(<<k:39'57c=:2.:>k4=;%304?4<,89:6?5+12096>"6;:097)?<4;08 4522;1/=>852:&272<53-;847<4$01:>7=#9:k1>6*>3c82?!74k3;0(<=k:066?!7283;>m6*>5080<>"6=;0846*>52802>"6==0:9;5+14595>"6=10:7)?9d;35g>"6>l0::n5f15a94?=n<90;66gjd;29?l73n3:17d:::188m42c2900e<:j:188m`e=831b5:4?:%37=???3g;?47>4;h;5>5<#9=31555a15:95>=n1<0;6)?;9;;;?k7303807d7;:18'51?=111e=9653:9j533=83.:844>679m51>=821b=;:50;&20<<6>?1e=9651:9j535=83.:844>679m51>=:21b=;<50;&20<<6>?1e=9653:9lf2<72-;?57l7;o37<?6<3fh=6=4+15;9f==i9=21=65`b583>!7313h37c?;8;08?jd4290/=975b99m51>=;21dn?4?:%37=?d?3g;?47:4;n`2>5<#9=31n55a15:91>=hj90;6)?;9;`;?k7303<07boi:18'51?=j11e=9657:9le`<72-;?57l7;o37<?><3fko6=4+15;9f==i9=21565`ab83>!7313h37c?;8;c8?jge290/=975b99m51>=j21dm44?:%37=?d?3g;?47m4;nc;>5<#9=31n55a15:9`>=hi>0;6)?;9;`;?k7303o07bo9:18'51?=j11e=965f:9le0<72-;?57l7;o37<?7732ej87>5$06:>g><f8>36<?4;nc0>5<#9=31n55a15:957=<gh81<7*>488a<>h6<10:?65`a083>!7313h37c?;8;37?>if83:1(<:6:c:8j42?28?07blj:18'51?=j11e=9651798kgb=83.:844m8:l20=<6?21dnn4?:%37=?d?3g;?47?7;:maf?6=,8>26o64n06;>4?<3fhj6=4+15;9f==i9=21=l54oc;94?"6<00i46`>4982f>=hj<0;6)?;9;`;?k7303;h76ana;29 42>2k20b<:7:0f8?j?a290/=975b99m51>=9l10c4k50;&20<<e02d:854>f:9j5a<72-;?57?j;o37<?6<3`;h6=4+15;95`=i9=21=65f1c83>!7313;n7c?;8;08?l7f290/=9751d9m51>=;21b>;4?:%37=?7b3g;?47:4;h06>5<#9=31=h5a15:91>=n:=0;6)?;9;3f?k7303<07d<<:18'51?=9l1e=9657:9j67<72-;?57?j;o37<?><3`8:6=4+15;95`=i9=21565f2183>!7313;n7c?;8;c8?l7a290/=9751d9m51>=j21b=44?:%37=?7b3g;?47m4;h3;>5<#9=31=h5a15:9`>=n:j0;6)?;9;0g?k7303:07d<m:18'51?=:m1e=9651:9j6d<72-;?57<k;o37<?4<3`826=4+15;96a=i9=21?65f3483>!73138o7c?;8;68?l53290/=9752e9m51>==21b?>4?:%37=?4c3g;?4784;h11>5<#9=31>i5a15:93>=n;80;6)?;9;0g?k7303207d=?:18'51?=:m1e=9659:9j6c<72-;?57<k;o37<?g<3`8n6=4+15;96a=i9=21n65f2983>!73138o7c?;8;a8?l40290/=9752e9m51>=l21b4n4?:%37=?>c3g;?47>4;h:a>5<#9=314i5a15:95>=n000;6)?;9;:g?k7303807d67:18'51?=0m1e=9653:9j<2<72-;?576k;o37<?2<3`2=6=4+15;9<a=i9=21965f8483>!73132o7c?;8;48?l>3290/=9758e9m51>=?21b4>4?:%37=?>c3g;?4764;h:1>5<#9=314i5a15:9=>=n080;6)?;9;:g?k7303k07d6?:18'51?=0m1e=965b:9j3`<72-;?576k;o37<?e<3`=o6=4+15;9<a=i9=21h65f7b83>!73132o7c?;8;g8?l1e290/=9758e9m51>=n21b;l4?:%37=?>c3g;?47??;:k4=?6=,8>265j4n06;>47<3`=36=4+15;9<a=i9=21=?54i6594?"6<003h6`>49827>=n??0;6)?;9;:g?k7303;?76g85;29 42>21n0b<:7:078?l?4290/=9758e9m51>=9?10e4<50;&20<<?l2d:854>7:9j=4<72-;?576k;o37<?7?32c2<7>5$06:>=b<f8>36<74;h:e>5<#9=314i5a15:95d=<a1o1<7*>488;`>h6<10:n65f8`83>!73132o7c?;8;3`?>o0n3:1(<:6:9f8j42?28n07d9;:18'51?=0m1e=9651d98m25=83.:8447d:l20=<6n21di84?:%37=?c13g;?47>4;ng7>5<#9=31i;5a15:95>=hm:0;6)?;9;g5?k7303807bk=:18'51?=m?1e=9653:9j=f<72-;?577k;o37<?6<3`3i6=4+15;9=a=i9=21=65f9`83>!73133o7c?;8;08?l?>290/=9759e9m51>=;21dil4?:%37=?ce3g;?47>4;ng:>5<#9=31io5a15:95>=hm10;6)?;9;ga?k7303807bk8:18'51?=mk1e=9653:9l`<<72-;?57jn;o37<?6<3fn36=4+15;9`d=i9=21=65`d783>!7313nj7c?;8;08?jb2290/=975d`9m51>=;21dh94?:%37=?bf3g;?47:4;nf0>5<#9=31hl5a15:91>=hl;0;6)?;9;fb?k7303<07bj>:18'51?=lh1e=9657:9l`5<72-;?57jn;o37<?><3fim6=4+15;9`d=i9=21565`cd83>!7313nj7c?;8;c8?jec290/=975d`9m51>=j21doo4?:%37=?bf3g;?47m4;nab>5<#9=31hl5a15:9`>=hk00;6)?;9;fb?k7303o07bm7:18'51?=lh1e=965f:9lg2<72-;?57jn;o37<?7732eh:7>5$06:>ag<f8>36<?4;na6>5<#9=31hl5a15:957=<gj>1<7*>488ge>h6<10:?65`c283>!7313nj7c?;8;37?>id:3:1(<:6:ec8j42?28?07bk?:18'51?=lh1e=9651798ka`=83.:844ka:l20=<6?21dhh4?:%37=?bf3g;?47?7;:mg`?6=,8>26io4n06;>4?<3fnh6=4+15;9`d=i9=21=l54oe`94?"6<00om6`>4982f>=hl>0;6)?;9;fb?k7303;h76alc;29 42>2mk0b<:7:0f8?je6290/=975d`9m51>=9l10cn>50;&20<<ci2d:854>f:9j53g=83.:844>6c9m51>=821b=;750;&20<<6>k1e=9651:9j53>=83.:844>6c9m51>=:21b=;950;&20<<6>k1e=9653:9j2g<72-;?578l;o37<?6<3`<j6=4+15;92f=i9=21=65f6983>!7313<h7c?;8;08?l00290/=9756b9m51>=;21b:;4?:%37=?0d3g;?47:4;h46>5<#9=31:n5a15:91>=n>=0;6)?;9;4`?k7303<07d8<:18'51?=>j1e=9657:9j27<72-;?578l;o37<?><3`<:6=4+15;92f=i9=21565f6183>!7313<h7c?;8;c8?l3a290/=9756b9m51>=j21b9i4?:%37=?0d3g;?47m4;h7`>5<#9=31:n5a15:9`>=n=k0;6)?;9;4`?k7303o07d;n:18'51?=>j1e=965f:9j1<<72-;?578l;o37<?7732c>47>5$06:>3e<f8>36<?4;h74>5<#9=31:n5a15:957=<a<<1<7*>4885g>h6<10:?65f5483>!7313<h7c?;8;37?>o2<3:1(<:6:7a8j42?28?07d9=:18'51?=>j1e=9651798m27=83.:8449c:l20=<6?21b;=4?:%37=?0d3g;?47?7;:k5b?6=,8>26;m4n06;>4?<3`<n6=4+15;92f=i9=21=l54i7f94?"6<00=o6`>4982f>=n>00;6)?;9;4`?k7303;h76g:e;29 42>2?i0b<:7:0f8?l34290/=9756b9m51>=9l10e8<50;&20<<1k2d:854>f:9~f43b290io7>50z&21g<6<k1C=:>4H043?_502jq>6;4i:01955<6<3;:6n4n:e826??=ug?;6?:4n439=>hen3:0bh?51:&fa?`73-om6k>4$g196>"a<380(k;52:&e2?4<,o=1>6*i8;08 c?=:2.mm7<4$g`96>"ak380(kj52:&ea?4<,ol1>6*>0181?!779380(<>=:39'555=:2.:<94=;%331?4<,8:=6?5+11596>"681097)??9;08 46f2;1/==l52:&24f<53-;;h7<4$02f>7=#99l1>6*>1181?!769380(<?=:39'545=:2.:=94=;%321?4<,8;=6?5+10596>"691097)?>9;08 47f2;1/=<l52:&25f<53-;:h7<4$03f>7=#98l1>6*>2181?!759380(<<=:39'575=:2.:>94=;%311?4<,88=6?5+13596>"6:1097)?=9;08 44f2;1/=?l52:&26f<53-;9h7<4$00f>7=#9;l1>6*>3181?!749380(<==:39'565=:2.:?94=;%301?4<,89=6?5+12596>"6;1097)?<9;08 45f2;1/=>l51:&27f<63-;8h7?;5:&215<6=h1/=8?5399'504=;11/=8=5379'502=9<<0(<;8:09'50>=92.::i4>6b9'53c=9?i0e<:l:188m16=831bii4?::k20c<722c?97>5;h37`?6=3`;?i7>5;hg`>5<<a0=1<7*>488:<>h6<10;76g66;29 42>2020b<:7:098m<3=83.:84468:l20=<532c287>5$06:><><f8>36>54i046>5<#9=31=;84n06;>5=<a8<?6=4+15;9530<f8>36<54i040>5<#9=31=;84n06;>7=<a8<96=4+15;9530<f8>36>54oc594?"6<00i46`>4983?>ie>3:1(<:6:c:8j42?2810co:50;&20<<e02d:854=;:ma7?6=,8>26o64n06;>6=<gk81<7*>488a<>h6<10?76am1;29 42>2k20b<:7:498kg6=83.:844m8:l20=<132ejj7>5$06:>g><f8>36:54o`g94?"6<00i46`>498;?>ifl3:1(<:6:c:8j42?2010clm50;&20<<e02d:854n;:mbf?6=,8>26o64n06;>g=<gh31<7*>488a<>h6<10h76an8;29 42>2k20b<:7:e98kd1=83.:844m8:l20=<b32ej:7>5$06:>g><f8>36k54o`794?"6<00i46`>49824>=hi=0;6)?;9;`;?k7303;:76an3;29 42>2k20b<:7:008?jg5290/=975b99m51>=9:10cl?50;&20<<e02d:854>4:9le5<72-;?57l7;o37<?7232eii7>5$06:>g><f8>36<84;n`g>5<#9=31n55a15:952=<gki1<7*>488a<>h6<10:465`bc83>!7313h37c?;8;3:?>iei3:1(<:6:c:8j42?28k07bl6:18'51?=j11e=9651c98kg3=83.:844m8:l20=<6k21dml4?:%37=?d?3g;?47?k;:m:b?6=,8>26o64n06;>4c<3f3n6=4+15;9f==i9=21=k54i0f94?"6<00:i6`>4983?>o6k3:1(<:6:0g8j42?2810e<l50;&20<<6m2d:854=;:k2e?6=,8>26<k4n06;>6=<a;<1<7*>4882a>h6<10?76g=5;29 42>28o0b<:7:498m72=83.:844>e:l20=<132c9?7>5$06:>4c<f8>36:54i3094?"6<00:i6`>498;?>o593:1(<:6:0g8j42?2010e?>50;&20<<6m2d:854n;:k2b?6=,8>26<k4n06;>g=<a831<7*>4882a>h6<10h76g>8;29 42>28o0b<:7:e98m7e=83.:844=d:l20=<732c9n7>5$06:>7b<f8>36<54i3c94?"6<009h6`>4981?>o513:1(<:6:3f8j42?2:10e>;50;&20<<5l2d:854;;:k00?6=,8>26?j4n06;>0=<a:91<7*>4881`>h6<10=76g<2;29 42>2;n0b<:7:698m67=83.:844=d:l20=<?32c8<7>5$06:>7b<f8>36454i3d94?"6<009h6`>498b?>o5m3:1(<:6:3f8j42?2k10e?650;&20<<5l2d:854l;:k13?6=,8>26?j4n06;>a=<a1i1<7*>488;`>h6<10;76g7b;29 42>21n0b<:7:098m=?=83.:8447d:l20=<532c347>5$06:>=b<f8>36>54i9594?"6<003h6`>4987?>o?>3:1(<:6:9f8j42?2<10e5;50;&20<<?l2d:8549;:k;0?6=,8>265j4n06;>2=<a191<7*>488;`>h6<10376g72;29 42>21n0b<:7:898m=7=83.:8447d:l20=<f32c3<7>5$06:>=b<f8>36o54i6g94?"6<003h6`>498`?>o0l3:1(<:6:9f8j42?2m10e:m50;&20<<?l2d:854j;:k4f?6=,8>265j4n06;>c=<a>k1<7*>488;`>h6<10:<65f7883>!73132o7c?;8;32?>o003:1(<:6:9f8j42?28807d98:18'51?=0m1e=9651298m20=83.:8447d:l20=<6<21b;84?:%37=?>c3g;?47?:;:k:7?6=,8>265j4n06;>40<3`396=4+15;9<a=i9=21=:54i8394?"6<003h6`>4982<>=n190;6)?;9;:g?k7303;276g7f;29 42>21n0b<:7:0c8?l>b290/=9758e9m51>=9k10e5o50;&20<<?l2d:854>c:9j3c<72-;?576k;o37<?7c32c<87>5$06:>=b<f8>36<k4;h50>5<#9=314i5a15:95c=<gl?1<7*>488f2>h6<10;76aj4;29 42>2l<0b<:7:098k`5=83.:844j6:l20=<532en>7>5$06:>`0<f8>36>54i8a94?"6<002h6`>4983?>o>j3:1(<:6:8f8j42?2810e4o50;&20<<>l2d:854=;:k:=?6=,8>264j4n06;>6=<glk1<7*>488ff>h6<10;76aj9;29 42>2lh0b<:7:098k`>=83.:844jb:l20=<532en;7>5$06:>`d<f8>36>54oe;94?"6<00om6`>4983?>ic03:1(<:6:ec8j42?2810ci850;&20<<ci2d:854=;:mg1?6=,8>26io4n06;>6=<gm>1<7*>488ge>h6<10?76ak3;29 42>2mk0b<:7:498ka4=83.:844ka:l20=<132eo=7>5$06:>ag<f8>36:54oe294?"6<00om6`>498;?>idn3:1(<:6:ec8j42?2010cnk50;&20<<ci2d:854n;:m``?6=,8>26io4n06;>g=<gjh1<7*>488ge>h6<10h76ala;29 42>2mk0b<:7:e98kf?=83.:844ka:l20=<b32eh47>5$06:>ag<f8>36k54ob594?"6<00om6`>49824>=hk?0;6)?;9;fb?k7303;:76al5;29 42>2mk0b<:7:008?je3290/=975d`9m51>=9:10cn=50;&20<<ci2d:854>4:9lg7<72-;?57jn;o37<?7232en<7>5$06:>ag<f8>36<84;nfe>5<#9=31hl5a15:952=<gmo1<7*>488ge>h6<10:465`de83>!7313nj7c?;8;3:?>ick3:1(<:6:ec8j42?28k07bjm:18'51?=lh1e=9651c98ka1=83.:844ka:l20=<6k21don4?:%37=?bf3g;?47?k;:m`5?6=,8>26io4n06;>4c<3fi;6=4+15;9`d=i9=21=k54i04b>5<#9=31=;l4n06;>5=<a8<26=4+15;953d<f8>36<54i04;>5<#9=31=;l4n06;>7=<a8<<6=4+15;953d<f8>36>54i7`94?"6<00=o6`>4983?>o1i3:1(<:6:7a8j42?2810e;650;&20<<1k2d:854=;:k53?6=,8>26;m4n06;>6=<a?<1<7*>4885g>h6<10?76g95;29 42>2?i0b<:7:498m32=83.:8449c:l20=<132c=?7>5$06:>3e<f8>36:54i7094?"6<00=o6`>498;?>o193:1(<:6:7a8j42?2010e;>50;&20<<1k2d:854n;:k6b?6=,8>26;m4n06;>g=<a<n1<7*>4885g>h6<10h76g:c;29 42>2?i0b<:7:e98m0d=83.:8449c:l20=<b32c>m7>5$06:>3e<f8>36k54i4;94?"6<00=o6`>49824>=n=10;6)?;9;4`?k7303;:76g:7;29 42>2?i0b<:7:008?l31290/=9756b9m51>=9:10e8;50;&20<<1k2d:854>4:9j11<72-;?578l;o37<?7232c<>7>5$06:>3e<f8>36<84;h52>5<#9=31:n5a15:952=<a>:1<7*>4885g>h6<10:465f6g83>!7313<h7c?;8;3:?>o1m3:1(<:6:7a8j42?28k07d8k:18'51?=>j1e=9651c98m3?=83.:8449c:l20=<6k21b9h4?:%37=?0d3g;?47?k;:k67?6=,8>26;m4n06;>4c<3`?96=4+15;92f=i9=21=k54}c36b?6=jj0;6=u+14`951d<@8=;7E?90:X03?e|=3<1j7?<:02951<693i1m7j5138:>xh2838?7c;>:89mfc<73go:6<5+ed8e4>"bn3l;7)h<:39'b1<53-l>6?5+f781?!`02;1/j54=;%d:>7=#nh097)hm:39'bf<53-lo6?5+fd81?!`a2;1/==>52:&244<53-;;>7<4$020>7=#99>1>6*>0481?!77>380(<>8:39'55>=:2.:<44=;%33e?4<,8:i6?5+11a96>"68m097)??e;08 46a2;1/=<>52:&254<53-;:>7<4$030>7=#98>1>6*>1481?!76>380(<?8:39'54>=:2.:=44=;%32e?4<,8;i6?5+10a96>"69m097)?>e;08 47a2;1/=?>52:&264<53-;9>7<4$000>7=#9;>1>6*>2481?!75>380(<<8:39'57>=:2.:>44=;%31e?4<,88i6?5+13a96>"6:m097)?=e;08 44a2;1/=>>52:&274<53-;8>7<4$010>7=#9:>1>6*>3481?!74>380(<=8:39'56>=:2.:?44=;%30e?4<,89i6<5+12a95>"6;m0:885+142950g<,8?:6>64$071>6><,8?86>84$077>4313-;>;7?4$07;>4=#9?n1=;m4$04f>40d3`;?o7>5;h63>5<<aln1<75f15d94?=n<<0;66g>4e83>>o6<l0;66gjc;29?l?0290/=975999m51>=821b5;4?:%37=???3g;?47?4;h;6>5<#9=31555a15:96>=n1=0;6)?;9;;;?k7303907d?95;29 42>28<=7c?;8;28?l71<3:1(<:6:045?k7303;07d?93;29 42>28<=7c?;8;08?l71:3:1(<:6:045?k7303907bl8:18'51?=j11e=9650:9lf3<72-;?57l7;o37<?7<3fh?6=4+15;9f==i9=21>65`b283>!7313h37c?;8;18?jd5290/=975b99m51>=<21dn<4?:%37=?d?3g;?47;4;n`3>5<#9=31n55a15:92>=hio0;6)?;9;`;?k7303=07boj:18'51?=j11e=9658:9lea<72-;?57l7;o37<??<3fkh6=4+15;9f==i9=21m65`ac83>!7313h37c?;8;`8?jg>290/=975b99m51>=k21dm54?:%37=?d?3g;?47j4;nc4>5<#9=31n55a15:9a>=hi?0;6)?;9;`;?k7303l07bo::18'51?=j11e=9651198kd2=83.:844m8:l20=<6921dm>4?:%37=?d?3g;?47?=;:mb6?6=,8>26o64n06;>45<3fk:6=4+15;9f==i9=21=954o`294?"6<00i46`>49821>=hjl0;6)?;9;`;?k7303;=76amd;29 42>2k20b<:7:058?jdd290/=975b99m51>=9110col50;&20<<e02d:854>9:9lfd<72-;?57l7;o37<?7f32ei57>5$06:>g><f8>36<l4;n`6>5<#9=31n55a15:95f=<ghk1<7*>488a<>h6<10:h65`9g83>!7313h37c?;8;3f?>i>m3:1(<:6:c:8j42?28l07d?k:18'51?=9l1e=9650:9j5f<72-;?57?j;o37<?7<3`;i6=4+15;95`=i9=21>65f1`83>!7313;n7c?;8;18?l41290/=9751d9m51>=<21b>84?:%37=?7b3g;?47;4;h07>5<#9=31=h5a15:92>=n::0;6)?;9;3f?k7303=07d<=:18'51?=9l1e=9658:9j64<72-;?57?j;o37<??<3`8;6=4+15;95`=i9=21m65f1g83>!7313;n7c?;8;`8?l7>290/=9751d9m51>=k21b=54?:%37=?7b3g;?47j4;h0`>5<#9=31>i5a15:94>=n:k0;6)?;9;0g?k7303;07d<n:18'51?=:m1e=9652:9j6<<72-;?57<k;o37<?5<3`9>6=4+15;96a=i9=21865f3583>!73138o7c?;8;78?l54290/=9752e9m51>=>21b??4?:%37=?4c3g;?4794;h12>5<#9=31>i5a15:9<>=n;90;6)?;9;0g?k7303307d<i:18'51?=:m1e=965a:9j6`<72-;?57<k;o37<?d<3`836=4+15;96a=i9=21o65f2683>!73138o7c?;8;f8?l>d290/=9758e9m51>=821b4o4?:%37=?>c3g;?47?4;h::>5<#9=314i5a15:96>=n010;6)?;9;:g?k7303907d68:18'51?=0m1e=9654:9j<3<72-;?576k;o37<?3<3`2>6=4+15;9<a=i9=21:65f8583>!73132o7c?;8;58?l>4290/=9758e9m51>=021b4?4?:%37=?>c3g;?4774;h:2>5<#9=314i5a15:9e>=n090;6)?;9;:g?k7303h07d9j:18'51?=0m1e=965c:9j3a<72-;?576k;o37<?b<3`=h6=4+15;9<a=i9=21i65f7c83>!73132o7c?;8;d8?l1f290/=9758e9m51>=9910e:750;&20<<?l2d:854>1:9j3=<72-;?576k;o37<?7532c<;7>5$06:>=b<f8>36<=4;h55>5<#9=314i5a15:951=<a>?1<7*>488;`>h6<10:965f9283>!73132o7c?;8;35?>o>:3:1(<:6:9f8j42?28=07d7>:18'51?=0m1e=9651998m<6=83.:8447d:l20=<6121b4k4?:%37=?>c3g;?47?n;:k;a?6=,8>265j4n06;>4d<3`2j6=4+15;9<a=i9=21=n54i6d94?"6<003h6`>4982`>=n?=0;6)?;9;:g?k7303;n76g83;29 42>21n0b<:7:0d8?jc2290/=975e79m51>=821di94?:%37=?c13g;?47?4;ng0>5<#9=31i;5a15:96>=hm;0;6)?;9;g5?k7303907d7l:18'51?=1m1e=9650:9j=g<72-;?577k;o37<?7<3`3j6=4+15;9=a=i9=21>65f9883>!73133o7c?;8;18?jcf290/=975ec9m51>=821di44?:%37=?ce3g;?47?4;ng;>5<#9=31io5a15:96>=hm>0;6)?;9;ga?k7303907bj6:18'51?=lh1e=9650:9l`=<72-;?57jn;o37<?7<3fn=6=4+15;9`d=i9=21>65`d483>!7313nj7c?;8;18?jb3290/=975d`9m51>=<21dh>4?:%37=?bf3g;?47;4;nf1>5<#9=31hl5a15:92>=hl80;6)?;9;fb?k7303=07bj?:18'51?=lh1e=9658:9lgc<72-;?57jn;o37<??<3fin6=4+15;9`d=i9=21m65`ce83>!7313nj7c?;8;`8?jee290/=975d`9m51>=k21dol4?:%37=?bf3g;?47j4;na:>5<#9=31hl5a15:9a>=hk10;6)?;9;fb?k7303l07bm8:18'51?=lh1e=9651198kf0=83.:844ka:l20=<6921do84?:%37=?bf3g;?47?=;:m`0?6=,8>26io4n06;>45<3fi86=4+15;9`d=i9=21=954ob094?"6<00om6`>49821>=hm90;6)?;9;fb?k7303;=76akf;29 42>2mk0b<:7:058?jbb290/=975d`9m51>=9110cij50;&20<<ci2d:854>9:9l`f<72-;?57jn;o37<?7f32eon7>5$06:>ag<f8>36<l4;nf4>5<#9=31hl5a15:95f=<gji1<7*>488ge>h6<10:h65`c083>!7313nj7c?;8;3f?>id83:1(<:6:ec8j42?28l07d?9a;29 42>28<i7c?;8;28?l7113:1(<:6:04a?k7303;07d?98;29 42>28<i7c?;8;08?l71?3:1(<:6:04a?k7303907d8m:18'51?=>j1e=9650:9j2d<72-;?578l;o37<?7<3`<36=4+15;92f=i9=21>65f6683>!7313<h7c?;8;18?l01290/=9756b9m51>=<21b:84?:%37=?0d3g;?47;4;h47>5<#9=31:n5a15:92>=n>:0;6)?;9;4`?k7303=07d8=:18'51?=>j1e=9658:9j24<72-;?578l;o37<??<3`<;6=4+15;92f=i9=21m65f5g83>!7313<h7c?;8;`8?l3c290/=9756b9m51>=k21b9n4?:%37=?0d3g;?47j4;h7a>5<#9=31:n5a15:9a>=n=h0;6)?;9;4`?k7303l07d;6:18'51?=>j1e=9651198m0>=83.:8449c:l20=<6921b9:4?:%37=?0d3g;?47?=;:k62?6=,8>26;m4n06;>45<3`?>6=4+15;92f=i9=21=954i4694?"6<00=o6`>49821>=n?;0;6)?;9;4`?k7303;=76g81;29 42>2?i0b<:7:058?l17290/=9756b9m51>=9110e;h50;&20<<1k2d:854>9:9j2`<72-;?578l;o37<?7f32c=h7>5$06:>3e<f8>36<l4;h4:>5<#9=31:n5a15:95f=<a<o1<7*>4885g>h6<10:h65f5283>!7313<h7c?;8;3f?>o2:3:1(<:6:7a8j42?28l07p}>4283>gb|58=:6k?4=07`>4b<58?h6<m4=07`>77<58?h6?>4=07`>4`<58?h6<74=07`>4><58?h6?m4=07`>7d<58?h6?k4=07`>7><58?h6?94=07`>=e<58?h65l4=07`>=?<58?h6564=07`>=1<58?h6584=07`>=3<58?h65:4=07`>=5<58?h65<4=07`>=7<58?h65>4=07`>2c<58?h6:j4=07`>2e<58?h6:l4=07`>2g<58?h6:74=07`>2><58?h6:94=07`>20<58?h6:;4=07`><5<58?h64<4=07`><e<58?h64l4=07`><g<58?h6<:l;<36g?73m27:9n4>4g9>50b=9m16=8j51b9>50b=:816=8j5219>50b=9o16=8j5189>50b=9116=8j52b9>50b=:k16=8j52d9>50b=:116=8j5269>50b=0j16=8j58c9>50b=0016=8j5899>50b=0>16=8j5879>50b=0<16=8j5859>50b=0:16=8j5839>50b=0816=8j5819>50b=?l16=8j57e9>50b=?j16=8j57c9>50b=?h16=8j5789>50b=?116=8j5769>50b=??16=8j5749>50b=1:16=8j5939>50b=1j16=8j59c9>50b=1h16=8j515a8943c28>n70?:d;37b>;6=l0:h63>5d82g>;6=l09=63>5d814>;6=l0:j63>5d82=>;6=l0:463>5d81g>;6=l09n63>5d81a>;6=l09463>5d813>;6=l03o63>5d8;f>;6=l03563>5d8;<>;6=l03;63>5d8;2>;6=l03963>5d8;0>;6=l03?63>5d8;6>;6=l03=63>5d8;4>;6=l0<i63>5d84`>;6=l0<o63>5d84f>;6=l0<m63>5d84=>;6=l0<463>5d843>;6=l0<:63>5d841>;6=l02?63>5d8:6>;6=l02o63>5d8:f>;6=l02m63>5d820f=:9<o1=9k4=07f>42a34;>j7?k;<36b?7d34;>j7<>;<36b?4734;>j7?i;<36b?7>34;>j7?7;<36b?4d34;>j7<m;<36b?4b34;>j7<7;<36b?4034;>j78m;<36b?0f34;>j787;<36b?0534;>j78>;<36b?0734;>j7;6;<36b?3?34;>j7;8;<36b?1734;>j78i;<36b?0b34;>j76l;<36b?>e34;>j766;<36b?>?34;>j768;<36b?>134;>j76:;<36b?>334;>j76<;<36b?>534;>j76>;<36b?>734;>j79j;<36b?1c34;>j79l;<36b?1e34;>j79n;<36b?1>34;>j797;<36b?1034;>j799;<36b?1234;>j77<;<36b??534;>j77>;<36b??734;>j76i;<36b??034;>j779;<36b??234;>j77;;<36b??d34;>j77m;<36b??f34;>j776;<36b?73k27:9k4>4d9>50`=9=l0q~<l1;296~X5k816=8m5c19~w7e52909wS<l2:?21f<d92wx>nj50;0xZ7ec34;>o7ml;|q1`=<72;qU>i64=07`>a1<uz8oo7>52z\1`f=:9<i1ho5rs3fg>5<5sW8oh63>5b8gg>{t:mo1<7<t^3ff?872k3no7p}=dg83>7}Y:ml01<;l:eg8yv4b83:1>vP=e19>50e=m>1v?k>:181[4b927:9i4l0:p6f5=838pR?m<;<36`?e63ty9o94?:3y]6f2<58?o6nm4}r0`1?6=:rT9o85214f9`2=z{;i=6=4={_0`2>;6=m0on6s|2b594?4|V;i<70?:d;f`?xu5k10;6?uQ2b:8943c2mn0q~<l9;296~X5k016=8j5dd9~w7ef2909wS<la:?21a<b?2wx>nl50;0xZ7ee34;>i7m?;|q1gf<72;qU>nm4=07f>f7<uz8hi7>52z\1g`=:9<o1on5rs3ae>5<5sW8hj63>5d8g3>{t:m:1<7<t^3f3?872m3ni7p}=d083>7}Y:m;01<;j:ea8yv4c:3:1>vP=d39>50c=lm1v?j<:181[4c;27:9h4ke:p6a2=838pR?j;;<36a?c03ty9h84?:3y]6a3<58?m6n>4}r0g2?6=:rT9h;5214d9g4=z{;n<6=4={_0g3>;6=o0ho6s|2e;94?4|V;n270?:f;f4?xu5lh0;6?uQ2ec8943a2mh0q~<;0;296~X5<916=8m59d9~w7262909wS<;1:?21f<>n2wx>;750;0xZ70>34;>o7on;|q131<72;qU>::4=07`>g3<uz8<j7>52z\13c=:9<i1n45rs3:b>5<5sW83m63>5b8ae>{t:0?1<7<t^3;6?872k3hi7p}=a183>7}Y:h:01<;l:ca8yv4fj3:1>vP=ac9>50e=m;1v?l9:181[4e>27:9i46e:p614=838pR?:=;<36`??a3ty98i4?:3y]61b<58?o6lo4}r06<?6=:rT9955214f9f0=z{;<96=4={_056>;6=m0i56s|27194?4|V;<870?:d;`b?xu5>=0;6?uQ2768943c2kh0q~<95;296~X5><16=8j5bb9~w7012909wS<96:?21a<b:2wx>;950;0xZ70034;>i77j;|q12=<72;qU>;64=07f><`<uz8=m7>52z\12d=:9<o1ml5rs34a>5<5sW8=n63>5d8a1>{t:?i1<7<t^34`?872m3h27p}=6e83>7}Y:?n01<;j:cc8yv41m3:1>vP=6d9>50c=jk1v?8i:181[41n27:9h4mc:p626=838pR?9?;<36a?c53ty9;<4?:3y]627<58?m64k4}r046?6=:rT9;?5214d9=c=z{;=86=4={_047>;6=o0jm6s|26794?4|V;=>70?:f;`6?xu5??0;6?uQ2648943a2k30q~<87;296~X5?>16=8m5be9~w71?2909wS<88:?21f<em2wx>:750;0xZ71>34;>o7o?;|q13d<72;qU>:o4=07`>d7<uz8<n7>52z\13g=:9<i1m?5rs35`>5<5sW8<o63>5b8b7>{t:>n1<7<t^35g?872k3k?7p}=7d83>7}Y:>o01<;l:`78yv4?83:1>vP=819>50e=m:1v?6>:181[4?927:9i4md:p6=4=838pR?6=;<36`?db3ty94>4?:3y]6=5<58?o6l>4}r0;0?6=:rT9495214f9e4=z{;2>6=4={_0;1>;6=m0j>6s|29494?4|V;2=70?:d;c0?xu50>0;6?uQ2958943c2h>0q~<78;296~X50116=8j5a49~w7>>2909wS<79:?21a<b;2wx>5l50;0xZ7>e34;>i7lk;|q1<f<72;qU>5m4=07f>gc<uz83h7>52z\1<a=:9<o1m=5rs3:f>5<5sW83i63>5d8b5>{t:1l1<7<t^3:e?872m3k97p}=9183>7}Y:0:01<;j:`18yv4>93:1>vP=909>50c=i=1v?7=:181[4>:27:9h4n5:p6<5=838pR?7<;<36a?c43ty9594?:3y]6<2<58?m6oj4}r0:2?6=:rT95;5214d9f`=z{;3<6=4={_0:3>;6=o0j<6s|28:94?4|V;3370?:f;c2?xu5100;6?uQ28;8943a2h80q~<6a;296~X51h16=8m5a79~w7?e2909wS<6b:?21f<f?2wx>4m50;0xZ7?d34;>o7o7;|q1=a<72;qU>4j4=07`>d?<uz82i7>52z\1=`=:9<i1mo5rs3;e>5<5sW82j63>5b8bg>{t:h;1<7<t^3c2?872k3ko7p}=a383>7}Y:h801<;l:`g8yv4f;3:1>vP=a29>50e=m=1v?o;:181[4f<27:9i4n6:p6d3=838pR?o:;<36`?g03ty9m;4?:3y]6d0<58?o6l64}r0b3?6=:rT9m:5214f9e<=z{;k36=4={_0b<>;6=m0jn6s|2`;94?4|V;k270?:d;c`?xu5ih0;6?uQ2`c8943c2hn0q~<nc;296~X5ij16=8j5ad9~w7gc2909wS<nd:?21a<b<2wx>lk50;0xZ7gb34;>i7o9;|q1ec<72;qU>lh4=07f>d1<uz8i<7>52z\1f5=:9<o1m55rs3`2>5<5sW8i=63>5d8b=>{t:k81<7<t^3`1?872m3ki7p}=b283>7}Y:k901<;j:`a8yv4e<3:1>vP=b59>50c=im1v?l::181[4e=27:9h4ne:p6g1=838pR?l8;<36a?c33ty9n54?:3y]6g><58?m6l84}r0a=?6=:rT9n45214d9e2=z{;hj6=4={_0ae>;6=o0j46s|2c`94?4|V;hi70?:f;c:?xu5jj0;6?uQ2ca8943a2hh0q~<md;296~X5jm16=8m5ag9~w7db2909wS<me:?21f<e82wx>oh50;0xZ7da34;>o7l>;|q1g5<72;qU>n>4=07`>g4<uz8??7>52z\106=:9<i1n>5rs367>5<5sW8?863>5b8a0>{t:=?1<7<t^366?872k3h=7p}=4783>7}Y:=<01<;l:c58yv43?3:1>vP=469>50e=m<1v?:7:181[43027:9i4nf:p61?=838pR?:6;<36`?d73ty98l4?:3y]61g<58?o6o?4}r07f?6=:rT98o5214f9f7=z{;>h6=4={_07g>;6=m0i?6s|25g94?4|V;>n70?:d;`7?xu5<o0;6?uQ25d8943c2k<0q~<:0;296~X5=916=8j5b69~w7362909wS<:1:?21a<b=2wx>8<50;0xZ73534;>i7oi;|q116<72;qU>8=4=07f>g6<uz8>87>52z\111=:9<o1n<5rs376>5<5sW8>963>5d8a6>{t:<<1<7<t^375?872m3h87p}=5683>7}Y:<=01<;j:c68yv4213:1>vP=589>50c=j?1v?;n:181[42i27:9h4m7:p60d=838pR?;m;<36a?c23ty99n4?:3y]60e<58?m6lh4}r06`?6=:rT99i5214d9f5=z{;?n6=4={_06a>;6=o0i=6s|24d94?4|V;?m70?:f;`1?xu5>90;6?uQ2728943a2k90q~<j3;29=~X5m:16=8m5ee9>50e=9=n01<;k:df8943c28>o70?:e;gg?872m3;?h63>5g8f`>;6=o0:8i5rs0;g>5<2sW;2h63>5b871>;6=m0?963>5d871>;6=o0?96s|2d094?3|V;o970?:c;g`?872l3oh70?:e;g`?872n3oh7p}>9b83>0}Y90i01<;l:528943c2=:01<;j:528943a2=:0q~<>f;296~X59o16=8m5729~w7472909wS<=0:?21f<0<2wx>?l50;0xZ74e34;>o79i;|q173<72;qU>>84=07`>=g<uz88m7>52z\17d=:9<i14h5rs31a>5<5sW88n63>5b8;b>{t::i1<7<t^31`?872k33;7p}=3e83>7}Y::n01<;l:838yv44m3:1>vP=3d9>50e=101v?=i:181[44n27:9i483:p677=838pR?<>;<36`?133ty9>?4?:3y]674<58?o6:h4}r017?6=:rT9>>5214f9<d=z{;8?6=4={_010>;6=m03i6s|23794?4|V;8>70?:d;:e?xu5:?0;6?uQ2348943c20:0q~<=7;296~X5:>16=8j5909~w74?2909wS<=8:?21a<>12wx>?750;0xZ74>34;>i79<;|q16d<72;qU>?o4=07f>22<uz89o7>52z\16f=:9<o1;k5rs30g>5<5sW89h63>5d8;e>{t:;o1<7<t^30f?872m32n7p}=2g83>7}Y:;l01<;j:9d8yv4483:1>vP=319>50c=191v?=>:181[44927:9h461:p664=838pR?==;<36a??>3ty9?>4?:3y]665<58?m6:=4}r000?6=:rT9?95214d931=z{;9>6=4={_001>;6=o0<j6s|22594?4|V;9<70?:f;:b?xu5;10;6?uQ22:8943a21o0q~?70;291~X60916=8m52g9>50b=:o16=8k52g9>50`=:o1v<6>:186[7?927:9n4<0:?21a<4827:9h4<0:?21c<482wx=5<50;7xZ4>534;>o7=>;<36`?5634;>i7=>;<36b?563ty:4>4?:4y]5=5<58?h6><4=07g>64<58?n6><4=07e>64<uz;387>55z\2<1=:9<i1?>5214f976=:9<o1?>5214d976=z{82>6=4:{_3;1>;6=j08863>5e800>;6=l08863>5g800>{t91<1<7;t^0:5?872k39>70?:d;16?872m39>70?:f;16?xu60>0;68uQ1958943d2;301<;k:3;8943b2;301<;i:3;8yv7?03:19vP>899>50e=:h16=8j52`9>50c=:h16=8h52`9~w7c0290:=vP=e69>50e=9?k01<;l:04:?872k3;=463>5b8222=:9<n1=;o4=07g>40>34;>h7?98:?21a<6>>16=8k517c8943b28<270?:e;35<>;6=l0:::5214d953g<58?m6<86;<36b?71027:9k4>669~w4?b2909wS?6e:?21f<2:2wx=4h50;0xZ4?a34;>o7;<;|q2g2<72;qU=n94=07`>0c<uz;o>7>52z\2`7=:9<i1:45rs0fg>5<5sW;oh63>5b85`>{t9l21<7<t^0g;?872k3<n7p}>f283>7}Y9o901<;l:7d8yv7am3:1>vP>fd9>50e=?91v?>6:181[47127:9n464:p642=838pR??;;<36`?353ty:m=4?:3y]5d6<58?o68=4}r3bf?6=:rT:mo5214f91`=z{8h=6=4={_3a2>;6=m0=56s|1b294?4|V8i;70?:d;4g?xu6k80;6?uQ1b38943c2?o0q~?l2;296~X6k;16=8j56g9~w4e42909wS?l3:?21a<082wx=n:50;0xZ4e334;>h77;;|q2g0<72;qU=n;4=07f>04<uz;h:7>52z\2g3=:9<o19>5rs0a;>5<5sW;h463>5d86a>{t9j31<7<t^0a:?872m3<27p}>c`83>7}Y9jk01<;j:7f8yv7dj3:1>vP>cc9>50c=>l1v<ml:181[7dk27:9h49f:p5fb=838pR<mk;<36a?173ty:oh4?:3y]5fc<58?n64:4}r3`b?6=:rT:ok5214d917=z{8n;6=4={_3g4>;6=o0>?6s|1e394?4|V8n:70?:f;7f?xu6l:0;6?uQ1e18943a2?30q~?k4;296~X6l=16=8h56e9~w4b22909wS?k5:?21f<092wx=i850;0xZ4b134;>o79=;|q2`2<72;qU=i94=07`>02<uz;o47>52z\2`==:9<i1985rs0f:>5<5sW;o563>5b862>{t9mk1<7<t^0fb?872k3?<7p}>dc83>7}Y9mh01<;l:4:8yv7ck3:1>vP>db9>50e==01v<jj:181[7cm27:9n465:p5a`=838pR<ji;<36`?163ty:i=4?:3y]5`6<58?o6:<4}r3f5?6=:rT:i<5214f911=z{8o96=4={_3f6>;6=m0>96s|1d194?4|V8o870?:d;75?xu6m=0;6?uQ1d68943c2<=0q~?j5;296~X6m<16=8j5599~w4c12909wS?j6:?21a<212wx=h950;0xZ4c034;>h77:;|q2a<<72;qU=h74=07f>27<uz;nm7>52z\2ad=:9<o1;?5rs0ga>5<5sW;nn63>5d860>{t9li1<7<t^0g`?872m3?>7p}>ee83>7}Y9ln01<;j:448yv7bm3:1>vP>ed9>50c==>1v<ki:181[7bn27:9h4:8:p5c6=838pR<h?;<36a?3>3ty:j<4?:3y]5c7<58?n64;4}r3e6?6=:rT:j?5214d934=z{8l?6=4={_3e0>;6=o0<>6s|1g794?4|V8l>70?:f;77?xu6n?0;6?uQ1g48943a2<?0q~?i7;296~X6n>16=8h5579~w4`?2909wS?i8:?21f<2i2wx=k750;0xZ4`>34;>o7;m;|q2bd<72;qU=ko4=07`>0e<uz;mn7>52z\2bg=:9<i19i5rs0d`>5<5sW;mo63>5b86b>{t9on1<7<t^0dg?872k3<;7p}>fg83>7}Y9ol01<;l:738yv4783:1>vP=019>50e=>;1v?>>:181[47927:9n466:p654=838pR?>=;<36`?3f3ty9<>4?:3y]655<58?o68l4}r030?6=:rT9<95214f91f=z{;:>6=4={_031>;6=m0>h6s|21494?4|V;:=70?:d;7e?xu58>0;6?uQ2158943c2?:0q~<?8;296~X58116=8j5609~w76f2909wS<?a:?21a<1:2wx>=l50;0xZ76e34;>h779;|q14f<72;qU>=m4=07f>0g<uz8;h7>52z\14a=:9<o19o5rs32f>5<5sW8;i63>5d86g>{t:9l1<7<t^32e?872m3?o7p}=1183>7}Y:8:01<;j:4d8yv4693:1>vP=109>50c=>91v??=:181[46:27:9h491:p645=838pR??<;<36a?053ty9=84?:3y]643<58?n6484}r022?6=:rT9=;5214d91d=z{;;<6=4={_023>;6=o0>n6s|20:94?4|V;;370?:f;7`?xu5900;6?uQ20;8943a2<n0q~<>a;296~X59h16=8h55g9~w77e2909wS<>b:?21f<1;2wx><m50;0xZ77d34;>o78;;|q15a<72;qU><j4=07`>33<uz8:i7>52z\15`=:9<i1:;5rs0c2>5<5sW;j=63>5b853>{t9h81<7<t^0c1?872k3<37p}>a283>7}Y9h901<;l:7c8yv7f<3:1>vP>a59>50e=>k1v<o::181[7f=27:9n467:p5d0=838pR<o9;<36`?043ty:m:4?:3y]5d1<58?o6;:4}r3b<?6=:rT:m55214f920=z{8k26=4={_3b=>;6=m0=:6s|1`c94?4|V8kj70?:d;44?xu6ij0;6?uQ1`a8943c2?20q~?nd;296~X6im16=8j56`9~w4gb2909wS?ne:?21a<1j2wx=lh50;0xZ4ga34;>h778;|q2f5<72;qU=o>4=07f>35<uz;i=7>52z\2f4=:9<o1:95rs0`1>5<5sW;i>63>5d851>{t9k91<7<t^0`0?872m3<=7p}>b583>7}Y9k>01<;j:758yv7e=3:1>vP>b49>50c=>11v<l8:181[7e?27:9h49a:p5g>=838pR<l7;<36a?0e3ty:n44?:3y]5g?<58?n6494}r3ae?6=:rT:nl5214d926=z{8hi6=4={_3af>;6=o0=86s|1ca94?4|V8hh70?:f;46?xu6jm0;6?uQ1cf8943a2?<0q~?me;296~X6jl16=8h5669~w41?290>wS?88:?21f<5:27:9i4=2:?21`<5:27:9k4=2:p52?=83?pR<96;<36g?4434;>h7<<;<36a?4434;>j7<<;|q23d<72<qU=:o4=07`>72<58?o6?:4=07f>72<58?m6?:4}r34f?6==rT:;o5214a960=:9<n1>85214g960=:9<l1>85rs05`>5<2sW;<o63>5b812>;6=m09:63>5d812>;6=o09:6s|16f94?3|V8=o70?:c;3b?872l3;j70?:e;3b?872n3;j7p}>7d83>0}Y9>o01<;l:0`8943c28h01<;j:0`8943a28h0q~<j5;2954}Y:l?01<;l:046?872k3;=863>5b8226=:9<i1=;<4=07g>40234;>h7?94:?21a<6>:16=8j51708943b28<>70?:e;350>;6=l0::>5214g9534<58?m6<8:;<36b?71<27:9k4>629>50`=9?80qp`;5683>4}O9?:0qc::8;295~N6>91vb9;6:182M7182we88o50;3xL4073td?9o4?:0yK536<ug>>o7>51zJ225=zf=?o6=4>{I354>{i<<o1<7?tH043?xh3=o0;6<uG1728yk2183:1=vF>619~j106290:wE?90:m034=83;pD<8?;|l726<728qC=;>4}o650?6=9rB::=5rn546>5<6sA;=<6sa47494?7|@8<;7p`;6683>4}O9?:0qc:98;295~N6>91vb986:182M7182we8;o50;3xL4073td?:o4?:0yK536<ug>=o7>51zJ225=zf=<o6=4>{I354>{i<?o1<7?tH043?xh3>o0;6<uG1728yk2083:1=vF>619~j116290:wE?90:m024=83;pD<8?;|l736<728qC=;>4}o640?6=9rB::=5rn556>5<6sA;=<6sa46494?7|@8<;7p`;7683>4}O9?:0qc:88;295~N6>91vb996:182M7182we8:o50;3xL4073td?;o4?:0yK536<ug><o7>51zJ225=zf==o6=4>{I354>{i<>o1<7?tH043?xh3?o0;6<uG1728yk2?83:1=vF>619~j1>6290:wE?90:m0=4=83;pD<8?;|l7<6<728qC=;>4}o6;0?6=9rB::=5rn5:6>5<6sA;=<6sa49494?7|@8<;7p`;8683>4}O9?:0qc:78;295~N6>91vb966:182M7182we85o50;3xL4073td?4o4?:0yK536<ug>3o7>51zJ225=zf=2o6=4>{I354>{i<1o1<7?tH043?xh30o0;6<uG1728yk2>83:1=vF>619~j1?6290:wE?90:m0<4=83;pD<8?;|l7=6<728qC=;>4}o6:0?6=9rB::=5rn5;6>5<6sA;=<6sa48494?7|@8<;7p`;9683>4}O9?:0qc:68;295~N6>91vb976:182M7182we84o50;3xL4073td?5o4?:0yK536<ug>2o7>51zJ225=zf=3o6=4>{I354>{i<0o1<7?tH043?xh31o0;6<uG1728yk2f83:1=vF>619~j1g6290:wE?90:m0d4=83;pD<8?;|l7e6<728qC=;>4}o6b0?6=9rB::=5rn5c6>5<6sA;=<6sa4`494?7|@8<;7p`;a683>4}O9?:0qc:n8;295~N6>91vb9o6:182M7182we8lo50;3xL4073td?mo4?:0yK536<ug>jo7>51zJ225=zf=ko6=4>{I354>{i<ho1<7?tH043?xh3io0;6<uG1728yk2e83:1=vF>619~j1d6290:wE?90:m0g4=83;pD<8?;|l7f6<728qC=;>4}o6a0?6=9rB::=5rn5`6>5<6sA;=<6sa4c494?7|@8<;7p`;b683>4}O9?:0qc:m8;295~N6>91vb9l6:182M7182we8oo50;3xL4073td?no4?:0yK536<ug>io7>51zJ225=zf=ho6=4>{I354>{i<ko1<7?tH043?xh3jo0;6<uG1728yk2d83:1=vF>619~j1e6290:wE?90:m0f4=83;pD<8?;|l7g6<728qC=;>4}o6`0?6=9rB::=5rn5a6>5<6sA;=<6sa4b494?7|@8<;7p`;c683>4}O9?:0qc:l8;295~N6>91vb9m6:182M7182we8no50;3xL4073td?oo4?:0yK536<ug>ho7>51zJ225=zf=io6=4>{I354>{i<jo1<7?tH043?xh3ko0;6<uG1728yk2c83:1=vF>619~j1b6290:wE?90:m0a4=83;pD<8?;|l7`6<728qC=;>4}o6g0?6=9rB::=5rn5f6>5<6sA;=<6sa4e494?7|@8<;7p`;d683>4}O9?:0qc:k8;295~N6>91vb9j6:182M7182we8io50;3xL4073td?ho4?:0yK536<ug>oo7>51zJ225=zf=no6=4>{I354>{i<mo1<7?tH043?xh3lo0;6<uG1728yk2b83:1=vF>619~j1c6290:wE?90:m0`4=83;pD<8?;|l7a6<728qC=;>4}o6f0?6=9rB::=5rn5g6>5<6sA;=<6sa4d494?7|@8<;7p`;e683>4}O9?:0qc:j8;295~N6>91vb9k6:182M7182we8ho50;3xL4073td?io4?:0yK536<ug>no7>51zJ225=zf=oo6=4>{I354>{i<lo1<7?tH043?xh3mo0;6<uG1728yk2a83:1=vF>619~j1`6290:wE?90:m0c4=83;pD<8?;|l7b6<728qC=;>4}o6e0?6=9rB::=5rn5d6>5<6sA;=<6sa4g494?7|@8<;7p`;f683>4}O9?:0qc:i8;295~N6>91vb9h6:182M7182we8ko50;3xL4073td?jo4?:0yK536<ug>mo7>51zJ225=zf=lo6=4>{I354>{i<oo1<7?tH043?xh3no0;6<uG1728yk3783:1=vF>619~j066290:wE?90:m154=83;pD<8?;|l646<728qC=;>4}o730?6=9rB::=5rn426>5<6sA;=<6sa51494?7|@8<;7p`:0683>4}O9?:0qc;?8;295~N6>91vb8>6:182M7182we9=o50;3xL4073td><o4?:0yK536<ug?;o7>51zJ225=zf<:o6=4>{I354>{i=9o1<7?tH043?xh28o0;6<uG1728yk3683:1=vF>619~j076290:wE?90:m144=83;pD<8?;|l656<728qC=;>4}o720?6=9rB::=5rn436>5<6sA;=<6sa50494?7|@8<;7p`:1683>4}O9?:0qc;>8;295~N6>91vb8?6:182M7182we9<o50;3xL4073td>=o4?:0yK536<ug?:o7>51zJ225=zf<;o6=4>{I354>{i=8o1<7?tH043?xh29o0;6<uG1728yk3583:1=vF>619~j046290:wE?90:m174=83;pD<8?;|l666<728qC=;>4}o710?6=9rB::=5rn406>5<6sA;=<6sa53494?7|@8<;7p`:2683>4}O9?:0qc;=8;295~N6>91vb8<6:182M7182we9?o50;3xL4073td>>o4?:0yK536<ug?9o7>51zJ225=zf<8o6=4>{I354>{i=;o1<7?tH043?xh2:o0;6<uG1728yk3483:1=vF>619~j056290:wE?90:m164=83;pD<8?;|l676<728qC=;>4}o700?6=9rB::=5rn416>5<6sA;=<6sa52494?7|@8<;7p`:3683>4}O9?:0qc;<8;295~N6>91vb8=6:182M7182we9>o50;3xL4073td>?o4?:0yK536<ug?8o7>51zJ225=zf<9o6=4>{I354>{i=:o1<7?tH043?xh2;o0;6<uG1728yk3383:1=vF>619~j026290:wE?90:m114=83;pD<8?;|l606<728qC=;>4}o770?6=9rB::=5rn466>5<6sA;=<6sa55494?7|@8<;7p`:4683>4}O9?:0qc;;8;295~N6>91vb8:6:182M7182we99o50;3xL4073td>8o4?:0yK536<ug??o7>51zJ225=zf<>o6=4>{I354>{i==o1<7?tH043?xh2<o0;6<uG1728yk3283:1=vF>619~j036290:wE?90:m104=83;pD<8?;|l616<728qC=;>4}o760?6=9rB::=5rn476>5<6sA;=<6sa54494?7|@8<;7p`:5683>4}O9?:0qc;:8;295~N6>91vb8;6:182M7182we98o50;3xL4073td>9o4?:0yK536<ug?>o7>51zJ225=zf<?o6=4>{I354>{i=<o1<7?tH043?xh2=o0;6<uG1728yk3183:1=vF>619~j006290:wE?90:m134=83;pD<8?;|l626<728qC=;>4}o750?6=9rB::=5rn446>5<6sA;=<6sa57494?7|@8<;7p`:6683>4}O9?:0qc;98;295~N6>91vb886:182M7182we9;o50;3xL4073td>:o4?:0yK536<ug?=o7>51zJ225=zf<<o6=4>{I354>{i=?o1<7?tH043?xh2>o0;6<uG1728yk3083:1=vF>619~j016290:wE?90:m124=83;pD<8?;|l636<728qC=;>4}o740?6=9rB::=5rn456>5<6sA;=<6sa56494?7|@8<;7p`:7683>4}O9?:0qc;88;295~N6>91vb896:182M7182we9:o50;3xL4073td>;o4?:0yK536<ug?<o7>51zJ225=zf<=o6=4>{I354>{i=>o1<7?tH043?xh2?o0;6<uG1728yk3?83:1=vF>619~j0>6290:wE?90:m1=4=83;pD<8?;|l6<6<728qC=;>4}o7;0?6=9rB::=5rn4:6>5<6sA;=<6sa59494?7|@8<;7p`:8683>4}O9?:0qc;78;295~N6>91vb866:182M7182we95o50;3xL4073td>4o4?:0yK536<ug?3o7>51zJ225=zf<2o6=4>{I354>{i=1o1<7?tH043?xh20o0;6<uG1728yk3>83:1=vF>619~j0?6290:wE?90:m1<4=83;pD<8?;|l6=6<728qC=;>4}o7:0?6=9rB::=5rn4;6>5<6sA;=<6sa58494?7|@8<;7p`:9683>4}O9?:0qc;68;295~N6>91vb876:182M7182we94o50;3xL4073td>5o4?:0yK536<ug?2o7>51zJ225=zf<3o6=4>{I354>{i=0o1<7?tH043?xh21o0;6<uG1728yk3f83:1=vF>619~j0g6290:wE?90:m1d4=83;pD<8?;|l6e6<728qC=;>4}o7b0?6=9rB::=5rn4c6>5<6sA;=<6sa5`494?7|@8<;7p`:a683>4}O9?:0qc;n8;295~N6>91vb8o6:182M7182we9lo50;3xL4073td>mo4?:0yK536<ug?jo7>51zJ225=zf<ko6=4>{I354>{zutJKOv9?5;a3<5c3;owKLOu?}ABSxFG
\ No newline at end of file
files = ["acam_databus_interface.vhd",
"acam_timecontrol_interface.vhd",
"carrier_info.vhd",
"circular_buffer.vhd",
"clks_rsts_manager.vhd",
"data_engine.vhd",
"data_formatting.vhd",
"decr_counter.vhd",
"fmc_tdc_core.vhd",
"fmc_tdc_mezzanine.vhd",
"free_counter.vhd",
"incr_counter.vhd",
"irq_generator.vhd",
"leds_manager.vhd",
"local_pps_gen.vhd",
"reg_ctrl.vhd",
"start_retrig_ctrl.vhd",
"tdc_eic.vhd",
"wrabbit_sync.vhd"];
......@@ -105,7 +105,8 @@ entity circular_buffer is
port
-- INPUTS
-- Signal from the clk_rst_manager
(clk_i : in std_logic; -- 125 MHz clock; same for both ports
(clk_tdc_i : in std_logic; -- 125 MHz clock; same for both ports
clk_sys_i : in std_logic;
-- Signals from the data_formatting unit (WISHBONE classic): timestamps writing
tstamp_wr_rst_i : in std_logic; -- timestamp writing WISHBONE reset
......@@ -155,9 +156,9 @@ begin
-- TIMESTAMP WRITINGS WISHBONE CLASSIC ACK --
---------------------------------------------------------------------------------------------------
-- WISHBONE classic interface compatible slave
classic_interface: process (clk_i)
classic_interface: process (clk_tdc_i)
begin
if rising_edge (clk_i) then
if rising_edge (clk_tdc_i) then
if tstamp_wr_rst_i ='1' then
tstamp_wr_ack_p <= '0';
......@@ -186,9 +187,9 @@ begin
-- ACK : _________________|-----------------------------------|_____
-- DATO: <DAT0><DAT1><DAT2><DAT3><DAT4><DAT5>
WB_pipe_ack_fsm_seq: process (clk_i)
WB_pipe_ack_fsm_seq: process (clk_sys_i)
begin
if rising_edge (clk_i) then
if rising_edge (clk_sys_i) then
if tdc_mem_wb_rst_i ='1' then
tstamp_rd_wb_st <= IDLE;
else
......@@ -275,7 +276,7 @@ begin
memory_block: blk_mem_circ_buff_v6_4
port map(
-- Port A: attached to the data_formatting unit
clka => clk_i,
clka => clk_tdc_i,
addra => tstamp_wr_adr_i(7 downto 0), -- 2^8 = 256 addresses
dina => tstamp_wr_dat_i, -- 128-bit long timestamps
ena => tstamp_wr_cyc_i,
......@@ -283,7 +284,7 @@ begin
douta => tstamp_wr_dat_o, -- not used
-- Port B: attached to the GN4124/VME_core unit
clkb => clk_i,
clkb => clk_sys_i,
addrb => tdc_mem_wb_adr_i(9 downto 0),-- 2^10 = 1024 addresses
dinb => tdc_mem_wb_dat_i, -- not used
enb => tdc_mem_wb_cyc_i,
......
......@@ -198,7 +198,7 @@ begin
data_engine_fsm_comb: process (engine_st, activate_acq_p_i, deactivate_acq_p_i, acam_ef1_i, acam_adr,
acam_ef2_i, acam_ef1_meta_i, acam_ef2_meta_i, acam_wr_config_p_i,
acam_rdbk_config_p_i, acam_rdbk_status_p_i, acam_ack_i, acam_rst_p_i,
acam_rdbk_ififo1_p_i, acam_rdbk_ififo2_p_i, acam_rdbk_start01_p_i,
acam_rdbk_ififo1_p_i, acam_rdbk_ififo2_p_i, acam_rdbk_start01_p_i,
start_from_fpga_i, time_c, time_c_full_p)
begin
case engine_st is
......@@ -388,6 +388,8 @@ begin
acam_stb <= '1';
acam_we <= '0';
-----------------------------------------------
time_c_en <= '0';
time_c_rst <= '0';
if deactivate_acq_p_i = '1' then
nxt_engine_st <= INACTIVE;
......@@ -414,7 +416,8 @@ begin
acam_cyc <= '1';
acam_stb <= '1';
acam_we <= '0';
-----------------------------------------------
time_c_en <= '0';
time_c_rst <= '0'; -----------------------------------------------
if deactivate_acq_p_i = '1' then
nxt_engine_st <= INACTIVE;
......@@ -441,7 +444,9 @@ begin
acam_cyc <= '1';
acam_stb <= '1';
acam_we <= '1';
-----------------------------------------------
time_c_en <= '0';
time_c_rst <= '0';
-----------------------------------------------
if acam_ack_i = '1' and acam_adr = x"0E" then -- last address
nxt_engine_st <= INACTIVE;
......@@ -456,7 +461,8 @@ begin
acam_cyc <= '1';
acam_stb <= '1';
acam_we <= '0';
-----------------------------------------------
time_c_en <= '0';
time_c_rst <= '0'; -----------------------------------------------
if acam_ack_i = '1' and acam_adr = x"0E" then -- last address
nxt_engine_st <= INACTIVE;
......@@ -471,7 +477,9 @@ begin
acam_cyc <= '1';
acam_stb <= '1';
acam_we <= '0';
-----------------------------------------------
time_c_en <= '0';
time_c_rst <= '0';
-----------------------------------------------
if acam_ack_i ='1' then
nxt_engine_st <= INACTIVE;
......@@ -486,6 +494,8 @@ begin
acam_cyc <= '1';
acam_stb <= '1';
acam_we <= '0';
time_c_en <= '0';
time_c_rst <= '0';
-----------------------------------------------
if acam_ack_i ='1' then
......@@ -501,6 +511,8 @@ begin
acam_cyc <= '1';
acam_stb <= '1';
acam_we <= '0';
time_c_en <= '0';
time_c_rst <= '0';
-----------------------------------------------
if acam_ack_i ='1' then
......@@ -515,6 +527,8 @@ begin
acam_cyc <= '1';
acam_stb <= '1';
acam_we <= '1';
time_c_en <= '0';
time_c_rst <= '0';
-----------------------------------------------
if acam_ack_i ='1' then
......@@ -529,6 +543,8 @@ begin
acam_cyc <= '0';
acam_stb <= '0';
acam_we <= '0';
time_c_en <= '0';
time_c_rst <= '0';
-----------------------------------------------
nxt_engine_st <= INACTIVE;
......
--_________________________________________________________________________________________________
-- |
-- |TDC core| |
-- |
-- CERN,BE/CO-HT |
--________________________________________________________________________________________________|
---------------------------------------------------------------------------------------------------
-- |
-- fmc_tdc_core |
-- |
---------------------------------------------------------------------------------------------------
-- File fmc_tdc_core.vhd |
-- |
-- Description The TDC core top level instantiates all the modules needed to provide to the |
-- GN4124/VME interface the timestamps generated in the ACAM chip. |
-- |
-- Figure 1 shows the architecture of this core. |
-- |
-- Each timestamp is a 128-bit word with the following structure: |
-- [31:0] Fine time | each bit represents 81.03 ps |
-- [63:32] Coarse time within the current second | each bit represents 8 ns |
-- [95:64] Local UTC time | each bit represents 1 s |
-- [127:96] Metadata | rising/falling tstamp, Channel |
-- |
-- As the structure indicates, each timestamp is referred to a UTC second; the coarse|
-- and fine time indicate with 81.03 ps resolution the amount of time passed after |
-- the last UTC second. |
-- If the White Rabbit synchronization has been established, the UTC time comes from |
-- the White Rabbit core. Otherwise, the one_hz_gen unit is responsible for keeping |
-- the local UTC time relaying on the local TDC oscillator. |
-- Timestamps are formatted to the structure above within the data_formatting unit & |
-- are stored in the circular_buffer, where the GN4124/VME core have direct access |
-- |
-- In this application, the ACAM is used in I-Mode which provides unlimited measuring|
-- range with internal start retriggers. ACAM's counter of retriggers however is not |
-- large enough and there is the need to follow the retriggers inside the core; the |
-- start_retrig_ctrl unit is responsible for that. |
-- |
-- The acam_databus_interface implements the communication with the ACAM for its |
-- configuration as well as for the timestamps retrieval. |
-- The acam_timecontrol_interface is mainly responsible for delivering to the ACAM |
-- the start pulse, to which all timestamps are related. |
-- |
-- The regs_ctrl implements the communication with the GN4124/VME interface for the |
-- configuration of this core and of the ACAM. |
-- The data_engine is managing the transferring of the configuration registers from |
-- the regs_ctrl to the ACAM chip; it is also managing the timestamps' |
-- acquisition from the ACAM chip, making it available to the data_formatting unit. |
-- |
-- The core is providing an interrupt in any of the following 3 cases: |
-- o accumulation of timestamps larger than the settable threshold |
-- o more time passed than the settable time threshold and >=1 timestamps arrived |
-- o error occurred in the ACAM chip |
-- |
-- The clks_rsts_manager unit is providing 125 MHz clock and resets to the core. |
-- _________________________________________________________ |
-- | | |
-- | ________________ ____________ | |
-- | | ____________ | | | ___________ | |
-- | | | | | | | | | | |
-- | | | ACAM time | | | | | irq gen | | |
-- | | | ctrl | | | | |___________| | |
-- | | |____________| | | | ___________ | ______ |
-- | | ____________ | | | | | | | | |
-- | | | | | | data | | | | | | |
-- | | | ACAM data | | | engine | | | | | | |
-- | | | ctrl | | | | | | | | | |
-- | | |____________| | | | | regs | | --> | | |
-- | |________________| | | | ctrl | | <-- | | |
-- ACAM <-- | fine time | | | | | | | |
-- chip --> | ____________ | | | | | | VME/ | |
-- | | | | | | | | |GN4124| |
-- | | start | | | | | | | core | |
-- | | retrig | | | | | | | | |
-- | |____________| | | | | | | | |
-- | coarse time | | | | | | | |
-- | | | | | | | | |
-- WRabbit --|------------------->|\ | | | | | | | |
-- UTC time | ____________ |O| |____________| |___________| | | | |
-- | | | |R| ___________ | | | |
-- | | 1 Hz gen |-->|/ ____________ | | | | | |
-- | |____________| | | | circular | | --> | | |
-- | local UTC time | data | | buffer | | <-- | | |
-- | | formating | | | | | | |
-- | _________________ |____________| |___________| | | | |
-- | |____TDC LEDs_____| | |______| |
-- | | |
-- |_________________________________________________________| |
-- TDC core |
-- _________________________________________________________ |
-- | | |
-- | clks_rsts_manager | |
-- |_________________________________________________________| |
-- |
-- Figure 1: TDC core architecture |
-- |
-- |
-- Authors Gonzalo Penacoba (Gonzalo.Penacoba@cern.ch) |
-- Evangelia Gousiou (Evangelia.Gousiou@cern.ch) |
-- Date 04/2014 |
-- Version v6 |
-- Depends on |
-- |
---------------- |
-- Last changes |
-- 05/2011 v1 GP First version |
-- 06/2012 v2 EG Revamping; Comments added, signals renamed |
-- removed LEDs from top level |
-- new GN4124 core integrated |
-- carrier 1 wire master added |
-- mezzanine I2C master added |
-- mezzanine 1 wire master added |
-- interrupts generator added |
-- changed generation of rst_i |
-- DAC reconfiguration+needed regs added |
-- 06/2012 v3 EG Changes for v2 of TDC mezzanine |
-- Several pinout changes, |
-- acam_ref_clk LVDS instead of CMOS, |
-- no PLL_LD only PLL_STATUS |
-- 04/2013 v4 EG created fmc_tdc_core module; before was all on fmc_tdc_core |
-- 07/2013 v5 EG removed the clks_rsts_manager from the core; will go to top level |
-- 09/2013 v5.1EG added block of comments and architecture drawing |
-- 04/2014 v6 EG added WRabbit support |
-- |
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE |
-- ------------------------------------ |
-- This source file is free software; you can redistribute it and/or modify it under the terms of |
-- the GNU Lesser General Public License as published by the Free Software Foundation; either |
-- version 2.1 of the License, or (at your option) any later version. |
-- This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
-- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
-- See the GNU Lesser General Public License for more details. |
-- You should have received a copy of the GNU Lesser General Public License along with this |
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html |
---------------------------------------------------------------------------------------------------
--=================================================================================================
-- Libraries & Packages
--=================================================================================================
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use work.tdc_core_pkg.all;
use work.gencores_pkg.all;
use work.wishbone_pkg.all;
use work.wrcore_pkg.all;
use work.genram_pkg.all;
--=================================================================================================
-- Entity declaration for fmc_tdc_core
--=================================================================================================
entity fmc_tdc_core is
generic
(g_span : integer := 32; -- address span in bus interfaces
g_width : integer := 32; -- data width in bus interfaces
values_for_simul : boolean := FALSE); -- this generic is set to TRUE
-- when instantiated in a test-bench
port
(-- Clock and reset
clk_125m_i : in std_logic; -- 125 MHz clk from the PLL on the TDC mezz
rst_i : in std_logic; -- global reset, synched to clk_125m_i
acam_refclk_r_edge_p_i : in std_logic; -- rising edge on 31.25MHz ACAM reference clock
send_dac_word_p_o : out std_logic; -- command from GN4124/VME to reconfigure the TDC mezz DAC with dac_word_o
dac_word_o : out std_logic_vector(23 downto 0); -- new DAC configuration word from GN4124/VME
-- Signals for the timing interface with the ACAM on TDC mezzanine
start_from_fpga_o : out std_logic; -- start pulse
err_flag_i : in std_logic; -- error flag
int_flag_i : in std_logic; -- interrupt flag
start_dis_o : out std_logic; -- start disable, not used
stop_dis_o : out std_logic; -- disables all acam channels
-- Signals for the data interface with the ACAM on TDC mezzanine
data_bus_io : inout std_logic_vector(27 downto 0);
address_o : out std_logic_vector(3 downto 0);
cs_n_o : out std_logic; -- chip select for ACAM
oe_n_o : out std_logic; -- output enable for ACAM
rd_n_o : out std_logic; -- read signal for ACAM
wr_n_o : out std_logic; -- write signal for ACAM
ef1_i : in std_logic; -- empty flag of ACAM iFIFO1
ef2_i : in std_logic; -- empty flag of ACAM iFIFO2
-- Signals for the Input Logic on TDC mezzanine
enable_inputs_o : out std_logic; -- enables all 5 inputs
term_en_1_o : out std_logic; -- Ch.1 termination enable of 50 Ohm termination
term_en_2_o : out std_logic; -- Ch.2 termination enable of 50 Ohm termination
term_en_3_o : out std_logic; -- Ch.3 termination enable of 50 Ohm termination
term_en_4_o : out std_logic; -- Ch.4 termination enable of 50 Ohm termination
term_en_5_o : out std_logic; -- Ch.5 termination enable of 50 Ohm termination
-- LEDs on TDC mezzanine
tdc_led_status_o : out std_logic; -- amber led on front pannel, division of clk_125m_i
tdc_led_trig1_o : out std_logic; -- amber led on front pannel, Ch.1 termination
tdc_led_trig2_o : out std_logic; -- amber led on front pannel, Ch.2 termination
tdc_led_trig3_o : out std_logic; -- amber led on front pannel, Ch.3 termination
tdc_led_trig4_o : out std_logic; -- amber led on front pannel, Ch.4 termination
tdc_led_trig5_o : out std_logic; -- amber led on front pannel, Ch.5 termination
-- TDC input signals, also arriving to the FPGA; not used currently
tdc_in_fpga_1_i : in std_logic; -- TDC input Ch.1, not used
tdc_in_fpga_2_i : in std_logic; -- TDC input Ch.2, not used
tdc_in_fpga_3_i : in std_logic; -- TDC input Ch.3, not used
tdc_in_fpga_4_i : in std_logic; -- TDC input Ch.4, not used
tdc_in_fpga_5_i : in std_logic; -- TDC input Ch.5, not used
-- Interrupts
irq_tstamp_p_o : out std_logic; -- if amount of tstamps > tstamps_threshold
irq_time_p_o : out std_logic; -- if 0 < amount of tstamps < tstamps_threshold and time > time_threshold
irq_acam_err_p_o : out std_logic; -- if ACAM err_flag_i is activated
-- White Rabbit control and status registers
wrabbit_status_reg_i : in std_logic_vector(g_width-1 downto 0);
wrabbit_ctrl_reg_o : out std_logic_vector(g_width-1 downto 0);
-- White Rabbit timing
wrabbit_synched_i : in std_logic;
wrabbit_tai_p_i : in std_logic;
wrabbit_tai_i : in std_logic_vector(31 downto 0);
-- WISHBONE bus interface with the GN4124/VME core for the configuration of the TDC core
tdc_config_wb_adr_i : in std_logic_vector(g_span-1 downto 0); -- WISHBONE classic address
tdc_config_wb_dat_i : in std_logic_vector(g_width-1 downto 0); -- WISHBONE classic data in
tdc_config_wb_stb_i : in std_logic; -- WISHBONE classic strobe
tdc_config_wb_we_i : in std_logic; -- WISHBONE classic write enable
tdc_config_wb_cyc_i : in std_logic; -- WISHBONE classic cycle
tdc_config_wb_ack_o : out std_logic; -- WISHBONE classic acknowledge
tdc_config_wb_dat_o : out std_logic_vector(g_width-1 downto 0); -- WISHBONE classic data out
-- WISHBONE bus interface with the GN4124/VME core for the retrieval of the timestamps from the TDC core memory
tdc_mem_wb_adr_i : in std_logic_vector(31 downto 0); -- WISHBONE pipelined address
tdc_mem_wb_dat_i : in std_logic_vector(31 downto 0); -- WISHBONE pipelined data in
tdc_mem_wb_stb_i : in std_logic; -- WISHBONE pipelined strobe
tdc_mem_wb_we_i : in std_logic; -- WISHBONE pipelined write enable
tdc_mem_wb_cyc_i : in std_logic; -- WISHBONE pipelined cycle
tdc_mem_wb_ack_o : out std_logic; -- WISHBONE pipelined acknowledge
tdc_mem_wb_dat_o : out std_logic_vector(31 downto 0); -- WISHBONE pipelined data out
tdc_mem_wb_stall_o : out std_logic); -- WISHBONE pipelined stall
end fmc_tdc_core;
--=================================================================================================
-- architecture declaration
--=================================================================================================
architecture rtl of fmc_tdc_core is
-- ACAM communication
signal acm_adr : std_logic_vector(7 downto 0);
signal acm_cyc, acm_stb, acm_we, acm_ack : std_logic;
signal acm_dat_r, acm_dat_w : std_logic_vector(g_width-1 downto 0);
signal acam_ef1, acam_ef2, acam_ef1_meta, acam_ef2_meta : std_logic;
signal acam_errflag_f_edge_p, acam_errflag_r_edge_p : std_logic;
signal acam_intflag_f_edge_p : std_logic;
signal acam_tstamp1, acam_tstamp2 : std_logic_vector(g_width-1 downto 0);
signal acam_tstamp1_ok_p, acam_tstamp2_ok_p : std_logic;
-- control unit
signal activate_acq_p, deactivate_acq_p, load_acam_config : std_logic;
signal read_acam_config, read_acam_status, read_ififo1 : std_logic;
signal read_ififo2, read_start01, reset_acam, load_utc : std_logic;
signal clear_dacapo_counter, roll_over_incr_recent : std_logic;
signal deactivate_chan : std_logic_vector(4 downto 0);
signal pulse_delay, window_delay, clk_period : std_logic_vector(g_width-1 downto 0);
signal starting_utc, acam_inputs_en : std_logic_vector(g_width-1 downto 0);
signal acam_ififo1, acam_ififo2, acam_start01 : std_logic_vector(g_width-1 downto 0);
signal irq_tstamp_threshold, irq_time_threshold : std_logic_vector(g_width-1 downto 0);
signal local_utc, wr_index : std_logic_vector(g_width-1 downto 0);
signal acam_config, acam_config_rdbk : config_vector;
signal tstamp_wr_p, start_from_fpga, state_active_p : std_logic;
-- retrigger control
signal clk_i_cycles_offset, roll_over_nb, retrig_nb_offset: std_logic_vector(g_width-1 downto 0);
signal local_utc_p : std_logic;
signal current_retrig_nb : std_logic_vector(g_width-1 downto 0);
-- UTC
signal utc_p : std_logic;
signal utc, wrabbit_ctrl_reg : std_logic_vector(g_width-1 downto 0);
-- circular buffer
signal circ_buff_class_adr : std_logic_vector(7 downto 0);
signal circ_buff_class_stb, circ_buff_class_cyc : std_logic;
signal circ_buff_class_we, circ_buff_class_ack : std_logic;
signal circ_buff_class_data_wr, circ_buff_class_data_rd : std_logic_vector(4*g_width-1 downto 0);
-- LEDs
signal acam_channel : std_logic_vector(5 downto 0);
signal tdc_in_fpga_1, tdc_in_fpga_2, tdc_in_fpga_3 : std_logic_vector(1 downto 0);
signal tdc_in_fpga_4, tdc_in_fpga_5 : std_logic_vector(1 downto 0);
signal acam_tstamp_channel : std_logic_vector(2 downto 0);
-- Chipscope
component chipscope_ila
port (
CONTROL : inout std_logic_vector(35 downto 0);
CLK : in std_logic;
TRIG0 : in std_logic_vector(31 downto 0);
TRIG1 : in std_logic_vector(31 downto 0);
TRIG2 : in std_logic_vector(31 downto 0);
TRIG3 : in std_logic_vector(31 downto 0));
end component;
component chipscope_icon
port (
CONTROL0 : inout std_logic_vector (35 downto 0));
end component;
signal CONTROL : std_logic_vector(35 downto 0);
signal CLK : std_logic;
signal TRIG0 : std_logic_vector(31 downto 0);
signal TRIG1 : std_logic_vector(31 downto 0);
signal TRIG2 : std_logic_vector(31 downto 0);
signal TRIG3 : std_logic_vector(31 downto 0);
--=================================================================================================
-- architecture begin
--=================================================================================================
begin
---------------------------------------------------------------------------------------------------
-- TDC REGISTERS CONTROLLER --
---------------------------------------------------------------------------------------------------
reg_control_block: reg_ctrl
generic map
(g_span => g_span,
g_width => g_width)
port map
(clk_i => clk_125m_i,
rst_i => rst_i,
tdc_config_wb_adr_i => tdc_config_wb_adr_i,
tdc_config_wb_dat_i => tdc_config_wb_dat_i,
tdc_config_wb_stb_i => tdc_config_wb_stb_i,
tdc_config_wb_we_i => tdc_config_wb_we_i,
tdc_config_wb_cyc_i => tdc_config_wb_cyc_i,
tdc_config_wb_ack_o => tdc_config_wb_ack_o,
tdc_config_wb_dat_o => tdc_config_wb_dat_o,
activate_acq_p_o => activate_acq_p,
deactivate_acq_p_o => deactivate_acq_p,
acam_wr_config_p_o => load_acam_config,
acam_rdbk_config_p_o => read_acam_config,
acam_rdbk_status_p_o => read_acam_status,
acam_rdbk_ififo1_p_o => read_ififo1,
acam_rdbk_ififo2_p_o => read_ififo2,
acam_rdbk_start01_p_o => read_start01,
acam_rst_p_o => reset_acam,
load_utc_p_o => load_utc,
dacapo_c_rst_p_o => clear_dacapo_counter,
deactivate_chan_o => deactivate_chan,
acam_config_rdbk_i => acam_config_rdbk,
acam_ififo1_i => acam_ififo1,
acam_ififo2_i => acam_ififo2,
acam_start01_i => acam_start01,
local_utc_i => utc,
irq_code_i => x"00000000",
core_status_i => x"00000000",
wr_index_i => wr_index,
wrabbit_status_reg_i => wrabbit_status_reg_i,
wrabbit_ctrl_reg_o => wrabbit_ctrl_reg,
acam_config_o => acam_config,
starting_utc_o => starting_utc,
acam_inputs_en_o => acam_inputs_en,
start_phase_o => window_delay,
irq_tstamp_threshold_o=> irq_tstamp_threshold,
irq_time_threshold_o => irq_time_threshold,
send_dac_word_p_o => send_dac_word_p_o,
dac_word_o => dac_word_o,
one_hz_phase_o => pulse_delay);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
wrabbit_ctrl_reg_o <= wrabbit_ctrl_reg;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- termination enable registers
term_enable_regs: process (clk_125m_i)
begin
if rising_edge (clk_125m_i) then
if rst_i = '1' then
enable_inputs_o <= '0';
term_en_5_o <= '0';
term_en_4_o <= '0';
term_en_3_o <= '0';
term_en_2_o <= '0';
term_en_1_o <= '0';
else
enable_inputs_o <= acam_inputs_en(7);
term_en_5_o <= acam_inputs_en(4);
term_en_4_o <= acam_inputs_en(3);
term_en_3_o <= acam_inputs_en(2);
term_en_2_o <= acam_inputs_en(1);
term_en_1_o <= acam_inputs_en(0);
end if;
end if;
end process;
---------------------------------------------------------------------------------------------------
-- LOCAL ONE HZ GENERATOR --
---------------------------------------------------------------------------------------------------
local_one_second_block: local_pps_gen
generic map
(g_width => g_width)
port map
(acam_refclk_r_edge_p_i => acam_refclk_r_edge_p_i,
clk_i => clk_125m_i,
clk_period_i => clk_period,
load_utc_p_i => load_utc,
pulse_delay_i => pulse_delay,
rst_i => rst_i,
starting_utc_i => starting_utc,
local_utc_o => local_utc,
local_utc_p_o => local_utc_p);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
clk_period <= c_SIM_CLK_PERIOD when values_for_simul else c_SYN_CLK_PERIOD;
---------------------------------------------------------------------------------------------------
-- ACAM TIMECONTROL INTERFACE --
---------------------------------------------------------------------------------------------------
acam_timing_block: acam_timecontrol_interface
port map
(err_flag_i => err_flag_i,
int_flag_i => int_flag_i,
start_from_fpga_o => start_from_fpga,
stop_dis_o => stop_dis_o,
acam_refclk_r_edge_p_i => acam_refclk_r_edge_p_i,
utc_p_i => utc_p,
clk_i => clk_125m_i,
activate_acq_p_i => activate_acq_p,
state_active_p_i => state_active_p,
deactivate_acq_p_i => deactivate_acq_p,
rst_i => rst_i,
acam_errflag_f_edge_p_o => acam_errflag_f_edge_p,
acam_errflag_r_edge_p_o => acam_errflag_r_edge_p,
acam_intflag_f_edge_p_o => acam_intflag_f_edge_p);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
start_from_fpga_o <= start_from_fpga;
---------------------------------------------------------------------------------------------------
-- ACAM DATABUS INTERFACE --
---------------------------------------------------------------------------------------------------
acam_data_block: acam_databus_interface
port map
(ef1_i => ef1_i,
ef2_i => ef2_i,
data_bus_io => data_bus_io,
adr_o => address_o,
cs_n_o => cs_n_o,
oe_n_o => oe_n_o,
rd_n_o => rd_n_o,
wr_n_o => wr_n_o,
ef1_o => acam_ef1,
ef1_meta_o => acam_ef1_meta,
ef2_o => acam_ef2,
ef2_meta_o => acam_ef2_meta,
clk_i => clk_125m_i,
rst_i => rst_i,
adr_i => acm_adr,
cyc_i => acm_cyc,
dat_i => acm_dat_w,
stb_i => acm_stb,
we_i => acm_we,
ack_o => acm_ack,
dat_o => acm_dat_r);
---------------------------------------------------------------------------------------------------
-- ACAM START RETRIGGER CONTROLLER --
---------------------------------------------------------------------------------------------------
start_retrigger_block: start_retrig_ctrl
generic map
(g_width => g_width)
port map
(acam_intflag_f_edge_p_i => acam_intflag_f_edge_p,
clk_i => clk_125m_i,
utc_p_i => utc_p,
rst_i => rst_i,
current_retrig_nb_o => current_retrig_nb, -- for debug
roll_over_incr_recent_o => roll_over_incr_recent,
clk_i_cycles_offset_o => clk_i_cycles_offset,
roll_over_nb_o => roll_over_nb,
retrig_nb_offset_o => retrig_nb_offset);
---------------------------------------------------------------------------------------------------
-- DATA ENGINE --
---------------------------------------------------------------------------------------------------
data_engine_block: data_engine
port map
(acam_ack_i => acm_ack,
acam_dat_i => acm_dat_r,
acam_adr_o => acm_adr,
acam_cyc_o => acm_cyc,
acam_dat_o => acm_dat_w,
acam_stb_o => acm_stb,
acam_we_o => acm_we,
clk_i => clk_125m_i,
rst_i => rst_i,
acam_ef1_i => acam_ef1,
acam_ef1_meta_i => acam_ef1_meta,
acam_ef2_i => acam_ef2,
acam_ef2_meta_i => acam_ef2_meta,
activate_acq_p_i => activate_acq_p,
deactivate_acq_p_i => deactivate_acq_p,
acam_wr_config_p_i => load_acam_config,
acam_rdbk_config_p_i => read_acam_config,
acam_rdbk_status_p_i => read_acam_status,
acam_rdbk_ififo1_p_i => read_ififo1,
acam_rdbk_ififo2_p_i => read_ififo2,
acam_rdbk_start01_p_i => read_start01,
acam_rst_p_i => reset_acam,
acam_config_i => acam_config,
start_from_fpga_i => start_from_fpga,
state_active_p_o => state_active_p,
acam_config_rdbk_o => acam_config_rdbk,
acam_ififo1_o => acam_ififo1,
acam_ififo2_o => acam_ififo2,
acam_start01_o => acam_start01,
acam_tstamp1_o => acam_tstamp1,
acam_tstamp1_ok_p_o => acam_tstamp1_ok_p,
acam_tstamp2_o => acam_tstamp2,
acam_tstamp2_ok_p_o => acam_tstamp2_ok_p);
---------------------------------------------------------------------------------------------------
-- DATA FORMATTING --
---------------------------------------------------------------------------------------------------
data_formatting_block: data_formatting
port map
(clk_i => clk_125m_i,
rst_i => rst_i,
tstamp_wr_wb_ack_i => circ_buff_class_ack,
tstamp_wr_dat_i => circ_buff_class_data_rd,
tstamp_wr_wb_adr_o => circ_buff_class_adr,
tstamp_wr_wb_cyc_o => circ_buff_class_cyc,
tstamp_wr_dat_o => circ_buff_class_data_wr,
tstamp_wr_wb_stb_o => circ_buff_class_stb,
tstamp_wr_wb_we_o => circ_buff_class_we,
acam_tstamp1_i => acam_tstamp1,
acam_tstamp1_ok_p_i => acam_tstamp1_ok_p,
acam_tstamp2_i => acam_tstamp2,
acam_tstamp2_ok_p_i => acam_tstamp2_ok_p,
dacapo_c_rst_p_i => clear_dacapo_counter,
deactivate_chan_i => deactivate_chan,
roll_over_incr_recent_i => roll_over_incr_recent,
clk_i_cycles_offset_i => clk_i_cycles_offset,
roll_over_nb_i => roll_over_nb,
retrig_nb_offset_i => retrig_nb_offset,
utc_p_i => utc_p,
utc_i => utc,
tstamp_wr_p_o => tstamp_wr_p,
acam_channel_o => acam_tstamp_channel,
wr_index_o => wr_index);
---------------------------------------------------------------------------------------------------
-- UTC timing source --
---------------------------------------------------------------------------------------------------
utc <= wrabbit_tai_i when wrabbit_synched_i = '1' else local_utc;
utc_p <= wrabbit_tai_p_i when wrabbit_synched_i = '1' else local_utc_p;
---------------------------------------------------------------------------------------------------
-- INTERRUPTS GENERATOR --
---------------------------------------------------------------------------------------------------
interrupts_generator: irq_generator
generic map
(g_width => 32)
port map
(clk_i => clk_125m_i,
rst_i => rst_i,
irq_tstamp_threshold_i => irq_tstamp_threshold,
irq_time_threshold_i => irq_time_threshold,
acam_errflag_r_edge_p_i => acam_errflag_r_edge_p,
activate_acq_p_i => activate_acq_p,
deactivate_acq_p_i => deactivate_acq_p,
tstamp_wr_p_i => tstamp_wr_p,
irq_tstamp_p_o => irq_tstamp_p_o,
irq_time_p_o => irq_time_p_o,
irq_acam_err_p_o => irq_acam_err_p_o);
---------------------------------------------------------------------------------------------------
-- CIRCULAR BUFFER --
---------------------------------------------------------------------------------------------------
circular_buffer_block: circular_buffer
port map
(clk_i => clk_125m_i,
tstamp_wr_rst_i => rst_i,
tstamp_wr_adr_i => circ_buff_class_adr,
tstamp_wr_cyc_i => circ_buff_class_cyc,
tstamp_wr_dat_i => circ_buff_class_data_wr,
tstamp_wr_stb_i => circ_buff_class_stb,
tstamp_wr_we_i => circ_buff_class_we,
tstamp_wr_ack_p_o => circ_buff_class_ack,
tstamp_wr_dat_o => circ_buff_class_data_rd,
tdc_mem_wb_rst_i => rst_i,
tdc_mem_wb_adr_i => tdc_mem_wb_adr_i,
tdc_mem_wb_cyc_i => tdc_mem_wb_cyc_i,
tdc_mem_wb_dat_i => tdc_mem_wb_dat_i,
tdc_mem_wb_stb_i => tdc_mem_wb_stb_i,
tdc_mem_wb_we_i => tdc_mem_wb_we_i,
tdc_mem_wb_ack_o => tdc_mem_wb_ack_o,
tdc_mem_wb_dat_o => tdc_mem_wb_dat_o,
tdc_mem_wb_stall_o => tdc_mem_wb_stall_o);
---------------------------------------------------------------------------------------------------
-- TDC LEDs --
---------------------------------------------------------------------------------------------------
TDCboard_leds: leds_manager
generic map
(g_width => 32,
values_for_simul => values_for_simul)
port map
(clk_i => clk_125m_i,
rst_i => rst_i,
utc_p_i => local_utc_p,
acam_inputs_en_i => acam_inputs_en,
acam_channel_i => acam_channel,
tstamp_wr_p_i => tstamp_wr_p,
tdc_led_status_o => tdc_led_status_o,
tdc_led_trig1_o => tdc_led_trig1_o,
tdc_led_trig2_o => tdc_led_trig2_o,
tdc_led_trig3_o => tdc_led_trig3_o,
tdc_led_trig4_o => tdc_led_trig4_o,
tdc_led_trig5_o => tdc_led_trig5_o);
acam_channel <= "000" & acam_tstamp_channel;
---------------------------------------------------------------------------------------------------
-- ACAM start_dis, not used --
---------------------------------------------------------------------------------------------------
start_dis_o <= '0';
---------------------------------------------------------------------------------------------------
-- CHIPSCOPE --
---------------------------------------------------------------------------------------------------
-- chipscope_ila_1 : chipscope_ila
-- port map (
-- CONTROL => CONTROL,
-- CLK => clk_125m_i,
-- TRIG0 => TRIG0,
-- TRIG1 => TRIG1,
-- TRIG2 => TRIG2,
-- TRIG3 => TRIG3);
--
-- chipscope_icon_1 : chipscope_icon
-- port map (
-- CONTROL0 => CONTROL);
--
-- TRIG0(0) <= utc_p;
-- TRIG0(1) <= ef1_i;
-- TRIG0(2) <= acam_intflag_f_edge_p;
-- TRIG0(15 downto 3) <= roll_over_nb(12 downto 0);
-- TRIG0(16) <= start_from_fpga;
-- TRIG0(24 downto 17) <= retrig_nb_offset(7 downto 0);
-- TRIG0(31 downto 25) <= clk_i_cycles_offset(6 downto 0);
--
-- TRIG1(30 downto 0) <= acam_tstamp1(30 downto 0);
-- TRIG1(31) <= acam_tstamp1_ok_p;
--
-- TRIG2(31 downto 0) <= utc(31 downto 0);
--
-- TRIG3(0) <= tdc_in_fpga_1_i;
-- TRIG3(1) <= roll_over_incr_recent;
-- TRIG3(2) <= wrabbit_tai_p_i;
-- TRIG3(31 downto 3) <= current_retrig_nb(28 downto 0);
end rtl;
----------------------------------------------------------------------------------------------------
-- architecture ends
----------------------------------------------------------------------------------------------------
\ No newline at end of file
--_________________________________________________________________________________________________
-- |
-- |TDC core| |
-- |
-- CERN,BE/CO-HT |
--________________________________________________________________________________________________|
---------------------------------------------------------------------------------------------------
-- |
-- fmc_tdc_core |
-- |
---------------------------------------------------------------------------------------------------
-- File fmc_tdc_core.vhd |
-- |
-- Description The TDC core top level instantiates all the modules needed to provide to the |
-- GN4124/VME interface the timestamps generated in the ACAM chip. |
-- |
-- Figure 1 shows the architecture of this core. |
-- |
-- Each timestamp is a 128-bit word with the following structure: |
-- [31:0] Fine time | each bit represents 81.03 ps |
-- [63:32] Coarse time within the current second | each bit represents 8 ns |
-- [95:64] Local UTC time | each bit represents 1 s |
-- [127:96] Metadata | rising/falling tstamp, Channel |
-- |
-- As the structure indicates, each timestamp is referred to a UTC second; the coarse|
-- and fine time indicate with 81.03 ps resolution the amount of time passed after |
-- the last UTC second. |
-- If the White Rabbit synchronization has been established, the UTC time comes from |
-- the White Rabbit core. Otherwise, the one_hz_gen unit is responsible for keeping |
-- the local UTC time relaying on the local TDC oscillator. |
-- Timestamps are formatted to the structure above within the data_formatting unit & |
-- are stored in the circular_buffer, where the GN4124/VME core have direct access |
-- |
-- In this application, the ACAM is used in I-Mode which provides unlimited measuring|
-- range with internal start retriggers. ACAM's counter of retriggers however is not |
-- large enough and there is the need to follow the retriggers inside the core; the |
-- start_retrig_ctrl unit is responsible for that. |
-- |
-- The acam_databus_interface implements the communication with the ACAM for its |
-- configuration as well as for the timestamps retrieval. |
-- The acam_timecontrol_interface is mainly responsible for delivering to the ACAM |
-- the start pulse, to which all timestamps are related. |
-- |
-- The regs_ctrl implements the communication with the GN4124/VME interface for the |
-- configuration of this core and of the ACAM. |
-- The data_engine is managing the transferring of the configuration registers from |
-- the regs_ctrl to the ACAM chip; it is also managing the timestamps' |
-- acquisition from the ACAM chip, making it available to the data_formatting unit. |
-- |
-- The core is providing an interrupt in any of the following 3 cases: |
-- o accumulation of timestamps larger than the settable threshold |
-- o more time passed than the settable time threshold and >=1 timestamps arrived |
-- o error occurred in the ACAM chip |
-- |
-- The clks_rsts_manager unit is providing 125 MHz clock and resets to the core. |
-- _________________________________________________________ |
-- | | |
-- | ________________ ____________ | |
-- | | ____________ | | | ___________ | |
-- | | | | | | | | | | |
-- | | | ACAM time | | | | | irq gen | | |
-- | | | ctrl | | | | |___________| | |
-- | | |____________| | | | ___________ | ______ |
-- | | ____________ | | | | | | | | |
-- | | | | | | data | | | | | | |
-- | | | ACAM data | | | engine | | | | | | |
-- | | | ctrl | | | | | | | | | |
-- | | |____________| | | | | regs | | --> | | |
-- | |________________| | | | ctrl | | <-- | | |
-- ACAM <-- | fine time | | | | | | | |
-- chip --> | ____________ | | | | | | VME/ | |
-- | | | | | | | | |GN4124| |
-- | | start | | | | | | | core | |
-- | | retrig | | | | | | | | |
-- | |____________| | | | | | | | |
-- | coarse time | | | | | | | |
-- | | | | | | | | |
-- WRabbit --|------------------->|\ | | | | | | | |
-- UTC time | ____________ |O| |____________| |___________| | | | |
-- | | | |R| ___________ | | | |
-- | | 1 Hz gen |-->|/ ____________ | | | | | |
-- | |____________| | | | circular | | --> | | |
-- | local UTC time | data | | buffer | | <-- | | |
-- | | formating | | | | | | |
-- | _________________ |____________| |___________| | | | |
-- | |____TDC LEDs_____| | |______| |
-- | | |
-- |_________________________________________________________| |
-- TDC core |
-- _________________________________________________________ |
-- | | |
-- | clks_rsts_manager | |
-- |_________________________________________________________| |
-- |
-- Figure 1: TDC core architecture |
-- |
-- |
-- Authors Gonzalo Penacoba (Gonzalo.Penacoba@cern.ch) |
-- Evangelia Gousiou (Evangelia.Gousiou@cern.ch) |
-- Date 04/2014 |
-- Version v6 |
-- Depends on |
-- |
---------------- |
-- Last changes |
-- 05/2011 v1 GP First version |
-- 06/2012 v2 EG Revamping; Comments added, signals renamed |
-- removed LEDs from top level |
-- new GN4124 core integrated |
-- carrier 1 wire master added |
-- mezzanine I2C master added |
-- mezzanine 1 wire master added |
-- interrupts generator added |
-- changed generation of rst_i |
-- DAC reconfiguration+needed regs added |
-- 06/2012 v3 EG Changes for v2 of TDC mezzanine |
-- Several pinout changes, |
-- acam_ref_clk LVDS instead of CMOS, |
-- no PLL_LD only PLL_STATUS |
-- 04/2013 v4 EG created fmc_tdc_core module; before was all on fmc_tdc_core |
-- 07/2013 v5 EG removed the clks_rsts_manager from the core; will go to top level |
-- 09/2013 v5.1EG added block of comments and architecture drawing |
-- 04/2014 v6 EG added WRabbit support |
-- |
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE |
-- ------------------------------------ |
-- This source file is free software; you can redistribute it and/or modify it under the terms of |
-- the GNU Lesser General Public License as published by the Free Software Foundation; either |
-- version 2.1 of the License, or (at your option) any later version. |
-- This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
-- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
-- See the GNU Lesser General Public License for more details. |
-- You should have received a copy of the GNU Lesser General Public License along with this |
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html |
---------------------------------------------------------------------------------------------------
--=================================================================================================
-- Libraries & Packages
--=================================================================================================
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use work.tdc_core_pkg.all;
use work.gencores_pkg.all;
use work.wishbone_pkg.all;
use work.wrcore_pkg.all;
use work.genram_pkg.all;
--=================================================================================================
-- Entity declaration for fmc_tdc_core
--=================================================================================================
entity fmc_tdc_core is
generic
(g_span : integer := 32; -- address span in bus interfaces
g_width : integer := 32; -- data width in bus interfaces
values_for_simul : boolean := FALSE); -- this generic is set to TRUE
-- when instantiated in a test-bench
port
(
clk_sys_i : in std_logic;
rst_n_sys_i : in std_logic;
clk_tdc_i : in std_logic; -- 125 MHz reference from the PLL
rst_tdc_i : in std_logic; -- global reset, synched to clk_tdc_i
acam_refclk_r_edge_p_i : in std_logic; -- rising edge on 31.25MHz ACAM reference clock
send_dac_word_p_o : out std_logic; -- command from GN4124/VME to reconfigure the TDC mezz DAC with dac_word_o
dac_word_o : out std_logic_vector(23 downto 0); -- new DAC configuration word from GN4124/VME
-- Signals for the timing interface with the ACAM on TDC mezzanine
start_from_fpga_o : out std_logic; -- start pulse
err_flag_i : in std_logic; -- error flag
int_flag_i : in std_logic; -- interrupt flag
start_dis_o : out std_logic; -- start disable, not used
stop_dis_o : out std_logic; -- disables all acam channels
-- Signals for the data interface with the ACAM on TDC mezzanine
data_bus_io : inout std_logic_vector(27 downto 0);
address_o : out std_logic_vector(3 downto 0);
cs_n_o : out std_logic; -- chip select for ACAM
oe_n_o : out std_logic; -- output enable for ACAM
rd_n_o : out std_logic; -- read signal for ACAM
wr_n_o : out std_logic; -- write signal for ACAM
ef1_i : in std_logic; -- empty flag of ACAM iFIFO1
ef2_i : in std_logic; -- empty flag of ACAM iFIFO2
-- Signals for the Input Logic on TDC mezzanine
enable_inputs_o : out std_logic; -- enables all 5 inputs
term_en_1_o : out std_logic; -- Ch.1 termination enable of 50 Ohm termination
term_en_2_o : out std_logic; -- Ch.2 termination enable of 50 Ohm termination
term_en_3_o : out std_logic; -- Ch.3 termination enable of 50 Ohm termination
term_en_4_o : out std_logic; -- Ch.4 termination enable of 50 Ohm termination
term_en_5_o : out std_logic; -- Ch.5 termination enable of 50 Ohm termination
-- LEDs on TDC mezzanine
tdc_led_status_o : out std_logic; -- amber led on front pannel, division of clk_tdc_i
tdc_led_trig1_o : out std_logic; -- amber led on front pannel, Ch.1 termination
tdc_led_trig2_o : out std_logic; -- amber led on front pannel, Ch.2 termination
tdc_led_trig3_o : out std_logic; -- amber led on front pannel, Ch.3 termination
tdc_led_trig4_o : out std_logic; -- amber led on front pannel, Ch.4 termination
tdc_led_trig5_o : out std_logic; -- amber led on front pannel, Ch.5 termination
-- TDC input signals, also arriving to the FPGA; not used currently
tdc_in_fpga_1_i : in std_logic; -- TDC input Ch.1, not used
tdc_in_fpga_2_i : in std_logic; -- TDC input Ch.2, not used
tdc_in_fpga_3_i : in std_logic; -- TDC input Ch.3, not used
tdc_in_fpga_4_i : in std_logic; -- TDC input Ch.4, not used
tdc_in_fpga_5_i : in std_logic; -- TDC input Ch.5, not used
-- Interrupts
irq_tstamp_p_o : out std_logic; -- if amount of tstamps > tstamps_threshold
irq_time_p_o : out std_logic; -- if 0 < amount of tstamps < tstamps_threshold and time > time_threshold
irq_acam_err_p_o : out std_logic; -- if ACAM err_flag_i is activated
-- White Rabbit control and status registers
wrabbit_status_reg_i : in std_logic_vector(g_width-1 downto 0);
wrabbit_ctrl_reg_o : out std_logic_vector(g_width-1 downto 0);
-- White Rabbit timing
wrabbit_synched_i : in std_logic;
wrabbit_tai_p_i : in std_logic;
wrabbit_tai_i : in std_logic_vector(31 downto 0);
-- WISHBONE bus interface with the GN4124/VME core for the configuration
-- of the TDC core (clk_sys)
cfg_slave_i: in t_wishbone_slave_in;
cfg_slave_o: out t_wishbone_slave_out;
-- WISHBONE bus interface with the GN4124/VME core for the retrieval
-- of the timestamps from the TDC core memory (clk_sys)
mem_slave_i: in t_wishbone_slave_in;
mem_slave_o: out t_wishbone_slave_out;
direct_timestamp_o : out std_logic_vector(127 downto 0);
direct_timestamp_stb_o : out std_logic
);
end fmc_tdc_core;
--=================================================================================================
-- architecture declaration
--=================================================================================================
architecture rtl of fmc_tdc_core is
-- ACAM communication
signal acm_adr : std_logic_vector(7 downto 0);
signal acm_cyc, acm_stb, acm_we, acm_ack : std_logic;
signal acm_dat_r, acm_dat_w : std_logic_vector(g_width-1 downto 0);
signal acam_ef1, acam_ef2, acam_ef1_meta, acam_ef2_meta : std_logic;
signal acam_errflag_f_edge_p, acam_errflag_r_edge_p : std_logic;
signal acam_intflag_f_edge_p : std_logic;
signal acam_tstamp1, acam_tstamp2 : std_logic_vector(g_width-1 downto 0);
signal acam_tstamp1_ok_p, acam_tstamp2_ok_p : std_logic;
-- control unit
signal activate_acq_p, deactivate_acq_p, load_acam_config : std_logic;
signal read_acam_config, read_acam_status, read_ififo1 : std_logic;
signal read_ififo2, read_start01, reset_acam, load_utc : std_logic;
signal clear_dacapo_counter, roll_over_incr_recent : std_logic;
signal deactivate_chan : std_logic_vector(4 downto 0);
signal pulse_delay, window_delay, clk_period : std_logic_vector(g_width-1 downto 0);
signal starting_utc, acam_inputs_en : std_logic_vector(g_width-1 downto 0);
signal acam_ififo1, acam_ififo2, acam_start01 : std_logic_vector(g_width-1 downto 0);
signal irq_tstamp_threshold, irq_time_threshold : std_logic_vector(g_width-1 downto 0);
signal local_utc, wr_index : std_logic_vector(g_width-1 downto 0);
signal acam_config, acam_config_rdbk : config_vector;
signal tstamp_wr_p, start_from_fpga, state_active_p : std_logic;
-- retrigger control
signal clk_i_cycles_offset, roll_over_nb, retrig_nb_offset: std_logic_vector(g_width-1 downto 0);
signal local_utc_p : std_logic;
signal current_retrig_nb : std_logic_vector(g_width-1 downto 0);
-- UTC
signal utc_p : std_logic;
signal utc, wrabbit_ctrl_reg : std_logic_vector(g_width-1 downto 0);
-- circular buffer
signal circ_buff_class_adr : std_logic_vector(7 downto 0);
signal circ_buff_class_stb, circ_buff_class_cyc : std_logic;
signal circ_buff_class_we, circ_buff_class_ack : std_logic;
signal circ_buff_class_data_wr, circ_buff_class_data_rd : std_logic_vector(4*g_width-1 downto 0);
-- LEDs
signal acam_channel : std_logic_vector(5 downto 0);
signal tdc_in_fpga_1, tdc_in_fpga_2, tdc_in_fpga_3 : std_logic_vector(1 downto 0);
signal tdc_in_fpga_4, tdc_in_fpga_5 : std_logic_vector(1 downto 0);
signal acam_tstamp_channel : std_logic_vector(2 downto 0);
signal rst_sys: std_logic;
-- Chipscope
component chipscope_ila
port (
CONTROL : inout std_logic_vector(35 downto 0);
CLK : in std_logic;
TRIG0 : in std_logic_vector(31 downto 0);
TRIG1 : in std_logic_vector(31 downto 0);
TRIG2 : in std_logic_vector(31 downto 0);
TRIG3 : in std_logic_vector(31 downto 0));
end component;
component chipscope_icon
port (
CONTROL0 : inout std_logic_vector (35 downto 0));
end component;
signal CONTROL : std_logic_vector(35 downto 0);
signal CLK : std_logic;
signal TRIG0 : std_logic_vector(31 downto 0);
signal TRIG1 : std_logic_vector(31 downto 0);
signal TRIG2 : std_logic_vector(31 downto 0);
signal TRIG3 : std_logic_vector(31 downto 0);
--=================================================================================================
-- architecture begin
--=================================================================================================
begin
rst_sys <= not rst_n_sys_i;
---------------------------------------------------------------------------------------------------
-- TDC REGISTERS CONTROLLER --
---------------------------------------------------------------------------------------------------
reg_control_block: reg_ctrl
generic map
(g_span => g_span,
g_width => g_width)
port map
(clk_tdc_i => clk_tdc_i,
rst_tdc_i => rst_tdc_i,
clk_sys_i => clk_sys_i,
rst_n_sys_i => rst_n_sys_i,
slave_i => cfg_slave_i,
slave_o => cfg_slave_o,
activate_acq_p_o => activate_acq_p,
deactivate_acq_p_o => deactivate_acq_p,
acam_wr_config_p_o => load_acam_config,
acam_rdbk_config_p_o => read_acam_config,
acam_rdbk_status_p_o => read_acam_status,
acam_rdbk_ififo1_p_o => read_ififo1,
acam_rdbk_ififo2_p_o => read_ififo2,
acam_rdbk_start01_p_o => read_start01,
acam_rst_p_o => reset_acam,
load_utc_p_o => load_utc,
dacapo_c_rst_p_o => clear_dacapo_counter,
deactivate_chan_o => deactivate_chan,
acam_config_rdbk_i => acam_config_rdbk,
acam_ififo1_i => acam_ififo1,
acam_ififo2_i => acam_ififo2,
acam_start01_i => acam_start01,
local_utc_i => utc,
irq_code_i => x"00000000",
core_status_i => x"00000000",
wr_index_i => wr_index,
wrabbit_status_reg_i => wrabbit_status_reg_i,
wrabbit_ctrl_reg_o => wrabbit_ctrl_reg,
acam_config_o => acam_config,
starting_utc_o => starting_utc,
acam_inputs_en_o => acam_inputs_en,
start_phase_o => window_delay,
irq_tstamp_threshold_o=> irq_tstamp_threshold,
irq_time_threshold_o => irq_time_threshold,
send_dac_word_p_o => send_dac_word_p_o,
dac_word_o => dac_word_o,
one_hz_phase_o => pulse_delay);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
wrabbit_ctrl_reg_o <= wrabbit_ctrl_reg;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- termination enable registers
term_enable_regs: process (clk_tdc_i)
begin
if rising_edge (clk_tdc_i) then
if rst_tdc_i = '1' then
enable_inputs_o <= '0';
term_en_5_o <= '0';
term_en_4_o <= '0';
term_en_3_o <= '0';
term_en_2_o <= '0';
term_en_1_o <= '0';
else
enable_inputs_o <= acam_inputs_en(7);
term_en_5_o <= acam_inputs_en(4);
term_en_4_o <= acam_inputs_en(3);
term_en_3_o <= acam_inputs_en(2);
term_en_2_o <= acam_inputs_en(1);
term_en_1_o <= acam_inputs_en(0);
end if;
end if;
end process;
---------------------------------------------------------------------------------------------------
-- LOCAL ONE HZ GENERATOR --
---------------------------------------------------------------------------------------------------
local_one_second_block: local_pps_gen
generic map
(g_width => g_width)
port map
(acam_refclk_r_edge_p_i => acam_refclk_r_edge_p_i,
clk_i => clk_tdc_i,
clk_period_i => clk_period,
load_utc_p_i => load_utc,
pulse_delay_i => pulse_delay,
rst_i => rst_tdc_i,
starting_utc_i => starting_utc,
local_utc_o => local_utc,
local_utc_p_o => local_utc_p);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
clk_period <= c_SIM_CLK_PERIOD when values_for_simul else c_SYN_CLK_PERIOD;
---------------------------------------------------------------------------------------------------
-- ACAM TIMECONTROL INTERFACE --
---------------------------------------------------------------------------------------------------
acam_timing_block: acam_timecontrol_interface
port map
(err_flag_i => err_flag_i,
int_flag_i => int_flag_i,
start_from_fpga_o => start_from_fpga,
stop_dis_o => stop_dis_o,
acam_refclk_r_edge_p_i => acam_refclk_r_edge_p_i,
utc_p_i => utc_p,
clk_i => clk_tdc_i,
activate_acq_p_i => activate_acq_p,
state_active_p_i => state_active_p,
deactivate_acq_p_i => deactivate_acq_p,
rst_i => rst_tdc_i,
acam_errflag_f_edge_p_o => acam_errflag_f_edge_p,
acam_errflag_r_edge_p_o => acam_errflag_r_edge_p,
acam_intflag_f_edge_p_o => acam_intflag_f_edge_p);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
start_from_fpga_o <= start_from_fpga;
---------------------------------------------------------------------------------------------------
-- ACAM DATABUS INTERFACE --
---------------------------------------------------------------------------------------------------
acam_data_block: acam_databus_interface
port map
(ef1_i => ef1_i,
ef2_i => ef2_i,
data_bus_io => data_bus_io,
adr_o => address_o,
cs_n_o => cs_n_o,
oe_n_o => oe_n_o,
rd_n_o => rd_n_o,
wr_n_o => wr_n_o,
ef1_o => acam_ef1,
ef1_meta_o => acam_ef1_meta,
ef2_o => acam_ef2,
ef2_meta_o => acam_ef2_meta,
clk_i => clk_tdc_i,
rst_i => rst_tdc_i,
adr_i => acm_adr,
cyc_i => acm_cyc,
dat_i => acm_dat_w,
stb_i => acm_stb,
we_i => acm_we,
ack_o => acm_ack,
dat_o => acm_dat_r);
---------------------------------------------------------------------------------------------------
-- ACAM START RETRIGGER CONTROLLER --
---------------------------------------------------------------------------------------------------
start_retrigger_block: start_retrig_ctrl
generic map
(g_width => g_width)
port map
(acam_intflag_f_edge_p_i => acam_intflag_f_edge_p,
clk_i => clk_tdc_i,
utc_p_i => utc_p,
rst_i => rst_tdc_i,
current_retrig_nb_o => current_retrig_nb, -- for debug
roll_over_incr_recent_o => roll_over_incr_recent,
clk_i_cycles_offset_o => clk_i_cycles_offset,
roll_over_nb_o => roll_over_nb,
retrig_nb_offset_o => retrig_nb_offset);
---------------------------------------------------------------------------------------------------
-- DATA ENGINE --
---------------------------------------------------------------------------------------------------
data_engine_block: data_engine
port map
(acam_ack_i => acm_ack,
acam_dat_i => acm_dat_r,
acam_adr_o => acm_adr,
acam_cyc_o => acm_cyc,
acam_dat_o => acm_dat_w,
acam_stb_o => acm_stb,
acam_we_o => acm_we,
clk_i => clk_tdc_i,
rst_i => rst_tdc_i,
acam_ef1_i => acam_ef1,
acam_ef1_meta_i => acam_ef1_meta,
acam_ef2_i => acam_ef2,
acam_ef2_meta_i => acam_ef2_meta,
activate_acq_p_i => activate_acq_p,
deactivate_acq_p_i => deactivate_acq_p,
acam_wr_config_p_i => load_acam_config,
acam_rdbk_config_p_i => read_acam_config,
acam_rdbk_status_p_i => read_acam_status,
acam_rdbk_ififo1_p_i => read_ififo1,
acam_rdbk_ififo2_p_i => read_ififo2,
acam_rdbk_start01_p_i => read_start01,
acam_rst_p_i => reset_acam,
acam_config_i => acam_config,
start_from_fpga_i => start_from_fpga,
state_active_p_o => state_active_p,
acam_config_rdbk_o => acam_config_rdbk,
acam_ififo1_o => acam_ififo1,
acam_ififo2_o => acam_ififo2,
acam_start01_o => acam_start01,
acam_tstamp1_o => acam_tstamp1,
acam_tstamp1_ok_p_o => acam_tstamp1_ok_p,
acam_tstamp2_o => acam_tstamp2,
acam_tstamp2_ok_p_o => acam_tstamp2_ok_p);
---------------------------------------------------------------------------------------------------
-- DATA FORMATTING --
---------------------------------------------------------------------------------------------------
data_formatting_block: data_formatting
port map
(clk_i => clk_tdc_i,
rst_i => rst_tdc_i,
tstamp_wr_wb_ack_i => circ_buff_class_ack,
tstamp_wr_dat_i => circ_buff_class_data_rd,
tstamp_wr_wb_adr_o => circ_buff_class_adr,
tstamp_wr_wb_cyc_o => circ_buff_class_cyc,
tstamp_wr_dat_o => circ_buff_class_data_wr,
tstamp_wr_wb_stb_o => circ_buff_class_stb,
tstamp_wr_wb_we_o => circ_buff_class_we,
acam_tstamp1_i => acam_tstamp1,
acam_tstamp1_ok_p_i => acam_tstamp1_ok_p,
acam_tstamp2_i => acam_tstamp2,
acam_tstamp2_ok_p_i => acam_tstamp2_ok_p,
dacapo_c_rst_p_i => clear_dacapo_counter,
deactivate_chan_i => deactivate_chan,
roll_over_incr_recent_i => roll_over_incr_recent,
clk_i_cycles_offset_i => clk_i_cycles_offset,
roll_over_nb_i => roll_over_nb,
retrig_nb_offset_i => retrig_nb_offset,
utc_p_i => utc_p,
utc_i => utc,
tstamp_wr_p_o => tstamp_wr_p,
acam_channel_o => acam_tstamp_channel,
wr_index_o => wr_index);
---------------------------------------------------------------------------------------------------
-- UTC timing source --
---------------------------------------------------------------------------------------------------
utc <= wrabbit_tai_i when wrabbit_synched_i = '1' else local_utc;
utc_p <= wrabbit_tai_p_i when wrabbit_synched_i = '1' else local_utc_p;
direct_timestamp_stb_o <= circ_buff_class_cyc and circ_buff_class_stb and circ_buff_class_ack;
direct_timestamp_o <= circ_buff_class_data_wr;
---------------------------------------------------------------------------------------------------
-- INTERRUPTS GENERATOR --
---------------------------------------------------------------------------------------------------
interrupts_generator: irq_generator
generic map
(g_width => 32)
port map
(clk_i => clk_tdc_i,
rst_i => rst_tdc_i,
irq_tstamp_threshold_i => irq_tstamp_threshold,
irq_time_threshold_i => irq_time_threshold,
acam_errflag_r_edge_p_i => acam_errflag_r_edge_p,
activate_acq_p_i => activate_acq_p,
deactivate_acq_p_i => deactivate_acq_p,
tstamp_wr_p_i => tstamp_wr_p,
irq_tstamp_p_o => irq_tstamp_p_o,
irq_time_p_o => irq_time_p_o,
irq_acam_err_p_o => irq_acam_err_p_o);
---------------------------------------------------------------------------------------------------
-- CIRCULAR BUFFER --
---------------------------------------------------------------------------------------------------
circular_buffer_block: circular_buffer
port map
(clk_tdc_i => clk_tdc_i,
clk_sys_i => clk_sys_i,
tstamp_wr_rst_i => rst_tdc_i,
tstamp_wr_adr_i => circ_buff_class_adr,
tstamp_wr_cyc_i => circ_buff_class_cyc,
tstamp_wr_dat_i => circ_buff_class_data_wr,
tstamp_wr_stb_i => circ_buff_class_stb,
tstamp_wr_we_i => circ_buff_class_we,
tstamp_wr_ack_p_o => circ_buff_class_ack,
tstamp_wr_dat_o => circ_buff_class_data_rd,
tdc_mem_wb_rst_i => rst_sys,
tdc_mem_wb_adr_i => mem_slave_i.adr,
tdc_mem_wb_cyc_i => mem_slave_i.cyc,
tdc_mem_wb_dat_i => mem_slave_i.dat,
tdc_mem_wb_stb_i => mem_slave_i.stb,
tdc_mem_wb_we_i => mem_slave_i.we,
tdc_mem_wb_ack_o => mem_slave_o.ack,
tdc_mem_wb_dat_o => mem_slave_o.dat,
tdc_mem_wb_stall_o => mem_slave_o.stall);
---------------------------------------------------------------------------------------------------
-- TDC LEDs --
---------------------------------------------------------------------------------------------------
TDCboard_leds: leds_manager
generic map
(g_width => 32,
values_for_simul => values_for_simul)
port map
(clk_i => clk_tdc_i,
rst_i => rst_tdc_i,
utc_p_i => local_utc_p,
acam_inputs_en_i => acam_inputs_en,
acam_channel_i => acam_channel,
tstamp_wr_p_i => tstamp_wr_p,
tdc_led_status_o => tdc_led_status_o,
tdc_led_trig1_o => tdc_led_trig1_o,
tdc_led_trig2_o => tdc_led_trig2_o,
tdc_led_trig3_o => tdc_led_trig3_o,
tdc_led_trig4_o => tdc_led_trig4_o,
tdc_led_trig5_o => tdc_led_trig5_o);
acam_channel <= "000" & acam_tstamp_channel;
---------------------------------------------------------------------------------------------------
-- ACAM start_dis, not used --
---------------------------------------------------------------------------------------------------
start_dis_o <= '0';
---------------------------------------------------------------------------------------------------
-- CHIPSCOPE --
---------------------------------------------------------------------------------------------------
-- chipscope_ila_1 : chipscope_ila
-- port map (
-- CONTROL => CONTROL,
-- CLK => clk_tdc_i,
-- TRIG0 => TRIG0,
-- TRIG1 => TRIG1,
-- TRIG2 => TRIG2,
-- TRIG3 => TRIG3);
--
-- chipscope_icon_1 : chipscope_icon
-- port map (
-- CONTROL0 => CONTROL);
--
-- TRIG0(0) <= utc_p;
-- TRIG0(1) <= ef1_i;
-- TRIG0(2) <= acam_intflag_f_edge_p;
-- TRIG0(15 downto 3) <= roll_over_nb(12 downto 0);
-- TRIG0(16) <= start_from_fpga;
-- TRIG0(24 downto 17) <= retrig_nb_offset(7 downto 0);
-- TRIG0(31 downto 25) <= clk_i_cycles_offset(6 downto 0);
--
-- TRIG1(30 downto 0) <= acam_tstamp1(30 downto 0);
-- TRIG1(31) <= acam_tstamp1_ok_p;
--
-- TRIG2(31 downto 0) <= utc(31 downto 0);
--
-- TRIG3(0) <= tdc_in_fpga_1_i;
-- TRIG3(1) <= roll_over_incr_recent;
-- TRIG3(2) <= wrabbit_tai_p_i;
-- TRIG3(31 downto 3) <= current_retrig_nb(28 downto 0);
end rtl;
----------------------------------------------------------------------------------------------------
-- architecture ends
----------------------------------------------------------------------------------------------------
--_________________________________________________________________________________________________
-- |
-- |TDC core| |
-- |
-- CERN,BE/CO-HT |
--________________________________________________________________________________________________|
---------------------------------------------------------------------------------------------------
-- |
-- fmc_tdc_mezzanine |
-- |
---------------------------------------------------------------------------------------------------
-- File fmc_tdc_mezzanine.vhd |
-- |
-- Description The unit combines |
-- o the TDC core |
-- o the wrabbit_sync unit that is managing the White Rabbit synchronization and |
-- control signals |
-- o the I2C core for the communication with the TDC board EEPROM |
-- o the OneWire core for the communication with the TDC board UniqueID&Thermeter |
-- o the Embedded Interrupt Controller core that concentrates several interrupt |
-- sources into one WISHBONE interrupt request line. |
-- |
-- For the interconnection between the GN4124/VME core and the different cores (TDC, |
-- I2C, 1W, EIC, timestamps memory) the unit instantiates an SDB crossbar. |
-- |
-- Note that the TDC core uses word addressing, whereas the GN4124/VME cores use byte|
-- addressing |
-- _______________________________ |
-- | FMC TDC mezzanine | |
-- | | |
-- | ________________ | |
-- | |--| WRabbit_sync | | |
-- | | |________________| | |
-- | | ________________ ___ | |
-- | |->| | | | | |
-- ACAM chip <--> | | TDC core | | | | <--> |
-- | |--|________________| | S | | |
-- | | ________________ | | | |
-- | | | | | | | |
-- EEPROM chip <--> | | | I2C core | | | | <--> |
-- | | |________________| | | | |
-- | | ________________ | D | | GN4124/VME core |
-- | | | | | | | |
-- 1W chip <--> | | | 1W core | | | | <--> |
-- | | |________________| | | | |
-- | | ________________ | | | |
-- | | | | | B | | |
-- | |->| EIC | | | | <--> |
-- | |________________| |___| | |
-- | | |
-- |________________________________| |
-- ^ ^ |
-- | 125 MHz rst | |
-- __|________________________|___ |
-- | | |
-- DAC chip <--> | clks_rsts_manager | |
-- PLL chip |_______________________________| |
-- |
-- Figure 1: FMC TDC mezzanine architecture and |
-- connection with the clks_rsts_manager unit |
-- |
-- |
-- |
-- Authors Gonzalo Penacoba (Gonzalo.Penacoba@cern.ch) |
-- Evangelia Gousiou (Evangelia.Gousiou@cern.ch) |
-- Date 01/2014 |
-- Version v2 |
-- Depends on |
-- |
---------------- |
-- Last changes |
-- 07/2013 v1 EG First version |
-- 01/2014 v2 EG Different output for the timestamp data |
-- 01/2014 v3 EG Removed option for timestamps retrieval through DMA |
-- 08/2014 v4 EG Corrected missalignement between wrabbit_tai and wrabbit_tai_p (line 444) |
-- |
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE |
-- ------------------------------------ |
-- This source file is free software; you can redistribute it and/or modify it under the terms of |
-- the GNU Lesser General Public License as published by the Free Software Foundation; either |
-- version 2.1 of the License, or (at your option) any later version. |
-- This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
-- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
-- See the GNU Lesser General Public License for more details. |
-- You should have received a copy of the GNU Lesser General Public License along with this |
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html |
---------------------------------------------------------------------------------------------------
--=================================================================================================
-- Libraries & Packages
--=================================================================================================
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use work.tdc_core_pkg.all;
use work.gencores_pkg.all;
use work.wishbone_pkg.all;
--=================================================================================================
-- Entity declaration for fmc_tdc_mezzanine
--=================================================================================================
entity fmc_tdc_mezzanine is
generic
(g_with_wrabbit_core : boolean := FALSE;
g_span : integer := 32;
g_width : integer := 32;
values_for_simul : boolean := FALSE);
port
-- TDC core
(-- Clock & reset 62M5
clk_sys_i : in std_logic; -- 62.5 MHz clock
rst_sys_n_i : in std_logic; -- reset for 62.5 MHz logic
-- Signals from the clks_rsts_manager unit
clk_ref_0_i : in std_logic; -- 125 MHz clock
rst_ref_0_i : in std_logic; -- reset for 125 MHz logic
acam_refclk_r_edge_p_i : in std_logic;
send_dac_word_p_o : out std_logic;
dac_word_o : out std_logic_vector(23 downto 0);
-- Interface with ACAM
start_from_fpga_o : out std_logic;
err_flag_i : in std_logic;
int_flag_i : in std_logic;
start_dis_o : out std_logic;
stop_dis_o : out std_logic;
data_bus_io : inout std_logic_vector(27 downto 0);
address_o : out std_logic_vector(3 downto 0);
cs_n_o : out std_logic;
oe_n_o : out std_logic;
rd_n_o : out std_logic;
wr_n_o : out std_logic;
ef1_i : in std_logic;
ef2_i : in std_logic;
-- Channels termination
enable_inputs_o : out std_logic;
term_en_1_o : out std_logic;
term_en_2_o : out std_logic;
term_en_3_o : out std_logic;
term_en_4_o : out std_logic;
term_en_5_o : out std_logic;
-- TDC board LEDs
tdc_led_status_o : out std_logic;
tdc_led_trig1_o : out std_logic;
tdc_led_trig2_o : out std_logic;
tdc_led_trig3_o : out std_logic;
tdc_led_trig4_o : out std_logic;
tdc_led_trig5_o : out std_logic;
-- Input pulses arriving also to the FPGA, currently not treated
tdc_in_fpga_1_i : in std_logic;
tdc_in_fpga_2_i : in std_logic;
tdc_in_fpga_3_i : in std_logic;
tdc_in_fpga_4_i : in std_logic;
tdc_in_fpga_5_i : in std_logic;
-- White Rabbit core
wrabbit_link_up_i : in std_logic;
wrabbit_time_valid_i : in std_logic;
wrabbit_cycles_i : in std_logic_vector(27 downto 0);
wrabbit_utc_i : in std_logic_vector(31 downto 0);
wrabbit_clk_aux_lock_en_o : out std_logic;
wrabbit_clk_aux_locked_i : in std_logic;
wrabbit_clk_dmtd_locked_i : in std_logic;
wrabbit_dac_value_i : in std_logic_vector(23 downto 0);
wrabbit_dac_wr_p_i : in std_logic;
-- WISHBONE interface with the GN4124/VME_core
-- for the core configuration | timestamps retrieval | core interrupts | 1Wire | I2C
wb_tdc_csr_adr_i : in std_logic_vector(31 downto 0);
wb_tdc_csr_dat_i : in std_logic_vector(31 downto 0);
wb_tdc_csr_cyc_i : in std_logic;
wb_tdc_csr_sel_i : in std_logic_vector(3 downto 0);
wb_tdc_csr_stb_i : in std_logic;
wb_tdc_csr_we_i : in std_logic;
wb_tdc_csr_dat_o : out std_logic_vector(31 downto 0);
wb_tdc_csr_ack_o : out std_logic;
wb_tdc_csr_stall_o : out std_logic;
wb_irq_o : out std_logic;
-- I2C EEPROM interface
i2c_scl_o : out std_logic;
i2c_scl_oen_o : out std_logic;
i2c_scl_i : in std_logic;
i2c_sda_oen_o : out std_logic;
i2c_sda_o : out std_logic;
i2c_sda_i : in std_logic;
-- 1-Wire interface
onewire_b : inout std_logic);
end fmc_tdc_mezzanine;
--=================================================================================================
-- architecture declaration
--=================================================================================================
architecture rtl of fmc_tdc_mezzanine is
---------------------------------------------------------------------------------------------------
-- SDB CONSTANTS --
---------------------------------------------------------------------------------------------------
-- Note: All address in sdb and crossbar are BYTE addresses!
-- Master ports on the wishbone crossbar
constant c_NUM_WB_MASTERS : integer := 5;
constant c_WB_SLAVE_TDC_ONEWIRE : integer := 0; -- TDC mezzanine board UnidueID&Thermometer 1-wire
constant c_WB_SLAVE_TDC_CORE_CONFIG : integer := 1; -- TDC core configuration registers
constant c_WB_SLAVE_TDC_EIC : integer := 2; -- TDC interrupts
constant c_WB_SLAVE_TDC_I2C : integer := 3; -- TDC mezzanine board system EEPROM I2C
constant c_WB_SLAVE_TSTAMP_MEM : integer := 4; -- Access to TDC core memory for timestamps retrieval
-- Slave port on the wishbone crossbar
constant c_NUM_WB_SLAVES : integer := 1;
-- Wishbone master(s)
constant c_WB_MASTER : integer := 0;
-- sdb header address
constant c_SDB_ADDRESS : t_wishbone_address := x"00000000";
-- WISHBONE crossbar layout
constant c_INTERCONNECT_LAYOUT : t_sdb_record_array(4 downto 0) :=
(0 => f_sdb_embed_device(c_ONEWIRE_SDB_DEVICE, x"00010000"),
1 => f_sdb_embed_device(c_TDC_CONFIG_SDB_DEVICE, x"00011000"),
2 => f_sdb_embed_device(c_TDC_EIC_DEVICE, x"00012000"),
3 => f_sdb_embed_device(c_I2C_SDB_DEVICE, x"00013000"),
4 => f_sdb_embed_device(c_TDC_MEM_SDB_DEVICE, x"00014000"));
---------------------------------------------------------------------------------------------------
-- Signals --
---------------------------------------------------------------------------------------------------
-- resets
signal general_rst_n, rst_ref_0_n: std_logic;
-- Wishbone buse(s) from crossbar master port(s)
signal cnx_master_out : t_wishbone_master_out_array(c_NUM_WB_MASTERS-1 downto 0);
signal cnx_master_in : t_wishbone_master_in_array (c_NUM_WB_MASTERS-1 downto 0);
-- Wishbone buse(s) to crossbar slave port(s)
signal cnx_slave_out : t_wishbone_slave_out_array(c_NUM_WB_SLAVES-1 downto 0);
signal cnx_slave_in : t_wishbone_slave_in_array (c_NUM_WB_SLAVES-1 downto 0);
-- Wishbone bus from additional registers
signal xreg_slave_out : t_wishbone_slave_out;
signal xreg_slave_in : t_wishbone_slave_in;
-- WISHBONE addresses
signal tdc_core_wb_adr : std_logic_vector(31 downto 0);
signal tdc_mem_wb_adr : std_logic_vector(31 downto 0);
-- 1-wire
signal mezz_owr_en, mezz_owr_i : std_logic_vector(0 downto 0);
-- I2C
signal sys_scl_in, sys_scl_out : std_logic;
signal sys_scl_oe_n, sys_sda_in : std_logic;
signal sys_sda_out, sys_sda_oe_n : std_logic;
-- IRQ
signal irq_tstamp_p, irq_time_p : std_logic;
signal irq_acam_err_p : std_logic;
-- WRabbit
signal reg_to_wr, reg_from_wr : std_logic_vector(31 downto 0);
signal wrabbit_utc_p : std_logic;
signal wrabbit_synched : std_logic;
--=================================================================================================
-- architecture begin
--=================================================================================================
begin
rst_ref_0_n <= not(rst_ref_0_i);
---------------------------------------------------------------------------------------------------
-- CSR WISHBONE CROSSBAR --
---------------------------------------------------------------------------------------------------
-- CSR wishbone address decoder
-- 0x10000 -> TDC core configuration
-- 0x11000 -> TDC mezzanine board 1-Wire
-- 0x12000 -> EIC for TDC core
-- 0x13000 -> TDC mezzanine board EEPROM I2C
-- 0x14000 -> TDC core timestamps retrieval
-- Additional register to help timing
cmp_xwb_reg : xwb_register_link
port map
(clk_sys_i => clk_ref_0_i,
rst_n_i => rst_ref_0_n,
slave_i => xreg_slave_in,
slave_o => xreg_slave_out,
master_i => cnx_slave_out(c_WB_MASTER),
master_o => cnx_slave_in(c_WB_MASTER));
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Unused wishbone signals
wb_tdc_csr_dat_o <= xreg_slave_out.dat;
wb_tdc_csr_ack_o <= xreg_slave_out.ack;
wb_tdc_csr_stall_o <= xreg_slave_out.stall;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Connect crossbar slave port to entity port
xreg_slave_in.adr <= wb_tdc_csr_adr_i;
xreg_slave_in.dat <= wb_tdc_csr_dat_i;
xreg_slave_in.sel <= wb_tdc_csr_sel_i;
xreg_slave_in.stb <= wb_tdc_csr_stb_i;
xreg_slave_in.we <= wb_tdc_csr_we_i;
xreg_slave_in.cyc <= wb_tdc_csr_cyc_i;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
cmp_sdb_crossbar : xwb_sdb_crossbar
generic map
(g_num_masters => c_NUM_WB_SLAVES,
g_num_slaves => c_NUM_WB_MASTERS,
g_registered => true,
g_wraparound => true,
g_layout => c_INTERCONNECT_LAYOUT,
g_sdb_addr => c_SDB_ADDRESS)
port map
(clk_sys_i => clk_ref_0_i,
rst_n_i => rst_ref_0_n,
slave_i => cnx_slave_in,
slave_o => cnx_slave_out,
master_i => cnx_master_in,
master_o => cnx_master_out);
---------------------------------------------------------------------------------------------------
-- TDC CORE --
---------------------------------------------------------------------------------------------------
cmp_tdc_core: fmc_tdc_core
generic map
(g_span => g_span,
g_width => g_width,
values_for_simul => FALSE)
port map
(-- clks, rst
clk_125m_i => clk_ref_0_i,
rst_i => rst_ref_0_i,
acam_refclk_r_edge_p_i => acam_refclk_r_edge_p_i,
-- DAC configuration
send_dac_word_p_o => send_dac_word_p_o,
dac_word_o => dac_word_o,
-- ACAM
start_from_fpga_o => start_from_fpga_o,
err_flag_i => err_flag_i,
int_flag_i => int_flag_i,
start_dis_o => start_dis_o,
stop_dis_o => stop_dis_o,
data_bus_io => data_bus_io,
address_o => address_o,
cs_n_o => cs_n_o,
oe_n_o => oe_n_o,
rd_n_o => rd_n_o,
wr_n_o => wr_n_o,
ef1_i => ef1_i,
ef2_i => ef2_i,
-- Input channels enable
enable_inputs_o => enable_inputs_o,
term_en_1_o => term_en_1_o,
term_en_2_o => term_en_2_o,
term_en_3_o => term_en_3_o,
term_en_4_o => term_en_4_o,
term_en_5_o => term_en_5_o,
-- Input channels to FPGA (not used currently)
tdc_in_fpga_1_i => tdc_in_fpga_1_i,
tdc_in_fpga_2_i => tdc_in_fpga_2_i,
tdc_in_fpga_3_i => tdc_in_fpga_3_i,
tdc_in_fpga_4_i => tdc_in_fpga_4_i,
tdc_in_fpga_5_i => tdc_in_fpga_5_i,
-- TDC board LEDs
tdc_led_status_o => tdc_led_status_o,
tdc_led_trig1_o => tdc_led_trig1_o,
tdc_led_trig2_o => tdc_led_trig2_o,
tdc_led_trig3_o => tdc_led_trig3_o,
tdc_led_trig4_o => tdc_led_trig4_o,
tdc_led_trig5_o => tdc_led_trig5_o,
-- Interrupts
irq_tstamp_p_o => irq_tstamp_p,
irq_time_p_o => irq_time_p,
irq_acam_err_p_o => irq_acam_err_p,
-- WR stuff
wrabbit_tai_i => wrabbit_utc_i,
wrabbit_tai_p_i => wrabbit_utc_p,
wrabbit_synched_i => wrabbit_synched,
wrabbit_status_reg_i => reg_from_wr,
wrabbit_ctrl_reg_o => reg_to_wr,
-- WISHBONE CSR for core configuration
tdc_config_wb_adr_i => tdc_core_wb_adr,
tdc_config_wb_dat_i => cnx_master_out(c_WB_SLAVE_TDC_CORE_CONFIG).dat,
tdc_config_wb_stb_i => cnx_master_out(c_WB_SLAVE_TDC_CORE_CONFIG).stb,
tdc_config_wb_we_i => cnx_master_out(c_WB_SLAVE_TDC_CORE_CONFIG).we,
tdc_config_wb_cyc_i => cnx_master_out(c_WB_SLAVE_TDC_CORE_CONFIG).cyc,
tdc_config_wb_dat_o => cnx_master_in(c_WB_SLAVE_TDC_CORE_CONFIG).dat,
tdc_config_wb_ack_o => cnx_master_in(c_WB_SLAVE_TDC_CORE_CONFIG).ack,
-- WISHBONE for timestamps transfer
tdc_mem_wb_adr_i => tdc_mem_wb_adr,--wb_tdc_mem_adr_i,
tdc_mem_wb_dat_i => cnx_master_out(c_WB_SLAVE_TSTAMP_MEM).dat,
tdc_mem_wb_stb_i => cnx_master_out(c_WB_SLAVE_TSTAMP_MEM).stb,
tdc_mem_wb_we_i => cnx_master_out(c_WB_SLAVE_TSTAMP_MEM).we,
tdc_mem_wb_cyc_i => cnx_master_out(c_WB_SLAVE_TSTAMP_MEM).cyc,
tdc_mem_wb_ack_o => cnx_master_in(c_WB_SLAVE_TSTAMP_MEM).ack,
tdc_mem_wb_dat_o => cnx_master_in(c_WB_SLAVE_TSTAMP_MEM).dat,
tdc_mem_wb_stall_o => cnx_master_in(c_WB_SLAVE_TSTAMP_MEM).stall);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Convert byte address into word address
tdc_core_wb_adr <= "00" & cnx_master_out(c_WB_SLAVE_TDC_CORE_CONFIG).adr(31 downto 2);
tdc_mem_wb_adr <= "00" & cnx_master_out(c_WB_SLAVE_TSTAMP_MEM).adr(31 downto 2);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Unused wishbone signals
cnx_master_in(c_WB_SLAVE_TDC_CORE_CONFIG).err <= '0';
cnx_master_in(c_WB_SLAVE_TDC_CORE_CONFIG).rty <= '0';
cnx_master_in(c_WB_SLAVE_TDC_CORE_CONFIG).stall <= '0';
cnx_master_in(c_WB_SLAVE_TDC_CORE_CONFIG).int <= '0';
cnx_master_in(c_WB_SLAVE_TSTAMP_MEM).err <= '0';
cnx_master_in(c_WB_SLAVE_TSTAMP_MEM).rty <= '0';
cnx_master_in(c_WB_SLAVE_TSTAMP_MEM).int <= '0';
---------------------------------------------------------------------------------------------------
-- WHITE RABBIT STUFF --
-- only synthesized if g_with_wrabbit_core is TRUE --
---------------------------------------------------------------------------------------------------
cmp_wrabbit_synch: wrabbit_sync
generic map
(g_simulation => false,
g_with_wrabbit_core => g_with_wrabbit_core)
port map
(clk_sys_i => clk_sys_i,
rst_n_sys_i => rst_sys_n_i,
clk_ref_i => clk_ref_0_i,
rst_n_ref_i => rst_ref_0_n,
wrabbit_dac_value_i => wrabbit_dac_value_i,
wrabbit_dac_wr_p_i => wrabbit_dac_wr_p_i,
wrabbit_link_up_i => wrabbit_link_up_i,
wrabbit_time_valid_i => wrabbit_time_valid_i,
wrabbit_clk_aux_lock_en_o => wrabbit_clk_aux_lock_en_o,
wrabbit_clk_aux_locked_i => wrabbit_clk_aux_locked_i,
wrabbit_clk_dmtd_locked_i => '1', -- FIXME
wrabbit_synched_o => wrabbit_synched,
wrabbit_reg_i => reg_to_wr, -- synced to 125MHz mezzanine
wrabbit_reg_o => reg_from_wr); -- synced to 125MHz mezzanine
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
wrabbit_one_hz_pulse : process(clk_ref_0_i)
begin
if rising_edge(clk_ref_0_i) then
if rst_ref_0_n = '0' then
wrabbit_utc_p <= '0';
else
if wrabbit_clk_aux_locked_i = '1' and g_with_wrabbit_core then
if unsigned(wrabbit_cycles_i) = (unsigned(c_SYN_CLK_PERIOD)-3) then -- so that the end of the pulse
-- comes exactly upon the UTC change
wrabbit_utc_p <= '1';
else
wrabbit_utc_p <= '0';
end if;
else
wrabbit_utc_p <= '0';
end if;
end if;
end if;
end process;
---------------------------------------------------------------------------------------------------
-- TDC Mezzanine Board UniqueID&Thermometer OneWire --
---------------------------------------------------------------------------------------------------
cmp_fmc_onewire : xwb_onewire_master
generic map
(g_interface_mode => PIPELINED,
g_address_granularity => BYTE,
g_num_ports => 1,
g_ow_btp_normal => "5.0",
g_ow_btp_overdrive => "1.0")
port map
(clk_sys_i => clk_ref_0_i,
rst_n_i => rst_ref_0_n,
slave_i => cnx_master_out(c_WB_SLAVE_TDC_ONEWIRE),
slave_o => cnx_master_in(c_WB_SLAVE_TDC_ONEWIRE),
desc_o => open,
owr_pwren_o => open,
owr_en_o => mezz_owr_en,
owr_i => mezz_owr_i);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
onewire_b <= '0' when mezz_owr_en(0) = '1' else 'Z';
mezz_owr_i(0) <= onewire_b;
---------------------------------------------------------------------------------------------------
-- WBGEN2 EMBEDDED INTERRUPTS CONTROLLER --
---------------------------------------------------------------------------------------------------
-- IRQ sources
-- 0 -> number of accumulated timestamps reached threshold
-- 1 -> number of seconds passed reached threshold and number of accumulated tstamps > 0
-- 2 -> ACAM error
cmp_tdc_eic : tdc_eic
port map
(clk_sys_i => clk_ref_0_i,
rst_n_i => rst_ref_0_n,
wb_adr_i => cnx_master_out(c_WB_SLAVE_TDC_EIC).adr(3 downto 2),
wb_dat_i => cnx_master_out(c_WB_SLAVE_TDC_EIC).dat,
wb_dat_o => cnx_master_in(c_WB_SLAVE_TDC_EIC).dat,
wb_cyc_i => cnx_master_out(c_WB_SLAVE_TDC_EIC).cyc,
wb_sel_i => cnx_master_out(c_WB_SLAVE_TDC_EIC).sel,
wb_stb_i => cnx_master_out(c_WB_SLAVE_TDC_EIC).stb,
wb_we_i => cnx_master_out(c_WB_SLAVE_TDC_EIC).we,
wb_ack_o => cnx_master_in(c_WB_SLAVE_TDC_EIC).ack,
wb_stall_o => cnx_master_in(c_WB_SLAVE_TDC_EIC).stall,
wb_int_o => wb_irq_o,
irq_tdc_tstamps_i => irq_tstamp_p,
irq_tdc_time_i => irq_time_p,
irq_tdc_acam_err_i => irq_acam_err_p);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Unused wishbone signals
cnx_master_in(c_WB_SLAVE_TDC_EIC).err <= '0';
cnx_master_in(c_WB_SLAVE_TDC_EIC).rty <= '0';
cnx_master_in(c_WB_SLAVE_TDC_EIC).int <= '0';
---------------------------------------------------------------------------------------------------
-- TDC Mezzanine Board EEPROM I2C --
---------------------------------------------------------------------------------------------------
cmp_I2C_master : xwb_i2c_master
generic map
(g_interface_mode => PIPELINED,
g_address_granularity => BYTE)
port map
(clk_sys_i => clk_ref_0_i,
rst_n_i => rst_ref_0_n,
slave_i => cnx_master_out(c_WB_SLAVE_TDC_I2C),
slave_o => cnx_master_in(c_WB_SLAVE_TDC_I2C),
desc_o => open,
scl_pad_i => i2c_scl_i,
scl_pad_o => sys_scl_out,
scl_padoen_o => sys_scl_oe_n,
sda_pad_i => i2c_sda_i,
sda_pad_o => sys_sda_out,
sda_padoen_o => sys_sda_oe_n);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
i2c_sda_oen_o <= sys_sda_oe_n;
i2c_sda_o <= sys_sda_out;
i2c_scl_oen_o <= sys_scl_oe_n;
i2c_scl_o <= sys_scl_out;
end rtl;
----------------------------------------------------------------------------------------------------
-- architecture ends
----------------------------------------------------------------------------------------------------
\ No newline at end of file
--_________________________________________________________________________________________________
-- |
-- |TDC core| |
-- |
-- CERN,BE/CO-HT |
--________________________________________________________________________________________________|
---------------------------------------------------------------------------------------------------
-- |
-- fmc_tdc_mezzanine |
-- |
---------------------------------------------------------------------------------------------------
-- File fmc_tdc_mezzanine.vhd |
-- |
-- Description The unit combines |
-- o the TDC core |
-- o the wrabbit_sync unit that is managing the White Rabbit synchronization and |
-- control signals |
-- o the I2C core for the communication with the TDC board EEPROM |
-- o the OneWire core for the communication with the TDC board UniqueID&Thermeter |
-- o the Embedded Interrupt Controller core that concentrates several interrupt |
-- sources into one WISHBONE interrupt request line. |
-- |
-- For the interconnection between the GN4124/VME core and the different cores (TDC, |
-- I2C, 1W, EIC, timestamps memory) the unit instantiates an SDB crossbar. |
-- |
-- Note that the TDC core uses word addressing, whereas the GN4124/VME cores use byte|
-- addressing |
-- _______________________________ |
-- | FMC TDC mezzanine | |
-- | | |
-- | ________________ | |
-- | |--| WRabbit_sync | | |
-- | | |________________| | |
-- | | ________________ ___ | |
-- | |->| | | | | |
-- ACAM chip <--> | | TDC core | | | | <--> |
-- | |--|________________| | S | | |
-- | | ________________ | | | |
-- | | | | | | | |
-- EEPROM chip <--> | | | I2C core | | | | <--> |
-- | | |________________| | | | |
-- | | ________________ | D | | GN4124/VME core |
-- | | | | | | | |
-- 1W chip <--> | | | 1W core | | | | <--> |
-- | | |________________| | | | |
-- | | ________________ | | | |
-- | | | | | B | | |
-- | |->| EIC | | | | <--> |
-- | |________________| |___| | |
-- | | |
-- |________________________________| |
-- ^ ^ |
-- | 125 MHz rst | |
-- __|________________________|___ |
-- | | |
-- DAC chip <--> | clks_rsts_manager | |
-- PLL chip |_______________________________| |
-- |
-- Figure 1: FMC TDC mezzanine architecture and |
-- connection with the clks_rsts_manager unit |
-- |
-- |
-- |
-- Authors Gonzalo Penacoba (Gonzalo.Penacoba@cern.ch) |
-- Evangelia Gousiou (Evangelia.Gousiou@cern.ch) |
-- Date 01/2014 |
-- Version v2 |
-- Depends on |
-- |
---------------- |
-- Last changes |
-- 07/2013 v1 EG First version |
-- 01/2014 v2 EG Different output for the timestamp data |
-- 01/2014 v3 EG Removed option for timestamps retrieval through DMA |
-- 08/2014 v4 EG Corrected missalignement between wrabbit_tai and wrabbit_tai_p (line 444) |
-- |
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE |
-- ------------------------------------ |
-- This source file is free software; you can redistribute it and/or modify it under the terms of |
-- the GNU Lesser General Public License as published by the Free Software Foundation; either |
-- version 2.1 of the License, or (at your option) any later version. |
-- This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
-- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
-- See the GNU Lesser General Public License for more details. |
-- You should have received a copy of the GNU Lesser General Public License along with this |
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html |
---------------------------------------------------------------------------------------------------
--=================================================================================================
-- Libraries & Packages
--=================================================================================================
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use work.tdc_core_pkg.all;
use work.gencores_pkg.all;
use work.wishbone_pkg.all;
--=================================================================================================
-- Entity declaration for fmc_tdc_mezzanine
--=================================================================================================
entity fmc_tdc_mezzanine is
generic
(g_with_wrabbit_core : boolean := FALSE;
g_span : integer := 32;
g_width : integer := 32;
values_for_simul : boolean := FALSE);
port
-- TDC core
(
-- System clock & reset (Wishbone)
clk_sys_i : in std_logic; -- 62.5 MHz clock
rst_sys_n_i : in std_logic; -- reset for 62.5 MHz logic
-- TDC 125 MHz reference & Reset (FMC)
clk_tdc_i : in std_logic; -- 125 MHz clock
rst_tdc_i : in std_logic; -- reset for 125 MHz logic
acam_refclk_r_edge_p_i : in std_logic;
send_dac_word_p_o : out std_logic;
dac_word_o : out std_logic_vector(23 downto 0);
-- Interface with ACAM
start_from_fpga_o : out std_logic;
err_flag_i : in std_logic;
int_flag_i : in std_logic;
start_dis_o : out std_logic;
stop_dis_o : out std_logic;
data_bus_io : inout std_logic_vector(27 downto 0);
address_o : out std_logic_vector(3 downto 0);
cs_n_o : out std_logic;
oe_n_o : out std_logic;
rd_n_o : out std_logic;
wr_n_o : out std_logic;
ef1_i : in std_logic;
ef2_i : in std_logic;
-- Channels termination
enable_inputs_o : out std_logic;
term_en_1_o : out std_logic;
term_en_2_o : out std_logic;
term_en_3_o : out std_logic;
term_en_4_o : out std_logic;
term_en_5_o : out std_logic;
-- TDC board LEDs
tdc_led_status_o : out std_logic;
tdc_led_trig1_o : out std_logic;
tdc_led_trig2_o : out std_logic;
tdc_led_trig3_o : out std_logic;
tdc_led_trig4_o : out std_logic;
tdc_led_trig5_o : out std_logic;
-- Input pulses arriving also to the FPGA, currently not treated
tdc_in_fpga_1_i : in std_logic;
tdc_in_fpga_2_i : in std_logic;
tdc_in_fpga_3_i : in std_logic;
tdc_in_fpga_4_i : in std_logic;
tdc_in_fpga_5_i : in std_logic;
-- White Rabbit core
wrabbit_link_up_i : in std_logic;
wrabbit_time_valid_i : in std_logic;
wrabbit_cycles_i : in std_logic_vector(27 downto 0);
wrabbit_utc_i : in std_logic_vector(31 downto 0);
wrabbit_clk_aux_lock_en_o : out std_logic;
wrabbit_clk_aux_locked_i : in std_logic;
wrabbit_clk_dmtd_locked_i : in std_logic;
wrabbit_dac_value_i : in std_logic_vector(23 downto 0);
wrabbit_dac_wr_p_i : in std_logic;
-- WISHBONE interface with the GN4124/VME_core (clk_sys)
-- for the core configuration | timestamps retrieval | core interrupts | 1Wire | I2C
slave_i: in t_wishbone_slave_in;
slave_o: out t_wishbone_slave_out;
wb_irq_o : out std_logic;
-- I2C EEPROM interface
i2c_scl_o : out std_logic;
i2c_scl_oen_o : out std_logic;
i2c_scl_i : in std_logic;
i2c_sda_oen_o : out std_logic;
i2c_sda_o : out std_logic;
i2c_sda_i : in std_logic;
-- 1-Wire interface
onewire_b : inout std_logic;
direct_timestamp_o : out std_logic_vector(127 downto 0);
direct_timestamp_stb_o : out std_logic
);
end fmc_tdc_mezzanine;
--=================================================================================================
-- architecture declaration
--=================================================================================================
architecture rtl of fmc_tdc_mezzanine is
---------------------------------------------------------------------------------------------------
-- SDB CONSTANTS --
---------------------------------------------------------------------------------------------------
-- Note: All address in sdb and crossbar are BYTE addresses!
-- Master ports on the wishbone crossbar
constant c_NUM_WB_MASTERS : integer := 5;
constant c_WB_SLAVE_TDC_ONEWIRE : integer := 0; -- TDC mezzanine board UnidueID&Thermometer 1-wire
constant c_WB_SLAVE_TDC_CORE_CONFIG : integer := 1; -- TDC core configuration registers
constant c_WB_SLAVE_TDC_EIC : integer := 2; -- TDC interrupts
constant c_WB_SLAVE_TDC_I2C : integer := 3; -- TDC mezzanine board system EEPROM I2C
constant c_WB_SLAVE_TSTAMP_MEM : integer := 4; -- Access to TDC core memory for timestamps retrieval
-- Slave port on the wishbone crossbar
constant c_NUM_WB_SLAVES : integer := 1;
-- Wishbone master(s)
constant c_WB_MASTER : integer := 0;
-- sdb header address
constant c_SDB_ADDRESS : t_wishbone_address := x"00000000";
-- WISHBONE crossbar layout
constant c_INTERCONNECT_LAYOUT : t_sdb_record_array(4 downto 0) :=
(0 => f_sdb_embed_device(c_ONEWIRE_SDB_DEVICE, x"00010000"),
1 => f_sdb_embed_device(c_TDC_CONFIG_SDB_DEVICE, x"00011000"),
2 => f_sdb_embed_device(c_TDC_EIC_DEVICE, x"00012000"),
3 => f_sdb_embed_device(c_I2C_SDB_DEVICE, x"00013000"),
4 => f_sdb_embed_device(c_TDC_MEM_SDB_DEVICE, x"00014000"));
---------------------------------------------------------------------------------------------------
-- Signals --
---------------------------------------------------------------------------------------------------
-- resets
signal general_rst_n, rst_ref_0_n: std_logic;
-- Wishbone buse(s) from crossbar master port(s)
signal cnx_master_out : t_wishbone_master_out_array(c_NUM_WB_MASTERS-1 downto 0);
signal cnx_master_in : t_wishbone_master_in_array (c_NUM_WB_MASTERS-1 downto 0);
-- WISHBONE addresses
signal tdc_core_wb_adr : std_logic_vector(31 downto 0);
signal tdc_mem_wb_adr : std_logic_vector(31 downto 0);
-- 1-wire
signal mezz_owr_en, mezz_owr_i : std_logic_vector(0 downto 0);
-- I2C
signal sys_scl_in, sys_scl_out : std_logic;
signal sys_scl_oe_n, sys_sda_in : std_logic;
signal sys_sda_out, sys_sda_oe_n : std_logic;
-- IRQ
signal irq_tstamp_p, irq_time_p : std_logic;
signal irq_acam_err_p : std_logic;
signal irq_tstamp_p_sys, irq_time_p_sys : std_logic;
signal irq_acam_err_p_sys : std_logic;
-- WRabbit
signal reg_to_wr, reg_from_wr : std_logic_vector(31 downto 0);
signal wrabbit_utc_p : std_logic;
signal wrabbit_synched : std_logic;
function f_wb_shift_address_word ( w: t_wishbone_master_out ) return t_wishbone_master_out is
variable r : t_wishbone_master_out;
begin
r.adr := "00" & w.adr(31 downto 2);
r.dat := w.dat;
r.cyc := w.cyc;
r.stb := w.stb;
r.we := w.we;
r.sel := w.sel;
return r;
end f_wb_shift_address_word;
--=================================================================================================
-- architecture begin
--=================================================================================================
begin
rst_ref_0_n <= not(rst_tdc_i);
---------------------------------------------------------------------------------------------------
-- CSR WISHBONE CROSSBAR --
---------------------------------------------------------------------------------------------------
-- CSR wishbone address decoder
-- 0x10000 -> TDC core configuration
-- 0x11000 -> TDC mezzanine board 1-Wire
-- 0x12000 -> EIC for TDC core
-- 0x13000 -> TDC mezzanine board EEPROM I2C
-- 0x14000 -> TDC core timestamps retrieval
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
cmp_sdb_crossbar : xwb_sdb_crossbar
generic map
(g_num_masters => c_NUM_WB_SLAVES,
g_num_slaves => c_NUM_WB_MASTERS,
g_registered => true,
g_wraparound => true,
g_layout => c_INTERCONNECT_LAYOUT,
g_sdb_addr => c_SDB_ADDRESS)
port map
(clk_sys_i => clk_sys_i,
rst_n_i => rst_sys_n_i,
slave_i(0) => slave_i,
slave_o(0) => slave_o,
master_i => cnx_master_in,
master_o => cnx_master_out);
---------------------------------------------------------------------------------------------------
-- TDC CORE --
---------------------------------------------------------------------------------------------------
cmp_tdc_core: fmc_tdc_core
generic map
(g_span => g_span,
g_width => g_width,
values_for_simul => FALSE)
port map
(-- clks, rst
clk_tdc_i => clk_tdc_i,
rst_tdc_i => rst_tdc_i,
clk_sys_i => clk_sys_i,
rst_n_sys_i => rst_sys_n_i,
acam_refclk_r_edge_p_i => acam_refclk_r_edge_p_i,
-- DAC configuration
send_dac_word_p_o => send_dac_word_p_o,
dac_word_o => dac_word_o,
-- ACAM
start_from_fpga_o => start_from_fpga_o,
err_flag_i => err_flag_i,
int_flag_i => int_flag_i,
start_dis_o => start_dis_o,
stop_dis_o => stop_dis_o,
data_bus_io => data_bus_io,
address_o => address_o,
cs_n_o => cs_n_o,
oe_n_o => oe_n_o,
rd_n_o => rd_n_o,
wr_n_o => wr_n_o,
ef1_i => ef1_i,
ef2_i => ef2_i,
-- Input channels enable
enable_inputs_o => enable_inputs_o,
term_en_1_o => term_en_1_o,
term_en_2_o => term_en_2_o,
term_en_3_o => term_en_3_o,
term_en_4_o => term_en_4_o,
term_en_5_o => term_en_5_o,
-- Input channels to FPGA (not used currently)
tdc_in_fpga_1_i => tdc_in_fpga_1_i,
tdc_in_fpga_2_i => tdc_in_fpga_2_i,
tdc_in_fpga_3_i => tdc_in_fpga_3_i,
tdc_in_fpga_4_i => tdc_in_fpga_4_i,
tdc_in_fpga_5_i => tdc_in_fpga_5_i,
-- TDC board LEDs
tdc_led_status_o => tdc_led_status_o,
tdc_led_trig1_o => tdc_led_trig1_o,
tdc_led_trig2_o => tdc_led_trig2_o,
tdc_led_trig3_o => tdc_led_trig3_o,
tdc_led_trig4_o => tdc_led_trig4_o,
tdc_led_trig5_o => tdc_led_trig5_o,
-- Interrupts
irq_tstamp_p_o => irq_tstamp_p,
irq_time_p_o => irq_time_p,
irq_acam_err_p_o => irq_acam_err_p,
-- WR stuff
wrabbit_tai_i => wrabbit_utc_i,
wrabbit_tai_p_i => wrabbit_utc_p,
wrabbit_synched_i => wrabbit_synched,
wrabbit_status_reg_i => reg_from_wr,
wrabbit_ctrl_reg_o => reg_to_wr,
-- WISHBONE CSR for core configuration
cfg_slave_i => f_wb_shift_address_word(cnx_master_out(c_WB_SLAVE_TDC_CORE_CONFIG)),
cfg_slave_o => cnx_master_in(c_WB_SLAVE_TDC_CORE_CONFIG),
mem_slave_i => f_wb_shift_address_word(cnx_master_out(c_WB_SLAVE_TSTAMP_MEM)),
mem_slave_o => cnx_master_in(c_WB_SLAVE_TSTAMP_MEM),
direct_timestamp_o => direct_timestamp_o,
direct_timestamp_stb_o => direct_timestamp_stb_o);
---------------------------------------------------------------------------------------------------
-- WHITE RABBIT STUFF --
-- only synthesized if g_with_wrabbit_core is TRUE --
---------------------------------------------------------------------------------------------------
cmp_wrabbit_synch: wrabbit_sync
generic map
(g_simulation => false,
g_with_wrabbit_core => g_with_wrabbit_core)
port map
(clk_sys_i => clk_sys_i,
rst_n_sys_i => rst_sys_n_i,
clk_ref_i => clk_tdc_i,
rst_n_ref_i => rst_ref_0_n,
wrabbit_dac_value_i => wrabbit_dac_value_i,
wrabbit_dac_wr_p_i => wrabbit_dac_wr_p_i,
wrabbit_link_up_i => wrabbit_link_up_i,
wrabbit_time_valid_i => wrabbit_time_valid_i,
wrabbit_clk_aux_lock_en_o => wrabbit_clk_aux_lock_en_o,
wrabbit_clk_aux_locked_i => wrabbit_clk_aux_locked_i,
wrabbit_clk_dmtd_locked_i => '1', -- FIXME
wrabbit_synched_o => wrabbit_synched,
wrabbit_reg_i => reg_to_wr, -- synced to 125MHz mezzanine
wrabbit_reg_o => reg_from_wr); -- synced to 125MHz mezzanine
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
wrabbit_one_hz_pulse : process(clk_tdc_i)
begin
if rising_edge(clk_tdc_i) then
if rst_ref_0_n = '0' then
wrabbit_utc_p <= '0';
else
if wrabbit_clk_aux_locked_i = '1' and g_with_wrabbit_core then
if unsigned(wrabbit_cycles_i) = (unsigned(c_SYN_CLK_PERIOD)-3) then -- so that the end of the pulse
-- comes exactly upon the UTC change
wrabbit_utc_p <= '1';
else
wrabbit_utc_p <= '0';
end if;
else
wrabbit_utc_p <= '0';
end if;
end if;
end if;
end process;
---------------------------------------------------------------------------------------------------
-- TDC Mezzanine Board UniqueID&Thermometer OneWire --
---------------------------------------------------------------------------------------------------
cmp_fmc_onewire : xwb_onewire_master
generic map
(g_interface_mode => PIPELINED,
g_address_granularity => BYTE,
g_num_ports => 1,
g_ow_btp_normal => "5.0",
g_ow_btp_overdrive => "1.0")
port map
(clk_sys_i => clk_sys_i,
rst_n_i => rst_sys_n_i,
slave_i => cnx_master_out(c_WB_SLAVE_TDC_ONEWIRE),
slave_o => cnx_master_in(c_WB_SLAVE_TDC_ONEWIRE),
desc_o => open,
owr_pwren_o => open,
owr_en_o => mezz_owr_en,
owr_i => mezz_owr_i);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
onewire_b <= '0' when mezz_owr_en(0) = '1' else 'Z';
mezz_owr_i(0) <= onewire_b;
---------------------------------------------------------------------------------------------------
-- WBGEN2 EMBEDDED INTERRUPTS CONTROLLER --
---------------------------------------------------------------------------------------------------
-- IRQ sources
-- 0 -> number of accumulated timestamps reached threshold
-- 1 -> number of seconds passed reached threshold and number of accumulated tstamps > 0
-- 2 -> ACAM error
cmp_tdc_eic : tdc_eic
port map
(clk_sys_i => clk_sys_i,
rst_n_i => rst_sys_n_i,
wb_adr_i => cnx_master_out(c_WB_SLAVE_TDC_EIC).adr(3 downto 2),
wb_dat_i => cnx_master_out(c_WB_SLAVE_TDC_EIC).dat,
wb_dat_o => cnx_master_in(c_WB_SLAVE_TDC_EIC).dat,
wb_cyc_i => cnx_master_out(c_WB_SLAVE_TDC_EIC).cyc,
wb_sel_i => cnx_master_out(c_WB_SLAVE_TDC_EIC).sel,
wb_stb_i => cnx_master_out(c_WB_SLAVE_TDC_EIC).stb,
wb_we_i => cnx_master_out(c_WB_SLAVE_TDC_EIC).we,
wb_ack_o => cnx_master_in(c_WB_SLAVE_TDC_EIC).ack,
wb_stall_o => cnx_master_in(c_WB_SLAVE_TDC_EIC).stall,
wb_int_o => wb_irq_o,
irq_tdc_tstamps_i => irq_tstamp_p_sys,
irq_tdc_time_i => irq_time_p_sys,
irq_tdc_acam_err_i => irq_acam_err_p_sys);
cmp_sync_irq_tstamp: gc_pulse_synchronizer2
port map (
clk_in_i => clk_tdc_i,
rst_in_n_i => rst_ref_0_n,
clk_out_i => clk_sys_i,
rst_out_n_i => rst_sys_n_i,
d_p_i => irq_tstamp_p,
q_p_o => irq_tstamp_p_sys);
irq_time_p_sys <= '0'; -- we don't need these in the driver
irq_acam_err_p_sys <= '0';
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Unused wishbone signals
cnx_master_in(c_WB_SLAVE_TDC_EIC).err <= '0';
cnx_master_in(c_WB_SLAVE_TDC_EIC).rty <= '0';
cnx_master_in(c_WB_SLAVE_TDC_EIC).int <= '0';
---------------------------------------------------------------------------------------------------
-- TDC Mezzanine Board EEPROM I2C --
---------------------------------------------------------------------------------------------------
cmp_I2C_master : xwb_i2c_master
generic map
(g_interface_mode => PIPELINED,
g_address_granularity => BYTE)
port map
(clk_sys_i => clk_sys_i,
rst_n_i => rst_sys_n_i,
slave_i => cnx_master_out(c_WB_SLAVE_TDC_I2C),
slave_o => cnx_master_in(c_WB_SLAVE_TDC_I2C),
desc_o => open,
scl_pad_i(0) => i2c_scl_i,
scl_pad_o(0) => sys_scl_out,
scl_padoen_o(0) => sys_scl_oe_n,
sda_pad_i(0) => i2c_sda_i,
sda_pad_o(0) => sys_sda_out,
sda_padoen_o(0) => sys_sda_oe_n);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
i2c_sda_oen_o <= sys_sda_oe_n;
i2c_sda_o <= sys_sda_out;
i2c_scl_oen_o <= sys_scl_oe_n;
i2c_scl_o <= sys_scl_out;
end rtl;
----------------------------------------------------------------------------------------------------
-- architecture ends
----------------------------------------------------------------------------------------------------
--_________________________________________________________________________________________________
-- |
-- |TDC core| |
-- |
-- CERN,BE/CO-HT |
--________________________________________________________________________________________________|
---------------------------------------------------------------------------------------------------
-- |
-- reg_ctrl |
-- |
---------------------------------------------------------------------------------------------------
-- File reg_ctrl.vhd |
-- |
-- Description Interfaces with the GN4124/VME core for the configuration of the ACAM chip and of |
-- the TDC core. Data transfers take place between the GN4124/VME interface and |
-- locally the TDC core. The unit implements a WISHBONE slave. |
-- |
-- Through WISHBONE writes, the unit receives: |
-- o the ACAM configuration registers which are then made available to the |
-- data_engine and acam_databus_interface units to be transferred to the ACAMchip|
-- o the local configuration registers (eg irq_thresholds, channels_enable, WRabbit|
-- core enable) that are then made available to the different units of the design|
-- o the control register that defines the action to be taken in the core; the |
-- register is decoded and the corresponding signals are made available to the |
-- different units in the design. |
-- |
-- Through WISHBONE reads, the unit transmits: |
-- o the ACAM configuration registers readback from the ACAM chip |
-- o status registers coming from different units of the TDC core |
-- |
-- All the registers are of size 32 bits, as the WISHBONE data bus |
-- |
-- |
-- Authors Gonzalo Penacoba (Gonzalo.Penacoba@cern.ch) |
-- Evangelia Gousiou (Evangelia.Gousiou@cern.ch) |
-- Date 04/2014 |
-- Version v2 |
-- Depends on |
-- |
---------------- |
-- Last changes |
-- 10/2011 v0.1 GP First version |
-- 04/2012 v0.11 EG Revamping; Comments added, signals renamed |
-- 08/2012 v1 EG added register reg_adr_pipe0 for slack timing reasons |
-- 04/2014 v2 EG added WRabbit register; added channel deactivation register |
-- |
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE |
-- ------------------------------------ |
-- This source file is free software; you can redistribute it and/or modify it under the terms of |
-- the GNU Lesser General Public License as published by the Free Software Foundation; either |
-- version 2.1 of the License, or (at your option) any later version. |
-- This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
-- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
-- See the GNU Lesser General Public License for more details. |
-- You should have received a copy of the GNU Lesser General Public License along with this |
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html |
---------------------------------------------------------------------------------------------------
--=================================================================================================
-- Libraries & Packages
--=================================================================================================
--_________________________________________________________________________________________________
-- |
-- |TDC core| |
-- |
-- CERN,BE/CO-HT |
--________________________________________________________________________________________________|
---------------------------------------------------------------------------------------------------
-- |
-- reg_ctrl |
-- |
---------------------------------------------------------------------------------------------------
-- File reg_ctrl.vhd |
-- |
-- Description Interfaces with the GN4124/VME core for the configuration of the ACAM chip and of |
-- the TDC core. Data transfers take place between the GN4124/VME interface and |
-- locally the TDC core. The unit implements a WISHBONE slave. |
-- |
-- Through WISHBONE writes, the unit receives: |
-- o the ACAM configuration registers which are then made available to the |
-- data_engine and acam_databus_interface units to be transfered to the ACAM chip|
-- o the local configuration registers (eg irq_thresholds, channels_enable) that |
-- are then made available to the different units of this design |
-- o the control register that defines the action to be taken in the core; the |
-- register is decoded and the corresponding signals are made available to the |
-- different units in the design. |
-- |
-- Through WISHBONE reads, the unit transmits: |
-- o the ACAM configuration registers readback from the ACAM chip |
-- o status registers coming from different units of the TDC core |
-- |
-- All the registers are of size 32 bits, as the WISHBONE data bus |
-- |
-- |
-- Authors Gonzalo Penacoba (Gonzalo.Penacoba@cern.ch) |
-- Evangelia Gousiou (Evangelia.Gousiou@cern.ch) |
-- Date 08/2012 |
-- Version v1 |
-- Depends on |
-- |
---------------- |
-- Last changes |
-- 10/2011 v0.1 GP First version |
-- 04/2012 v0.11 EG Revamping; Comments added, signals renamed |
-- 08/2012 v1 EG added register reg_adr_pipe0 for slack timing reasons |
-- |
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE |
-- ------------------------------------ |
-- This source file is free software; you can redistribute it and/or modify it under the terms of |
-- the GNU Lesser General Public License as published by the Free Software Foundation; either |
-- version 2.1 of the License, or (at your option) any later version. |
-- This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
-- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
-- See the GNU Lesser General Public License for more details. |
-- You should have received a copy of the GNU Lesser General Public License along with this |
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html |
---------------------------------------------------------------------------------------------------
--=================================================================================================
-- Libraries & Packages
--=================================================================================================
-- Standard library
library IEEE;
use IEEE.STD_LOGIC_1164.all; -- std_logic definitions
use IEEE.NUMERIC_STD.all; -- conversion functions-- Specific library
use IEEE.std_logic_1164.all; -- std_logic definitions
use IEEE.NUMERIC_STD.all; -- conversion functions
-- Specific library
library work;
use work.tdc_core_pkg.all; -- definitions of types, constants, entities
--=================================================================================================
-- Entity declaration for reg_ctrl
--=================================================================================================
entity reg_ctrl is
generic
(g_span : integer := 32;
g_width : integer := 32);
port
-- INPUTS
-- Signals from the clks_rsts_manager unit
(clk_i : in std_logic; -- 125 MHz
rst_i : in std_logic; -- global reset, synced to clk_i
-- Signals from the GN4124/VME_core unit: WISHBONE for regs transfer
tdc_config_wb_adr_i : in std_logic_vector(g_span-1 downto 0); -- WISHBONE address
tdc_config_wb_cyc_i : in std_logic; -- WISHBONE cycle
tdc_config_wb_dat_i : in std_logic_vector(g_width-1 downto 0); -- WISHBONE data in
tdc_config_wb_stb_i : in std_logic; -- WISHBONE strobe
tdc_config_wb_we_i : in std_logic; -- WISHBONE write enable
-- Signals from the data_engine unit: configuration regs read back from the ACAM
acam_config_rdbk_i : in config_vector; -- array keeping values read back from ACAM regs 0-7, 11, 12, 14
acam_ififo1_i : in std_logic_vector(g_width-1 downto 0); -- keeps value read back from ACAM reg 8; for debug reasons only
acam_ififo2_i : in std_logic_vector(g_width-1 downto 0); -- keeps value read back from ACAM reg 9; for debug reasons only
acam_start01_i : in std_logic_vector(g_width-1 downto 0); -- keeps value read back from ACAM reg 10; for debug reasons only
-- Signals from the data_formatting unit
wr_index_i : in std_logic_vector(g_width-1 downto 0); -- index of the last circular_buffer adr written
-- Signals from the one_hz_gen unit
local_utc_i : in std_logic_vector(g_width-1 downto 0); -- local utc time
-- Signals not used so far
core_status_i : in std_logic_vector(g_width-1 downto 0); -- TDC core status word
irq_code_i : in std_logic_vector(g_width-1 downto 0); -- TDC core interrupt code word
-- White Rabbit status
wrabbit_status_reg_i : in std_logic_vector(g_width-1 downto 0); -- WRabbit status bits
-- OUTPUTS
-- Signals to the GN4124/VME_core unit: WISHBONE for regs transfer
tdc_config_wb_ack_o : out std_logic; -- WISHBONE acknowledge
tdc_config_wb_dat_o : out std_logic_vector(g_width-1 downto 0); -- WISHBONE data out
-- Signals to the data_engine unit: config regs for the ACAM
acam_config_o : out config_vector;
-- Signals to the data_engine unit: TDC core functionality
activate_acq_p_o : out std_logic; -- activates tstamps acquisition from ACAM
deactivate_acq_p_o : out std_logic; -- activates ACAM configuration readings/ writings
acam_wr_config_p_o : out std_logic; -- enables writing to ACAM regs 0-7, 11, 12, 14
acam_rdbk_config_p_o : out std_logic; -- enables reading of ACAM regs 0-7, 11, 12, 14
acam_rst_p_o : out std_logic; -- enables writing the c_RESET_WORD to ACAM reg 4
acam_rdbk_status_p_o : out std_logic; -- enables reading of ACAM reg 12
acam_rdbk_ififo1_p_o : out std_logic; -- enables reading of ACAM reg 8
acam_rdbk_ififo2_p_o : out std_logic; -- enables reading of ACAM reg 9
acam_rdbk_start01_p_o : out std_logic; -- enables reading of ACAM reg 10
-- Signal to the data_formatting unit
dacapo_c_rst_p_o : out std_logic; -- clears the dacapo counter
deactivate_chan_o : out std_logic_vector(4 downto 0); -- an active bit stops the registration of timestamps from the specified channel
-- eg: "10010": timestamps from Channel 2 and Channel 5 won't be registered
-- Signals to the clks_resets_manager unit
send_dac_word_p_o : out std_logic; -- initiates the reconfiguration of the DAC
dac_word_o : out std_logic_vector(23 downto 0);
-- Signal to the one_hz_gen unit
load_utc_p_o : out std_logic;
starting_utc_o : out std_logic_vector(g_width-1 downto 0);
irq_tstamp_threshold_o: out std_logic_vector(g_width-1 downto 0); -- threshold in number of timestamps
irq_time_threshold_o : out std_logic_vector(g_width-1 downto 0); -- threshold in number of ms
one_hz_phase_o : out std_logic_vector(g_width-1 downto 0); -- for debug only
-- Signal to the TDC mezzanine board
acam_inputs_en_o : out std_logic_vector(g_width-1 downto 0); -- enables all five input channels
-- White Rabbit control
wrabbit_ctrl_reg_o : out std_logic_vector(g_width-1 downto 0); -- WRabbit control register; bit 0 enables the WRabbit core
-- Signal to the acam_timecontrol_interface unit -- eva: i think it s not needed
start_phase_o : out std_logic_vector(g_width-1 downto 0));
end reg_ctrl;
--=================================================================================================
-- architecture declaration
--=================================================================================================
architecture rtl of reg_ctrl is
signal acam_config : config_vector;
signal reg_adr,reg_adr_pipe0 : std_logic_vector(7 downto 0);
signal starting_utc, acam_inputs_en, start_phase : std_logic_vector(g_width-1 downto 0);
signal ctrl_reg, one_hz_phase, irq_tstamp_threshold : std_logic_vector(g_width-1 downto 0);
signal irq_time_threshold : std_logic_vector(g_width-1 downto 0);
signal clear_ctrl_reg, send_dac_word_p : std_logic;
signal dac_word : std_logic_vector(23 downto 0);
signal pulse_extender_en : std_logic;
signal pulse_extender_c : std_logic_vector(2 downto 0);
signal dat_out, wrabbit_ctrl_reg, deactivate_chan : std_logic_vector(g_span-1 downto 0);
signal tdc_config_wb_ack_o_pipe0 : std_logic;
--=================================================================================================
-- architecture begin
--=================================================================================================
begin
reg_adr <= tdc_config_wb_adr_i(7 downto 0); -- we are interested in addresses 00 to FC
---------------------------------------------------------------------------------------------------
-- WISHBONE ACK to GN4124/VME_core --
---------------------------------------------------------------------------------------------------
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- TDCconfig_ack_generator: generation of the WISHBONE acknowledge signal for the
-- interactions with the GN4124/VME_core.
TDCconfig_ack_generator: process (clk_i)
begin
if rising_edge (clk_i) then
if rst_i = '1' then
tdc_config_wb_ack_o <= '0';
tdc_config_wb_ack_o_pipe0 <= '0';
elsif(tdc_config_wb_cyc_i = '0') then
tdc_config_wb_ack_o <= '0';
tdc_config_wb_ack_o_pipe0 <= '0';
else
tdc_config_wb_ack_o <= tdc_config_wb_ack_o_pipe0;
tdc_config_wb_ack_o_pipe0 <= tdc_config_wb_stb_i and tdc_config_wb_cyc_i;
end if;
end if;
end process;
---------------------------------------------------------------------------------------------------
-- Reception of ACAM Configuration Registers --
---------------------------------------------------------------------------------------------------
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- ACAM_config_reg_reception: reception from the GN4124/VME interface of the configuration registers
-- to be loaded to the ACAM chip. The received data is stored in the acam_config vector which is
-- input to the data_engine and the acam_databus_interface units for the further transfer to the
-- ACAM chip.
ACAM_config_reg_reception: process (clk_i)
begin
if rising_edge (clk_i) then
if rst_i = '1' then
acam_config(0) <= (others =>'0');
acam_config(1) <= (others =>'0');
acam_config(2) <= (others =>'0');
acam_config(3) <= (others =>'0');
acam_config(4) <= (others =>'0');
acam_config(5) <= (others =>'0');
acam_config(6) <= (others =>'0');
acam_config(7) <= (others =>'0');
acam_config(8) <= (others =>'0');
acam_config(9) <= (others =>'0');
acam_config(10) <= (others =>'0');
elsif tdc_config_wb_cyc_i = '1' and tdc_config_wb_stb_i = '1' and tdc_config_wb_we_i = '1' then -- WISHBONE writes
if reg_adr = c_ACAM_REG0_ADR then
acam_config(0) <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_ACAM_REG1_ADR then
acam_config(1) <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_ACAM_REG2_ADR then
acam_config(2) <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_ACAM_REG3_ADR then
acam_config(3) <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_ACAM_REG4_ADR then
acam_config(4) <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_ACAM_REG5_ADR then
acam_config(5) <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_ACAM_REG6_ADR then
acam_config(6) <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_ACAM_REG7_ADR then
acam_config(7) <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_ACAM_REG11_ADR then
acam_config(8) <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_ACAM_REG12_ADR then
acam_config(9) <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_ACAM_REG14_ADR then
acam_config(10) <= tdc_config_wb_dat_i;
end if;
end if;
end if;
end process;
-- -- -- -- -- -- -- -- -- -- -- --
acam_config_o <= acam_config;
---------------------------------------------------------------------------------------------------
-- Reception of TDC core Configuration Registers --
---------------------------------------------------------------------------------------------------
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- TDCcore_config_reg_reception: reception from the GN4124/VME interface of the configuration
-- registers to be loaded locally.
-- The following information is received:
-- o acam_inputs_en : for the activation of the TDC input channels
-- o irq_tstamp_threshold : for the activation of GN4124/VME interrupts based on the number of timestamps
-- o irq_time_threshold : for the activation of GN4124/VME interrupts based on the time elapsed
-- o starting_utc : definition of the current UTC time
-- o dac_word : word for the "manual" (non White Rabbit) reconfiguration of the DAC
-- o deactivate_chan : for the deactivation of the registration of timestamps if they come from the specified channel
-- o wrabbit_ctrl_reg : for the activation of the White Rabbit core (bit 0 only used so far)
-- o one_hz_phase : not used
-- o start_phase : not used
TDCcore_config_reg_reception: process (clk_i)
begin
if rising_edge (clk_i) then
if rst_i ='1' then
acam_inputs_en <= (others =>'0');
starting_utc <= (others =>'0');
start_phase <= (others =>'0');
one_hz_phase <= (others =>'0');
wrabbit_ctrl_reg <= (others =>'0');
deactivate_chan <= (others =>'0');
irq_tstamp_threshold <= x"00000100"; -- default 256 timestamps: full memory
irq_time_threshold <= x"000000C8"; -- default 200 ms
dac_word <= c_DEFAULT_DAC_WORD; -- default DAC Vout = 1.65
elsif tdc_config_wb_cyc_i = '1' and tdc_config_wb_stb_i = '1' and tdc_config_wb_we_i = '1' then -- WISHBONE writes
if reg_adr = c_STARTING_UTC_ADR then
starting_utc <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_ACAM_INPUTS_EN_ADR then
acam_inputs_en <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_START_PHASE_ADR then
start_phase <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_ONE_HZ_PHASE_ADR then
one_hz_phase <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_IRQ_TSTAMP_THRESH_ADR then
irq_tstamp_threshold <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_IRQ_TIME_THRESH_ADR then
irq_time_threshold <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_DAC_WORD_ADR then
dac_word <= tdc_config_wb_dat_i(23 downto 0);
end if;
if reg_adr = c_WRABBIT_CTRL_ADR then
wrabbit_ctrl_reg <= tdc_config_wb_dat_i;
end if;
if reg_adr = c_DEACT_CHAN_ADR then
deactivate_chan <= tdc_config_wb_dat_i;
end if;
end if;
end if;
end process;
-- -- -- -- -- -- -- -- -- -- -- --
starting_utc_o <= starting_utc;
acam_inputs_en_o <= acam_inputs_en;
start_phase_o <= start_phase;
one_hz_phase_o <= one_hz_phase;
irq_tstamp_threshold_o <= irq_tstamp_threshold;
irq_time_threshold_o <= irq_time_threshold;
dac_word_o <= dac_word;
wrabbit_ctrl_reg_o <= wrabbit_ctrl_reg;
deactivate_chan_o <= deactivate_chan(4 downto 0);
---------------------------------------------------------------------------------------------------
-- Reception of TDC core Control Register --
---------------------------------------------------------------------------------------------------
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- TDCcore_ctrl_reg_reception: reception from the GN4124/VME interface of the control register that
-- defines the action to be taken by the TDC core.
-- Note that only one bit of the register should be written at a time. The process receives
-- the register, defines the action to be taken and after 1 clk cycle clears the register.
TDCcore_ctrl_reg_reception: process (clk_i)
begin
if rising_edge (clk_i) then
if rst_i = '1' then
ctrl_reg <= (others =>'0');
clear_ctrl_reg <= '0';
elsif clear_ctrl_reg = '1' then
ctrl_reg <= (others =>'0');
clear_ctrl_reg <= '0';
elsif tdc_config_wb_cyc_i = '1' and tdc_config_wb_stb_i = '1' and tdc_config_wb_we_i = '1' then -- WISHBONE writes
if reg_adr = c_CTRL_REG_ADR then
ctrl_reg <= tdc_config_wb_dat_i;
clear_ctrl_reg <= '1';
end if;
end if;
end if;
end process;
-- -- -- -- -- -- -- -- -- -- -- --
activate_acq_p_o <= ctrl_reg(0);
deactivate_acq_p_o <= ctrl_reg(1);
acam_wr_config_p_o <= ctrl_reg(2);
acam_rdbk_config_p_o <= ctrl_reg(3);
acam_rdbk_status_p_o <= ctrl_reg(4);
acam_rdbk_ififo1_p_o <= ctrl_reg(5);
acam_rdbk_ififo2_p_o <= ctrl_reg(6);
acam_rdbk_start01_p_o <= ctrl_reg(7);
acam_rst_p_o <= ctrl_reg(8);
load_utc_p_o <= ctrl_reg(9);
dacapo_c_rst_p_o <= ctrl_reg(10) or ctrl_reg(1); -- dacapo register reset when the acquisition is deactivated
send_dac_word_p <= ctrl_reg(11);
-- ctrl_reg bits 12 to 31 not used for the moment!
-- -- -- -- -- -- -- -- -- -- -- --
-- Pulse_stretcher: Increases the width of the send_dac_word_p pulse so that it can be sampled
-- by the 20 MHz clock of the clks_rsts_manager that is communicating with the DAC.
Pulse_stretcher: incr_counter
generic map
(width => 3)
port map
(clk_i => clk_i,
rst_i => send_dac_word_p,
counter_top_i => "111",
counter_incr_en_i => pulse_extender_en,
counter_is_full_o => open,
counter_o => pulse_extender_c);
-- -- -- -- -- -- -- -- -- -- -- --
pulse_extender_en <= '1' when pulse_extender_c < "111" else '0';
send_dac_word_p_o <= pulse_extender_en;
---------------------------------------------------------------------------------------------------
-- Delivery of ACAM and TDC core Readback Registers --
---------------------------------------------------------------------------------------------------
-- TDCcore_ctrl_reg_reception: Delivery to the GN4124/VME interface of all the readable registers,
-- including those of the ACAM and the TDC core.
-- Note: pipelining of the address for timing/slack reasons
WISHBONEreads: process (clk_i)
begin
if rising_edge (clk_i) then
--if tdc_config_wb_cyc_i = '1' and tdc_config_wb_stb_i = '1' and tdc_config_wb_we_i = '0' then -- WISHBONE reads
-- tdc_config_wb_dat_o <= dat_out;
reg_adr_pipe0 <= reg_adr;
tdc_config_wb_dat_o <= dat_out;
--end if;
end if;
end process;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
with reg_adr_pipe0 select dat_out <=
-- regs written by the GN4124/VME interface
acam_config(0) when c_ACAM_REG0_ADR,
acam_config(1) when c_ACAM_REG1_ADR,
acam_config(2) when c_ACAM_REG2_ADR,
acam_config(3) when c_ACAM_REG3_ADR,
acam_config(4) when c_ACAM_REG4_ADR,
acam_config(5) when c_ACAM_REG5_ADR,
acam_config(6) when c_ACAM_REG6_ADR,
acam_config(7) when c_ACAM_REG7_ADR,
acam_config(8) when c_ACAM_REG11_ADR,
acam_config(9) when c_ACAM_REG12_ADR,
acam_config(10) when c_ACAM_REG14_ADR,
-- regs read from the ACAM
acam_config_rdbk_i(0) when c_ACAM_REG0_RDBK_ADR,
acam_config_rdbk_i(1) when c_ACAM_REG1_RDBK_ADR,
acam_config_rdbk_i(2) when c_ACAM_REG2_RDBK_ADR,
acam_config_rdbk_i(3) when c_ACAM_REG3_RDBK_ADR,
acam_config_rdbk_i(4) when c_ACAM_REG4_RDBK_ADR,
acam_config_rdbk_i(5) when c_ACAM_REG5_RDBK_ADR,
acam_config_rdbk_i(6) when c_ACAM_REG6_RDBK_ADR,
acam_config_rdbk_i(7) when c_ACAM_REG7_RDBK_ADR,
acam_ififo1_i when c_ACAM_REG8_RDBK_ADR,
acam_ififo2_i when c_ACAM_REG9_RDBK_ADR,
acam_start01_i when c_ACAM_REG10_RDBK_ADR,
acam_config_rdbk_i(8) when c_ACAM_REG11_RDBK_ADR,
acam_config_rdbk_i(9) when c_ACAM_REG12_RDBK_ADR,
acam_config_rdbk_i(10) when c_ACAM_REG14_RDBK_ADR,
-- regs written by the GN4124/VME interface
starting_utc when c_STARTING_UTC_ADR,
acam_inputs_en when c_ACAM_INPUTS_EN_ADR,
start_phase when c_START_PHASE_ADR,
one_hz_phase when c_ONE_HZ_PHASE_ADR,
irq_tstamp_threshold when c_IRQ_TSTAMP_THRESH_ADR,
irq_time_threshold when c_IRQ_TIME_THRESH_ADR,
x"00" & dac_word when c_DAC_WORD_ADR,
-- regs written locally by the TDC core units
local_utc_i when c_LOCAL_UTC_ADR,
irq_code_i when c_IRQ_CODE_ADR,
wr_index_i when c_WR_INDEX_ADR,
core_status_i when c_CORE_STATUS_ADR,
-- White Rabbit regs
wrabbit_status_reg_i when c_WRABBIT_STATUS_ADR,
wrabbit_ctrl_reg when c_WRABBIT_CTRL_ADR,
-- Deactivation of timestamps registration
deactivate_chan when c_DEACT_CHAN_ADR,
-- others
x"C0FFEEEE" when others;
end architecture rtl;
--=================================================================================================
-- architecture end
--=================================================================================================
---------------------------------------------------------------------------------------------------
-- E N D O F F I L E
---------------------------------------------------------------------------------------------------
\ No newline at end of file
use work.tdc_core_pkg.all; -- definitions of types, constants, entities
use work.wishbone_pkg.all;
--=================================================================================================
-- Entity declaration for reg_ctrl
--=================================================================================================
entity reg_ctrl is
generic
(g_span : integer := 32;
g_width : integer := 32);
port
-- INPUTS
-- Signals from the clks_rsts_manager unit
(clk_sys_i : in std_logic;
rst_n_sys_i : in std_logic; -- global reset, synched to clk_sys
clk_tdc_i : in std_logic;
rst_tdc_i : in std_logic;
slave_i: in t_wishbone_slave_in; -- WB interface (clk_sys domain)
slave_o: out t_wishbone_slave_out;
-- Signals from the data_engine unit: configuration regs read back from the ACAM
acam_config_rdbk_i : in config_vector; -- array keeping values read back from ACAM regs 0-7, 11, 12, 14
acam_ififo1_i : in std_logic_vector(g_width-1 downto 0); -- keeps value read back from ACAM reg 8; for debug reasons only
acam_ififo2_i : in std_logic_vector(g_width-1 downto 0); -- keeps value read back from ACAM reg 9; for debug reasons only
acam_start01_i : in std_logic_vector(g_width-1 downto 0); -- keeps value read back from ACAM reg 10; for debug reasons only
-- Signals from the data_formatting unit
wr_index_i : in std_logic_vector(g_width-1 downto 0); -- index of the last circular_buffer adr written
-- Signals from the one_hz_gen unit
local_utc_i : in std_logic_vector(g_width-1 downto 0); -- local utc time
-- Signals not used so far
core_status_i : in std_logic_vector(g_width-1 downto 0); -- TDC core status word
irq_code_i : in std_logic_vector(g_width-1 downto 0); -- TDC core interrupt code word
-- White Rabbit status
wrabbit_status_reg_i : in std_logic_vector(g_width-1 downto 0); --
-- OUTPUTS
-- Signals to the data_engine unit: config regs for the ACAM
acam_config_o : out config_vector;
-- Signals to the data_engine unit: TDC core functionality
activate_acq_p_o : out std_logic; -- activates tstamps aquisition from ACAM
deactivate_acq_p_o : out std_logic; -- activates ACAM configuration readings/ writings
acam_wr_config_p_o : out std_logic; -- enables writing to ACAM regs 0-7, 11, 12, 14
acam_rdbk_config_p_o : out std_logic; -- enables reading of ACAM regs 0-7, 11, 12, 14
acam_rst_p_o : out std_logic; -- enables writing the c_RESET_WORD to ACAM reg 4
acam_rdbk_status_p_o : out std_logic; -- enables reading of ACAM reg 12
acam_rdbk_ififo1_p_o : out std_logic; -- enables reading of ACAM reg 8
acam_rdbk_ififo2_p_o : out std_logic; -- enables reading of ACAM reg 9
acam_rdbk_start01_p_o : out std_logic; -- enables reading of ACAM reg 10
-- Signal to the data_formatting unit
dacapo_c_rst_p_o : out std_logic; -- clears the dacapo counter
deactivate_chan_o : out std_logic_vector(4 downto 0); -- stops registering timestamps from a specific channel
-- Signals to the clks_resets_manager unit
send_dac_word_p_o : out std_logic; -- initiates the reconfiguration of the DAC
dac_word_o : out std_logic_vector(23 downto 0);
-- Signal to the one_hz_gen unit
load_utc_p_o : out std_logic;
starting_utc_o : out std_logic_vector(g_width-1 downto 0);
irq_tstamp_threshold_o: out std_logic_vector(g_width-1 downto 0); -- threshold in number of timestamps
irq_time_threshold_o : out std_logic_vector(g_width-1 downto 0); -- threshold in number of ms
one_hz_phase_o : out std_logic_vector(g_width-1 downto 0); -- for debug only
-- Signal to the TDC mezzanine board
acam_inputs_en_o : out std_logic_vector(g_width-1 downto 0); -- enables all five input channels
-- White Rabbit control
wrabbit_ctrl_reg_o : out std_logic_vector(g_width-1 downto 0); --
-- Signal to the acam_timecontrol_interface unit -- eva: i think it s not needed
start_phase_o : out std_logic_vector(g_width-1 downto 0));
end reg_ctrl;
--=================================================================================================
-- architecture declaration
--=================================================================================================
architecture rtl of reg_ctrl is
signal acam_config : config_vector;
signal reg_adr,reg_adr_pipe0 : std_logic_vector(7 downto 0);
signal starting_utc, acam_inputs_en, start_phase : std_logic_vector(g_width-1 downto 0);
signal ctrl_reg, one_hz_phase, irq_tstamp_threshold : std_logic_vector(g_width-1 downto 0);
signal irq_time_threshold : std_logic_vector(g_width-1 downto 0);
signal clear_ctrl_reg, send_dac_word_p : std_logic;
signal dac_word : std_logic_vector(23 downto 0);
signal pulse_extender_en : std_logic;
signal pulse_extender_c : std_logic_vector(2 downto 0);
signal dat_out, wrabbit_ctrl_reg, deactivate_chan : std_logic_vector(g_span-1 downto 0);
signal ack_out_pipe0, ack_out_pipe1 : std_logic;
signal dat_out_comb0, dat_out_comb1 : std_logic_vector(g_span-1 downto 0);
signal dat_out_comb2, dat_out_comb3 : std_logic_vector(g_span-1 downto 0);
signal dat_out_pipe0, dat_out_pipe1 : std_logic_vector(g_span-1 downto 0);
signal dat_out_pipe2, dat_out_pipe3 : std_logic_vector(g_span-1 downto 0);
signal cyc_in_progress : std_logic;
signal wb_in : t_wishbone_slave_in;
signal wb_out : t_wishbone_slave_out;
signal rst_n_tdc : std_logic;
--=================================================================================================
-- architecture begin
--=================================================================================================
begin
rst_n_tdc <= not rst_tdc_i;
wb_out.stall <= '0';
wb_out.err <= '0';
wb_out.rty <= '0';
cmp_clks_crossing : xwb_clock_crossing
port map
(slave_clk_i => clk_sys_i, -- Slave control port: VME interface at 62.5 MHz
slave_rst_n_i => rst_n_sys_i,
slave_i => slave_i,
slave_o => slave_o,
master_clk_i => clk_tdc_i,
master_rst_n_i => rst_n_tdc,
master_i => wb_out,
master_o => wb_in);
reg_adr <= wb_in.adr(7 downto 0); -- we are interested in addresses 0:5000 to 0:50FC
---------------------------------------------------------------------------------------------------
-- WISHBONE ACK to GN4124/VME_core --
---------------------------------------------------------------------------------------------------
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- TDCconfig_ack_generator: generation of the WISHBONE acknowledge signal for the
-- interactions with the GN4124/VME_core.
TDCconfig_ack_generator : process (clk_tdc_i)
begin
if rising_edge (clk_tdc_i) then
if rst_n_tdc = '0' then
wb_out.ack <= '0';
ack_out_pipe1 <= '0';
ack_out_pipe0 <= '0';
cyc_in_progress <= '0';
elsif(wb_in.cyc /= '1') then
ack_out_pipe1 <= '0';
ack_out_pipe0 <= '0';
cyc_in_progress <= '0';
else
cyc_in_progress <= '1';
wb_out.ack <= ack_out_pipe1;
ack_out_pipe1 <= ack_out_pipe0;
ack_out_pipe0 <= wb_in.stb and wb_in.cyc and not cyc_in_progress;
end if;
end if;
end process;
---------------------------------------------------------------------------------------------------
-- Reception of ACAM Configuration Registers --
---------------------------------------------------------------------------------------------------
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- ACAM_config_reg_reception: reception from the GN4124/VME interface of the configuration registers
-- to be loaded to the ACAM chip. The received data is stored in the acam_config vector which is
-- input to the data_engine and the acam_databus_interface units for the further transfer to the
-- ACAM chip.
ACAM_config_reg_reception : process (clk_tdc_i)
begin
if rising_edge (clk_tdc_i) then
if rst_tdc_i = '1' then
acam_config(0) <= (others =>'0');
acam_config(1) <= (others =>'0');
acam_config(2) <= (others =>'0');
acam_config(3) <= (others =>'0');
acam_config(4) <= (others =>'0');
acam_config(5) <= (others =>'0');
acam_config(6) <= (others =>'0');
acam_config(7) <= (others =>'0');
acam_config(8) <= (others =>'0');
acam_config(9) <= (others =>'0');
acam_config(10) <= (others =>'0');
elsif wb_in.cyc = '1' and wb_in.stb = '1' and wb_in.we = '1' then -- WISHBONE writes
if reg_adr = c_ACAM_REG0_ADR then
acam_config(0) <= wb_in.dat;
end if;
if reg_adr = c_ACAM_REG1_ADR then
acam_config(1) <= wb_in.dat;
end if;
if reg_adr = c_ACAM_REG2_ADR then
acam_config(2) <= wb_in.dat;
end if;
if reg_adr = c_ACAM_REG3_ADR then
acam_config(3) <= wb_in.dat;
end if;
if reg_adr = c_ACAM_REG4_ADR then
acam_config(4) <= wb_in.dat;
end if;
if reg_adr = c_ACAM_REG5_ADR then
acam_config(5) <= wb_in.dat;
end if;
if reg_adr = c_ACAM_REG6_ADR then
acam_config(6) <= wb_in.dat;
end if;
if reg_adr = c_ACAM_REG7_ADR then
acam_config(7) <= wb_in.dat;
end if;
if reg_adr = c_ACAM_REG11_ADR then
acam_config(8) <= wb_in.dat;
end if;
if reg_adr = c_ACAM_REG12_ADR then
acam_config(9) <= wb_in.dat;
end if;
if reg_adr = c_ACAM_REG14_ADR then
acam_config(10) <= wb_in.dat;
end if;
end if;
end if;
end process;
-- -- -- -- -- -- -- -- -- -- -- --
acam_config_o <= acam_config;
---------------------------------------------------------------------------------------------------
-- Reception of TDC core Configuration Registers --
---------------------------------------------------------------------------------------------------
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- TDCcore_config_reg_reception: reception from the GN4124/VME interface of the configuration
-- registers to be loaded locally.
-- The following information is received:
-- o acam_inputs_en : for the activation of the TDC input channels
-- o irq_tstamp_threshold : for the activation of GN4124/VME interrupts based on the number of timestamps
-- o irq_time_threshold : for the activation of GN4124/VME interrupts based on the time elapsed
-- o starting_utc : definition of the current UTC time
-- o starting_utc : definition of the current UTC time
-- o one_hz_phase : eva: think it s not used
-- o start_phase : eva: think it s not used
TDCcore_config_reg_reception: process (clk_tdc_i)
begin
if rising_edge (clk_tdc_i) then
if rst_tdc_i ='1' then
acam_inputs_en <= (others =>'0');
starting_utc <= (others =>'0');
start_phase <= (others =>'0');
one_hz_phase <= (others =>'0');
wrabbit_ctrl_reg <= (others =>'0');
deactivate_chan <= (others =>'0');
irq_tstamp_threshold <= x"00000100"; -- default 256 timestamps: full memory
irq_time_threshold <= x"000000C8"; -- default 200 ms
dac_word <= c_DEFAULT_DAC_WORD; -- default DAC Vout = 1.65
elsif wb_in.cyc = '1' and wb_in.stb = '1' and wb_in.we = '1' then
if reg_adr = c_STARTING_UTC_ADR then
starting_utc <= wb_in.dat;
end if;
if reg_adr = c_ACAM_INPUTS_EN_ADR then
acam_inputs_en <= wb_in.dat;
end if;
if reg_adr = c_START_PHASE_ADR then
start_phase <= wb_in.dat;
end if;
if reg_adr = c_ONE_HZ_PHASE_ADR then
one_hz_phase <= wb_in.dat;
end if;
if reg_adr = c_IRQ_TSTAMP_THRESH_ADR then
irq_tstamp_threshold <= wb_in.dat;
end if;
if reg_adr = c_IRQ_TIME_THRESH_ADR then
irq_time_threshold <= wb_in.dat;
end if;
if reg_adr = c_DAC_WORD_ADR then
dac_word <= wb_in.dat(23 downto 0);
end if;
if reg_adr = c_WRABBIT_CTRL_ADR then
wrabbit_ctrl_reg <= wb_in.dat;
end if;
if reg_adr = c_DEACT_CHAN_ADR then
deactivate_chan <= wb_in.dat;
end if;
end if;
end if;
end process;
-- -- -- -- -- -- -- -- -- -- -- --
starting_utc_o <= starting_utc;
acam_inputs_en_o <= acam_inputs_en;
start_phase_o <= start_phase;
one_hz_phase_o <= one_hz_phase;
irq_tstamp_threshold_o <= irq_tstamp_threshold;
irq_time_threshold_o <= irq_time_threshold;
dac_word_o <= dac_word;
wrabbit_ctrl_reg_o <= wrabbit_ctrl_reg;
deactivate_chan_o <= deactivate_chan(4 downto 0);
---------------------------------------------------------------------------------------------------
-- Reception of TDC core Control Register --
---------------------------------------------------------------------------------------------------
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- TDCcore_ctrl_reg_reception: reception from the GN4124/VME interface of the control register that
-- defines the action to be taken by the TDC core.
-- Note that only one bit of the register should be written at a time. The process receives
-- the register, defines the action to be taken and after 1 clk cycle clears the register.
TDCcore_ctrl_reg_reception : process (clk_tdc_i)
begin
if rising_edge (clk_tdc_i) then
if rst_tdc_i = '1' then
ctrl_reg <= (others =>'0');
clear_ctrl_reg <= '0';
elsif clear_ctrl_reg = '1' then
ctrl_reg <= (others =>'0');
clear_ctrl_reg <= '0';
elsif wb_in.cyc = '1' and wb_in.stb = '1' and wb_in.we = '1' then
if reg_adr = c_CTRL_REG_ADR then
ctrl_reg <= wb_in.dat;
clear_ctrl_reg <= '1';
end if;
end if;
end if;
end process;
-- -- -- -- -- -- -- -- -- -- -- --
activate_acq_p_o <= ctrl_reg(0);
deactivate_acq_p_o <= ctrl_reg(1);
acam_wr_config_p_o <= ctrl_reg(2);
acam_rdbk_config_p_o <= ctrl_reg(3);
acam_rdbk_status_p_o <= ctrl_reg(4);
acam_rdbk_ififo1_p_o <= ctrl_reg(5);
acam_rdbk_ififo2_p_o <= ctrl_reg(6);
acam_rdbk_start01_p_o <= ctrl_reg(7);
acam_rst_p_o <= ctrl_reg(8);
load_utc_p_o <= ctrl_reg(9);
dacapo_c_rst_p_o <= ctrl_reg(10) or ctrl_reg(1); -- dacapo register reset when the acquisition is deactivated
send_dac_word_p <= ctrl_reg(11);
-- ctrl_reg bits 12 to 31 not used for the moment!
-- -- -- -- -- -- -- -- -- -- -- --
-- Pulse_stretcher: Increases the width of the send_dac_word_p pulse so that it can be sampled
-- by the 20 MHz clock of the clks_rsts_manager that is communicating with the DAC.
Pulse_stretcher: incr_counter
generic map
(width => 3)
port map
(clk_i => clk_tdc_i,
rst_i => send_dac_word_p,
counter_top_i => "111",
counter_incr_en_i => pulse_extender_en,
counter_is_full_o => open,
counter_o => pulse_extender_c);
-- -- -- -- -- -- -- -- -- -- -- --
pulse_extender_en <= '1' when pulse_extender_c < "111" else '0';
send_dac_word_p_o <= pulse_extender_en;
---------------------------------------------------------------------------------------------------
-- Delivery of ACAM and TDC core Readback Registers --
---------------------------------------------------------------------------------------------------
-- TDCcore_ctrl_reg_reception: Delivery to the GN4124/VME interface of all the readable registers,
-- including those of the ACAM and the TDC core.
-- Note: pipelining of the address for timing/slack reasons
WISHBONEreads : process (clk_tdc_i)
begin
if rising_edge (clk_tdc_i) then
reg_adr_pipe0 <= reg_adr;
dat_out_pipe0 <= dat_out_comb0;
dat_out_pipe1 <= dat_out_comb1;
dat_out_pipe2 <= dat_out_comb2;
dat_out_pipe3 <= dat_out_comb3;
wb_out.dat <= dat_out_pipe0 or dat_out_pipe1 or dat_out_pipe2 or dat_out_pipe3;
--end if;
end if;
end process;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
with reg_adr_pipe0 select dat_out_comb0 <=
-- regs written by the GN4124/VME interface
acam_config(0) when c_ACAM_REG0_ADR,
acam_config(1) when c_ACAM_REG1_ADR,
acam_config(2) when c_ACAM_REG2_ADR,
acam_config(3) when c_ACAM_REG3_ADR,
acam_config(4) when c_ACAM_REG4_ADR,
acam_config(5) when c_ACAM_REG5_ADR,
acam_config(6) when c_ACAM_REG6_ADR,
acam_config(7) when c_ACAM_REG7_ADR,
acam_config(8) when c_ACAM_REG11_ADR,
acam_config(9) when c_ACAM_REG12_ADR,
acam_config(10) when c_ACAM_REG14_ADR,
x"00000000" when others;
with reg_adr_pipe0 select dat_out_comb1 <=
-- regs read from the ACAM
acam_config_rdbk_i(0) when c_ACAM_REG0_RDBK_ADR,
acam_config_rdbk_i(1) when c_ACAM_REG1_RDBK_ADR,
acam_config_rdbk_i(2) when c_ACAM_REG2_RDBK_ADR,
acam_config_rdbk_i(3) when c_ACAM_REG3_RDBK_ADR,
acam_config_rdbk_i(4) when c_ACAM_REG4_RDBK_ADR,
acam_config_rdbk_i(5) when c_ACAM_REG5_RDBK_ADR,
acam_config_rdbk_i(6) when c_ACAM_REG6_RDBK_ADR,
acam_config_rdbk_i(7) when c_ACAM_REG7_RDBK_ADR,
acam_ififo1_i when c_ACAM_REG8_RDBK_ADR,
acam_ififo2_i when c_ACAM_REG9_RDBK_ADR,
x"00000000" when others;
with reg_adr_pipe0 select dat_out_comb2 <=
acam_start01_i when c_ACAM_REG10_RDBK_ADR,
acam_config_rdbk_i(8) when c_ACAM_REG11_RDBK_ADR,
acam_config_rdbk_i(9) when c_ACAM_REG12_RDBK_ADR,
acam_config_rdbk_i(10) when c_ACAM_REG14_RDBK_ADR,
-- regs written by the GN4124/VME interface
starting_utc when c_STARTING_UTC_ADR,
acam_inputs_en when c_ACAM_INPUTS_EN_ADR,
start_phase when c_START_PHASE_ADR,
one_hz_phase when c_ONE_HZ_PHASE_ADR,
irq_tstamp_threshold when c_IRQ_TSTAMP_THRESH_ADR,
irq_time_threshold when c_IRQ_TIME_THRESH_ADR,
x"00" & dac_word when c_DAC_WORD_ADR,
x"00000000" when others;
with reg_adr_pipe0 select dat_out_comb3 <=
-- regs written locally by the TDC core units
local_utc_i when c_LOCAL_UTC_ADR,
irq_code_i when c_IRQ_CODE_ADR,
wr_index_i when c_WR_INDEX_ADR,
core_status_i when c_CORE_STATUS_ADR,
-- White Rabbit regs
wrabbit_status_reg_i when c_WRABBIT_STATUS_ADR,
wrabbit_ctrl_reg when c_WRABBIT_CTRL_ADR,
deactivate_chan when c_DEACT_CHAN_ADR,
-- others
x"00000000" when others;
end architecture rtl;
--=================================================================================================
-- architecture end
--=================================================================================================
---------------------------------------------------------------------------------------------------
-- E N D O F F I L E
---------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- acam_test.vec
-------------------------------------------------------------------------------
-- Select the GN4124 Primary BFM
model 0
-- Initialize the BFM to its default state
init
-------------------------------------------------------------------------------
-- Initialize the Primary GN412x BFM model
-------------------------------------------------------------------------------
-- These address ranges will generate traffic from the BFM to the FPGA
-- bar BAR ADDR SIZE VC TC S
bar 0 0000000000000000 00100000 0 7 0
-- This allocates a RAM block inside the BFM for the FPGA to access
-- bfm_bar BAR ADDR SIZE
bfm_bar 0 0000000040000000 20000000
bfm_bar 1 0000000020000000 20000000
-- Drive reset to the FPGA
reset %d320
-- Wait until the FPGA is un-reset and ready for traffic on the local bus
wait %d50000
-- Drive reset to the FPGA
reset %d320
-- Wait until the FPGA is un-reset and ready for traffic on the local bus
wait %d60000
-------------------------------------------------------------------------------
-- Access the tdc core register space
-------------------------------------------------------------------------------
-- the following writes will go out in a single packet
-- Gonzalo: 3 writings outside of the BAR defined memory space to check that
-- the BFM model does not forward them to the Local bus
wr 0000000040000808 F 0001F04C
wait %d50
wr 0000000040000800 F 00021040
wait %d50
wr 0000000040000800 F 00025000
wait %d50
-- Gonzalo: 5 reads inside Matthieu's core memory space to check that the core
-- does not forward them to the wishbone bus
rd 0000000000000000 F 0000A0A1
wait %d20
rd 0000000000000004 F 0000A0A2
wait %d20
rd 0000000000000008 F 0000A0A3
wait %d20
rd 000000000000000C F 0000A0A4
wait %d20
rd 0000000000000010 F 0000A0A5
wait %d60
-- Gonzalo: actual wr and rd for test
wr 0000000000005000 F 0000FC81
wait %d50
wr 000000000000502C F 00FF0000
wait %d50
rd 0000000000080000 F 0000FC81
wait %d50
rd 000000000008002C F 00FF0000
wait %d50
wr 0000000000080030 F 04000000
wait %d50
rd 0000000000080030 F 04000000
wait %d50
......@@ -54,97 +54,126 @@ wait %d60000
-- Gonzalo: actual wr and rd on the application memory space for test
-- writing stuff on the TDC config
--wr 0000000000051000 F 00000040
--wr 0000000000005000 F 00000040
--wait %d20
--wr 0000000000051004 F 00000000
--wr 0000000000005004 F 00000000
--wait %d20
--wr 0000000000051008 F 00000000
--wr 0000000000005008 F 00000000
--wait %d60
-- writing stuff for the ACAM config
wr 0000000000051000 F 01F0FC81
wr 0000000000005000 F 01F0FC81
wait %d20
wr 0000000000051004 F 00000000
wr 0000000000005004 F 00000000
wait %d20
wr 0000000000051008 F 00000E02
wr 0000000000005008 F 00000E02
wait %d60
-- loading the utc time
wr 00000000000510FC F 00000200
wr 00000000000050FC F 00000200
wait %d200
-- loading the acam config
wr 000000000005100FC F 00000004
wr 00000000000050FC F 00000004
wait %d200
-- reading back the acam config
wr 00000000000510FC F 00000008
wr 00000000000050FC F 00000008
wait %d200
-- activate acquisition
wr 00000000000510FC F 00000001
wr 00000000000050FC F 00000001
wait %d540000
-- read circular buffer wr pointer
rd 00000000000510A8 F 00000000
rd 000000000000509C F 00000000
wait %d200
-- deactivate acquisition
wr 00000000000510FC F 00000002
wait %d200
-- read a timestamps from memory
rd 0000000000054000 F 00000000
wait %d100
rd 0000000000054004 F 00000000
wait %d100
rd 0000000000054008 F 00000000
-- prepare and launch DMA transfer
wr 000000000000000C F 36EF8000
wait %d20
wr 0000000000000014 F 00000210
wait %d100
rd 000000000005400C F 00000000
wr 0000000000000000 F 00000001
wait %d100
-- deactivate acquisition
wr 00000000000800FC F 00000002
wait %d200
-- read acam status
wr 00000000000510FC F 00000010
wr 00000000000800FC F 00000010
wait %d100
rd 0000000000051070 F 00000000
rd 0000000000080070 F 00000000
wait %d100
-- read acam ififo1
wr 00000000000510FC F 00000020
wr 00000000000800FC F 00000020
wait %d100
rd 0000000000051060 F 00000000
rd 0000000000080060 F 00000000
wait %d100
-- read acam ififo2
wr 00000000000510FC F 00000040
wr 00000000000800FC F 00000040
wait %d100
rd 0000000000051064 F 00000000
rd 0000000000080064 F 00000000
wait %d100
-- read acam start01 register
wr 00000000000510FC F 00000080
wr 00000000000800FC F 00000080
wait %d100
rd 0000000000051068 F 00000000
rd 0000000000080068 F 00000000
wait %d100
-- reset acam
wr 00000000000510FC F 00000100
wr 00000000000800FC F 00000100
wait %d200
--rd 0000000000051000 F 00001234
--rd 0000000000080000 F 00001234
--wait %d20
--rd 0000000000051004 F 00005678
--rd 0000000000080004 F 00005678
--wait %d20
--rd 0000000000051008 F 0000abcd
--rd 0000000000080008 F 0000abcd
--wait %d20
--rd 000000000005100C F 0000ef90
--rd 000000000008000C F 0000ef90
--wait %d60
--
--wr 00000000000510FC F 00000001
--wr 00000000000800FC F 00000001
--wait %d100
--wr 00000000000510FC F 00000002
--wr 00000000000800FC F 00000002
--wait %d100
---- Gonzalo: registers inside Matthieu's core memory space are written with the
---- settings for DMA transfer
--
---- Start address on the carrier local memory
--wr 0000000000000008 F 00000000
--wait %d20
--
---- Start addresses on the PCI host memory
--wr 000000000000000C F 0000A0A4
--wait %d20
--wr 0000000000000010 F 0000A0A5
--wait %d20
--
---- Transfer length
--wr 0000000000000014 F 00000060
--wait %d20
--
---- Chain control
--wr 0000000000000020 F 00000000
--wait %d60
--
---- Start transfer through the Control register and check through the status register
--wr 0000000000000000 F 00000001
--wait %d100
--rd 0000000000000004 F 00000001
--wait %d100
--
--
-------------------------------------------------------------------------------
-- acam_test.vec
-------------------------------------------------------------------------------
-- Select the GN4124 Primary BFM
model 0
-- Initialize the BFM to its default state
init
-------------------------------------------------------------------------------
-- Initialize the Primary GN412x BFM model
-------------------------------------------------------------------------------
-- These address ranges will generate traffic from the BFM to the FPGA
-- bar BAR ADDR SIZE VC TC S
bar 0 0000000000000000 00100000 0 7 0
-- This allocates a RAM block inside the BFM for the FPGA to access
-- bfm_bar BAR ADDR SIZE
bfm_bar 0 0000000040000000 20000000
bfm_bar 1 0000000020000000 20000000
-- Drive reset to the FPGA
reset %d320
-- Wait until the FPGA is un-reset and ready for traffic on the local bus
wait %d50000
-- Drive reset to the FPGA
reset %d320
-- Wait until the FPGA is un-reset and ready for traffic on the local bus
wait %d60000
-------------------------------------------------------------------------------
-- Access the tdc core register space
-------------------------------------------------------------------------------
-- the following writes will go out in a single packet
-- Gonzalo: 3 writings outside of the BAR defined memory space to check that
-- the BFM model does not forward them to the Local bus
wr 0000000040000808 F 0001F04C
wait %d20
wr 0000000040000800 F 00021040
wait %d20
wr 0000000040000800 F 00025000
wait %d60
-- Gonzalo: 3 reads inside Matthieu's core memory space to check that the core
-- does not forward them to the wishbone bus
rd 0000000000000000 F 0000A0A1
wait %d20
rd 0000000000000004 F 0000A0A2
wait %d20
rd 0000000000000008 F 0000A0A3
wait %d60
-- Gonzalo: actual wr and rd on the application memory space for test
wr 0000000000080000 F 00001234
wait %d20
wr 0000000000080004 F 00005678
wait %d20
wr 0000000000080008 F 0000abcd
wait %d20
wr 000000000008000C F 0000ef90
wait %d60
rd 0000000000080000 F 00001234
wait %d20
rd 0000000000080004 F 00005678
wait %d20
rd 0000000000080008 F 0000abcd
wait %d20
rd 000000000008000C F 0000ef90
wait %d60
wr 0000000000080100 F 00000001
wait %d100
wr 0000000000080100 F 00000002
wait %d100
-- Gonzalo: registers inside Matthieu's core memory space are written with the
-- settings for DMA transfer
-- Start address on the carrier local memory
wr 0000000000000008 F 00000000
wait %d20
-- Start addresses on the PCI host memory
wr 000000000000000C F 0000A0A4
wait %d20
wr 0000000000000010 F 0000A0A5
wait %d20
-- Transfer length
wr 0000000000000014 F 00000060
wait %d20
-- Chain control
wr 0000000000000020 F 00000000
wait %d60
-- Start transfer through the Control register and check through the status register
wr 0000000000000000 F 00000001
wait %d100
rd 0000000000000004 F 00000001
wait %d100
......@@ -16,208 +16,216 @@
<files>
<file xil_pn:name="../../ip_cores/gnum_core/p2l_dma_master.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="45"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="36"/>
<association xil_pn:name="Implementation" xil_pn:seqID="1"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/p2l_decode32.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="47"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="38"/>
<association xil_pn:name="Implementation" xil_pn:seqID="3"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/l2p_dma_master.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="49"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="40"/>
<association xil_pn:name="Implementation" xil_pn:seqID="5"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/l2p_arbiter.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="50"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="41"/>
<association xil_pn:name="Implementation" xil_pn:seqID="6"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/gn4124_core_pkg.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="12"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="6"/>
<association xil_pn:name="Implementation" xil_pn:seqID="9"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/dma_controller_wb_slave.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="35"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="17"/>
<association xil_pn:name="Implementation" xil_pn:seqID="10"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/dma_controller.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="51"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="42"/>
<association xil_pn:name="Implementation" xil_pn:seqID="11"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/wbmaster32.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="42"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="33"/>
<association xil_pn:name="Implementation" xil_pn:seqID="12"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/serdes_n_to_1_s2_se.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="32"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="14"/>
<association xil_pn:name="Implementation" xil_pn:seqID="13"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/serdes_n_to_1_s2_diff.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="33"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="15"/>
<association xil_pn:name="Implementation" xil_pn:seqID="14"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/serdes_1_to_n_data_s2_se.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="34"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="16"/>
<association xil_pn:name="Implementation" xil_pn:seqID="17"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/serdes_1_to_n_clk_pll_s2_diff.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="43"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="34"/>
<association xil_pn:name="Implementation" xil_pn:seqID="18"/>
</file>
<file xil_pn:name="../../top/spec/top_tdc.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="54"/>
<association xil_pn:name="Implementation" xil_pn:seqID="19"/>
</file>
<file xil_pn:name="../../top/spec/tdc_core_pkg.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="4"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="7"/>
<association xil_pn:name="Implementation" xil_pn:seqID="20"/>
</file>
<file xil_pn:name="../../rtl/reg_ctrl.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="16"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="22"/>
<association xil_pn:name="Implementation" xil_pn:seqID="22"/>
</file>
<file xil_pn:name="../../rtl/one_hz_gen.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="17"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="23"/>
<association xil_pn:name="Implementation" xil_pn:seqID="23"/>
</file>
<file xil_pn:name="../../rtl/data_formatting.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="20"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="26"/>
<association xil_pn:name="Implementation" xil_pn:seqID="24"/>
</file>
<file xil_pn:name="../../rtl/data_engine.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="21"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="27"/>
<association xil_pn:name="Implementation" xil_pn:seqID="25"/>
</file>
<file xil_pn:name="../../rtl/circular_buffer.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="22"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="28"/>
<association xil_pn:name="Implementation" xil_pn:seqID="27"/>
</file>
<file xil_pn:name="../../rtl/acam_timecontrol_interface.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="23"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="29"/>
<association xil_pn:name="Implementation" xil_pn:seqID="28"/>
</file>
<file xil_pn:name="../../rtl/acam_databus_interface.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="24"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="30"/>
<association xil_pn:name="Implementation" xil_pn:seqID="29"/>
</file>
<file xil_pn:name="../../rtl/incr_counter.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="5"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="9"/>
<association xil_pn:name="Implementation" xil_pn:seqID="30"/>
</file>
<file xil_pn:name="../../rtl/free_counter.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="6"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="10"/>
<association xil_pn:name="Implementation" xil_pn:seqID="31"/>
</file>
<file xil_pn:name="../../testbench/spec/gnum_model/cmd_router.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="64"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="57"/>
<association xil_pn:name="Implementation" xil_pn:seqID="34"/>
</file>
<file xil_pn:name="../../testbench/spec/gnum_model/util.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="14"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="8"/>
<association xil_pn:name="Implementation" xil_pn:seqID="35"/>
</file>
<file xil_pn:name="../../testbench/spec/gnum_model/mem_model.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="52"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="45"/>
<association xil_pn:name="Implementation" xil_pn:seqID="36"/>
</file>
<file xil_pn:name="../../testbench/spec/gnum_model/gn412x_bfm.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="63"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="56"/>
<association xil_pn:name="Implementation" xil_pn:seqID="37"/>
</file>
<file xil_pn:name="../../testbench/spec/gnum_model/cmd_router1.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="53"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="46"/>
<association xil_pn:name="Implementation" xil_pn:seqID="38"/>
</file>
<file xil_pn:name="../../testbench/spec/gnum_model/textutil.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="36"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="19"/>
<association xil_pn:name="Implementation" xil_pn:seqID="39"/>
</file>
<file xil_pn:name="../../testbench/spec/acam_data_model.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="55"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="48"/>
<association xil_pn:name="Implementation" xil_pn:seqID="40"/>
</file>
<file xil_pn:name="../../testbench/spec/tb_tdc.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="66"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="59"/>
<association xil_pn:name="Implementation" xil_pn:seqID="41"/>
</file>
<file xil_pn:name="../../testbench/spec/start_stop_gen.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="62"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="55"/>
<association xil_pn:name="Implementation" xil_pn:seqID="42"/>
</file>
<file xil_pn:name="../../testbench/spec/acam_timing_model.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="54"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="47"/>
<association xil_pn:name="Implementation" xil_pn:seqID="43"/>
</file>
<file xil_pn:name="../../testbench/spec/acam_model.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="65"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="58"/>
<association xil_pn:name="Implementation" xil_pn:seqID="44"/>
</file>
<file xil_pn:name="../../testbench/spec/acam_fifo_model.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="37"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="20"/>
<association xil_pn:name="Implementation" xil_pn:seqID="45"/>
</file>
<file xil_pn:name="../../ip_cores/mem_core/blk_mem_circ_buff_v6_4.xco" xil_pn:type="FILE_COREGEN">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="9"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="12"/>
<association xil_pn:name="Implementation" xil_pn:seqID="76"/>
</file>
<file xil_pn:name="../../ip_cores/mem_core/blk_mem_circ_buff_v6_4_flist.txt" xil_pn:type="FILE_USERDOC"/>
<file xil_pn:name="../../rtl/start_retrig_ctrl.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="15"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="21"/>
<association xil_pn:name="Implementation" xil_pn:seqID="52"/>
</file>
<file xil_pn:name="../../rtl/clks_rsts_manager.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="57"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="50"/>
<association xil_pn:name="Implementation" xil_pn:seqID="53"/>
</file>
<file xil_pn:name="../../rtl/decr_counter.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="7"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="11"/>
<association xil_pn:name="Implementation" xil_pn:seqID="54"/>
</file>
<file xil_pn:name="../../rtl/fmc_tdc_core.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="39"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="49"/>
<association xil_pn:name="Implementation" xil_pn:seqID="55"/>
</file>
<file xil_pn:name="../../rtl/irq_generator.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="19"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="25"/>
<association xil_pn:name="Implementation" xil_pn:seqID="59"/>
</file>
<file xil_pn:name="../../rtl/leds_manager.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="18"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="24"/>
<association xil_pn:name="Implementation" xil_pn:seqID="60"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/gn4124_core.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="60"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="53"/>
<association xil_pn:name="Implementation" xil_pn:seqID="67"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/l2p_ser.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="48"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="39"/>
<association xil_pn:name="Implementation" xil_pn:seqID="68"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/p2l_des.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="46"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="37"/>
<association xil_pn:name="Implementation" xil_pn:seqID="69"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/pulse_sync_rtl.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="44"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="35"/>
<association xil_pn:name="Implementation" xil_pn:seqID="70"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/xilinx_cores/generic_async_fifo_wrapper.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="31"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="13"/>
<association xil_pn:name="Implementation" xil_pn:seqID="71"/>
</file>
<file xil_pn:name="../../ip_cores/wishbone/wb_crossbar/xwb_sdb_crossbar.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="41"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="51"/>
<association xil_pn:name="Implementation" xil_pn:seqID="74"/>
</file>
<file xil_pn:name="../../ip_cores/wishbone/wb_crossbar/sdb_rom.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="29"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="32"/>
<association xil_pn:name="Implementation" xil_pn:seqID="75"/>
</file>
<file xil_pn:name="../../ip_cores/wishbone/wb_crossbar/xwb_crossbar.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="28"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="31"/>
<association xil_pn:name="Implementation" xil_pn:seqID="76"/>
</file>
<file xil_pn:name="../../ip_cores/wishbone/wishbone_pkg.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="2"/>
<association xil_pn:name="Implementation" xil_pn:seqID="85"/>
</file>
<file xil_pn:name="../../ip_cores/wishbone/carrier_csr.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="52"/>
<association xil_pn:name="Implementation" xil_pn:seqID="86"/>
</file>
<file xil_pn:name="../../ip_cores/wishbone/wb_slave_adapter/wb_slave_adapter.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="27"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="0"/>
<association xil_pn:name="Implementation" xil_pn:seqID="87"/>
</file>
<file xil_pn:name="../../ip_cores/genrams/genram_pkg.vhd" xil_pn:type="FILE_VHDL">
......@@ -229,72 +237,28 @@
<association xil_pn:name="Implementation" xil_pn:seqID="96"/>
</file>
<file xil_pn:name="../../ip_cores/common/gencores_pkg.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="13"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="43"/>
<association xil_pn:name="Implementation" xil_pn:seqID="99"/>
</file>
<file xil_pn:name="../../top/spec/wb_irq_controller/irq_controller_regs.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="18"/>
<association xil_pn:name="Implementation" xil_pn:seqID="115"/>
</file>
<file xil_pn:name="../../top/spec/wb_irq_controller/irq_controller.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="44"/>
<association xil_pn:name="Implementation" xil_pn:seqID="116"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/xilinx_cores/fifo_64x512.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="10"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="4"/>
<association xil_pn:name="Implementation" xil_pn:seqID="133"/>
</file>
<file xil_pn:name="../../ip_cores/gnum_core/xilinx_cores/fifo_32x512.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="11"/>
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="5"/>
<association xil_pn:name="Implementation" xil_pn:seqID="134"/>
</file>
<file xil_pn:name="../../ip_cores/mem_core/blk_mem_gen_v6_3_flist.txt" xil_pn:type="FILE_USERDOC"/>
<file xil_pn:name="../../ip_cores/mem_core/blk_mem_gen_v6_1_flist.txt" xil_pn:type="FILE_USERDOC"/>
<file xil_pn:name="../../ip_cores/mem_core/blk_mem_gen_v6_2_flist.txt" xil_pn:type="FILE_USERDOC"/>
<file xil_pn:name="../../top/spec/spec_top_fmc_tdc.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="61"/>
<association xil_pn:name="Implementation" xil_pn:seqID="76"/>
</file>
<file xil_pn:name="../../rtl/tdc_eic.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="38"/>
<association xil_pn:name="Implementation" xil_pn:seqID="77"/>
</file>
<file xil_pn:name="../../rtl/carrier_info.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="58"/>
<association xil_pn:name="Implementation" xil_pn:seqID="78"/>
</file>
<file xil_pn:name="../../rtl/fmc_tdc_mezzanine.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="56"/>
<association xil_pn:name="Implementation" xil_pn:seqID="79"/>
</file>
<file xil_pn:name="../../ip_cores/wishbone/wb_vic/xwb_vic.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="59"/>
<association xil_pn:name="Implementation" xil_pn:seqID="80"/>
</file>
<file xil_pn:name="../../ip_cores/wishbone/wb_vic/vic_prio_enc.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="26"/>
<association xil_pn:name="Implementation" xil_pn:seqID="81"/>
</file>
<file xil_pn:name="../../ip_cores/wishbone/wb_vic/wb_slave_vic.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="25"/>
<association xil_pn:name="Implementation" xil_pn:seqID="82"/>
</file>
<file xil_pn:name="../../ip_cores/wishbone/wb_vic/wb_vic.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="40"/>
<association xil_pn:name="Implementation" xil_pn:seqID="83"/>
</file>
<file xil_pn:name="../../ip_cores/wishbone/wbgen2/wbgen2_pkg.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="8"/>
<association xil_pn:name="Implementation" xil_pn:seqID="86"/>
</file>
<file xil_pn:name="../../ip_cores/wishbone/wbgen2/wbgen2_dpssram.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="0"/>
<association xil_pn:name="Implementation" xil_pn:seqID="87"/>
</file>
<file xil_pn:name="../../ip_cores/wishbone/wbgen2/wbgen2_eic.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="30"/>
<association xil_pn:name="Implementation" xil_pn:seqID="88"/>
</file>
<file xil_pn:name="../../ip_cores/wishbone/wbgen2/wbgen2_fifo_async.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="0"/>
<association xil_pn:name="Implementation" xil_pn:seqID="89"/>
</file>
<file xil_pn:name="../../ip_cores/wishbone/wbgen2/wbgen2_fifo_sync.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation" xil_pn:seqID="0"/>
<association xil_pn:name="Implementation" xil_pn:seqID="90"/>
</file>
<file xil_pn:name="../../ip_cores/mem_core/blk_mem_circ_buff_v6_4.xise" xil_pn:type="FILE_COREGENISE">
<association xil_pn:name="Implementation" xil_pn:seqID="77"/>
</file>
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -26,7 +26,7 @@ end tb_tdc;
architecture behavioral of tb_tdc is
component spec_top_fmc_tdc
component top_tdc
generic(
g_span : integer :=32;
g_width : integer :=32;
......@@ -34,8 +34,7 @@ architecture behavioral of tb_tdc is
);
port(
-- interface with GNUM circuit
rst_n_a_i : in std_logic;
spec_clk_i : in std_logic;
rst_n_a_i : in std_logic;
-- P2L Direction
p2l_clk_p_i : in std_logic; -- Receiver Source Synchronous Clock+
p2l_clk_n_i : in std_logic; -- Receiver Source Synchronous Clock-
......@@ -61,7 +60,7 @@ architecture behavioral of tb_tdc is
irq_p_o : out std_logic; -- Interrupt request pulse to GN4124 GPIO
-- interface signals with PLL circuit
acam_refclk_p_i : in std_logic;
acam_refclk_p_i : in std_logic;
acam_refclk_n_i : in std_logic;
--pll_ld_i : in std_logic;
--pll_refmon_i : in std_logic;
......@@ -72,8 +71,8 @@ architecture behavioral of tb_tdc is
pll_dac_sync_o : out std_logic;
pll_sdi_o : out std_logic;
pll_sclk_o : out std_logic;
tdc_clk_125m_p_i : in std_logic;
tdc_clk_125m_n_i : in std_logic;
tdc_clk_p_i : in std_logic;
tdc_clk_n_i : in std_logic;
-- interface signals with acam (timing)
err_flag_i : in std_logic;
......@@ -113,11 +112,23 @@ architecture behavioral of tb_tdc is
tdc_led_trig5_o : out std_logic;
carrier_one_wire_b : inout std_logic;
mezz_sys_scl_b : inout std_logic;
mezz_sys_sda_b : inout std_logic;
sys_scl_b : inout std_logic;
sys_sda_b : inout std_logic;
mezz_one_wire_b : inout std_logic;
pcb_ver_i : in std_logic_vector(3 downto 0);
prsnt_m2c_n_i : in std_logic);
prsnt_m2c_n_i : in std_logic;
-- other signals on the spec card
spec_aux0_i : in std_logic;
spec_aux1_i : in std_logic;
spec_aux2_o : out std_logic;
spec_aux3_o : out std_logic;
spec_aux4_o : out std_logic;
spec_aux5_o : out std_logic;
spec_led_green_o : out std_logic;
spec_led_red_o : out std_logic;
spec_clk_i : in std_logic
);
end component;
component acam_model
......@@ -284,7 +295,7 @@ constant start_retrig_period : time:= 512 ns;
-- Maximum width of a command string
constant STRING_MAX : integer := 256;
signal acam_refclk_i : std_logic:='0';
signal acam_refclk_i : std_logic:='0';
signal acam_refclk_n_i : std_logic:='1';
signal tdc_clk_p_i : std_logic:='0';
signal tdc_clk_n_i : std_logic:='1';
......@@ -387,7 +398,7 @@ signal spare : std_logic;
begin
dut: spec_top_fmc_tdc
dut: top_tdc
generic map(
g_span => 32,
g_width => 32,
......@@ -395,8 +406,7 @@ begin
)
port map(
-- interface with GNUM circuit
rst_n_a_i => rst_n,
spec_clk_i => spec_clk_i,
rst_n_a_i => rst_n,
p2l_clk_p_i => p2l_clkp,
p2l_clk_n_i => p2l_clkn,
p2l_data_i => p2l_data,
......@@ -420,7 +430,7 @@ begin
irq_p_o => irq_p,
-- interface with PLL circuit
acam_refclk_p_i => acam_refclk_i,
acam_refclk_p_i => acam_refclk_i,
acam_refclk_n_i => acam_refclk_n_i,
--pll_ld_i => pll_ld_i,
--pll_refmon_i => pll_refmon_i,
......@@ -431,8 +441,8 @@ begin
pll_dac_sync_o => pll_dac_sync_o,
pll_sdi_o => pll_sdi_o,
pll_sclk_o => pll_sclk_o,
tdc_clk_125m_p_i => tdc_clk_p_i,
tdc_clk_125m_n_i => tdc_clk_n_i,
tdc_clk_p_i => tdc_clk_p_i,
tdc_clk_n_i => tdc_clk_n_i,
-- interface signals with acam (timing)
int_flag_i => int_flag_i,
......@@ -473,11 +483,21 @@ begin
-- other signals on the spec card
carrier_one_wire_b => open,
mezz_sys_scl_b => open,
mezz_sys_sda_b => open,
sys_scl_b => open,
sys_sda_b => open,
mezz_one_wire_b => open,
pcb_ver_i => (others => '0'),
prsnt_m2c_n_i => '1');
prsnt_m2c_n_i => '0',
spec_aux0_i => spec_aux0_i,
spec_aux1_i => spec_aux1_i,
spec_aux2_o => spec_aux2_o,
spec_aux3_o => spec_aux3_o,
spec_aux4_o => spec_aux4_o,
spec_aux5_o => spec_aux5_o,
spec_led_green_o => spec_led_green,
spec_led_red_o => spec_led_red,
spec_clk_i => spec_clk_i
);
acam: acam_model
generic map(
......@@ -645,8 +665,8 @@ begin
end if;
wait for pll_clk_period*2;
end process;
acam_refclk_n_i <= not acam_refclk_i;
acam_refclk_n_i <= not acam_refclk_i;
spec_clock: process
begin
......
files = ["fmc_tdc_wrapper.vhd",
"tdc_core_pkg.vhd",
"fmc_tdc_direct_readout.vhd",
"fmc_tdc_direct_readout_slave.vhd",
"fmc_tdc_direct_readout_slave_pkg.vhd"
];
modules = {"local" : [ "../../platform/xilinx" ] }
#!/bin/bash
wbgen2 -D 1.html -V fmc_tdc_direct_readout_slave.vhd -H record -p fmc_tdc_direct_readout_slave_pkg.vhd -K regs.vh -s defines -C fmctdc-direct.h fmc_tdc_direct_readout_slave.wb
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.gencores_pkg.all;
use work.tdc_core_pkg.all;
use work.wishbone_pkg.all;
use work.dr_wbgen2_pkg.all;
entity fmc_tdc_direct_readout is
port
(
clk_tdc_i : in std_logic;
rst_tdc_n_i : in std_logic;
clk_sys_i : in std_logic;
rst_sys_n_i : in std_logic;
direct_timestamp_i : in std_logic_vector(127 downto 0);
direct_timestamp_wr_i : in std_logic;
direct_slave_i : in t_wishbone_slave_in;
direct_slave_o : out t_wishbone_slave_out
);
end entity;
architecture rtl of fmc_tdc_direct_readout is
component fmc_tdc_direct_readout_wb_slave is
port (
rst_n_i : in std_logic;
clk_sys_i : in std_logic;
wb_adr_i : in std_logic_vector(2 downto 0);
wb_dat_i : in std_logic_vector(31 downto 0);
wb_dat_o : out std_logic_vector(31 downto 0);
wb_cyc_i : in std_logic;
wb_sel_i : in std_logic_vector(3 downto 0);
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_ack_o : out std_logic;
wb_stall_o : out std_logic;
clk_tdc_i : in std_logic;
regs_i : in t_dr_in_registers;
regs_o : out t_dr_out_registers);
end component fmc_tdc_direct_readout_wb_slave;
constant c_num_channels : integer := 5;
type t_channel_state is record
enable : std_logic;
timeout : unsigned(23 downto 0);
fifo_wr : std_logic;
end record;
type t_channel_state_array is array(0 to c_num_channels-1) of t_channel_state;
signal c : t_channel_state_array;
signal regs_out : t_dr_out_registers;
signal regs_in : t_dr_in_registers;
signal ts_cycles : std_logic_vector(31 downto 0);
signal ts_seconds : std_logic_vector(31 downto 0);
signal ts_bins : std_logic_vector(17 downto 0);
signal ts_edge : std_logic;
signal ts_channel : std_logic_vector(2 downto 0);
signal direct_slave_out: t_wishbone_slave_out;
begin
ts_channel <= direct_timestamp_i(98 downto 96);
ts_edge <= direct_timestamp_i(100);
ts_seconds <= direct_timestamp_i(95 downto 64);
ts_cycles <= direct_timestamp_i(63 downto 32);
ts_bins <= direct_timestamp_i(17 downto 0);
U_WB_Slave : fmc_tdc_direct_readout_wb_slave
port map (
rst_n_i => rst_sys_n_i,
clk_sys_i => clk_sys_i,
wb_adr_i => direct_slave_i.adr(4 downto 2),
wb_dat_i => direct_slave_i.dat,
wb_dat_o => direct_slave_out.dat,
wb_cyc_i => direct_slave_i.cyc,
wb_sel_i => direct_slave_i.sel,
wb_stb_i => direct_slave_i.stb,
wb_we_i => direct_slave_i.we,
wb_ack_o => direct_slave_out.ack,
wb_stall_o => direct_slave_out.stall,
clk_tdc_i => clk_tdc_i,
regs_i => regs_in,
regs_o => regs_out);
direct_slave_out.err <= '0';
direct_slave_out.rty <= '0';
direct_slave_o <= direct_slave_out;
regs_in.fifo_cycles_i <= ts_cycles;
regs_in.fifo_edge_i <= '1';
regs_in.fifo_seconds_i <= ts_seconds;
regs_in.fifo_channel_i <= '0'&ts_channel;
regs_in.fifo_bins_i <= ts_bins;
gen_channels : for i in 0 to c_num_channels-1 generate
p_dead_time : process (clk_tdc_i)
begin
if rising_edge(clk_tdc_i) then
if rst_tdc_n_i = '0' then
c(i).timeout <= (others => '0');
c(i).enable <= '0';
c(i).fifo_wr <= '0';
else
c(i).enable <= regs_out.chan_enable_o(i);
if c(i).enable = '1' then
if direct_timestamp_wr_i = '1' and unsigned(ts_channel) = i and ts_edge = '1' and c(i).timeout = 0 then
c(i).timeout <= unsigned(regs_out.dead_time_o);
c(i).fifo_wr <= '1';
elsif c(i).timeout /= 0 then
c(i).fifo_wr <= '0';
c(i).timeout <= c(i).timeout - 1;
end if;
else
c(i).fifo_wr <= '0';
c(i).timeout <= (others => '0');
end if;
end if;
end if;
end process;
end generate gen_channels;
p_fifo_write : process(clk_tdc_i)
begin
if rising_edge(clk_tdc_i) then
if rst_tdc_n_i = '0' then
regs_in.fifo_wr_req_i <= '0';
else
regs_in.fifo_wr_req_i <= '0';
for i in 0 to c_num_channels-1 loop
if(c(i).fifo_wr = '1' and regs_out.fifo_wr_full_o = '0') then
regs_in.fifo_wr_req_i <= '1';
end if;
end loop;
end if;
end if;
end process;
end rtl;
---------------------------------------------------------------------------------------
-- Title : Wishbone slave core for TDC Direct Readout WB Slave
---------------------------------------------------------------------------------------
-- File : fmc_tdc_direct_readout_slave.vhd
-- Author : auto-generated by wbgen2 from fmc_tdc_direct_readout_slave.wb
-- Created : Thu May 22 14:05:35 2014
-- Standard : VHDL'87
---------------------------------------------------------------------------------------
-- THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE fmc_tdc_direct_readout_slave.wb
-- DO NOT HAND-EDIT UNLESS IT'S ABSOLUTELY NECESSARY!
---------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.wbgen2_pkg.all;
use work.dr_wbgen2_pkg.all;
entity fmc_tdc_direct_readout_wb_slave is
port (
rst_n_i : in std_logic;
clk_sys_i : in std_logic;
wb_adr_i : in std_logic_vector(2 downto 0);
wb_dat_i : in std_logic_vector(31 downto 0);
wb_dat_o : out std_logic_vector(31 downto 0);
wb_cyc_i : in std_logic;
wb_sel_i : in std_logic_vector(3 downto 0);
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_ack_o : out std_logic;
wb_stall_o : out std_logic;
clk_tdc_i : in std_logic;
regs_i : in t_dr_in_registers;
regs_o : out t_dr_out_registers
);
end fmc_tdc_direct_readout_wb_slave;
architecture syn of fmc_tdc_direct_readout_wb_slave is
signal dr_fifo_rst_n : std_logic ;
signal dr_fifo_in_int : std_logic_vector(86 downto 0);
signal dr_fifo_out_int : std_logic_vector(86 downto 0);
signal dr_fifo_rdreq_int : std_logic ;
signal dr_fifo_rdreq_int_d0 : std_logic ;
signal dr_chan_enable_int : std_logic_vector(4 downto 0);
signal dr_dead_time_int : std_logic_vector(23 downto 0);
signal dr_fifo_full_int : std_logic ;
signal dr_fifo_empty_int : std_logic ;
signal dr_fifo_usedw_int : std_logic_vector(7 downto 0);
signal ack_sreg : std_logic_vector(9 downto 0);
signal rddata_reg : std_logic_vector(31 downto 0);
signal wrdata_reg : std_logic_vector(31 downto 0);
signal bwsel_reg : std_logic_vector(3 downto 0);
signal rwaddr_reg : std_logic_vector(2 downto 0);
signal ack_in_progress : std_logic ;
signal wr_int : std_logic ;
signal rd_int : std_logic ;
signal allones : std_logic_vector(31 downto 0);
signal allzeros : std_logic_vector(31 downto 0);
begin
-- Some internal signals assignments. For (foreseen) compatibility with other bus standards.
wrdata_reg <= wb_dat_i;
bwsel_reg <= wb_sel_i;
rd_int <= wb_cyc_i and (wb_stb_i and (not wb_we_i));
wr_int <= wb_cyc_i and (wb_stb_i and wb_we_i);
allones <= (others => '1');
allzeros <= (others => '0');
--
-- Main register bank access process.
process (clk_sys_i, rst_n_i)
begin
if (rst_n_i = '0') then
ack_sreg <= "0000000000";
ack_in_progress <= '0';
rddata_reg <= "00000000000000000000000000000000";
dr_chan_enable_int <= "00000";
dr_dead_time_int <= "000000000000000000000000";
dr_fifo_rdreq_int <= '0';
elsif rising_edge(clk_sys_i) then
-- advance the ACK generator shift register
ack_sreg(8 downto 0) <= ack_sreg(9 downto 1);
ack_sreg(9) <= '0';
if (ack_in_progress = '1') then
if (ack_sreg(0) = '1') then
ack_in_progress <= '0';
else
end if;
else
if ((wb_cyc_i = '1') and (wb_stb_i = '1')) then
case rwaddr_reg(2 downto 0) is
when "000" =>
if (wb_we_i = '1') then
dr_chan_enable_int <= wrdata_reg(4 downto 0);
end if;
rddata_reg(4 downto 0) <= dr_chan_enable_int;
rddata_reg(5) <= 'X';
rddata_reg(6) <= 'X';
rddata_reg(7) <= 'X';
rddata_reg(8) <= 'X';
rddata_reg(9) <= 'X';
rddata_reg(10) <= 'X';
rddata_reg(11) <= 'X';
rddata_reg(12) <= 'X';
rddata_reg(13) <= 'X';
rddata_reg(14) <= 'X';
rddata_reg(15) <= 'X';
rddata_reg(16) <= 'X';
rddata_reg(17) <= 'X';
rddata_reg(18) <= 'X';
rddata_reg(19) <= 'X';
rddata_reg(20) <= 'X';
rddata_reg(21) <= 'X';
rddata_reg(22) <= 'X';
rddata_reg(23) <= 'X';
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when "001" =>
if (wb_we_i = '1') then
dr_dead_time_int <= wrdata_reg(23 downto 0);
end if;
rddata_reg(23 downto 0) <= dr_dead_time_int;
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when "010" =>
if (wb_we_i = '1') then
end if;
if (dr_fifo_rdreq_int_d0 = '0') then
dr_fifo_rdreq_int <= not dr_fifo_rdreq_int;
else
rddata_reg(31 downto 0) <= dr_fifo_out_int(31 downto 0);
ack_in_progress <= '1';
ack_sreg(0) <= '1';
end if;
when "011" =>
if (wb_we_i = '1') then
end if;
rddata_reg(31 downto 0) <= dr_fifo_out_int(63 downto 32);
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when "100" =>
if (wb_we_i = '1') then
end if;
rddata_reg(17 downto 0) <= dr_fifo_out_int(81 downto 64);
rddata_reg(18) <= dr_fifo_out_int(82);
rddata_reg(22 downto 19) <= dr_fifo_out_int(86 downto 83);
rddata_reg(23) <= 'X';
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when "101" =>
if (wb_we_i = '1') then
end if;
rddata_reg(16) <= dr_fifo_full_int;
rddata_reg(17) <= dr_fifo_empty_int;
rddata_reg(7 downto 0) <= dr_fifo_usedw_int;
rddata_reg(8) <= 'X';
rddata_reg(9) <= 'X';
rddata_reg(10) <= 'X';
rddata_reg(11) <= 'X';
rddata_reg(12) <= 'X';
rddata_reg(13) <= 'X';
rddata_reg(14) <= 'X';
rddata_reg(15) <= 'X';
rddata_reg(18) <= 'X';
rddata_reg(19) <= 'X';
rddata_reg(20) <= 'X';
rddata_reg(21) <= 'X';
rddata_reg(22) <= 'X';
rddata_reg(23) <= 'X';
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when others =>
-- prevent the slave from hanging the bus on invalid address
ack_in_progress <= '1';
ack_sreg(0) <= '1';
end case;
end if;
end if;
end if;
end process;
-- Drive the data output bus
wb_dat_o <= rddata_reg;
-- extra code for reg/fifo/mem: Readout FIFO
dr_fifo_in_int(31 downto 0) <= regs_i.fifo_seconds_i;
dr_fifo_in_int(63 downto 32) <= regs_i.fifo_cycles_i;
dr_fifo_in_int(81 downto 64) <= regs_i.fifo_bins_i;
dr_fifo_in_int(82) <= regs_i.fifo_edge_i;
dr_fifo_in_int(86 downto 83) <= regs_i.fifo_channel_i;
dr_fifo_rst_n <= rst_n_i;
dr_fifo_INST : wbgen2_fifo_async
generic map (
g_size => 256,
g_width => 87,
g_usedw_size => 8
)
port map (
wr_req_i => regs_i.fifo_wr_req_i,
wr_full_o => regs_o.fifo_wr_full_o,
wr_empty_o => regs_o.fifo_wr_empty_o,
wr_usedw_o => regs_o.fifo_wr_usedw_o,
rd_full_o => dr_fifo_full_int,
rd_empty_o => dr_fifo_empty_int,
rd_usedw_o => dr_fifo_usedw_int,
rd_req_i => dr_fifo_rdreq_int,
rst_n_i => dr_fifo_rst_n,
wr_clk_i => clk_tdc_i,
rd_clk_i => clk_sys_i,
wr_data_i => dr_fifo_in_int,
rd_data_o => dr_fifo_out_int
);
-- Channel enable
regs_o.chan_enable_o <= dr_chan_enable_int;
-- Dead time (8ns ticks)
regs_o.dead_time_o <= dr_dead_time_int;
-- extra code for reg/fifo/mem: FIFO 'Readout FIFO' data output register 0
process (clk_sys_i, rst_n_i)
begin
if (rst_n_i = '0') then
dr_fifo_rdreq_int_d0 <= '0';
elsif rising_edge(clk_sys_i) then
dr_fifo_rdreq_int_d0 <= dr_fifo_rdreq_int;
end if;
end process;
-- extra code for reg/fifo/mem: FIFO 'Readout FIFO' data output register 1
-- extra code for reg/fifo/mem: FIFO 'Readout FIFO' data output register 2
rwaddr_reg <= wb_adr_i;
wb_stall_o <= (not ack_sreg(0)) and (wb_stb_i and wb_cyc_i);
-- ACK signal generation. Just pass the LSB of ACK counter.
wb_ack_o <= ack_sreg(0);
end syn;
peripheral
{
name = "TDC Direct Readout WB Slave";
hdl_entity = "fmc_tdc_direct_readout_wb_slave";
prefix = "dr";
fifo_reg {
name = "Readout FIFO";
prefix = "FIFO";
direction = CORE_TO_BUS;
size = 256;
flags_bus = {FIFO_EMPTY, FIFO_FULL, FIFO_COUNT, FIFO_RESET};
flags_dev = {FIFO_EMPTY, FIFO_FULL, FIFO_COUNT, FIFO_RESET};
clock = "clk_tdc_i";
field {
name = "Seconds";
prefix = "SECONDS";
type = SLV;
size = 32;
};
field {
name = "Cycles";
prefix = "CYCLES";
type = SLV;
size = 32;
};
field {
name = "Bins";
prefix = "BINS";
type = SLV;
size = 18;
};
field {
name = "Edge";
prefix = "EDGE";
type = BIT;
};
field {
name = "Channel";
prefix = "CHANNEL";
type = SLV;
size = 4;
};
};
reg {
name = "Channel Enable Register";
prefix = "CHAN_ENABLE";
clock = "clk_tdc_i";
field {
name = "Channel enable";
size = 5;
type = SLV;
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
};
reg {
name = "Dead Time Register";
prefix = "DEAD_TIME";
clock = "clk_tdc_i";
field {
name = "Dead time (8ns ticks)";
size = 24;
type = SLV;
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
};
};
\ No newline at end of file
---------------------------------------------------------------------------------------
-- Title : Wishbone slave core for TDC Direct Readout WB Slave
---------------------------------------------------------------------------------------
-- File : fmc_tdc_direct_readout_slave_pkg.vhd
-- Author : auto-generated by wbgen2 from fmc_tdc_direct_readout_slave.wb
-- Created : Thu May 22 14:05:35 2014
-- Standard : VHDL'87
---------------------------------------------------------------------------------------
-- THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE fmc_tdc_direct_readout_slave.wb
-- DO NOT HAND-EDIT UNLESS IT'S ABSOLUTELY NECESSARY!
---------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.wbgen2_pkg.all;
package dr_wbgen2_pkg is
-- Input registers (user design -> WB slave)
type t_dr_in_registers is record
fifo_wr_req_i : std_logic;
fifo_seconds_i : std_logic_vector(31 downto 0);
fifo_cycles_i : std_logic_vector(31 downto 0);
fifo_bins_i : std_logic_vector(17 downto 0);
fifo_edge_i : std_logic;
fifo_channel_i : std_logic_vector(3 downto 0);
end record;
constant c_dr_in_registers_init_value: t_dr_in_registers := (
fifo_wr_req_i => '0',
fifo_seconds_i => (others => '0'),
fifo_cycles_i => (others => '0'),
fifo_bins_i => (others => '0'),
fifo_edge_i => '0',
fifo_channel_i => (others => '0')
);
-- Output registers (WB slave -> user design)
type t_dr_out_registers is record
fifo_wr_full_o : std_logic;
fifo_wr_empty_o : std_logic;
fifo_wr_usedw_o : std_logic_vector(7 downto 0);
chan_enable_o : std_logic_vector(4 downto 0);
dead_time_o : std_logic_vector(23 downto 0);
end record;
constant c_dr_out_registers_init_value: t_dr_out_registers := (
fifo_wr_full_o => '0',
fifo_wr_empty_o => '0',
fifo_wr_usedw_o => (others => '0'),
chan_enable_o => (others => '0'),
dead_time_o => (others => '0')
);
function "or" (left, right: t_dr_in_registers) return t_dr_in_registers;
function f_x_to_zero (x:std_logic) return std_logic;
function f_x_to_zero (x:std_logic_vector) return std_logic_vector;
end package;
package body dr_wbgen2_pkg is
function f_x_to_zero (x:std_logic) return std_logic is
begin
if x = '1' then
return '1';
else
return '0';
end if;
end function;
function f_x_to_zero (x:std_logic_vector) return std_logic_vector is
variable tmp: std_logic_vector(x'length-1 downto 0);
begin
for i in 0 to x'length-1 loop
if(x(i) = 'X' or x(i) = 'U') then
tmp(i):= '0';
else
tmp(i):=x(i);
end if;
end loop;
return tmp;
end function;
function "or" (left, right: t_dr_in_registers) return t_dr_in_registers is
variable tmp: t_dr_in_registers;
begin
tmp.fifo_wr_req_i := f_x_to_zero(left.fifo_wr_req_i) or f_x_to_zero(right.fifo_wr_req_i);
tmp.fifo_seconds_i := f_x_to_zero(left.fifo_seconds_i) or f_x_to_zero(right.fifo_seconds_i);
tmp.fifo_cycles_i := f_x_to_zero(left.fifo_cycles_i) or f_x_to_zero(right.fifo_cycles_i);
tmp.fifo_bins_i := f_x_to_zero(left.fifo_bins_i) or f_x_to_zero(right.fifo_bins_i);
tmp.fifo_edge_i := f_x_to_zero(left.fifo_edge_i) or f_x_to_zero(right.fifo_edge_i);
tmp.fifo_channel_i := f_x_to_zero(left.fifo_channel_i) or f_x_to_zero(right.fifo_channel_i);
return tmp;
end function;
end package body;
--_________________________________________________________________________________________________
-- |
-- |SPEC TDC| |
-- |
-- CERN,BE/CO-HT |
--________________________________________________________________________________________________|
---------------------------------------------------------------------------------------------------
-- |
-- spec_top_fmc_tdc |
-- |
---------------------------------------------------------------------------------------------------
-- File spec_top_fmc_tdc.vhd |
-- |
-- Description TDC top level for a SPEC carrier. Figure 1 shows the architecture of the unit. |
-- |
-- For the communication with the PCIe, the ohwr.org GN4124 core is instantiated. |
-- |
-- The TDC mezzanine core is instantiated for the communication with the TDC board. |
-- The VIC core is forwarding the interrupts coming from the TDC mezzanine core to |
-- the GN4124 core. |
-- The carrier_info module provides general information on the SPEC PCB version, PLLs |
-- locking state etc. |
-- The 1-Wire core provides communication with the SPEC Thermometer&UniqueID chip. |
-- All the cores communicate with the GN4124 core through the SDB crossbar. The SDB |
-- crossbar is responsible for managing the acess to the GN4124 core. |
-- |
-- The speed of all the cores (TDC mezzanine, VIC, carrier csr, 1-Wire as well as |
-- the GN4124 core) is 125MHz. |
-- |
-- The 125MHz clock comes from the PLL located on the TDC mezzanine board. |
-- The clks_rsts_manager unit is responsible for automatically configuring the PLL |
-- upon the FPGA startup or after a PCIe reset, using the 20MHz VCXO on the SPEC |
-- carrier board. The clks_rsts_manager is keeping all the rest of the logic under |
-- reset until the PLL gets locked. |
-- |
-- __________________________________________________________________ |
-- ________ | ___ _____ | |
-- | | | ___________________ | | | | | |
-- | PLL |<->| | clks rsts manager | | | | | | |
-- | DAC | | |___________________| | | | | | |
-- | | | ____________________________ | | | | | |
-- | | | | | \ | | | | | |
-- | ACAM |<->| | TDC mezzanine | \ | | | | | |
-- |________| | |--|____________________________| \ | | | G | | |
-- TDC mezz | | \ | | | | | |
-- | | ____________________________ | S | | N | | |
-- | |->| | | | | | | |
-- | | Vector Interrupt Controller| ---- | D | <--> | 4 | | |
-- | |____________________________| | | | | | |
-- | | B | | 1 | | |
-- | ____________________________ | | | | | |
-- | | | | | | 2 | | |
-- SPEC 1Wire <->| | 1-Wire | ---- | | | | | |
-- | |____________________________| | | | 4 | | |
-- | / | | | | | |
-- | ____________________________ / | | | | | |
-- | | | / | | | | | |
-- | | carrier_info | / | | | | | |
-- | |____________________________| | | | | | |
-- | |___| |_____| | |
-- | | |
-- | ______________________________________________ | |
-- SPEC LEDs <->| |___________________LEDs_______________________| | |
-- | | |
-- |__________________________________________________________________| |
-- |
-- |
-- Authors Gonzalo Penacoba (Gonzalo.Penacoba@cern.ch) |
-- Evangelia Gousiou (Evangelia.Gousiou@cern.ch) |
-- Date 01/2014 |
-- Version v5 (see sdb_meta_pkg) |
-- Depends on |
--
---------------- |
-- Last changes |
-- 05/2011 v1 GP First version |
-- 06/2012 v2 EG Revamping; Comments added, signals renamed |
-- removed LEDs from top level |
-- new GN4124 core integrated |
-- carrier 1 wire master added |
-- mezzanine I2C master added |
-- mezzanine 1 wire master added |
-- interrupts generator added |
-- changed generation of rst_125m_mezz |
-- DAC reconfiguration+needed regs added |
-- 06/2012 v3 EG Changes for v2 of TDC mezzanine |
-- Several pinout changes, |
-- acam_ref_clk LVDS instead of CMOS, |
-- no PLL_LD only PLL_STATUS |
-- 04/2013 v4 EG added SDB; fixed bugs in data_formatting; added carrier CSR information |
-- 01/2014 v5 EG added VIC and EIC in the TDC mezzanine |
-- |
----------------------------------------------/!\-------------------------------------------------|
-- Note for eva: Remember the design is synthesised with Synplify Premier with DP (tdc_syn.prj) |
-- For PAR use the tdc_par_script.tcl commands in Xilinx ISE! |
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE |
-- ------------------------------------ |
-- This source file is free software; you can redistribute it and/or modify it under the terms of |
-- the GNU Lesser General Public License as published by the Free Software Foundation; either |
-- version 2.1 of the License, or (at your option) any later version. |
-- This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
-- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
-- See the GNU Lesser General Public License for more details. |
-- You should have received a copy of the GNU Lesser General Public License along with this |
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html |
---------------------------------------------------------------------------------------------------
--=================================================================================================
-- Libraries & Packages
--=================================================================================================
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use work.tdc_core_pkg.all;
use work.gencores_pkg.all;
use work.wishbone_pkg.all;
library UNISIM;
use UNISIM.vcomponents.all;
--=================================================================================================
-- Entity declaration for spec_top_fmc_tdc
--=================================================================================================
entity fmc_tdc_wrapper is
generic
(g_simulation : boolean := false); -- this generic is set to TRUE
-- when instantiated in a test-bench
port
(
clk_sys_i : in std_logic;
rst_sys_n_i : in std_logic;
rst_n_a_i : in std_logic;
-- Interface with the PLL AD9516 and DAC AD5662 on TDC mezzanine
pll_sclk_o : out std_logic; -- SPI clock
pll_sdi_o : out std_logic; -- data line for PLL and DAC
pll_cs_o : out std_logic; -- PLL chip select
pll_dac_sync_o : out std_logic; -- DAC chip select
pll_sdo_i : in std_logic; -- not used for the moment
pll_status_i : in std_logic; -- PLL Digital Lock Detect, active high
tdc_clk_125m_p_i : in std_logic; -- 125 MHz differential clock: system clock
tdc_clk_125m_n_i : in std_logic; -- 125 MHz differential clock: system clock
acam_refclk_p_i : in std_logic; -- 31.25 MHz differential clock: ACAM ref clock
acam_refclk_n_i : in std_logic; -- 31.25 MHz differential clock: ACAM ref clock
-- Timing interface with the ACAM on TDC mezzanine
start_from_fpga_o : out std_logic; -- start signal
err_flag_i : in std_logic; -- error flag
int_flag_i : in std_logic; -- interrupt flag
start_dis_o : out std_logic; -- start disable, not used
stop_dis_o : out std_logic; -- stop disable, not used
-- Data interface with the ACAM on TDC mezzanine
data_bus_io : inout std_logic_vector(27 downto 0);
address_o : out std_logic_vector(3 downto 0);
cs_n_o : out std_logic; -- chip select for ACAM
oe_n_o : out std_logic; -- output enable for ACAM
rd_n_o : out std_logic; -- read signal for ACAM
wr_n_o : out std_logic; -- write signal for ACAM
ef1_i : in std_logic; -- empty flag iFIFO1
ef2_i : in std_logic; -- empty flag iFIFO2
-- Enable of input Logic on TDC mezzanine
enable_inputs_o : out std_logic; -- enables all 5 inputs
term_en_1_o : out std_logic; -- Ch.1 termination enable of 50 Ohm termination
term_en_2_o : out std_logic; -- Ch.2 termination enable of 50 Ohm termination
term_en_3_o : out std_logic; -- Ch.3 termination enable of 50 Ohm termination
term_en_4_o : out std_logic; -- Ch.4 termination enable of 50 Ohm termination
term_en_5_o : out std_logic; -- Ch.5 termination enable of 50 Ohm termination
-- LEDs on TDC mezzanine
tdc_led_status_o : out std_logic; -- amber led on front pannel, division of 125 MHz tdc_clk
tdc_led_trig1_o : out std_logic; -- amber led on front pannel, Ch.1 enable
tdc_led_trig2_o : out std_logic; -- amber led on front pannel, Ch.2 enable
tdc_led_trig3_o : out std_logic; -- amber led on front pannel, Ch.3 enable
tdc_led_trig4_o : out std_logic; -- amber led on front pannel, Ch.4 enable
tdc_led_trig5_o : out std_logic; -- amber led on front pannel, Ch.5 enable
-- Input Logic on TDC mezzanine (not used currently)
tdc_in_fpga_1_i : in std_logic; -- Ch.1 for ACAM, also received by FPGA
tdc_in_fpga_2_i : in std_logic; -- Ch.2 for ACAM, also received by FPGA
tdc_in_fpga_3_i : in std_logic; -- Ch.3 for ACAM, also received by FPGA
tdc_in_fpga_4_i : in std_logic; -- Ch.4 for ACAM, also received by FPGA
tdc_in_fpga_5_i : in std_logic; -- Ch.5 for ACAM, also received by FPGA
-- I2C EEPROM interface on TDC mezzanine
mezz_scl_b : inout std_logic;
mezz_sda_b : inout std_logic;
-- 1-wire interface on TDC mezzanine
mezz_one_wire_b : inout std_logic;
---------------------------------------------------------------------------
-- WhiteRabbit time/frequency sync (see WR Core documentation)
---------------------------------------------------------------------------
tm_link_up_i : in std_logic;
tm_time_valid_i : in std_logic;
tm_cycles_i : in std_logic_vector(27 downto 0);
tm_tai_i : in std_logic_vector(39 downto 0);
tm_clk_aux_lock_en_o : out std_logic;
tm_clk_aux_locked_i : in std_logic;
tm_clk_dmtd_locked_i : in std_logic;
tm_dac_value_i : in std_logic_vector(23 downto 0);
tm_dac_wr_i : in std_logic;
slave_i : in t_wishbone_slave_in;
slave_o : out t_wishbone_slave_out;
direct_slave_i : in t_wishbone_slave_in;
direct_slave_o : out t_wishbone_slave_out;
irq_o : out std_logic;
clk_125m_tdc_o : out std_logic
); -- Mezzanine presence (active low)
end fmc_tdc_wrapper;
--=================================================================================================
-- architecture declaration
--=================================================================================================
architecture rtl of fmc_tdc_wrapper is
component fmc_tdc_direct_readout is
port (
clk_tdc_i : in std_logic;
rst_tdc_n_i : in std_logic;
clk_sys_i : in std_logic;
rst_sys_n_i : in std_logic;
direct_timestamp_i : in std_logic_vector(127 downto 0);
direct_timestamp_wr_i : in std_logic;
direct_slave_i : in t_wishbone_slave_in;
direct_slave_o : out t_wishbone_slave_out);
end component fmc_tdc_direct_readout;
-----------------------------------------------------------------
-- Signals --
---------------------------------------------------------------------------------------------------
-- WRabbit clocks
signal clk_125m_mezz : std_logic;
signal rst_125m_mezz_n, rst_125m_mezz : std_logic;
signal acam_refclk_r_edge_p : std_logic;
-- DAC configuration through PCIe/VME
signal send_dac_word_p : std_logic;
signal dac_word : std_logic_vector(23 downto 0);
-- WRabbit time
signal pll_sclk, pll_sdi, pll_dac_sync : std_logic;
signal fmc_eic_irq : std_logic;
signal fmc_eic_irq_synch : std_logic_vector(1 downto 0);
signal tdc_scl_out, tdc_scl_oen, tdc_sda_out, tdc_sda_oen : std_logic;
signal direct_timestamp : std_logic_vector(127 downto 0);
signal direct_timestamp_wr : std_logic;
constant c_cnx_slave_ports : integer := 2;
constant c_cnx_master_ports : integer := 2;
constant c_master_wrnc : integer := 0;
constant c_master_host : integer := 1;
constant c_slave_direct : integer := 0;
constant c_slave_regs : integer := 1;
signal cnx_master_in : t_wishbone_master_in_array(c_cnx_master_ports-1 downto 0);
signal cnx_master_out : t_wishbone_master_out_array(c_cnx_master_ports-1 downto 0);
constant c_cfg_base_addr : t_wishbone_address_array(c_cnx_master_ports-1 downto 0) :=
(c_slave_direct => x"00010000", -- Direct I/O
c_slave_regs => x"00020000"); -- Mezzanine regs
constant c_cfg_base_mask : t_wishbone_address_array(c_cnx_master_ports-1 downto 0) :=
(c_slave_direct => x"00030000",
c_slave_regs => x"00020000");
begin
cmp_mux_host_registers : xwb_crossbar
generic map (
g_num_masters => c_cnx_slave_ports,
g_num_slaves => c_cnx_master_ports,
g_registered => true,
g_address => c_cfg_base_addr,
g_mask => c_cfg_base_mask)
port map (
clk_sys_i => clk_sys_i,
rst_n_i => rst_sys_n_i,
slave_i(c_master_wrnc) => direct_slave_i,
slave_i(c_master_host) => slave_i,
slave_o(c_master_wrnc) => direct_slave_o,
slave_o(c_master_host) => slave_o,
master_i => cnx_master_in,
master_o => cnx_master_out);
mezz_scl_b <= tdc_scl_out when (tdc_scl_oen = '0') else 'Z';
mezz_sda_b <= tdc_sda_out when (tdc_sda_oen = '0') else 'Z';
cmp_tdc_clks_rsts_mgment : clks_rsts_manager
generic map
(nb_of_reg => 68)
port map
(clk_sys_i => clk_sys_i,
acam_refclk_p_i => acam_refclk_p_i,
acam_refclk_n_i => acam_refclk_n_i,
tdc_125m_clk_p_i => tdc_clk_125m_p_i,
tdc_125m_clk_n_i => tdc_clk_125m_n_i,
rst_n_i => rst_n_a_i,
pll_sdo_i => pll_sdo_i,
pll_status_i => pll_status_i,
send_dac_word_p_i => send_dac_word_p,
dac_word_i => dac_word,
acam_refclk_r_edge_p_o => acam_refclk_r_edge_p,
wrabbit_dac_value_i => tm_dac_value_i,
wrabbit_dac_wr_p_i => tm_dac_wr_i,
internal_rst_o => rst_125m_mezz,
pll_cs_n_o => pll_cs_o,
pll_dac_sync_n_o => pll_dac_sync,
pll_sdi_o => pll_sdi,
pll_sclk_o => pll_sclk,
tdc_125m_clk_o => clk_125m_mezz,
pll_status_o => open);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
rst_125m_mezz_n <= not rst_125m_mezz;
pll_dac_sync_o <= pll_dac_sync;
pll_sdi_o <= pll_sdi;
pll_sclk_o <= pll_sclk;
clk_125m_tdc_o <= clk_125m_mezz;
---------------------------------------------------------------------------------------------------
-- TDC BOARD --
---------------------------------------------------------------------------------------------------
cmp_tdc_mezz : fmc_tdc_mezzanine
generic map
(g_span => 32,
g_width => 32,
values_for_simul => g_simulation)
port map
-- 62M5 clk and reset
(clk_sys_i => clk_sys_i,
rst_sys_n_i => rst_sys_n_i,
-- 125M clk and reset
clk_tdc_i => clk_125m_mezz,
rst_tdc_i => rst_125m_mezz,
-- Wishbone
slave_i => cnx_master_out(c_slave_regs),
slave_o => cnx_master_in(c_slave_regs),
-- Interrupt line from EIC
wb_irq_o => fmc_eic_irq,
-- Configuration of the DAC on the TDC mezzanine, non White Rabbit
acam_refclk_r_edge_p_i => acam_refclk_r_edge_p,
send_dac_word_p_o => send_dac_word_p,
dac_word_o => dac_word,
-- ACAM interface
start_from_fpga_o => start_from_fpga_o,
err_flag_i => err_flag_i,
int_flag_i => int_flag_i,
start_dis_o => start_dis_o,
stop_dis_o => stop_dis_o,
data_bus_io => data_bus_io,
address_o => address_o,
cs_n_o => cs_n_o,
oe_n_o => oe_n_o,
rd_n_o => rd_n_o,
wr_n_o => wr_n_o,
ef1_i => ef1_i,
ef2_i => ef2_i,
-- Input channels enable
enable_inputs_o => enable_inputs_o,
term_en_1_o => term_en_1_o,
term_en_2_o => term_en_2_o,
term_en_3_o => term_en_3_o,
term_en_4_o => term_en_4_o,
term_en_5_o => term_en_5_o,
-- LEDs on TDC mezzanine
tdc_led_status_o => tdc_led_status_o,
tdc_led_trig1_o => tdc_led_trig1_o,
tdc_led_trig2_o => tdc_led_trig2_o,
tdc_led_trig3_o => tdc_led_trig3_o,
tdc_led_trig4_o => tdc_led_trig4_o,
tdc_led_trig5_o => tdc_led_trig5_o,
-- Input channels to FPGA (not used)
tdc_in_fpga_1_i => tdc_in_fpga_1_i,
tdc_in_fpga_2_i => tdc_in_fpga_2_i,
tdc_in_fpga_3_i => tdc_in_fpga_3_i,
tdc_in_fpga_4_i => tdc_in_fpga_4_i,
tdc_in_fpga_5_i => tdc_in_fpga_5_i,
-- WISHBONE interface with the GN4124 core
-- White Rabbit
wrabbit_link_up_i => tm_link_up_i,
wrabbit_time_valid_i => tm_time_valid_i,
wrabbit_cycles_i => tm_cycles_i,
wrabbit_utc_i => tm_tai_i(31 downto 0),
wrabbit_clk_aux_lock_en_o => tm_clk_aux_lock_en_o,
wrabbit_clk_aux_locked_i => tm_clk_aux_locked_i,
wrabbit_clk_dmtd_locked_i => '1', -- FIXME: fan out real signal from the WRCore
wrabbit_dac_value_i => tm_dac_value_i,
wrabbit_dac_wr_p_i => tm_dac_wr_i,
-- EEPROM I2C on TDC mezzanine
i2c_scl_oen_o => tdc_scl_oen,
i2c_scl_i => mezz_scl_b,
i2c_sda_oen_o => tdc_sda_oen,
i2c_sda_i => mezz_sda_b,
i2c_scl_o => tdc_scl_out,
i2c_sda_o => tdc_sda_out,
-- 1-Wire on TDC mezzanine
onewire_b => mezz_one_wire_b,
direct_timestamp_o => direct_timestamp,
direct_timestamp_stb_o => direct_timestamp_wr);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Domains crossing: synchronization of the wb_ird_o from 125MHz to 62.5MHz
irq_pulse_synchronizer : process (clk_sys_i)
begin
if rising_edge (clk_sys_i) then
if rst_sys_n_i = '0' then
fmc_eic_irq_synch <= (others => '0');
else
fmc_eic_irq_synch <= fmc_eic_irq_synch(0) & fmc_eic_irq;
end if;
end if;
irq_o <= fmc_eic_irq_synch(1);
end process;
U_DirectRD : fmc_tdc_direct_readout
port map (
clk_tdc_i => clk_125m_mezz,
rst_tdc_n_i => rst_125m_mezz_n,
clk_sys_i => clk_sys_i,
rst_sys_n_i => rst_sys_n_i,
direct_timestamp_i => direct_timestamp,
direct_timestamp_wr_i => direct_timestamp_wr,
direct_slave_i => cnx_master_out(c_slave_direct),
direct_slave_o => cnx_master_in(c_slave_direct));
end rtl;
----------------------------------------------------------------------------------------------------
-- architecture ends
----------------------------------------------------------------------------------------------------
--_________________________________________________________________________________________________
-- |
-- |TDC core| |
-- |
-- CERN,BE/CO-HT |
--________________________________________________________________________________________________|
---------------------------------------------------------------------------------------------------
-- |
-- sdb_meta_pkg |
-- |
---------------------------------------------------------------------------------------------------
-- File sdb_meta_pkg.vhd |
-- |
-- Description Sdb meta-information for the FMC TDC design for SPEC. |
-- |
-- Authors Matthieu Cattin (matthieu.cattin@cern.ch) |
-- Evangelia Gousiou (Evangelia.Gousiou@cern.ch) |
-- Date 04/2013 |
-- Version v1 |
-- |
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE |
-- ------------------------------------ |
-- This source file is free software; you can redistribute it and/or modify it under the terms of |
-- the GNU Lesser General Public License as published by the Free Software Foundation; either |
-- version 2.1 of the License, or (at your option) any later version. |
-- This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
-- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
-- See the GNU Lesser General Public License for more details. |
-- You should have received a copy of the GNU Lesser General Public License along with this |
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html |
---------------------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.wishbone_pkg.all;
package sdb_meta_pkg is
------------------------------------------------------------------------------
-- Meta-information sdb records
------------------------------------------------------------------------------
-- Top module repository url
constant c_SDB_REPO_URL : t_sdb_repo_url := (
-- url (string, 63 char)
repo_url => "http://svn.ohwr.org/fmc-tdc/hdl/spec/ ");
-- Synthesis informations
constant c_SDB_SYNTHESIS : t_sdb_synthesis := (
-- Top module name (string, 16 char)
syn_module_name => "spec_top_fmc_tdc",
-- Commit ID (hex string, 128-bit = 32 char)
-- git log -1 --format="%H" | cut -c1-320
syn_commit_id => x"00000000",
-- Synthesis tool name (string, 8 char)
syn_tool_name => "ISE ",
-- Synthesis tool version (bcd encoded, 32-bit)
syn_tool_version => x"00000134",
-- Synthesis date (bcd encoded, 32-bit)
syn_date => x"20140121",
-- Synthesised by (string, 15 char)
syn_username => "egousiou ");
-- Integration record
constant c_SDB_INTEGRATION : t_sdb_integration := (
product => (
vendor_id => x"000000000000CE42", -- CERN
device_id => x"593b56e5", -- echo "spec_fmc-tdc-1ns5cha" | md5sum | cut -c1-8
version => x"00050000", -- bcd encoded, [31:16] = major, [15:0] = minor
date => x"20140121", -- yyyymmdd
name => "spec_top_fmc_tdc "));
end sdb_meta_pkg;
package body sdb_meta_pkg is
end sdb_meta_pkg;
\ No newline at end of file
library ieee;
use ieee.STD_LOGIC_1164.all;
use ieee.NUMERIC_STD.all;
use work.gencores_pkg.all;
entity spec_reset_gen is
port (
clk_sys_i : in std_logic;
rst_pcie_n_a_i : in std_logic;
rst_button_n_a_i : in std_logic;
rst_n_o : out std_logic
);
end spec_reset_gen;
architecture behavioral of spec_reset_gen is
signal powerup_cnt : unsigned(7 downto 0) := x"00";
signal button_synced_n : std_logic;
signal pcie_synced_n : std_logic;
signal powerup_n : std_logic := '0';
begin -- behavioral
U_EdgeDet_PCIe : gc_sync_ffs port map (
clk_i => clk_sys_i,
rst_n_i => '1',
data_i => rst_pcie_n_a_i,
ppulse_o => pcie_synced_n);
U_Sync_Button : gc_sync_ffs port map (
clk_i => clk_sys_i,
rst_n_i => '1',
data_i => rst_button_n_a_i,
synced_o => button_synced_n);
p_powerup_reset : process(clk_sys_i)
begin
if rising_edge(clk_sys_i) then
if(powerup_cnt /= x"ff") then
powerup_cnt <= powerup_cnt + 1;
powerup_n <= '0';
else
powerup_n <= '1';
end if;
end if;
end process;
rst_n_o <= powerup_n and button_synced_n and (not pcie_synced_n);
end behavioral;
#----------------------------------------
# Clocks
#----------------------------------------
NET "clk_20m_vcxo_i" LOC = H12;
NET "clk_20m_vcxo_i" IOSTANDARD = "LVCMOS25";
NET "clk_20m_vcxo_i" TNM_NET = "clk_20m_vcxo_i";
TIMESPEC TS_clk_20m_vcxo_i = PERIOD "clk_20m_vcxo_i" 50 ns HIGH 50%;
NET "clk_125m_pllref_n_i" LOC = F10;
NET "clk_125m_pllref_n_i" IOSTANDARD = "LVDS_25";
NET "clk_125m_pllref_p_i" LOC = G9;
NET "clk_125m_pllref_p_i" IOSTANDARD = "LVDS_25";
NET "clk_125m_pllref_p_i" TNM_NET = clk_125m_pllref_p_i;
TIMESPEC TS_clk_125m_pllref_p_i = PERIOD "clk_125m_pllref_p_i" 8 ns HIGH 50%;
NET "clk_125m_pllref_n_i" TNM_NET = clk_125m_pllref_n_i;
TIMESPEC TS_clk_125m_pllref_n_i = PERIOD "clk_125m_pllref_n_i" 8 ns HIGH 50%;
NET "clk_125m_gtp_n_i" LOC = D11;
NET "clk_125m_gtp_p_i" LOC = C11;
NET "clk_125m_gtp_n_i" TNM_NET = clk_125m_gtp_n_i;
TIMESPEC TS_clk_125m_gtp_n_i = PERIOD "clk_125m_gtp_n_i" 8 ns HIGH 50%;
NET "clk_125m_gtp_p_i" TNM_NET = clk_125m_gtp_p_i;
TIMESPEC TS_clk_125m_gtp_p_i = PERIOD "clk_125m_gtp_p_i" 8 ns HIGH 50%;
NET "tdc_clk_125m_p_i" LOC = "L20";
NET "tdc_clk_125m_p_i" IOSTANDARD = "LVDS_25";
NET "tdc_clk_125m_p_i" TNM_NET = "tdc_clk_125m_p_i";
TIMESPEC TStdc_clk_125m_p_i = PERIOD "tdc_clk_125m_p_i" 8 ns HIGH 50%;
NET "tdc_clk_125m_n_i" LOC = "L22";
NET "tdc_clk_125m_n_i" IOSTANDARD = "LVDS_25";
NET "tdc_clk_125m_n_i" TNM_NET = "tdc_clk_125m_n_i";
TIMESPEC TS_tdc_clk_125m_n_i = PERIOD "tdc_clk_125m_n_i" 8 ns HIGH 50%;
NET "p2l_clk_n_i" LOC = M19;
NET "p2l_clk_n_i" IOSTANDARD = "DIFF_SSTL18_I";
NET "p2l_clk_p_i" LOC = M20;
NET "p2l_clk_p_i" IOSTANDARD = "DIFF_SSTL18_I";
NET "p2l_clk_p_i" TNM_NET = "p2l_clk_p_i";
TIMESPEC TS_p2l_clk_p_i = PERIOD "p2l_clk_p_i" 5 ns HIGH 50%;
NET "p2l_clk_n_i" TNM_NET = "p2l_clk_n_i";
TIMESPEC TS_p2l_clk_n_i = PERIOD "p2l_clk_n_i" 5 ns HIGH 50%;
#----------------------------------------
# FMC slot
#----------------------------------------
# <ucfgen_start>
# This section has bee generated automatically by ucfgen.py. Do not hand-modify if not really necessary.
# ucfgen pin assignments for mezzanine fmc-tdc-v3 slot 0
NET "acam_refclk_p_i" LOC = "E16";
NET "acam_refclk_p_i" IOSTANDARD = "LVDS_25";
NET "acam_refclk_n_i" LOC = "F16";
NET "acam_refclk_n_i" IOSTANDARD = "LVDS_25";
NET "tdc_led_trig1_o" LOC = "W18";
NET "tdc_led_trig1_o" IOSTANDARD = "LVCMOS25";
NET "tdc_led_trig2_o" LOC = "B20";
NET "tdc_led_trig2_o" IOSTANDARD = "LVCMOS25";
NET "tdc_led_trig3_o" LOC = "A20";
NET "tdc_led_trig3_o" IOSTANDARD = "LVCMOS25";
NET "term_en_1_o" LOC = "Y11";
NET "term_en_1_o" IOSTANDARD = "LVCMOS25";
NET "term_en_2_o" LOC = "AB11";
NET "term_en_2_o" IOSTANDARD = "LVCMOS25";
NET "ef1_i" LOC = "W12";
NET "ef1_i" IOSTANDARD = "LVCMOS25";
NET "ef2_i" LOC = "Y12";
NET "ef2_i" IOSTANDARD = "LVCMOS25";
NET "term_en_3_o" LOC = "R11";
NET "term_en_3_o" IOSTANDARD = "LVCMOS25";
NET "term_en_4_o" LOC = "T11";
NET "term_en_4_o" IOSTANDARD = "LVCMOS25";
NET "term_en_5_o" LOC = "R13";
NET "term_en_5_o" IOSTANDARD = "LVCMOS25";
NET "tdc_led_status_o" LOC = "T14";
NET "tdc_led_status_o" IOSTANDARD = "LVCMOS25";
NET "tdc_led_trig4_o" LOC = "D17";
NET "tdc_led_trig4_o" IOSTANDARD = "LVCMOS25";
NET "tdc_led_trig5_o" LOC = "C18";
NET "tdc_led_trig5_o" IOSTANDARD = "LVCMOS25";
NET "pll_sclk_o" LOC = "AA16";
NET "pll_sclk_o" IOSTANDARD = "LVCMOS25";
NET "pll_dac_sync_o" LOC = "AB16";
NET "pll_dac_sync_o" IOSTANDARD = "LVCMOS25";
NET "pll_cs_o" LOC = "Y17";
NET "pll_cs_o" IOSTANDARD = "LVCMOS25";
NET "cs_n_o" LOC = "AB17";
NET "cs_n_o" IOSTANDARD = "LVCMOS25";
NET "err_flag_i" LOC = "V11";
NET "err_flag_i" IOSTANDARD = "LVCMOS25";
NET "int_flag_i" LOC = "W11";
NET "int_flag_i" IOSTANDARD = "LVCMOS25";
NET "start_dis_o" LOC = "T15";
NET "start_dis_o" IOSTANDARD = "LVCMOS25";
NET "stop_dis_o" LOC = "U15";
NET "stop_dis_o" IOSTANDARD = "LVCMOS25";
NET "pll_sdo_i" LOC = "AB18";
NET "pll_sdo_i" IOSTANDARD = "LVCMOS25";
NET "pll_status_i" LOC = "Y18";
NET "pll_status_i" IOSTANDARD = "LVCMOS25";
NET "pll_sdi_o" LOC = "AA18";
NET "pll_sdi_o" IOSTANDARD = "LVCMOS25";
NET "start_from_fpga_o" LOC = "W17";
NET "start_from_fpga_o" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[27]" LOC = "AB4";
NET "data_bus_io[27]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[26]" LOC = "AA4";
NET "data_bus_io[26]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[25]" LOC = "AB9";
NET "data_bus_io[25]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[24]" LOC = "Y9";
NET "data_bus_io[24]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[23]" LOC = "Y10";
NET "data_bus_io[23]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[22]" LOC = "W10";
NET "data_bus_io[22]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[21]" LOC = "U10";
NET "data_bus_io[21]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[20]" LOC = "T10";
NET "data_bus_io[20]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[19]" LOC = "AB8";
NET "data_bus_io[19]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[18]" LOC = "AA8";
NET "data_bus_io[18]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[17]" LOC = "AB7";
NET "data_bus_io[17]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[16]" LOC = "Y7";
NET "data_bus_io[16]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[15]" LOC = "V9";
NET "data_bus_io[15]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[14]" LOC = "U9";
NET "data_bus_io[14]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[13]" LOC = "AB6";
NET "data_bus_io[13]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[12]" LOC = "AA6";
NET "data_bus_io[12]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[11]" LOC = "R8";
NET "data_bus_io[11]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[10]" LOC = "R9";
NET "data_bus_io[10]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[9]" LOC = "AB5";
NET "data_bus_io[9]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[8]" LOC = "Y5";
NET "data_bus_io[8]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[7]" LOC = "AB12";
NET "data_bus_io[7]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[6]" LOC = "U8";
NET "data_bus_io[6]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[5]" LOC = "AA12";
NET "data_bus_io[5]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[4]" LOC = "T8";
NET "data_bus_io[4]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[3]" LOC = "W8";
NET "data_bus_io[3]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[2]" LOC = "V7";
NET "data_bus_io[2]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[1]" LOC = "Y6";
NET "data_bus_io[1]" IOSTANDARD = "LVCMOS25";
NET "data_bus_io[0]" LOC = "W6";
NET "data_bus_io[0]" IOSTANDARD = "LVCMOS25";
NET "address_o[3]" LOC = "AB15";
NET "address_o[3]" IOSTANDARD = "LVCMOS25";
NET "address_o[2]" LOC = "Y15";
NET "address_o[2]" IOSTANDARD = "LVCMOS25";
NET "address_o[1]" LOC = "U12";
NET "address_o[1]" IOSTANDARD = "LVCMOS25";
NET "address_o[0]" LOC = "T12";
NET "address_o[0]" IOSTANDARD = "LVCMOS25";
NET "oe_n_o" LOC = "V13";
NET "oe_n_o" IOSTANDARD = "LVCMOS25";
NET "rd_n_o" LOC = "AB13";
NET "rd_n_o" IOSTANDARD = "LVCMOS25";
NET "wr_n_o" LOC = "Y13";
NET "wr_n_o" IOSTANDARD = "LVCMOS25";
NET "enable_inputs_o" LOC = "C19";
NET "enable_inputs_o" IOSTANDARD = "LVCMOS25";
NET "mezz_one_wire_b" LOC = "A19";
NET "mezz_one_wire_b" IOSTANDARD = "LVCMOS25";
# <ucfgen_end>
NET "mezz_sys_scl_b" LOC = "F7";
NET "mezz_sys_scl_b" IOSTANDARD = "LVCMOS25";
NET "mezz_sys_sda_b" LOC = "F8";
NET "mezz_sys_sda_b" IOSTANDARD = "LVCMOS25";
#----------------------------------------
# 1-wire thermometer w/ ID
#----------------------------------------
NET "carrier_onewire_b" LOC = D4;
NET "carrier_onewire_b" IOSTANDARD = "LVCMOS25";
#----------------------------------------
# GN4124 interface
#----------------------------------------
NET "rst_n_a_i" LOC = N20;
NET "rst_n_a_i" IOSTANDARD = "LVCMOS18";
NET "l2p_clk_n_o" LOC = K22;
NET "l2p_clk_n_o" IOSTANDARD = "DIFF_SSTL18_I";
NET "l2p_clk_p_o" LOC = K21;
NET "l2p_clk_p_o" IOSTANDARD = "DIFF_SSTL18_I";
NET "l2p_dframe_o" LOC = U22;
NET "l2p_dframe_o" IOSTANDARD = "SSTL18_I";
NET "l2p_edb_o" LOC = U20;
NET "l2p_edb_o" IOSTANDARD = "SSTL18_I";
NET "l2p_rdy_i" LOC = U19;
NET "l2p_rdy_i" IOSTANDARD = "SSTL18_I";
NET "l2p_valid_o" LOC = T18;
NET "l2p_valid_o" IOSTANDARD = "SSTL18_I";
NET "l_wr_rdy_i[0]" LOC = R20;
NET "l_wr_rdy_i[0]" IOSTANDARD = "SSTL18_I";
NET "l_wr_rdy_i[1]" LOC = T22;
NET "l_wr_rdy_i[1]" IOSTANDARD = "SSTL18_I";
#NET "L_CLKN" LOC = N19;
#NET "L_CLKN" IOSTANDARD = "DIFF_SSTL18_I";
#NET "L_CLKP" LOC = P20;
#NET "L_CLKP" IOSTANDARD = "DIFF_SSTL18_I";
NET "p2l_dframe_i" LOC = J22;
NET "p2l_dframe_i" IOSTANDARD = "SSTL18_I";
NET "p2l_rdy_o" LOC = J16;
NET "p2l_rdy_o" IOSTANDARD = "SSTL18_I";
NET "p2l_valid_i" LOC = L19;
NET "p2l_valid_i" IOSTANDARD = "SSTL18_I";
NET "p_rd_d_rdy_i[0]" LOC = N16;
NET "p_rd_d_rdy_i[0]" IOSTANDARD = "SSTL18_I";
NET "p_rd_d_rdy_i[1]" LOC = P19;
NET "p_rd_d_rdy_i[1]" IOSTANDARD = "SSTL18_I";
NET "p_wr_rdy_o[0]" LOC = L15;
NET "p_wr_rdy_o[0]" IOSTANDARD = "SSTL18_I";
NET "p_wr_rdy_o[1]" LOC = K16;
NET "p_wr_rdy_o[1]" IOSTANDARD = "SSTL18_I";
NET "p_wr_req_i[0]" LOC = M22;
NET "p_wr_req_i[0]" IOSTANDARD = "SSTL18_I";
NET "p_wr_req_i[1]" LOC = M21;
NET "p_wr_req_i[1]" IOSTANDARD = "SSTL18_I";
NET "rx_error_o" LOC = J17;
NET "rx_error_o" IOSTANDARD = "SSTL18_I";
NET "tx_error_i" LOC = M17;
NET "tx_error_i" IOSTANDARD = "SSTL18_I";
NET "vc_rdy_i[0]" LOC = B21;
NET "vc_rdy_i[0]" IOSTANDARD = "SSTL18_I";
NET "vc_rdy_i[1]" LOC = B22;
NET "vc_rdy_i[1]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[0]" LOC = P16;
NET "l2p_data_o[0]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[1]" LOC = P21;
NET "l2p_data_o[1]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[2]" LOC = P18;
NET "l2p_data_o[2]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[3]" LOC = T20;
NET "l2p_data_o[3]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[4]" LOC = V21;
NET "l2p_data_o[4]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[5]" LOC = V19;
NET "l2p_data_o[5]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[6]" LOC = W22;
NET "l2p_data_o[6]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[7]" LOC = Y22;
NET "l2p_data_o[7]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[8]" LOC = P22;
NET "l2p_data_o[8]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[9]" LOC = R22;
NET "l2p_data_o[9]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[10]" LOC = T21;
NET "l2p_data_o[10]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[11]" LOC = T19;
NET "l2p_data_o[11]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[12]" LOC = V22;
NET "l2p_data_o[12]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[13]" LOC = V20;
NET "l2p_data_o[13]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[14]" LOC = W20;
NET "l2p_data_o[14]" IOSTANDARD = "SSTL18_I";
NET "l2p_data_o[15]" LOC = Y21;
NET "l2p_data_o[15]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[0]" LOC = K20;
NET "p2l_data_i[0]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[1]" LOC = H22;
NET "p2l_data_i[1]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[2]" LOC = H21;
NET "p2l_data_i[2]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[3]" LOC = L17;
NET "p2l_data_i[3]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[4]" LOC = K17;
NET "p2l_data_i[4]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[5]" LOC = G22;
NET "p2l_data_i[5]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[6]" LOC = G20;
NET "p2l_data_i[6]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[7]" LOC = K18;
NET "p2l_data_i[7]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[8]" LOC = K19;
NET "p2l_data_i[8]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[9]" LOC = H20;
NET "p2l_data_i[9]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[10]" LOC = J19;
NET "p2l_data_i[10]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[11]" LOC = E22;
NET "p2l_data_i[11]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[12]" LOC = E20;
NET "p2l_data_i[12]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[13]" LOC = F22;
NET "p2l_data_i[13]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[14]" LOC = F21;
NET "p2l_data_i[14]" IOSTANDARD = "SSTL18_I";
NET "p2l_data_i[15]" LOC = H19;
NET "p2l_data_i[15]" IOSTANDARD = "SSTL18_I";
NET "irq_p_o" LOC = U16;
NET "irq_p_o" IOSTANDARD = "LVCMOS25";
#----------------------------------------
# PCB version number (coded with resistors)
#----------------------------------------
NET "pcb_ver_i[0]" LOC = P5;
NET "pcb_ver_i[0]" IOSTANDARD = "LVCMOS15";
NET "pcb_ver_i[1]" LOC = P4;
NET "pcb_ver_i[1]" IOSTANDARD = "LVCMOS15";
NET "pcb_ver_i[2]" LOC = AA2;
NET "pcb_ver_i[2]" IOSTANDARD = "LVCMOS15";
NET "pcb_ver_i[3]" LOC = AA1;
NET "pcb_ver_i[3]" IOSTANDARD = "LVCMOS15";
#----------------------------------------
# FMC Presence
#----------------------------------------
NET "prsnt_m2c_n_i" LOC = AB14;
NET "prsnt_m2c_n_i" IOSTANDARD = "LVCMOS25";
#----------------------------------------
# TDC IN FPGA (not used)
#----------------------------------------
NET "tdc_in_fpga_1_i" LOC = V17;
NET "tdc_in_fpga_1_i" IOSTANDARD = "LVCMOS25";
#----------------------------------------
# Carrier Generic Stuff
#----------------------------------------
NET "led_red" LOC = D5;
NET "led_red" IOSTANDARD = "LVCMOS25";
NET "led_green" LOC = E5;
NET "led_green" IOSTANDARD = "LVCMOS25";
NET "dac_cs1_n_o" LOC = A3;
NET "dac_cs1_n_o" IOSTANDARD = "LVCMOS25";
NET "dac_cs2_n_o" LOC = B3;
NET "dac_cs2_n_o" IOSTANDARD = "LVCMOS25";
#NET "dac_clr_n_o" LOC = F7;
#NET "dac_clr_n_o" IOSTANDARD = "LVCMOS25";
NET "dac_din_o" LOC = C4;
NET "dac_din_o" IOSTANDARD = "LVCMOS25";
NET "dac_sclk_o" LOC = A4;
NET "dac_sclk_o" IOSTANDARD = "LVCMOS25";
NET "button1_i" LOC = C22;
NET "button1_i" IOSTANDARD = "LVCMOS18";
NET "button2_i" LOC = D21;
NET "button2_i" IOSTANDARD = "LVCMOS18";
#----------------------------------------
# SFP
#----------------------------------------
NET "sfp_rxp_i" LOC= D15;
NET "sfp_rxn_i" LOC= C15;
NET "sfp_txp_o" LOC= B16;
NET "sfp_txn_o" LOC= A16;
NET "sfp_mod_def1_b" LOC = C17;
NET "sfp_mod_def1_b" IOSTANDARD = "LVCMOS25";
NET "sfp_mod_def0_b" LOC = G15;
NET "sfp_mod_def0_b" IOSTANDARD = "LVCMOS25";
NET "sfp_mod_def2_b" LOC = G16;
NET "sfp_mod_def2_b" IOSTANDARD = "LVCMOS25";
NET "sfp_rate_select_b" LOC = H14;
NET "sfp_rate_select_b" IOSTANDARD = "LVCMOS25";
NET "sfp_tx_fault_i" LOC = A17;
NET "sfp_tx_fault_i" IOSTANDARD = "LVCMOS25";
NET "sfp_tx_disable_o" LOC = F17;
NET "sfp_tx_disable_o" IOSTANDARD = "LVCMOS25";
NET "sfp_los_i" LOC = D18;
NET "sfp_los_i" IOSTANDARD = "LVCMOS25";
#----------------------------------------
# UART
#----------------------------------------
NET "uart_rxd_i" LOC= A2;
NET "uart_rxd_i" IOSTANDARD=LVCMOS25;
NET "uart_txd_o" LOC= B2;
NET "uart_txd_o" IOSTANDARD=LVCMOS25;
#----------------------------------------
# False Path
#----------------------------------------
# GN4124
NET "rst_n_a_i" TIG;
NET "cmp_gn4124_core/rst_*" TIG;
NET "cmp_gn4124_core/cmp_clk_in/P_clk" TNM_NET = cmp_gn4124_core/cmp_clk_in/P_clk;
TIMESPEC TS_cmp_gn4124_core_cmp_clk_in_P_clk = PERIOD "cmp_gn4124_core/cmp_clk_in/P_clk" 5 ns HIGH 50%;
PIN "cmp_clk_dmtd_buf.O" CLOCK_DEDICATED_ROUTE = FALSE;
NET "clk_62m5_sys" TNM_NET = clk_62m5_sys;
TIMESPEC ts_ignore_crossclock = FROM "clk_62m5_sys" TO "tdc_clk_125m_p_i" 10ns DATAPATHONLY;
TIMESPEC ts_ignore_crossclock2 = FROM "tdc_clk_125m_p_i" TO "clk_62m5_sys" 10ns DATAPATHONLY;
TIMESPEC ts_ignore_xclock1 = FROM "clk_62m5_sys" TO "clk_125m_pllref_n_i" 10ns DATAPATHONLY;
TIMESPEC ts_ignore_xclock2 = FROM "clk_125m_pllref_p_i" TO "clk_62m5_sys" 10ns DATAPATHONLY;
TIMESPEC ts_x3 = FROM "clk_62m5_sys" TO "U_GTP_ch1_rx_divclk" 10ns DATAPATHONLY;
TIMESPEC TS_x4 = FROM "U_GTP_ch1_rx_divclk" TO "clk_62m5_sys" 10ns DATAPATHONLY;
PIN "clk_125m_pllref_BUFG.O" CLOCK_DEDICATED_ROUTE = FALSE;
NET "U_GTP/ch1_gtp_clkout_int<1>" TNM_NET = U_GTP/ch1_gtp_clkout_int<1>;
TIMESPEC TS_U_GTP_ch1_gtp_clkout_int_1_ = PERIOD "U_GTP/ch1_gtp_clkout_int<1>" 125 MHz HIGH 50%;
##Created by Constraints Editor (xc6slx45t-fgg484-3) - 2012/08/07
INST "*/U_SOFTPLL/U_Wrapped_Softpll/gen_feedback_dmtds*/clk_in" TNM = skew_limit;
INST "*/U_SOFTPLL/U_Wrapped_Softpll/gen_ref_dmtds*/clk_in" TNM = skew_limit;
TIMESPEC TS_ = FROM "skew_limit" TO "FFS" 2 ns DATAPATHONLY;
#Created by Constraints Editor (xc6slx45t-fgg484-3) - 2012/08/08
INST "U_WR_CORE/WRPC/U_Endpoint/U_Wrapped_Endpoint/U_PCS_1000BASEX/gen_8bit.U_RX_PCS/timestamp_trigger_p_a_o" TNM = rx_ts_trig;
TIMESPEC TS_RXTS = FROM "rx_ts_trig" TO "FFS" 2 ns DATAPATHONLY;
--_________________________________________________________________________________________________
-- |
-- |SPEC TDC| |
-- |
-- CERN,BE/CO-HT |
--________________________________________________________________________________________________|
---------------------------------------------------------------------------------------------------
-- |
-- spec_top_fmc_tdc |
-- |
---------------------------------------------------------------------------------------------------
-- File spec_top_fmc_tdc.vhd |
-- |
-- Description TDC top level for a SPEC carrier. Figure 1 shows the architecture of the unit. |
-- |
-- For the communication with the PCIe, the ohwr.org GN4124 core is instantiated. |
-- |
-- The TDC mezzanine core is instantiated for the communication with the TDC board. |
-- The VIC core is forwarding the interrupts coming from the TDC mezzanine core to |
-- the GN4124 core. |
-- The carrier_info module provides general information on the SPEC PCB version, PLLs |
-- locking state etc. |
-- The 1-Wire core provides communication with the SPEC Thermometer&UniqueID chip. |
-- All the cores communicate with the GN4124 core through the SDB crossbar. The SDB |
-- crossbar is responsible for managing the acess to the GN4124 core. |
-- |
-- The speed of all the cores (TDC mezzanine, VIC, carrier csr, 1-Wire as well as |
-- the GN4124 core) is 125MHz. |
-- |
-- The 125MHz clock comes from the PLL located on the TDC mezzanine board. |
-- The clks_rsts_manager unit is responsible for automatically configuring the PLL |
-- upon the FPGA startup or after a PCIe reset, using the 20MHz VCXO on the SPEC |
-- carrier board. The clks_rsts_manager is keeping all the rest of the logic under |
-- reset until the PLL gets locked. |
-- |
-- __________________________________________________________________ |
-- ________ | ___ _____ | |
-- | | | ___________________ | | | | | |
-- | PLL |<->| | clks rsts manager | | | | | | |
-- | DAC | | |___________________| | | | | | |
-- | | | ____________________________ | | | | | |
-- | | | | | \ | | | | | |
-- | ACAM |<->| | TDC mezzanine | \ | | | | | |
-- |________| | |--|____________________________| \ | | | G | | |
-- TDC mezz | | \ | | | | | |
-- | | ____________________________ | S | | N | | |
-- | |->| | | | | | | |
-- | | Vector Interrupt Controller| ---- | D | <--> | 4 | | |
-- | |____________________________| | | | | | |
-- | | B | | 1 | | |
-- | ____________________________ | | | | | |
-- | | | | | | 2 | | |
-- SPEC 1Wire <->| | 1-Wire | ---- | | | | | |
-- | |____________________________| | | | 4 | | |
-- | / | | | | | |
-- | ____________________________ / | | | | | |
-- | | | / | | | | | |
-- | | carrier_info | / | | | | | |
-- | |____________________________| | | | | | |
-- | |___| |_____| | |
-- | | |
-- | ______________________________________________ | |
-- SPEC LEDs <->| |___________________LEDs_______________________| | |
-- | | |
-- |__________________________________________________________________| |
-- |
-- |
-- Authors Gonzalo Penacoba (Gonzalo.Penacoba@cern.ch) |
-- Evangelia Gousiou (Evangelia.Gousiou@cern.ch) |
-- Date 01/2014 |
-- Version v5 (see sdb_meta_pkg) |
-- Depends on |
-- |
---------------- |
-- Last changes |
-- 05/2011 v1 GP First version |
-- 06/2012 v2 EG Revamping; Comments added, signals renamed |
-- removed LEDs from top level |
-- new GN4124 core integrated |
-- carrier 1 wire master added |
-- mezzanine I2C master added |
-- mezzanine 1 wire master added |
-- interrupts generator added |
-- changed generation of rst_125m_mezz |
-- DAC reconfiguration+needed regs added |
-- 06/2012 v3 EG Changes for v2 of TDC mezzanine |
-- Several pinout changes, |
-- acam_ref_clk LVDS instead of CMOS, |
-- no PLL_LD only PLL_STATUS |
-- 04/2013 v4 EG added SDB; fixed bugs in data_formatting; added carrier CSR information |
-- 01/2014 v5 EG added VIC and EIC in the TDC mezzanine |
-- |
----------------------------------------------/!\-------------------------------------------------|
-- Note for eva: Remember the design is synthesised with Synplify Premier with DP (tdc_syn.prj) |
-- For PAR use the tdc_par_script.tcl commands in Xilinx ISE! |
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE |
-- ------------------------------------ |
-- This source file is free software; you can redistribute it and/or modify it under the terms of |
-- the GNU Lesser General Public License as published by the Free Software Foundation; either |
-- version 2.1 of the License, or (at your option) any later version. |
-- This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
-- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
-- See the GNU Lesser General Public License for more details. |
-- You should have received a copy of the GNU Lesser General Public License along with this |
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html |
---------------------------------------------------------------------------------------------------
--=================================================================================================
-- Libraries & Packages
--=================================================================================================
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use work.tdc_core_pkg.all;
use work.gn4124_core_pkg.all;
use work.gencores_pkg.all;
use work.wishbone_pkg.all;
--use work.sdb_meta_pkg.all;
use work.wrcore_pkg.all;
use work.wr_fabric_pkg.all;
use work.wr_xilinx_pkg.all;
use work.synthesis_descriptor.all;
library UNISIM;
use UNISIM.vcomponents.all;
--=================================================================================================
-- Entity declaration for spec_top_fmc_tdc
--=================================================================================================
entity spec_top_fmc_tdc is
generic
(g_span : integer := 32; -- address span in bus interfaces
g_width : integer := 32; -- data width in bus interfaces
values_for_simul : boolean := FALSE); -- this generic is set to TRUE
-- when instantiated in a test-bench
port
(-- SPEC carrier
clk_125m_pllref_p_i: in std_logic; -- 125 MHz PLL reference
clk_125m_pllref_n_i: in std_logic;
clk_125m_gtp_n_i : in std_logic; -- 125 MHz GTP reference
clk_125m_gtp_p_i : in std_logic;
clk_20m_vcxo_i : in std_logic; -- 20 MHz VCXO
dac_sclk_o : out std_logic; -- PLL VCXO DAC Drive
dac_din_o : out std_logic;
dac_cs1_n_o : out std_logic;
dac_cs2_n_o : out std_logic;
sfp_txp_o : out std_logic; -- SFP
sfp_txn_o : out std_logic;
sfp_rxp_i : in std_logic := '0';
sfp_rxn_i : in std_logic := '1';
sfp_mod_def0_b : in std_logic; -- SFP detect pin
sfp_mod_def1_b : inout std_logic; -- SFP scl
sfp_mod_def2_b : inout std_logic; -- SFP sda
sfp_rate_select_b : inout std_logic := '0';
sfp_tx_fault_i : in std_logic := '0';
sfp_tx_disable_o : out std_logic;
sfp_los_i : in std_logic := '0';
uart_rxd_i : in std_logic := '1'; -- UART
uart_txd_o : out std_logic;
carrier_scl_b : inout std_logic; -- SPEC EEPROM
carrier_sda_b : inout std_logic;
carrier_onewire_b : inout std_logic; -- SPEC 1-wire
button1_i : in std_logic := '1';
button2_i : in std_logic := '1';
-- Interface with GN4124
rst_n_a_i : in std_logic;
-- P2L Direction
p2l_clk_p_i : in std_logic; -- Receiver Source Synchronous Clock+
p2l_clk_n_i : in std_logic; -- Receiver Source Synchronous Clock-
p2l_data_i : in std_logic_vector(15 downto 0);-- Parallel receive data
p2l_dframe_i : in std_logic; -- Receive Frame
p2l_valid_i : in std_logic; -- Receive Data Valid
p2l_rdy_o : out std_logic; -- Rx Buffer Full Flag
p_wr_req_i : in std_logic_vector(1 downto 0); -- PCIe Write Request
p_wr_rdy_o : out std_logic_vector(1 downto 0); -- PCIe Write Ready
rx_error_o : out std_logic; -- Receive Error
vc_rdy_i : in std_logic_vector(1 downto 0); -- Virtual channel ready
-- L2P Direction
l2p_clk_p_o : out std_logic; -- Transmitter Source Synchronous Clock+ (freq set in GN4124 config registers)
l2p_clk_n_o : out std_logic; -- Transmitter Source Synchronous Clock- (freq set in GN4124 config registers)
l2p_data_o : out std_logic_vector(15 downto 0);-- Parallel transmit data
l2p_dframe_o : out std_logic; -- Transmit Data Frame
l2p_valid_o : out std_logic; -- Transmit Data Valid
l2p_edb_o : out std_logic; -- Packet termination and discard
l2p_rdy_i : in std_logic; -- Tx Buffer Full Flag
l_wr_rdy_i : in std_logic_vector(1 downto 0); -- Local-to-PCIe Write
p_rd_d_rdy_i : in std_logic_vector(1 downto 0); -- PCIe-to-Local Read Response Data Ready
tx_error_i : in std_logic; -- Transmit Error
irq_p_o : out std_logic; -- Interrupt request pulse to GN4124 GPIO 8
irq_aux_p_o : out std_logic; -- Interrupt request pulse to GN4124 GPIO 9, aux signal
-- Interface with the PLL AD9516 and DAC AD5662 on TDC mezzanine
pll_sclk_o : out std_logic; -- SPI clock
pll_sdi_o : out std_logic; -- data line for PLL and DAC
pll_cs_o : out std_logic; -- PLL chip select
pll_dac_sync_o : out std_logic; -- DAC chip select
pll_sdo_i : in std_logic; -- not used for the moment
pll_status_i : in std_logic; -- PLL Digital Lock Detect, active high
tdc_clk_125m_p_i : in std_logic; -- 125 MHz differential clock: system clock
tdc_clk_125m_n_i : in std_logic; -- 125 MHz differential clock: system clock
acam_refclk_p_i : in std_logic; -- 31.25 MHz differential clock: ACAM ref clock
acam_refclk_n_i : in std_logic; -- 31.25 MHz differential clock: ACAM ref clock
-- Timing interface with the ACAM on TDC mezzanine
start_from_fpga_o : out std_logic; -- start signal
err_flag_i : in std_logic; -- error flag
int_flag_i : in std_logic; -- interrupt flag
start_dis_o : out std_logic; -- start disable, not used
stop_dis_o : out std_logic; -- stop disable, not used
-- Data interface with the ACAM on TDC mezzanine
data_bus_io : inout std_logic_vector(27 downto 0);
address_o : out std_logic_vector(3 downto 0);
cs_n_o : out std_logic; -- chip select for ACAM
oe_n_o : out std_logic; -- output enable for ACAM
rd_n_o : out std_logic; -- read signal for ACAM
wr_n_o : out std_logic; -- write signal for ACAM
ef1_i : in std_logic; -- empty flag iFIFO1
ef2_i : in std_logic; -- empty flag iFIFO2
-- Enable of input Logic on TDC mezzanine
enable_inputs_o : out std_logic; -- enables all 5 inputs
term_en_1_o : out std_logic; -- Ch.1 termination enable of 50 Ohm termination
term_en_2_o : out std_logic; -- Ch.2 termination enable of 50 Ohm termination
term_en_3_o : out std_logic; -- Ch.3 termination enable of 50 Ohm termination
term_en_4_o : out std_logic; -- Ch.4 termination enable of 50 Ohm termination
term_en_5_o : out std_logic; -- Ch.5 termination enable of 50 Ohm termination
-- LEDs on TDC mezzanine
tdc_led_status_o : out std_logic; -- amber led on front pannel, division of 125 MHz tdc_clk
tdc_led_trig1_o : out std_logic; -- amber led on front pannel, Ch.1 enable
tdc_led_trig2_o : out std_logic; -- amber led on front pannel, Ch.2 enable
tdc_led_trig3_o : out std_logic; -- amber led on front pannel, Ch.3 enable
tdc_led_trig4_o : out std_logic; -- amber led on front pannel, Ch.4 enable
tdc_led_trig5_o : out std_logic; -- amber led on front pannel, Ch.5 enable
-- Input Logic on TDC mezzanine (not used currently)
tdc_in_fpga_1_i : in std_logic; -- Ch.1 for ACAM, also received by FPGA
tdc_in_fpga_2_i : in std_logic; -- Ch.2 for ACAM, also received by FPGA
tdc_in_fpga_3_i : in std_logic; -- Ch.3 for ACAM, also received by FPGA
tdc_in_fpga_4_i : in std_logic; -- Ch.4 for ACAM, also received by FPGA
tdc_in_fpga_5_i : in std_logic; -- Ch.5 for ACAM, also received by FPGA
-- I2C EEPROM interface on TDC mezzanine
mezz_sys_scl_b : inout std_logic := '1'; -- Mezzanine system EEPROM I2C clock
mezz_sys_sda_b : inout std_logic := '1'; -- Mezzanine system EEPROM I2C data
-- 1-wire interface on TDC mezzanine
mezz_one_wire_b : inout std_logic;
-- font panel leds
led_red : out std_logic;
led_green : out std_logic;
-- Carrier other signals
pcb_ver_i : in std_logic_vector(3 downto 0); -- PCB version
prsnt_m2c_n_i : in std_logic); -- Mezzanine presence (active low)
end spec_top_fmc_tdc;
--=================================================================================================
-- architecture declaration
--=================================================================================================
architecture rtl of spec_top_fmc_tdc is
---------------------------------------------------------------------------------------------------
-- SDB CONSTANTS --
---------------------------------------------------------------------------------------------------
-- Note: All address in sdb and crossbar are BYTE addresses!
-- Master ports on the wishbone crossbar
constant c_NUM_WB_MASTERS : integer := 5;
constant c_WB_SLAVE_SPEC_ONEWIRE: integer := 0; -- Carrier onewire interface
constant c_WB_SLAVE_SPEC_INFO : integer := 1; -- Info on SPEC control and status registers
constant c_WB_SLAVE_VIC : integer := 2; -- Interrupt controller
constant c_WB_SLAVE_TDC : integer := 3; -- TDC core configuration
constant c_SLAVE_WRCORE : integer := 4; -- White Rabbit PTP core
-- SDB header address
constant c_SDB_ADDRESS : t_wishbone_address := x"00000000";
-- Slave port on the wishbone crossbar
constant c_NUM_WB_SLAVES : integer := 1;
constant c_MASTER_GENNUM : integer := 0;
constant c_FMC_TDC_SDB_BRIDGE : t_sdb_bridge := f_xwb_bridge_manual_sdb(x"0001FFFF", x"00000000");
constant c_WRCORE_BRIDGE_SDB : t_sdb_bridge := f_xwb_bridge_manual_sdb(x"0003ffff", x"00000000");
constant c_INTERCONNECT_LAYOUT : t_sdb_record_array(6 downto 0) :=
(0 => f_sdb_embed_device (c_ONEWIRE_SDB_DEVICE, x"00010000"),
1 => f_sdb_embed_device (c_SPEC_INFO_SDB_DEVICE, x"00020000"),
2 => f_sdb_embed_device (c_xwb_vic_sdb, x"00030000"), -- c_xwb_vic_sdb described in the wishbone_pkg
3 => f_sdb_embed_bridge (c_FMC_TDC_SDB_BRIDGE, x"00040000"),
4 => f_sdb_embed_bridge (c_WRCORE_BRIDGE_SDB, x"00080000"),
5 => f_sdb_embed_repo_url (c_sdb_repo_url),
6 => f_sdb_embed_synthesis (c_sdb_synthesis_info));
---------------------------------------------------------------------------------------------------
-- VIC CONSTANT --
---------------------------------------------------------------------------------------------------
constant c_VIC_VECTOR_TABLE : t_wishbone_address_array(0 to 0) :=
(0 => x"00052000");
---------------------------------------------------------------------------------------------------
-- Signals --
---------------------------------------------------------------------------------------------------
-- WRabbit clocks
signal pllout_clk_sys, pllout_clk_dmtd : std_logic;
signal pllout_clk_fb_pllref, pllout_clk_fb_dmtd : std_logic;
signal clk_125m_pllref, clk_125m_gtp : std_logic;
signal clk_dmtd : std_logic;
attribute buffer_type : string; --" {bufgdll | ibufg | bufgp | ibuf | bufr | none}";
attribute buffer_type of clk_125m_pllref : signal is "BUFG";
-- TDC core clocks and resets
signal clk_20m_vcxo, clk_20m_vcxo_buf : std_logic;
signal clk_62m5_sys, clk_125m_mezz : std_logic;
signal rst_125m_mezz_n, rst_125m_mezz : std_logic;
signal acam_refclk_r_edge_p : std_logic;
signal rst_sys, rst_sys_n : std_logic;
-- DAC configuration through PCIe/VME
signal send_dac_word_p : std_logic;
signal dac_word : std_logic_vector(23 downto 0);
-- WISHBONE from crossbar master port
signal cnx_master_out : t_wishbone_master_out_array(c_NUM_WB_MASTERS-1 downto 0);
signal cnx_master_in : t_wishbone_master_in_array(c_NUM_WB_MASTERS-1 downto 0);
-- WISHBONE to crossbar slave port
signal cnx_slave_out : t_wishbone_slave_out_array(c_NUM_WB_SLAVES-1 downto 0);
signal cnx_slave_in : t_wishbone_slave_in_array(c_NUM_WB_SLAVES-1 downto 0);
signal tdc_slave_in : t_wishbone_slave_in;
signal tdc_slave_out : t_wishbone_slave_out;
signal gn_wb_adr : std_logic_vector(31 downto 0);
-- Carrier CSR info
signal gn4124_status : std_logic_vector(31 downto 0);
-- Carrier 1-wire
signal carrier_owr_en, carrier_owr_i : std_logic_vector(c_FMC_ONE_WIRE_NB - 1 downto 0);
-- VIC
signal fmc_eic_irq, irq_to_gn4124 : std_logic;
signal fmc_eic_irq_synch : std_logic_vector (1 downto 0);
-- WRabbit time
signal tm_link_up, tm_time_valid, tm_dac_wr_p : std_logic;
signal tm_utc : std_logic_vector(39 downto 0);
signal tm_cycles : std_logic_vector(27 downto 0);
signal tm_dac_value, tm_dac_value_reg : std_logic_vector(23 downto 0);
signal tm_clk_aux_lock_en, tm_clk_aux_locked : std_logic;
-- WRabbit PHY
signal phy_tx_data, phy_rx_data : std_logic_vector(7 downto 0);
signal phy_tx_k, phy_tx_disparity, phy_rx_k : std_logic;
signal phy_tx_enc_err, phy_rx_rbclk : std_logic;
signal phy_rx_enc_err, phy_rst, phy_loopen : std_logic;
signal phy_rx_bitslide : std_logic_vector(3 downto 0);
-- DAC configuration through WRabbit
signal dac_hpll_load_p1, dac_dpll_load_p1 : std_logic;
signal dac_hpll_data, dac_dpll_data : std_logic_vector(15 downto 0);
-- EEPROM on mezzanine
signal wrc_scl_out, wrc_scl_in, wrc_sda_out, wrc_sda_in: std_logic;
signal tdc_scl_out, tdc_scl_in, tdc_sda_out, tdc_sda_in: std_logic;
signal tdc_scl_oen, tdc_sda_oen : std_logic;
-- SFP EEPROM on mezzanine
signal sfp_scl_out, sfp_scl_in, sfp_sda_out, sfp_sda_in: std_logic;
-- Carrier 1-Wire
signal wrc_owr_en, wrc_owr_in : std_logic_vector(1 downto 0);
-- aux
signal pll_sclk, pll_sdi, pll_dac_sync : std_logic;
--=================================================================================================
-- architecture begin
--=================================================================================================
begin
---------------------------------------------------------------------------------------------------
-- 62.5 MHz system clock --
---------------------------------------------------------------------------------------------------
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
cmp_clk_vcxo_ibuf : IBUFG
port map
(O => clk_20m_vcxo_buf,
I => clk_20m_vcxo_i);
cmp_clk_vcxo_gbuf : BUFG
port map
(O => clk_20m_vcxo,
I => clk_20m_vcxo_buf);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
cmp_sys_clk_pll : PLL_BASE
generic map
(BANDWIDTH => "OPTIMIZED",
CLK_FEEDBACK => "CLKFBOUT",
COMPENSATION => "INTERNAL",
DIVCLK_DIVIDE => 1,
CLKFBOUT_MULT => 50,
CLKFBOUT_PHASE => 0.000,
CLKOUT0_DIVIDE => 16, -- 62.5 MHz
CLKOUT0_PHASE => 0.000,
CLKOUT0_DUTY_CYCLE => 0.500,
CLKOUT1_DIVIDE => 16, -- not used
CLKOUT1_PHASE => 0.000,
CLKOUT1_DUTY_CYCLE => 0.500,
CLKOUT2_DIVIDE => 16,
CLKOUT2_PHASE => 0.000,
CLKOUT2_DUTY_CYCLE => 0.500,
CLKIN_PERIOD => 50.0,
REF_JITTER => 0.016)
port map
(CLKFBOUT => pllout_clk_fb_pllref,
CLKOUT0 => pllout_clk_sys,
CLKOUT1 => open,
CLKOUT2 => open,
CLKOUT3 => open,
CLKOUT4 => open,
CLKOUT5 => open,
LOCKED => open,
RST => '0',
CLKFBIN => pllout_clk_fb_pllref,
CLKIN => clk_20m_vcxo);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
cmp_clk_sys_buf : BUFG
port map
(O => clk_62m5_sys,
I => pllout_clk_sys);
---------------------------------------------------------------------------------------------------
-- Reset for 62M5 clk domain --
---------------------------------------------------------------------------------------------------
U_Reset_Generator : spec_reset_gen
port map
(clk_sys_i => clk_62m5_sys,
rst_pcie_n_a_i => rst_n_a_i,
rst_button_n_a_i => button1_i,
rst_n_o => rst_sys_n);
-- -- -- -- -- -- -- -- -- --
rst_sys <= not rst_sys_n;
---------------------------------------------------------------------------------------------------
-- 125 MHz clk and Reset for TDC core --
---------------------------------------------------------------------------------------------------
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
cmp_tdc_clks_rsts_mgment : clks_rsts_manager
generic map
(nb_of_reg => 68)
port map
(clk_sys_i => clk_62m5_sys,
acam_refclk_p_i => acam_refclk_p_i,
acam_refclk_n_i => acam_refclk_n_i,
tdc_125m_clk_p_i => tdc_clk_125m_p_i,
tdc_125m_clk_n_i => tdc_clk_125m_n_i,
rst_n_i => rst_n_a_i,
pll_sdo_i => pll_sdo_i,
pll_status_i => pll_status_i,
send_dac_word_p_i => send_dac_word_p,
dac_word_i => dac_word,
acam_refclk_r_edge_p_o => acam_refclk_r_edge_p,
wrabbit_dac_value_i => tm_dac_value,
wrabbit_dac_wr_p_i => tm_dac_wr_p,
internal_rst_o => rst_125m_mezz,
pll_cs_n_o => pll_cs_o,
pll_dac_sync_n_o => pll_dac_sync,
pll_sdi_o => pll_sdi,
pll_sclk_o => pll_sclk,
tdc_125m_clk_o => clk_125m_mezz,
pll_status_o => open);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
rst_125m_mezz_n <= not rst_125m_mezz;
pll_dac_sync_o <= pll_dac_sync;
pll_sdi_o <= pll_sdi;
pll_sclk_o <= pll_sclk;
---------------------------------------------------------------------------------------------------
-- 62.5 MHz DMTD clock --
---------------------------------------------------------------------------------------------------
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
cmp_dmtd_clk_pll : PLL_BASE
generic map
(BANDWIDTH => "OPTIMIZED",
CLK_FEEDBACK => "CLKFBOUT",
COMPENSATION => "INTERNAL",
DIVCLK_DIVIDE => 1,
CLKFBOUT_MULT => 50,
CLKFBOUT_PHASE => 0.000,
CLKOUT0_DIVIDE => 16, -- 62.5 MHz
CLKOUT0_PHASE => 0.000,
CLKOUT0_DUTY_CYCLE => 0.500,
CLKOUT1_DIVIDE => 16, -- not used
CLKOUT1_PHASE => 0.000,
CLKOUT1_DUTY_CYCLE => 0.500,
CLKOUT2_DIVIDE => 8,
CLKOUT2_PHASE => 0.000,
CLKOUT2_DUTY_CYCLE => 0.500,
CLKIN_PERIOD => 50.0,
REF_JITTER => 0.016)
port map
(CLKFBOUT => pllout_clk_fb_dmtd,
CLKOUT0 => pllout_clk_dmtd,
CLKOUT1 => open,
CLKOUT2 => open,
CLKOUT3 => open,
CLKOUT4 => open,
CLKOUT5 => open,
LOCKED => open,
RST => '0',
CLKFBIN => pllout_clk_fb_dmtd,
CLKIN => clk_20m_vcxo_buf);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
cmp_clk_dmtd_buf : BUFG
port map
(O => clk_dmtd,
I => pllout_clk_dmtd);
---------------------------------------------------------------------------------------------------
-- 125 MHz clk for White Rabbit core --
---------------------------------------------------------------------------------------------------
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
U_Buf_CLK_PLL : IBUFGDS
generic map
(DIFF_TERM => true,
IBUF_LOW_PWR => true) -- Low power (TRUE) vs. performance (FALSE) setting for referenced
port map
(O => clk_125m_pllref, -- Buffer output
I => clk_125m_pllref_p_i, -- Diff_p buffer input (connect directly to top-level port)
IB => clk_125m_pllref_n_i); -- Diff_n buffer input (connect directly to top-level port)
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
U_Buf_CLK_GTP : IBUFDS
generic map
(DIFF_TERM => true,
IBUF_LOW_PWR => false)
port map
(O => clk_125m_gtp,
I => clk_125m_gtp_p_i,
IB => clk_125m_gtp_n_i);
---------------------------------------------------------------------------------------------------
-- White Rabbit Core + PHY --
---------------------------------------------------------------------------------------------------
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
U_WR_CORE : xwr_core
generic map
(g_simulation => 0,
g_phys_uart => true,
g_virtual_uart => true,
g_with_external_clock_input => false,
g_aux_clks => 1,
g_ep_rxbuf_size => 1024,
g_dpram_initf => "wrc.ram",
g_dpram_size => 90112/4,
g_interface_mode => PIPELINED,
g_address_granularity => BYTE,
g_softpll_enable_debugger => false)
port map
(clk_sys_i => clk_62m5_sys,
clk_dmtd_i => clk_dmtd,
clk_ref_i => clk_125m_pllref,
clk_aux_i(0) => clk_125m_mezz,
rst_n_i => rst_sys_n,
-- DAC
dac_hpll_load_p1_o => dac_hpll_load_p1,
dac_hpll_data_o => dac_hpll_data,
dac_dpll_load_p1_o => dac_dpll_load_p1,
dac_dpll_data_o => dac_dpll_data,
-- PHY
phy_ref_clk_i => clk_125m_pllref,
phy_tx_data_o => phy_tx_data,
phy_tx_k_o => phy_tx_k,
phy_tx_disparity_i => phy_tx_disparity,
phy_tx_enc_err_i => phy_tx_enc_err,
phy_rx_data_i => phy_rx_data,
phy_rx_rbclk_i => phy_rx_rbclk,
phy_rx_k_i => phy_rx_k,
phy_rx_enc_err_i => phy_rx_enc_err,
phy_rx_bitslide_i => phy_rx_bitslide,
phy_rst_o => phy_rst,
phy_loopen_o => phy_loopen,
-- SPEC LEDs
led_act_o => LED_RED,
led_link_o => LED_GREEN,
-- SFP
scl_o => wrc_scl_out,
scl_i => wrc_scl_in,
sda_o => wrc_sda_out,
sda_i => wrc_sda_in,
sfp_scl_o => sfp_scl_out,
sfp_scl_i => sfp_scl_in,
sfp_sda_o => sfp_sda_out,
sfp_sda_i => sfp_sda_in,
sfp_det_i => sfp_mod_def0_b,
uart_rxd_i => uart_rxd_i,
uart_txd_o => uart_txd_o,
-- 1-wire
owr_en_o => wrc_owr_en,
owr_i => wrc_owr_in,
-- WISHBONE
slave_i => cnx_master_out(c_SLAVE_WRCORE),
slave_o => cnx_master_in(c_SLAVE_WRCORE),
-- Timimg info for TDC core
tm_link_up_o => tm_link_up,
tm_dac_value_o => tm_dac_value,
tm_dac_wr_o(0) => tm_dac_wr_p,
tm_clk_aux_lock_en_i(0) => tm_clk_aux_lock_en,
tm_clk_aux_locked_o(0) => tm_clk_aux_locked,
tm_time_valid_o => tm_time_valid,
tm_tai_o => tm_utc,
tm_cycles_o => tm_cycles,
-- not used
btn1_i => '1',
btn2_i => '1',
pps_p_o => open,
-- aux reset
rst_aux_n_o => open);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
U_GTP : wr_gtp_phy_spartan6
generic map
(g_simulation => 0,
g_enable_ch0 => 0,
g_enable_ch1 => 1)
port map
(gtp_clk_i => clk_125m_gtp,
ch0_ref_clk_i => clk_125m_pllref,
ch0_tx_data_i => x"00",
ch0_tx_k_i => '0',
ch0_tx_disparity_o => open,
ch0_tx_enc_err_o => open,
ch0_rx_rbclk_o => open,
ch0_rx_data_o => open,
ch0_rx_k_o => open,
ch0_rx_enc_err_o => open,
ch0_rx_bitslide_o => open,
ch0_rst_i => '1',
ch0_loopen_i => '0',
ch1_ref_clk_i => clk_125m_pllref,
ch1_tx_data_i => phy_tx_data,
ch1_tx_k_i => phy_tx_k,
ch1_tx_disparity_o => phy_tx_disparity,
ch1_tx_enc_err_o => phy_tx_enc_err,
ch1_rx_data_o => phy_rx_data,
ch1_rx_rbclk_o => phy_rx_rbclk,
ch1_rx_k_o => phy_rx_k,
ch1_rx_enc_err_o => phy_rx_enc_err,
ch1_rx_bitslide_o => phy_rx_bitslide,
ch1_rst_i => phy_rst,
ch1_loopen_i => '0', -- phy_loopen,
pad_txn0_o => open,
pad_txp0_o => open,
pad_rxn0_i => '0',
pad_rxp0_i => '0',
pad_txn1_o => sfp_txn_o,
pad_txp1_o => sfp_txp_o,
pad_rxn1_i => sfp_rxn_i,
pad_rxp1_i => sfp_rxp_i);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
U_DAC_ARB : spec_serial_dac_arb
generic map
(g_invert_sclk => false,
g_num_extra_bits => 8)
port map
(clk_i => clk_62m5_sys,
rst_n_i => rst_sys_n,
val1_i => dac_dpll_data,
load1_i => dac_dpll_load_p1,
val2_i => dac_hpll_data,
load2_i => dac_hpll_load_p1,
dac_cs_n_o(0) => dac_cs1_n_o,
dac_cs_n_o(1) => dac_cs2_n_o,
-- dac_clr_n_o => open,
dac_sclk_o => dac_sclk_o,
dac_din_o => dac_din_o);
-- -- -- -- -- --
sfp_tx_disable_o <= '0';
-- dac_clr_n_o <= '1';
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Tristates for Carrier EEPROM
mezz_sys_scl_b <= '0' when (wrc_scl_out = '0') else 'Z';--tdc_scl_out when (tdc_scl_oen = '0') else '0' when (wrc_scl_out = '0') else 'Z';
mezz_sys_sda_b <= '0' when (wrc_sda_out = '0') else 'Z';--tdc_sda_out when (tdc_sda_oen = '0') else '0' when (wrc_sda_out = '0') else 'Z';
wrc_scl_in <= mezz_sys_scl_b;
wrc_sda_in <= mezz_sys_sda_b;
tdc_scl_in <= mezz_sys_scl_b;
tdc_sda_in <= mezz_sys_sda_b;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Tristates for SFP EEPROM
sfp_mod_def1_b <= '0' when sfp_scl_out = '0' else 'Z';
sfp_mod_def2_b <= '0' when sfp_sda_out = '0' else 'Z';
sfp_scl_in <= sfp_mod_def1_b;
sfp_sda_in <= sfp_mod_def2_b;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
carrier_onewire_b <= '0' when wrc_owr_en(0) = '1' else 'Z';
wrc_owr_in(0) <= carrier_onewire_b;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
---------------------------------------------------------------------------------------------------
-- CSR WISHBONE CROSSBAR --
---------------------------------------------------------------------------------------------------
-- 0x00000 -> SDB
-- 0x10000 -> Carrier 1-wire master
-- 0x20000 -> Carrier CSR information
-- 0x30000 -> Vector Interrupt Controller
-- 0x40000 -> TDC mezzanine SDB
-- 0x10000 -> TDC core configuration (including ACAM regs)
-- 0x11000 -> TDC Mezzanine 1-wire master
-- 0x12000 -> TDC Mezzanine Embedded Interrupt Controller
-- 0x13000 -> TDC Mezzanine I2C master
-- 0x14000 -> TDC core timestamps retrieval from memory
cmp_sdb_crossbar : xwb_sdb_crossbar
generic map
(g_num_masters => c_NUM_WB_SLAVES,
g_num_slaves => c_NUM_WB_MASTERS,
g_registered => true,
g_wraparound => true,
g_layout => c_INTERCONNECT_LAYOUT,
g_sdb_addr => c_SDB_ADDRESS)
port map
(clk_sys_i => clk_62m5_sys,
rst_n_i => rst_sys_n,
slave_i => cnx_slave_in,
slave_o => cnx_slave_out,
master_i => cnx_master_in,
master_o => cnx_master_out);
---------------------------------------------------------------------------------------------------
-- GN4124 CORE --
---------------------------------------------------------------------------------------------------
cmp_gn4124_core: gn4124_core
port map
(rst_n_a_i => rst_n_a_i,
status_o => gn4124_status,
-- P2L Direction Source Sync DDR related signals
p2l_clk_p_i => p2l_clk_p_i,
p2l_clk_n_i => p2l_clk_n_i,
p2l_data_i => p2l_data_i,
p2l_dframe_i => p2l_dframe_i,
p2l_valid_i => p2l_valid_i,
-- P2L Control
p2l_rdy_o => p2l_rdy_o,
p_wr_req_i => p_wr_req_i,
p_wr_rdy_o => p_wr_rdy_o,
rx_error_o => rx_error_o,
-- L2P Direction Source Sync DDR related signals
l2p_clk_p_o => l2p_clk_p_o,
l2p_clk_n_o => l2p_clk_n_o,
l2p_data_o => l2p_data_o ,
l2p_dframe_o => l2p_dframe_o,
l2p_valid_o => l2p_valid_o,
l2p_edb_o => l2p_edb_o,
-- L2P Control
l2p_rdy_i => l2p_rdy_i,
l_wr_rdy_i => l_wr_rdy_i,
p_rd_d_rdy_i => p_rd_d_rdy_i,
tx_error_i => tx_error_i,
vc_rdy_i => vc_rdy_i,
-- Interrupt interface
dma_irq_o => open,
irq_p_i => irq_to_gn4124,
irq_p_o => irq_p_o,
-- CSR WISHBONE interface (master pipelined)
csr_clk_i => clk_62m5_sys,
csr_adr_o => gn_wb_adr,
csr_dat_o => cnx_slave_in(c_MASTER_GENNUM).dat,
csr_sel_o => cnx_slave_in(c_MASTER_GENNUM).sel,
csr_stb_o => cnx_slave_in(c_MASTER_GENNUM).stb,
csr_we_o => cnx_slave_in(c_MASTER_GENNUM).we,
csr_cyc_o => cnx_slave_in(c_MASTER_GENNUM).cyc,
csr_dat_i => cnx_slave_out(c_MASTER_GENNUM).dat,
csr_ack_i => cnx_slave_out(c_MASTER_GENNUM).ack,
csr_stall_i => cnx_slave_out(c_MASTER_GENNUM).stall,
-- DMA: not used
dma_clk_i => clk_62m5_sys,
dma_adr_o => open,
dma_cyc_o => open,
dma_dat_o => open,
dma_sel_o => open,
dma_stb_o => open,
dma_we_o => open,
dma_ack_i => '1',
dma_dat_i => (others => '0'),
dma_stall_i => '0',
dma_reg_clk_i => clk_62m5_sys,
dma_reg_adr_i => (others => '0'),
dma_reg_dat_i => (others => '0'),
dma_reg_sel_i => (others => '0'),
dma_reg_stb_i => '0',
dma_reg_we_i => '0',
dma_reg_cyc_i => '0',
dma_reg_dat_o => open,
dma_reg_ack_o => open,
dma_reg_stall_o => open);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Convert 32-bit word address into byte address for crossbar
cnx_slave_in(c_MASTER_GENNUM).adr <= gn_wb_adr(29 downto 0) & "00";
---------------------------------------------------------------------------------------------------
-- TDC BOARD --
---------------------------------------------------------------------------------------------------
cmp_tdc_mezz : fmc_tdc_mezzanine
generic map
(g_span => g_span,
g_width => g_width,
values_for_simul => FALSE)
port map
-- 62M5 clk and reset
(clk_sys_i => clk_62m5_sys,
rst_sys_n_i => rst_sys_n,
-- 125M clk and reset
clk_ref_0_i => clk_125m_mezz,
rst_ref_0_i => rst_125m_mezz,
-- Configuration of the DAC on the TDC mezzanine, non White Rabbit
acam_refclk_r_edge_p_i => acam_refclk_r_edge_p,
send_dac_word_p_o => send_dac_word_p,
dac_word_o => dac_word,
-- ACAM interface
start_from_fpga_o => start_from_fpga_o,
err_flag_i => err_flag_i,
int_flag_i => int_flag_i,
start_dis_o => start_dis_o,
stop_dis_o => stop_dis_o,
data_bus_io => data_bus_io,
address_o => address_o,
cs_n_o => cs_n_o,
oe_n_o => oe_n_o,
rd_n_o => rd_n_o,
wr_n_o => wr_n_o,
ef1_i => ef1_i,
ef2_i => ef2_i,
-- Input channels enable
enable_inputs_o => enable_inputs_o,
term_en_1_o => term_en_1_o,
term_en_2_o => term_en_2_o,
term_en_3_o => term_en_3_o,
term_en_4_o => term_en_4_o,
term_en_5_o => term_en_5_o,
-- LEDs on TDC mezzanine
tdc_led_status_o => tdc_led_status_o,
tdc_led_trig1_o => tdc_led_trig1_o,
tdc_led_trig2_o => tdc_led_trig2_o,
tdc_led_trig3_o => tdc_led_trig3_o,
tdc_led_trig4_o => tdc_led_trig4_o,
tdc_led_trig5_o => tdc_led_trig5_o,
-- Input channels to FPGA (not used)
tdc_in_fpga_1_i => tdc_in_fpga_1_i,
tdc_in_fpga_2_i => tdc_in_fpga_2_i,
tdc_in_fpga_3_i => tdc_in_fpga_3_i,
tdc_in_fpga_4_i => tdc_in_fpga_4_i,
tdc_in_fpga_5_i => tdc_in_fpga_5_i,
-- WISHBONE interface with the GN4124 core
wb_tdc_csr_adr_i => tdc_slave_in.adr,
wb_tdc_csr_dat_i => tdc_slave_in.dat,
wb_tdc_csr_stb_i => tdc_slave_in.stb,
wb_tdc_csr_we_i => tdc_slave_in.we,
wb_tdc_csr_cyc_i => tdc_slave_in.cyc,
wb_tdc_csr_sel_i => tdc_slave_in.sel,
wb_tdc_csr_dat_o => tdc_slave_out.dat,
wb_tdc_csr_ack_o => tdc_slave_out.ack,
wb_tdc_csr_stall_o => tdc_slave_out.stall,
-- White Rabbit
wrabbit_link_up_i => tm_link_up,
wrabbit_time_valid_i => tm_time_valid,
wrabbit_cycles_i => tm_cycles,
wrabbit_utc_i => tm_utc(31 downto 0),
wrabbit_utc_p_o => open, -- for debug
wrabbit_clk_aux_lock_en_o => tm_clk_aux_lock_en,
wrabbit_clk_aux_locked_i => tm_clk_aux_locked,
wrabbit_clk_dmtd_locked_i => '1', -- FIXME: fan out real signal from the WRCore
wrabbit_dac_value_i => tm_dac_value_reg,
wrabbit_dac_wr_p_i => tm_dac_wr_p,
-- Interrupt line from EIC
wb_irq_o => fmc_eic_irq,
-- EEPROM I2C on TDC mezzanine
i2c_scl_oen_o => tdc_scl_oen,
i2c_scl_i => tdc_scl_in,
i2c_sda_oen_o => tdc_sda_oen,
i2c_sda_i => tdc_sda_in,
i2c_scl_o => tdc_scl_out,
i2c_sda_o => tdc_sda_out,
-- 1-Wire on TDC mezzanine
one_wire_b => mezz_one_wire_b);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Domains crossing: clk_125m_mezz <-> clk_62m5_sys
cmp_tdc_clk_crossing : xwb_clock_crossing
port map
(slave_clk_i => clk_62m5_sys, -- Slave control port: GNUM interface at 62.5 MHz
slave_rst_n_i => rst_sys_n,
slave_i => cnx_master_out(c_WB_SLAVE_TDC),
slave_o => cnx_master_in(c_WB_SLAVE_TDC),
master_clk_i => clk_125m_mezz, -- Master reader port: TDC core at 125 MHz
master_rst_n_i => rst_125m_mezz_n,
master_i => tdc_slave_out,
master_o => tdc_slave_in);
---------------------------------------------------------------------------------------------------
-- VIC --
---------------------------------------------------------------------------------------------------
cmp_vic : xwb_vic
generic map
(g_interface_mode => PIPELINED,
g_address_granularity => BYTE,
g_num_interrupts => 1,
g_init_vectors => c_VIC_VECTOR_TABLE)
port map
(clk_sys_i => clk_62m5_sys,
rst_n_i => rst_sys_n,
slave_i => cnx_master_out(c_WB_SLAVE_VIC),
slave_o => cnx_master_in(c_WB_SLAVE_VIC),
irqs_i(0) => fmc_eic_irq_synch(1),
irq_master_o => irq_to_gn4124);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Domains crossing: synchronization of the wb_ird_o from 125MHz to 62.5MHz
irq_pulse_synchronizer: process (clk_62m5_sys)
begin
if rising_edge (clk_62m5_sys) then
if rst_sys_n = '0' then
fmc_eic_irq_synch <= (others => '0');
else
fmc_eic_irq_synch <= fmc_eic_irq_synch(0) & fmc_eic_irq;
end if;
end if;
end process;
---------------------------------------------------------------------------------------------------
-- Carrier 1-wire MASTER DS18B20 (thermometer + unique ID) --
---------------------------------------------------------------------------------------------------
-- cmp_carrier_onewire : xwb_onewire_master
-- generic map
-- (g_interface_mode => CLASSIC,
-- g_address_granularity => BYTE,
-- g_num_ports => 1,
-- g_ow_btp_normal => "5.0",
-- g_ow_btp_overdrive => "1.0")
-- port map
-- (clk_sys_i => clk_62m5_sys,
-- rst_n_i => rst_sys_n,
-- slave_i => cnx_master_out(c_WB_SLAVE_SPEC_ONEWIRE),
-- slave_o => cnx_master_in(c_WB_SLAVE_SPEC_ONEWIRE),
-- desc_o => open,
-- owr_pwren_o => open,
-- owr_en_o => carrier_owr_en,
-- owr_i => carrier_owr_i);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- carrier_onewire_b <= '0' when carrier_owr_en(0) = '1' else 'Z';
-- carrier_owr_i(0) <= carrier_onewire_b;
---------------------------------------------------------------------------------------------------
-- Carrier CSR information --
---------------------------------------------------------------------------------------------------
-- Information on carrier type, mezzanine presence, pcb version
cmp_carrier_info : carrier_info
port map
(rst_n_i => rst_sys_n,
clk_sys_i => clk_62m5_sys,
wb_adr_i => cnx_master_out(c_WB_SLAVE_SPEC_INFO).adr(3 downto 2),
wb_dat_i => cnx_master_out(c_WB_SLAVE_SPEC_INFO).dat,
wb_dat_o => cnx_master_in(c_WB_SLAVE_SPEC_INFO).dat,
wb_cyc_i => cnx_master_out(c_WB_SLAVE_SPEC_INFO).cyc,
wb_sel_i => cnx_master_out(c_WB_SLAVE_SPEC_INFO).sel,
wb_stb_i => cnx_master_out(c_WB_SLAVE_SPEC_INFO).stb,
wb_we_i => cnx_master_out(c_WB_SLAVE_SPEC_INFO).we,
wb_ack_o => cnx_master_in(c_WB_SLAVE_SPEC_INFO).ack,
wb_stall_o => cnx_master_in(c_WB_SLAVE_SPEC_INFO).stall,
carrier_info_carrier_pcb_rev_i => pcb_ver_i,
carrier_info_carrier_reserved_i => (others => '0'),
carrier_info_carrier_type_i => c_CARRIER_TYPE,
carrier_info_stat_fmc_pres_i => prsnt_m2c_n_i,
carrier_info_stat_p2l_pll_lck_i => gn4124_status(0),
carrier_info_stat_sys_pll_lck_i => '0',
carrier_info_stat_ddr3_cal_done_i => '0',
carrier_info_stat_reserved_i => (others => '0'),
carrier_info_ctrl_led_green_o => open,
carrier_info_ctrl_led_red_o => open,
carrier_info_ctrl_dac_clr_n_o => open,
carrier_info_ctrl_reserved_o => open,
carrier_info_rst_fmc0_n_o => open,
carrier_info_rst_fmc0_n_i => '1',
carrier_info_rst_fmc0_n_load_o => open,
carrier_info_rst_reserved_o => open);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Unused wishbone signals
cnx_master_in(c_WB_SLAVE_SPEC_INFO).err <= '0';
cnx_master_in(c_WB_SLAVE_SPEC_INFO).rty <= '0';
cnx_master_in(c_WB_SLAVE_SPEC_INFO).int <= '0';
end rtl;
----------------------------------------------------------------------------------------------------
-- architecture ends
----------------------------------------------------------------------------------------------------
\ No newline at end of file
-------------------------------------------------------------------------------
-- Title : Fine Delay FMC SPEC (Simple PCIe FMC Carrier) SDB descriptor
-- Project : Fine Delay FMC (fmc-delay-1ns-4cha)
-------------------------------------------------------------------------------
-- File : synthesis_descriptor.vhd
-- Author : Evangelia Gousiou
-- Company : CERN
-- Created : 2013-04-16
-- Last update: 2013-04-16
-- Platform : FPGA-generic
-- Standard : VHDL'93
-------------------------------------------------------------------------------
-- Description: SDB descriptor for the top level of the FD on a SPEC carrier.
-- Contains synthesis & source repository information.
-- Warning: this file is modified whenever a synthesis is executed.
-------------------------------------------------------------------------------
--
-- Copyright (c) 2013 CERN / BE-CO-HT
--
-- This source file is free software; you can redistribute it
-- and/or modify it under the terms of the GNU Lesser General
-- Public License as published by the Free Software Foundation;
-- either version 2.1 of the License, or (at your option) any
-- later version.
--
-- This source is distributed in the hope that it will be
-- useful, but WITHOUT ANY WARRANTY; without even the implied
-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-- PURPOSE. See the GNU Lesser General Public License for more
-- details.
--
-- You should have received a copy of the GNU Lesser General
-- Public License along with this source; if not, download it
-- from http://www.gnu.org/licenses/lgpl-2.1.html
--
-------------------------------------------------------------------------------
library ieee;
use ieee.STD_LOGIC_1164.all;
use work.wishbone_pkg.all;
package synthesis_descriptor is
constant c_sdb_synthesis_info : t_sdb_synthesis :=
(
syn_module_name => "tdc-spec ",
syn_commit_id => "00000000000000000000000000000000",
syn_tool_name => "ISE ",
syn_tool_version => x"00000134",
syn_date => x"00000000",
syn_username => "egousiou ");
constant c_sdb_repo_url : t_sdb_repo_url :=
(
repo_url => "http://svn.ohwr.org/fmc-tdc "
);
end package synthesis_descriptor;
--_________________________________________________________________________________________________
-- |
-- |TDC core| |
-- |
-- CERN,BE/CO-HT |
--________________________________________________________________________________________________|
---------------------------------------------------------------------------------------------------
-- |
-- tdc_core_pkg |
-- |
---------------------------------------------------------------------------------------------------
-- File tdc_core_pkg.vhd |
-- |
-- Description Package containing core wide constants and components |
-- |
-- |
-- Authors Gonzalo Penacoba (Gonzalo.Penacoba@cern.ch) |
-- Evangelia Gousiou (Evangelia.Gousiou@cern.ch) |
-- Date 04/2012 |
-- Version v0.2 |
-- Depends on |
-- |
---------------- |
-- Last changes |
-- 07/2011 v0.1 GP First version |
-- 04/2012 v0.2 EG Revamping; Gathering of all the constants, declarations of all the |
-- units; Comments added, signals renamed |
-- |
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE |
-- ------------------------------------ |
-- This source file is free software; you can redistribute it and/or modify it under the terms of |
-- the GNU Lesser General Public License as published by the Free Software Foundation; either |
-- version 2.1 of the License, or (at your option) any later version. |
-- This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
-- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
-- See the GNU Lesser General Public License for more details. |
-- You should have received a copy of the GNU Lesser General Public License along with this |
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html |
---------------------------------------------------------------------------------------------------
--=================================================================================================
-- Libraries & Packages
--=================================================================================================
library IEEE;
use IEEE.STD_LOGIC_1164.all; -- std_logic definitions
use IEEE.NUMERIC_STD.all; -- conversion functions
use work.wishbone_pkg.all;
use work.gencores_pkg.all;
--=================================================================================================
-- Package declaration for tdc_core_pkg
--=================================================================================================
package tdc_core_pkg is
---------------------------------------------------------------------------------------------------
-- Constant regarding the Mezzanine DAC configuration --
---------------------------------------------------------------------------------------------------
-- Vout = Vref (DAC_WORD/ 65536); for Vout = 1.65V, with Vref = 2.5V the DAC_WORD = xA8F5
constant c_DEFAULT_DAC_WORD : std_logic_vector(23 downto 0) := x"00A8F5";
---------------------------------------------------------------------------------------------------
-- Constants regarding the SDB Devices Definitions --
---------------------------------------------------------------------------------------------------
-- Note: All address in sdb and crossbar are BYTE addresses!
-- Devices sdb description
constant c_ONEWIRE_SDB_DEVICE : t_sdb_device :=
(abi_class => x"0000", -- undocumented device
abi_ver_major => x"01",
abi_ver_minor => x"01",
wbd_endian => c_sdb_endian_big,
wbd_width => x"4", -- 32-bit port granularity
sdb_component =>
(addr_first => x"0000000000000000",
addr_last => x"0000000000000007",
product =>
(vendor_id => x"000000000000CE42", -- CERN
device_id => x"00000602", -- "WB-Onewire.Control " | md5sum | cut -c1-8
version => x"00000001",
date => x"20121116",
name => "WB-Onewire.Control ")));
constant c_SPEC_INFO_SDB_DEVICE : t_sdb_device :=
(abi_class => x"0000", -- undocumented device
abi_ver_major => x"01",
abi_ver_minor => x"01",
wbd_endian => c_sdb_endian_big,
wbd_width => x"4", -- 32-bit port granularity
sdb_component =>
(addr_first => x"0000000000000000",
addr_last => x"000000000000001F",
product =>
(vendor_id => x"000000000000CE42", -- CERN
device_id => x"00000603", -- "WB-SPEC.CSR " | md5sum | cut -c1-8
version => x"00000001",
date => x"20121116",
name => "WB-SPEC.CSR ")));
constant c_TDC_EIC_DEVICE : t_sdb_device :=
(abi_class => x"0000", -- undocumented device
abi_ver_major => x"01",
abi_ver_minor => x"01",
wbd_endian => c_sdb_endian_big,
wbd_width => x"4", -- 32-bit port granularity
sdb_component =>
(addr_first => x"0000000000000000",
addr_last => x"000000000000000F",
product =>
(vendor_id => x"000000000000CE42", -- CERN
device_id => x"00000605", -- "WB-FMC-ADC.EIC " | md5sum | cut -c1-8
version => x"00000001",
date => x"20121116",
name => "WB-FMC-TDC.EIC ")));
constant c_I2C_SDB_DEVICE : t_sdb_device :=
(abi_class => x"0000", -- undocumented device
abi_ver_major => x"01",
abi_ver_minor => x"01",
wbd_endian => c_sdb_endian_big,
wbd_width => x"4", -- 32-bit port granularity
sdb_component =>
(addr_first => x"0000000000000000",
addr_last => x"000000000000001F",
product =>
(vendor_id => x"000000000000CE42", -- CERN
device_id => x"00000606", -- "WB-I2C.Control " | md5sum | cut -c1-8
version => x"00000001",
date => x"20121116",
name => "WB-I2C.Control ")));
constant c_TDC_EIC_SDB : t_sdb_device := (
abi_class => x"0000", -- undocumented device
abi_ver_major => x"01",
abi_ver_minor => x"01",
wbd_endian => c_sdb_endian_big,
wbd_width => x"4", -- 32-bit port granularity
sdb_component => (
addr_first => x"0000000000000000",
addr_last => x"000000000000000F",
product => (
vendor_id => x"000000000000CE42", -- CERN
device_id => x"26ec6086", -- "WB-FMC-TDC.EIC " | md5sum | cut -c1-8
version => x"00000001",
date => x"20131204",
name => "WB-FMC-TDC.EIC ")));
constant c_TDC_CONFIG_SDB_DEVICE : t_sdb_device :=
(abi_class => x"0000", -- undocumented device
abi_ver_major => x"01",
abi_ver_minor => x"01",
wbd_endian => c_sdb_endian_big,
wbd_width => x"4", -- 32-bit port granularity
sdb_component =>
(addr_first => x"0000000000000000",
addr_last => x"00000000000000FF",
product =>
(vendor_id => x"000000000000CE42", -- CERN
device_id => x"00000604", -- "WB-TDC-Core-Config " | md5sum | cut -c1-8
version => x"00000001",
date => x"20130429",
name => "WB-TDC-Core-Config ")));
constant c_TDC_MEM_SDB_DEVICE : t_sdb_device :=
(abi_class => x"0000", -- undocumented device
abi_ver_major => x"01",
abi_ver_minor => x"01",
wbd_endian => c_sdb_endian_big,
wbd_width => x"4", -- 32-bit port granularity
sdb_component =>
(addr_first => x"0000000000000000",
addr_last => x"0000000000000FFF",
product =>
(vendor_id => x"000000000000CE42", -- CERN
device_id => x"00000601", -- "WB-TDC-Mem " | md5sum | cut -c1-8
version => x"00000001",
date => x"20121116",
name => "WB-TDC-Mem ")));
---------------------------------------------------------------------------------------------------
-- Constants regarding 1 Hz pulse generation --
---------------------------------------------------------------------------------------------------
-- for synthesis: 1 sec = x"07735940" clk_i cycles (1 clk_i cycle = 8ns)
constant c_SYN_CLK_PERIOD : std_logic_vector(31 downto 0) := x"07735940";
-- for simulation: 1 msec = x"0001E848" clk_i cycles (1 clk_i cycle = 8ns)
constant c_SIM_CLK_PERIOD : std_logic_vector(31 downto 0) := x"0001E848";
---------------------------------------------------------------------------------------------------
-- Vector with the 11 ACAM Configuration Registers --
---------------------------------------------------------------------------------------------------
subtype config_register is std_logic_vector(31 downto 0);
type config_vector is array (10 downto 0) of config_register;
---------------------------------------------------------------------------------------------------
-- Constants regarding addressing of the ACAM registers --
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- Addresses of ACAM configuration registers to be written by the PCIe host
-- corresponds to:
constant c_ACAM_REG0_ADR : std_logic_vector(7 downto 0) := x"00"; -- address 0x51000 of GN4124 BAR 0
constant c_ACAM_REG1_ADR : std_logic_vector(7 downto 0) := x"01"; -- address 0x51004 of GN4124 BAR 0
constant c_ACAM_REG2_ADR : std_logic_vector(7 downto 0) := x"02"; -- address 0x51008 of GN4124 BAR 0
constant c_ACAM_REG3_ADR : std_logic_vector(7 downto 0) := x"03"; -- address 0x5100C of GN4124 BAR 0
constant c_ACAM_REG4_ADR : std_logic_vector(7 downto 0) := x"04"; -- address 0x51010 of GN4124 BAR 0
constant c_ACAM_REG5_ADR : std_logic_vector(7 downto 0) := x"05"; -- address 0x51014 of GN4124 BAR 0
constant c_ACAM_REG6_ADR : std_logic_vector(7 downto 0) := x"06"; -- address 0x51018 of GN4124 BAR 0
constant c_ACAM_REG7_ADR : std_logic_vector(7 downto 0) := x"07"; -- address 0x5101C of GN4124 BAR 0
constant c_ACAM_REG11_ADR : std_logic_vector(7 downto 0) := x"0B"; -- address 0x5102C of GN4124 BAR 0
constant c_ACAM_REG12_ADR : std_logic_vector(7 downto 0) := x"0C"; -- address 0x51030 of GN4124 BAR 0
constant c_ACAM_REG14_ADR : std_logic_vector(7 downto 0) := x"0E"; -- address 0x51038 of GN4124 BAR 0
---------------------------------------------------------------------------------------------------
-- Addresses of ACAM read-only registers, to be written by the ACAM and used within the core to access ACAM timestamps
constant c_ACAM_REG8_ADR : std_logic_vector(7 downto 0) := x"08"; -- not accessible for writing from PCI-e
constant c_ACAM_REG9_ADR : std_logic_vector(7 downto 0) := x"09"; -- not accessible for writing from PCI-e
constant c_ACAM_REG10_ADR : std_logic_vector(7 downto 0) := x"0A"; -- not accessible for writing from PCI-e
---------------------------------------------------------------------------------------------------
-- Addresses of ACAM configuration readback registers, to be written by the ACAM
-- corresponds to:
constant c_ACAM_REG0_RDBK_ADR : std_logic_vector(7 downto 0) := x"10"; -- address 0x51040 of the GN4124 BAR 0
constant c_ACAM_REG1_RDBK_ADR : std_logic_vector(7 downto 0) := x"11"; -- address 0x51044 of the GN4124 BAR 0
constant c_ACAM_REG2_RDBK_ADR : std_logic_vector(7 downto 0) := x"12"; -- address 0x51048 of the GN4124 BAR 0
constant c_ACAM_REG3_RDBK_ADR : std_logic_vector(7 downto 0) := x"13"; -- address 0x5104C of the GN4124 BAR 0
constant c_ACAM_REG4_RDBK_ADR : std_logic_vector(7 downto 0) := x"14"; -- address 0x51050 of the GN4124 BAR 0
constant c_ACAM_REG5_RDBK_ADR : std_logic_vector(7 downto 0) := x"15"; -- address 0x51054 of the GN4124 BAR 0
constant c_ACAM_REG6_RDBK_ADR : std_logic_vector(7 downto 0) := x"16"; -- address 0x51058 of the GN4124 BAR 0
constant c_ACAM_REG7_RDBK_ADR : std_logic_vector(7 downto 0) := x"17"; -- address 0x5105C of the GN4124 BAR 0
constant c_ACAM_REG8_RDBK_ADR : std_logic_vector(7 downto 0) := x"18"; -- address 0x51060 of the GN4124 BAR 0
constant c_ACAM_REG9_RDBK_ADR : std_logic_vector(7 downto 0) := x"19"; -- address 0x51064 of the GN4124 BAR 0
constant c_ACAM_REG10_RDBK_ADR : std_logic_vector(7 downto 0) := x"1A"; -- address 0x51068 of the GN4124 BAR 0
constant c_ACAM_REG11_RDBK_ADR : std_logic_vector(7 downto 0) := x"1B"; -- address 0x5106C of the GN4124 BAR 0
constant c_ACAM_REG12_RDBK_ADR : std_logic_vector(7 downto 0) := x"1C"; -- address 0x51070 of the GN4124 BAR 0
constant c_ACAM_REG14_RDBK_ADR : std_logic_vector(7 downto 0) := x"1E"; -- address 0x51078 of the GN4124 BAR 0
---------------------------------------------------------------------------------------------------
-- Constants regarding addressing of the TDC core registers --
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- Addresses of TDC core Configuration registers to be written by the PCIe host
-- corresponds to:
constant c_STARTING_UTC_ADR : std_logic_vector(7 downto 0) := x"20"; -- address 0x51080 of GN4124 BAR 0
constant c_ACAM_INPUTS_EN_ADR : std_logic_vector(7 downto 0) := x"21"; -- address 0x51084 of GN4124 BAR 0
constant c_START_PHASE_ADR : std_logic_vector(7 downto 0) := x"22"; -- address 0x51088 of GN4124 BAR 0
constant c_ONE_HZ_PHASE_ADR : std_logic_vector(7 downto 0) := x"23"; -- address 0x5108C of GN4124 BAR 0
constant c_IRQ_TSTAMP_THRESH_ADR: std_logic_vector(7 downto 0) := x"24"; -- address 0x51090 of GN4124 BAR 0
constant c_IRQ_TIME_THRESH_ADR : std_logic_vector(7 downto 0) := x"25"; -- address 0x51094 of GN4124 BAR 0
constant c_DAC_WORD_ADR : std_logic_vector(7 downto 0) := x"26"; -- address 0x51098 of GN4124 BAR 0
constant c_DEACT_CHAN_ADR : std_logic_vector(7 downto 0) := x"27"; -- address 0x5109C of GN4124 BAR 0
---------------------------------------------------------------------------------------------------
-- Addresses of TDC core Status registers to be written by the different core units
-- corresponds to:
constant c_LOCAL_UTC_ADR : std_logic_vector(7 downto 0) := x"28"; -- address 0x510A0 of GN4124 BAR 0
constant c_IRQ_CODE_ADR : std_logic_vector(7 downto 0) := x"29"; -- address 0x510A4 of GN4124 BAR 0
constant c_WR_INDEX_ADR : std_logic_vector(7 downto 0) := x"2A"; -- address 0x510A8 of GN4124 BAR 0
constant c_CORE_STATUS_ADR : std_logic_vector(7 downto 0) := x"2B"; -- address 0x510AC of GN4124 BAR 0
---------------------------------------------------------------------------------------------------
-- Addresses of the White Rabbit control and status registers
constant c_WRABBIT_STATUS_ADR : std_logic_vector(7 downto 0) := x"2C"; -- address 0x510B0 of GN4124 BAR 0
constant c_WRABBIT_CTRL_ADR : std_logic_vector(7 downto 0) := x"2D"; -- address 0x510B4 of GN4124 BAR 0
---------------------------------------------------------------------------------------------------
-- Address of TDC core Control register
-- corresponds to:
constant c_CTRL_REG_ADR : std_logic_vector(7 downto 0) := x"3F"; -- address 0x510FC of GN4124 BAR 0
---------------------------------------------------------------------------------------------------
-- Constants regarding ACAM retriggers --
---------------------------------------------------------------------------------------------------
-- Number of clk_i cycles corresponding to the Acam retrigger period;
-- through Acam Reg 4 StartTimer the chip is programmed to retrigger every:
-- (15+1) * acam_ref_clk = (15+1) * 32 ns
-- x"00000040" * clk_i = 64 * 8 ns
-- 512 ns
constant c_ACAM_RETRIG_PERIOD : std_logic_vector(31 downto 0) := x"00000040";
-- Used to multiply by 64, which is the retrigger period in clk_i cycles
constant c_ACAM_RETRIG_PERIOD_SHIFT : integer := 6;
---------------------------------------------------------------------------------------------------
-- Constants regarding TDC & SPEC LEDs --
---------------------------------------------------------------------------------------------------
constant c_SPEC_LED_PERIOD_SIM : std_logic_vector(31 downto 0) := x"00004E20"; -- 1 ms at 20 MHz
constant c_SPEC_LED_PERIOD_SYN : std_logic_vector(31 downto 0) := x"01312D00"; -- 1 s at 20 MHz
constant c_BLINK_LGTH_SYN : std_logic_vector(31 downto 0) := x"00BEBC20"; -- 100 ms at 125 MHz
constant c_BLINK_LGTH_SIM : std_logic_vector(31 downto 0) := x"000004E2"; -- 10 us at 125 MHz
--c_RESET_WORD
---------------------------------------------------------------------------------------------------
-- Constants regarding the Circular Buffer --
---------------------------------------------------------------------------------------------------
constant c_CIRCULAR_BUFF_SIZE : unsigned(31 downto 0) := x"00000100";
---------------------------------------------------------------------------------------------------
-- Constants regarding the One-Wire interface --
---------------------------------------------------------------------------------------------------
constant c_FMC_ONEWIRE_NB : integer := 1;
---------------------------------------------------------------------------------------------------
-- Constants regarding the Carrier CSR info --
---------------------------------------------------------------------------------------------------
constant c_CARRIER_TYPE : std_logic_vector(15 downto 0) := X"0001";
---------------------------------------------------------------------------------------------------
-- Components Declarations --
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
component fmc_tdc_mezzanine is
generic
(g_with_wrabbit_core : boolean := TRUE;
g_span : integer := 32;
g_width : integer := 32;
values_for_simul : boolean := FALSE);
port
-- TDC core
(
-- System clock & reset (Wishbone)
clk_sys_i : in std_logic; -- 62.5 MHz clock
rst_sys_n_i : in std_logic; -- reset for 62.5 MHz logic
-- TDC 125 MHz reference & Reset (FMC)
clk_tdc_i : in std_logic; -- 125 MHz clock
rst_tdc_i : in std_logic; -- reset for 125 MHz logic
-- WISHBONE interface with the GN4124/VME_core (clk_sys)
-- for the core configuration | timestamps retrieval | core interrupts | 1Wire | I2C
slave_i: in t_wishbone_slave_in;
slave_o: out t_wishbone_slave_out;
wb_irq_o : out std_logic;
acam_refclk_r_edge_p_i : in std_logic;
send_dac_word_p_o : out std_logic;
dac_word_o : out std_logic_vector(23 downto 0);
-- Interface with ACAM
start_from_fpga_o : out std_logic;
err_flag_i : in std_logic;
int_flag_i : in std_logic;
start_dis_o : out std_logic;
stop_dis_o : out std_logic;
data_bus_io : inout std_logic_vector(27 downto 0);
address_o : out std_logic_vector(3 downto 0);
cs_n_o : out std_logic;
oe_n_o : out std_logic;
rd_n_o : out std_logic;
wr_n_o : out std_logic;
ef1_i : in std_logic;
ef2_i : in std_logic;
-- Channels termination
enable_inputs_o : out std_logic;
term_en_1_o : out std_logic;
term_en_2_o : out std_logic;
term_en_3_o : out std_logic;
term_en_4_o : out std_logic;
term_en_5_o : out std_logic;
-- TDC board LEDs
tdc_led_status_o : out std_logic;
tdc_led_trig1_o : out std_logic;
tdc_led_trig2_o : out std_logic;
tdc_led_trig3_o : out std_logic;
tdc_led_trig4_o : out std_logic;
tdc_led_trig5_o : out std_logic;
-- Input pulses arriving also to the FPGA, currently not treated
tdc_in_fpga_1_i : in std_logic;
tdc_in_fpga_2_i : in std_logic;
tdc_in_fpga_3_i : in std_logic;
tdc_in_fpga_4_i : in std_logic;
tdc_in_fpga_5_i : in std_logic;
-- White Rabbit core
wrabbit_link_up_i : in std_logic;
wrabbit_time_valid_i : in std_logic;
wrabbit_cycles_i : in std_logic_vector(27 downto 0);
wrabbit_utc_i : in std_logic_vector(31 downto 0);
wrabbit_clk_aux_lock_en_o : out std_logic;
wrabbit_clk_aux_locked_i : in std_logic;
wrabbit_clk_dmtd_locked_i : in std_logic;
wrabbit_dac_value_i : in std_logic_vector(23 downto 0);
wrabbit_dac_wr_p_i : in std_logic;
-- I2C EEPROM interface
i2c_scl_o : out std_logic;
i2c_scl_oen_o : out std_logic;
i2c_scl_i : in std_logic;
i2c_sda_oen_o : out std_logic;
i2c_sda_o : out std_logic;
i2c_sda_i : in std_logic;
-- 1-Wire interface
onewire_b : inout std_logic;
direct_timestamp_o : out std_logic_vector(127 downto 0);
direct_timestamp_stb_o : out std_logic
);
end component;
---------------------------------------------------------------------------------------------------
component fmc_tdc_core is
generic
(g_span : integer := 32;
g_width : integer := 32;
values_for_simul : boolean := FALSE);
port (
clk_sys_i : in std_logic;
rst_n_sys_i : in std_logic;
clk_tdc_i : in std_logic;
rst_tdc_i : in std_logic;
acam_refclk_r_edge_p_i : in std_logic;
send_dac_word_p_o : out std_logic;
dac_word_o : out std_logic_vector(23 downto 0);
start_from_fpga_o : out std_logic;
err_flag_i : in std_logic;
int_flag_i : in std_logic;
start_dis_o : out std_logic;
stop_dis_o : out std_logic;
data_bus_io : inout std_logic_vector(27 downto 0);
address_o : out std_logic_vector(3 downto 0);
cs_n_o : out std_logic;
oe_n_o : out std_logic;
rd_n_o : out std_logic;
wr_n_o : out std_logic;
ef1_i : in std_logic;
ef2_i : in std_logic;
enable_inputs_o : out std_logic;
term_en_1_o : out std_logic;
term_en_2_o : out std_logic;
term_en_3_o : out std_logic;
term_en_4_o : out std_logic;
term_en_5_o : out std_logic;
tdc_led_status_o : out std_logic;
tdc_led_trig1_o : out std_logic;
tdc_led_trig2_o : out std_logic;
tdc_led_trig3_o : out std_logic;
tdc_led_trig4_o : out std_logic;
tdc_led_trig5_o : out std_logic;
tdc_in_fpga_1_i : in std_logic;
tdc_in_fpga_2_i : in std_logic;
tdc_in_fpga_3_i : in std_logic;
tdc_in_fpga_4_i : in std_logic;
tdc_in_fpga_5_i : in std_logic;
irq_tstamp_p_o : out std_logic;
irq_time_p_o : out std_logic;
irq_acam_err_p_o : out std_logic;
wrabbit_status_reg_i : in std_logic_vector(g_width-1 downto 0);
wrabbit_ctrl_reg_o : out std_logic_vector(g_width-1 downto 0);
wrabbit_synched_i : in std_logic;
wrabbit_tai_p_i : in std_logic;
wrabbit_tai_i : in std_logic_vector(31 downto 0);
cfg_slave_i : in t_wishbone_slave_in;
cfg_slave_o : out t_wishbone_slave_out;
mem_slave_i : in t_wishbone_slave_in;
mem_slave_o : out t_wishbone_slave_out;
direct_timestamp_o : out std_logic_vector(127 downto 0);
direct_timestamp_stb_o : out std_logic);
end component fmc_tdc_core;
---------------------------------------------------------------------------------------------------
component wrabbit_sync is
generic
(g_simulation : boolean;
g_with_wrabbit_core : boolean);
port
(clk_sys_i : in std_logic;
rst_n_sys_i : in std_logic;
clk_ref_i : in std_logic;
rst_n_ref_i : in std_logic;
wrabbit_dac_value_i : in std_logic_vector(23 downto 0);
wrabbit_dac_wr_p_i : in std_logic;
wrabbit_link_up_i : in std_logic;
wrabbit_time_valid_i : in std_logic; -- this is i te clk_ref_0 domain, no??
wrabbit_clk_aux_lock_en_o : out std_logic;
wrabbit_clk_aux_locked_i : in std_logic;
wrabbit_clk_dmtd_locked_i : in std_logic;
wrabbit_synched_o : out std_logic;
wrabbit_reg_i : in std_logic_vector(31 downto 0);
wrabbit_reg_o : out std_logic_vector(31 downto 0));
end component;
---------------------------------------------------------------------------------------------------
component decr_counter
generic
(width : integer := 32);
port
(clk_i : in std_logic;
rst_i : in std_logic;
counter_load_i : in std_logic;
counter_top_i : in std_logic_vector(width-1 downto 0);
-------------------------------------------------------------
counter_is_zero_o : out std_logic;
counter_o : out std_logic_vector(width-1 downto 0));
-------------------------------------------------------------
end component;
---------------------------------------------------------------------------------------------------
component free_counter is
generic
(width : integer := 32);
port
(clk_i : in std_logic;
counter_en_i : in std_logic;
rst_i : in std_logic;
counter_top_i : in std_logic_vector(width-1 downto 0);
-------------------------------------------------------------
counter_is_zero_o : out std_logic;
counter_o : out std_logic_vector(width-1 downto 0));
-------------------------------------------------------------
end component;
---------------------------------------------------------------------------------------------------
component incr_counter
generic
(width : integer := 32);
port
(clk_i : in std_logic;
counter_top_i : in std_logic_vector(width-1 downto 0);
counter_incr_en_i : in std_logic;
rst_i : in std_logic;
-------------------------------------------------------------
counter_is_full_o : out std_logic;
counter_o : out std_logic_vector(width-1 downto 0));
-------------------------------------------------------------
end component;
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
component start_retrig_ctrl
generic
(g_width : integer := 32);
port
(clk_i : in std_logic;
rst_i : in std_logic;
acam_intflag_f_edge_p_i : in std_logic;
utc_p_i : in std_logic;
----------------------------------------------------------------------
current_retrig_nb_o : out std_logic_vector(g_width-1 downto 0);
roll_over_incr_recent_o : out std_logic;
clk_i_cycles_offset_o : out std_logic_vector(g_width-1 downto 0);
roll_over_nb_o : out std_logic_vector(g_width-1 downto 0);
retrig_nb_offset_o : out std_logic_vector(g_width-1 downto 0));
----------------------------------------------------------------------
end component;
---------------------------------------------------------------------------------------------------
component local_pps_gen
generic
(g_width : integer := 32);
port
(acam_refclk_r_edge_p_i : in std_logic;
clk_i : in std_logic;
clk_period_i : in std_logic_vector(g_width-1 downto 0);
load_utc_p_i : in std_logic;
pulse_delay_i : in std_logic_vector(g_width-1 downto 0);
rst_i : in std_logic;
starting_utc_i : in std_logic_vector(g_width-1 downto 0);
----------------------------------------------------------------------
local_utc_o : out std_logic_vector(g_width-1 downto 0);
local_utc_p_o : out std_logic);
----------------------------------------------------------------------
end component;
---------------------------------------------------------------------------------------------------
component data_engine
port
(acam_ack_i : in std_logic;
acam_dat_i : in std_logic_vector(31 downto 0);
clk_i : in std_logic;
rst_i : in std_logic;
acam_ef1_i : in std_logic;
acam_ef1_meta_i : in std_logic;
acam_ef2_i : in std_logic;
acam_ef2_meta_i : in std_logic;
activate_acq_p_i : in std_logic;
deactivate_acq_p_i : in std_logic;
acam_wr_config_p_i : in std_logic;
acam_rdbk_config_p_i : in std_logic;
acam_rdbk_status_p_i : in std_logic;
acam_rdbk_ififo1_p_i : in std_logic;
acam_rdbk_ififo2_p_i : in std_logic;
acam_rdbk_start01_p_i : in std_logic;
acam_rst_p_i : in std_logic;
acam_config_i : in config_vector;
start_from_fpga_i : in std_logic;
----------------------------------------------------------------------
state_active_p_o : out std_logic;
acam_adr_o : out std_logic_vector(7 downto 0);
acam_cyc_o : out std_logic;
acam_dat_o : out std_logic_vector(31 downto 0);
acam_stb_o : out std_logic;
acam_we_o : out std_logic;
acam_config_rdbk_o : out config_vector;
acam_ififo1_o : out std_logic_vector(31 downto 0);
acam_ififo2_o : out std_logic_vector(31 downto 0);
acam_start01_o : out std_logic_vector(31 downto 0);
acam_tstamp1_o : out std_logic_vector(31 downto 0);
acam_tstamp1_ok_p_o : out std_logic;
acam_tstamp2_o : out std_logic_vector(31 downto 0);
acam_tstamp2_ok_p_o : out std_logic);
----------------------------------------------------------------------
end component;
---------------------------------------------------------------------------------------------------
component reg_ctrl
generic
(g_span : integer := 32;
g_width : integer := 32);
port
(clk_sys_i : in std_logic;
rst_n_sys_i : in std_logic; -- global reset, synched to clk_sys_i
clk_tdc_i : in std_logic;
rst_tdc_i : in std_logic;
slave_i: in t_wishbone_slave_in; -- WB interface (clk_sys domain)
slave_o: out t_wishbone_slave_out;
acam_config_rdbk_i : in config_vector;
acam_ififo1_i : in std_logic_vector(g_width-1 downto 0);
acam_ififo2_i : in std_logic_vector(g_width-1 downto 0);
acam_start01_i : in std_logic_vector(g_width-1 downto 0);
local_utc_i : in std_logic_vector(g_width-1 downto 0);
irq_code_i : in std_logic_vector(g_width-1 downto 0);
wr_index_i : in std_logic_vector(g_width-1 downto 0);
core_status_i : in std_logic_vector(g_width-1 downto 0);
wrabbit_status_reg_i : in std_logic_vector(g_width-1 downto 0);
----------------------------------------------------------------------
activate_acq_p_o : out std_logic;
deactivate_acq_p_o : out std_logic;
deactivate_chan_o : out std_logic_vector(4 downto 0);
acam_wr_config_p_o : out std_logic;
acam_rdbk_config_p_o : out std_logic;
acam_rdbk_status_p_o : out std_logic;
acam_rdbk_ififo1_p_o : out std_logic;
acam_rdbk_ififo2_p_o : out std_logic;
acam_rdbk_start01_p_o : out std_logic;
acam_rst_p_o : out std_logic;
load_utc_p_o : out std_logic;
irq_tstamp_threshold_o : out std_logic_vector(g_width-1 downto 0);
irq_time_threshold_o : out std_logic_vector(g_width-1 downto 0);
send_dac_word_p_o : out std_logic;
dac_word_o : out std_logic_vector(23 downto 0);
dacapo_c_rst_p_o : out std_logic;
acam_config_o : out config_vector;
starting_utc_o : out std_logic_vector(g_width-1 downto 0);
acam_inputs_en_o : out std_logic_vector(g_width-1 downto 0);
start_phase_o : out std_logic_vector(g_width-1 downto 0);
one_hz_phase_o : out std_logic_vector(g_width-1 downto 0);
wrabbit_ctrl_reg_o : out std_logic_vector(g_width-1 downto 0));
----------------------------------------------------------------------
end component;
---------------------------------------------------------------------------------------------------
component acam_timecontrol_interface
port
(err_flag_i : in std_logic;
int_flag_i : in std_logic;
acam_refclk_r_edge_p_i : in std_logic;
utc_p_i : in std_logic;
clk_i : in std_logic;
activate_acq_p_i : in std_logic;
rst_i : in std_logic;
state_active_p_i : in std_logic;
deactivate_acq_p_i : in std_logic;
----------------------------------------------------------------------
start_from_fpga_o : out std_logic;
stop_dis_o : out std_logic;
acam_errflag_r_edge_p_o : out std_logic;
acam_errflag_f_edge_p_o : out std_logic;
acam_intflag_f_edge_p_o : out std_logic);
----------------------------------------------------------------------
end component;
---------------------------------------------------------------------------------------------------
component data_formatting
port
(tstamp_wr_wb_ack_i : in std_logic;
tstamp_wr_dat_i : in std_logic_vector(127 downto 0);
acam_tstamp1_i : in std_logic_vector(31 downto 0);
acam_tstamp1_ok_p_i : in std_logic;
acam_tstamp2_i : in std_logic_vector(31 downto 0);
acam_tstamp2_ok_p_i : in std_logic;
clk_i : in std_logic;
dacapo_c_rst_p_i : in std_logic;
deactivate_chan_i : in std_logic_vector(4 downto 0);
rst_i : in std_logic;
roll_over_incr_recent_i : in std_logic;
clk_i_cycles_offset_i : in std_logic_vector(31 downto 0);
roll_over_nb_i : in std_logic_vector(31 downto 0);
utc_i : in std_logic_vector(31 downto 0);
retrig_nb_offset_i : in std_logic_vector(31 downto 0);
utc_p_i : in std_logic;
----------------------------------------------------------------------
tstamp_wr_wb_adr_o : out std_logic_vector(7 downto 0);
tstamp_wr_wb_cyc_o : out std_logic;
tstamp_wr_dat_o : out std_logic_vector(127 downto 0);
tstamp_wr_wb_stb_o : out std_logic;
tstamp_wr_wb_we_o : out std_logic;
tstamp_wr_p_o : out std_logic;
acam_channel_o : out std_logic_vector(2 downto 0);
wr_index_o : out std_logic_vector(31 downto 0));
----------------------------------------------------------------------
end component;
---------------------------------------------------------------------------------------------------
component irq_generator is
generic
(g_width : integer := 32);
port
(clk_i : in std_logic;
rst_i : in std_logic;
irq_tstamp_threshold_i : in std_logic_vector(g_width-1 downto 0);
irq_time_threshold_i : in std_logic_vector(g_width-1 downto 0);
activate_acq_p_i : in std_logic;
deactivate_acq_p_i : in std_logic;
tstamp_wr_p_i : in std_logic;
acam_errflag_r_edge_p_i : in std_logic;
----------------------------------------------------------------------
irq_tstamp_p_o : out std_logic;
irq_acam_err_p_o : out std_logic;
irq_time_p_o : out std_logic);
----------------------------------------------------------------------
end component;
---------------------------------------------------------------------------------------------------
component tdc_eic
port
(rst_n_i : in std_logic;
clk_sys_i : in std_logic;
wb_adr_i : in std_logic_vector(1 downto 0);
wb_dat_i : in std_logic_vector(31 downto 0);
wb_dat_o : out std_logic_vector(31 downto 0);
wb_cyc_i : in std_logic;
wb_sel_i : in std_logic_vector(3 downto 0);
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_ack_o : out std_logic;
wb_stall_o : out std_logic;
wb_int_o : out std_logic;
irq_tdc_tstamps_i : in std_logic;
irq_tdc_time_i : in std_logic;
irq_tdc_acam_err_i : in std_logic);
end component tdc_eic;
---------------------------------------------------------------------------------------------------
component clks_rsts_manager
generic
(nb_of_reg : integer := 68);
port
(clk_sys_i : in std_logic;
acam_refclk_p_i : in std_logic;
acam_refclk_n_i : in std_logic;
tdc_125m_clk_p_i : in std_logic;
tdc_125m_clk_n_i : in std_logic;
rst_n_i : in std_logic;
pll_status_i : in std_logic;
pll_sdo_i : in std_logic;
send_dac_word_p_i : in std_logic;
dac_word_i : in std_logic_vector(23 downto 0);
wrabbit_dac_wr_p_i : in std_logic;
wrabbit_dac_value_i : in std_logic_vector(23 downto 0);
----------------------------------------------------------------------
tdc_125m_clk_o : out std_logic;
internal_rst_o : out std_logic;
acam_refclk_r_edge_p_o : out std_logic;
pll_cs_n_o : out std_logic;
pll_dac_sync_n_o : out std_logic;
pll_sdi_o : out std_logic;
pll_sclk_o : out std_logic;
pll_status_o : out std_logic);
----------------------------------------------------------------------
end component;
---------------------------------------------------------------------------------------------------
component carrier_info
port
(rst_n_i : in std_logic;
clk_sys_i : in std_logic;
wb_adr_i : in std_logic_vector(1 downto 0);
wb_dat_i : in std_logic_vector(31 downto 0);
wb_dat_o : out std_logic_vector(31 downto 0);
wb_cyc_i : in std_logic;
wb_sel_i : in std_logic_vector(3 downto 0);
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_ack_o : out std_logic;
wb_stall_o : out std_logic;
carrier_info_carrier_pcb_rev_i : in std_logic_vector(3 downto 0);
carrier_info_carrier_reserved_i : in std_logic_vector(11 downto 0);
carrier_info_carrier_type_i : in std_logic_vector(15 downto 0);
carrier_info_stat_fmc_pres_i : in std_logic;
carrier_info_stat_p2l_pll_lck_i : in std_logic;
carrier_info_stat_sys_pll_lck_i : in std_logic;
carrier_info_stat_ddr3_cal_done_i : in std_logic;
carrier_info_stat_reserved_i : in std_logic_vector(27 downto 0);
carrier_info_ctrl_led_green_o : out std_logic;
carrier_info_ctrl_led_red_o : out std_logic;
carrier_info_ctrl_dac_clr_n_o : out std_logic;
carrier_info_ctrl_reserved_o : out std_logic_vector(28 downto 0);
carrier_info_rst_fmc0_n_o : out std_logic;
carrier_info_rst_fmc0_n_i : in std_logic;
carrier_info_rst_fmc0_n_load_o : out std_logic;
carrier_info_rst_reserved_o : out std_logic_vector(30 downto 0));
end component carrier_info;
---------------------------------------------------------------------------------------------------
component leds_manager is
generic
(g_width : integer := 32;
values_for_simul : boolean := FALSE);
port
(clk_i : in std_logic;
rst_i : in std_logic;
utc_p_i : in std_logic;
acam_inputs_en_i : in std_logic_vector(g_width-1 downto 0);
acam_channel_i : in std_logic_vector(5 downto 0);
tstamp_wr_p_i : in std_logic;
----------------------------------------------------------------------
tdc_led_status_o : out std_logic;
tdc_led_trig1_o : out std_logic;
tdc_led_trig2_o : out std_logic;
tdc_led_trig3_o : out std_logic;
tdc_led_trig4_o : out std_logic;
tdc_led_trig5_o : out std_logic);
----------------------------------------------------------------------
end component;
---------------------------------------------------------------------------------------------------
component acam_databus_interface
port
(ef1_i : in std_logic;
ef2_i : in std_logic;
data_bus_io : inout std_logic_vector(27 downto 0);
clk_i : in std_logic;
rst_i : in std_logic;
adr_i : in std_logic_vector(7 downto 0);
cyc_i : in std_logic;
dat_i : in std_logic_vector(31 downto 0);
stb_i : in std_logic;
we_i : in std_logic;
----------------------------------------------------------------------
adr_o : out std_logic_vector(3 downto 0);
cs_n_o : out std_logic;
oe_n_o : out std_logic;
rd_n_o : out std_logic;
wr_n_o : out std_logic;
ack_o : out std_logic;
ef1_o : out std_logic;
ef1_meta_o : out std_logic;
ef2_o : out std_logic;
ef2_meta_o : out std_logic;
dat_o : out std_logic_vector(31 downto 0));
----------------------------------------------------------------------
end component;
---------------------------------------------------------------------------------------------------
component circular_buffer
port
(
clk_tdc_i : in std_logic; -- 125 MHz clock; same for both port
clk_sys_i : in std_logic;
tstamp_wr_rst_i : in std_logic;
tstamp_wr_stb_i : in std_logic;
tstamp_wr_cyc_i : in std_logic;
tstamp_wr_we_i : in std_logic;
tstamp_wr_adr_i : in std_logic_vector(7 downto 0);
tstamp_wr_dat_i : in std_logic_vector(127 downto 0);
tdc_mem_wb_rst_i : in std_logic;
tdc_mem_wb_stb_i : in std_logic;
tdc_mem_wb_cyc_i : in std_logic;
tdc_mem_wb_we_i : in std_logic;
tdc_mem_wb_adr_i : in std_logic_vector(31 downto 0);
tdc_mem_wb_dat_i : in std_logic_vector(31 downto 0);
--------------------------------------------------
tstamp_wr_ack_p_o : out std_logic;
tstamp_wr_dat_o : out std_logic_vector(127 downto 0);
tdc_mem_wb_ack_o : out std_logic;
tdc_mem_wb_dat_o : out std_logic_vector(31 downto 0);
tdc_mem_wb_stall_o : out std_logic);
--------------------------------------------------
end component;
---------------------------------------------------------------------------------------------------
component blk_mem_circ_buff_v6_4
port
(clka : in std_logic;
addra : in std_logic_vector(7 downto 0);
dina : in std_logic_vector(127 downto 0);
ena : in std_logic;
wea : in std_logic_vector(0 downto 0);
clkb : in std_logic;
addrb : in std_logic_vector(9 downto 0);
dinb : in std_logic_vector(31 downto 0);
enb : in std_logic;
web : in std_logic_vector(0 downto 0);
--------------------------------------------------
douta : out std_logic_vector(127 downto 0);
doutb : out std_logic_vector(31 downto 0));
--------------------------------------------------
end component;
component fmc_tdc_wrapper is
generic (
g_simulation : boolean);
port (
clk_sys_i : in std_logic;
rst_sys_n_i : in std_logic;
rst_n_a_i : in std_logic;
pll_sclk_o : out std_logic;
pll_sdi_o : out std_logic;
pll_cs_o : out std_logic;
pll_dac_sync_o : out std_logic;
pll_sdo_i : in std_logic;
pll_status_i : in std_logic;
tdc_clk_125m_p_i : in std_logic;
tdc_clk_125m_n_i : in std_logic;
acam_refclk_p_i : in std_logic;
acam_refclk_n_i : in std_logic;
start_from_fpga_o : out std_logic;
err_flag_i : in std_logic;
int_flag_i : in std_logic;
start_dis_o : out std_logic;
stop_dis_o : out std_logic;
data_bus_io : inout std_logic_vector(27 downto 0);
address_o : out std_logic_vector(3 downto 0);
cs_n_o : out std_logic;
oe_n_o : out std_logic;
rd_n_o : out std_logic;
wr_n_o : out std_logic;
ef1_i : in std_logic;
ef2_i : in std_logic;
enable_inputs_o : out std_logic;
term_en_1_o : out std_logic;
term_en_2_o : out std_logic;
term_en_3_o : out std_logic;
term_en_4_o : out std_logic;
term_en_5_o : out std_logic;
tdc_led_status_o : out std_logic;
tdc_led_trig1_o : out std_logic;
tdc_led_trig2_o : out std_logic;
tdc_led_trig3_o : out std_logic;
tdc_led_trig4_o : out std_logic;
tdc_led_trig5_o : out std_logic;
tdc_in_fpga_1_i : in std_logic;
tdc_in_fpga_2_i : in std_logic;
tdc_in_fpga_3_i : in std_logic;
tdc_in_fpga_4_i : in std_logic;
tdc_in_fpga_5_i : in std_logic;
mezz_scl_b : inout std_logic;
mezz_sda_b : inout std_logic;
mezz_one_wire_b : inout std_logic;
tm_link_up_i : in std_logic;
tm_time_valid_i : in std_logic;
tm_cycles_i : in std_logic_vector(27 downto 0);
tm_tai_i : in std_logic_vector(39 downto 0);
tm_clk_aux_lock_en_o : out std_logic;
tm_clk_aux_locked_i : in std_logic;
tm_clk_dmtd_locked_i : in std_logic;
tm_dac_value_i : in std_logic_vector(23 downto 0);
tm_dac_wr_i : in std_logic;
slave_i : in t_wishbone_slave_in;
slave_o : out t_wishbone_slave_out;
direct_slave_i : in t_wishbone_slave_in;
direct_slave_o : out t_wishbone_slave_out;
irq_o : out std_logic;
clk_125m_tdc_o : out std_logic);
end component fmc_tdc_wrapper;
end tdc_core_pkg;
--=================================================================================================
-- package body
--=================================================================================================
package body tdc_core_pkg is
end tdc_core_pkg;
--=================================================================================================
-- package end
--=================================================================================================
---------------------------------------------------------------------------------------------------
-- E N D O F F I L E
---------------------------------------------------------------------------------------------------
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment