From 30364d271166fd7359ff88d4b4fc22d63395ed9d Mon Sep 17 00:00:00 2001 From: pwpiwi Date: Mon, 9 Mar 2015 20:01:37 +0100 Subject: [PATCH] fix: broken edge detector implementation in hi_iso14443a.v resulted in decreased sensitivity --- fpga/fpga_hf.bit | Bin 42175 -> 42175 bytes fpga/hi_iso14443a.v | 63 ++++++++++++++++++++------------------------ 2 files changed, 29 insertions(+), 34 deletions(-) diff --git a/fpga/fpga_hf.bit b/fpga/fpga_hf.bit index 4910e6ac50d6e3cb405bacee3eef47de443b0147..20fb2bd4401254d899d6273451bfccbd827f562b 100644 GIT binary patch literal 42175 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 literal 42175 zcmeIbe{@{cl_t9D+$(XVDygnzJ4+3QT$O|=oRUQ^T2 zj636G1l@0j=(PJEQD_~_{e0iQ zTlc?h_EO{>be%M zNZzpGh9vz7(eA#B`1!$iKK1z|$q*4;kql+||3)%og-G_aC&}S|llS|&B;k4G-=QSg zl%clIQIpA!f6I?9)h~XJJ|XS5yuy9#zDN8XeVTq(AKiV=@72ft9WT<=@7^^jOU+bE zA&JJ7)Ktj{dL!iPjjPja7J%{c9+1ci$tLXVN<)F;Kb+)r)JmZW$k zq~7Dq-$PGOhZ8<566Rx8%rS~hr}0EM_^W9>%kQE2r|CRFo^CBcXJcJXV^QNLA8?{Y zZ9-S?DTNLj7pbQ$Iz4xmF32A2J8hQm#6e>QL&cA6?s4DqsFsjtsms~M@A*Gynfo4# z`;65jTzQJ3-Pk+E@(9Qif`mo!CN>a$N;PW?HLm5N!Q8ufm-8Wv3xBoV2`9x2wite_ zmDkWg*zF_t^je&7Z)Moj!hHH2>QdT0VHPTVB;^~AtKV3Yo*WC3=&)G=_ zDKTpFi3M~YS;vjOrkC*K1}EGno_FWjq3^PUS%YQ1ccA5M!@80LC9ODQM%;M_Je_EBSAo1`yOmmSS(BkpHOeLc2T zhke@)(MEeqv6T&ZnxwrHv%`5&B9q_KT+_yVoN&JJTEZT)>+@m~PqHHF z?A!9SI_(WvYwAofiYJyGHfbcpuc1Q?SvrJyj!MnaXQ<0;l&z=i83=|aZ)j@WcU(Qm zGG}g|m^(=qs3!tZC+W;^ie-MawvXS_T%-DABh%rf=+m8!gI-1S;+mhf2} z^9(60ZjjrM9Tb-0S$FJ44NI7?<7TgJ?v;s*VG0P3Ct*{Jxcb#Re>ac4H~o!)1U)7@ zRvURt6wesu=a{<|g?YPKW?PAIR;02CGt3jNKqE*W7s~+8$DUrbUK^ zGVPAr#~p=3YJRfwMrn`|r!i8SBqjl4Pn2h4%w6~4`2{)wQKN@6o5o<`;svdnEda~x zeU_wCc+%})nF?a2AHU*pd3{Q*eud2G5L?K|IW0-g;LqDjc+YdL&2&~LdA<4}I@@O> zxu{jo*&R*;%d?HOsVGXe$$ezadQ0^wiWudF5>8zKeKwhHpR#`GJc^?m@|brXSDgh= z=%H}{E|?sNHTA9IE-Hy zMFF#M34Y0V{tF3x5GKXN3sS)0;g_xO3-++T)uMl*)X7G+&j%q740Q#+cw90%rm1m_ z-0s?WEZimdl^TMcCd8Ov^WKUzHJ4$=@E(iD?&4RXX#Az<6kAG5Ggzk6^rY-$Agkb) z+ELBBZ;jDl$eO?sU|fZTJgzc+g%o~G$NyB!?HzKiEdT;s`~oOc@C#_w&7YpgI+O%# zT><oIW&FC@#jh)-!?X6qd{5|u7#AZokE*~OznnVwBw~=-=r(svd52fySGSB7=Emto zI*3Lq<5x-o$S%RJKVlO%8(Lw)#JTu|hL2yaoo~o%yKA2=G}*4rw3gXe!D{@<#&^W7 zqfPd*EX?vG?X|IyF2%3(^(Vz&(Y^K;R;xab84J0Ok6+62XPWP*pD*sUHy#B9039rA zEp~4JzhIxKL23mWrxk3LA+xcJ4Rsm6{=k(PcK%g5D{u5<2BJauD*WofDCS;k9HnJm zpIq177*`d3CE~`STZQ<#+{Lg3M6+W_09iGD^%|Lhc}@4mciXPaz+5G>(q$LFU7Q9eFF>V0lUS#jrViWKp!8!hK*|!ensw?`=B_M-@6{L^)me? zx40Au;1~O}%JP@!oRvxg0#4IeOFi-Mi`bu+J*C8$mJ-j&|FqjUtNi&MMl{F8_hIE9 zwo4-;7MMfSGSmQh>;vW(N5glC*IXPV+Nor&TPd39Uh}$t$g#|iR^gZB`iJtPu=669 zx12g2JA4ucMrO>#oniR=z$V#H47W9%un!~+mifGZO<;Y`vK^CzC-4s&*>yY{gDb*) zusYnw$1mmK%gBq`QhI~-%Wc!Gv%qd;TO8ZNuZ_U3&Vn&2x{R;WGKQ_w#-VIy6@Dq7 ze{}ioEA_(PQOr^{^Cl1D%J>!GHI>blFd*FSEQSN0#2r@|zZy33xSR-SI^cJobY<3+ z%w_!g16SrwXYRBy8~Tw0GdN2M$SU|%^CqtsMbg^W=wj@~sR!QFuA%Ydjl5ny|9S;z zwL%*C@R#VxWXrMo*?|t3%U1KRQCb3-p(zj^TdQuFNLV>r`RYFZ+RgZ0FmeMtQ8A~! zcx!@kXkZe`_%-Jh8*7n_EC(E46w90kidtjun6WIqEr4G|;Ma#`ClBX5{g9Vw)|lPd zGl>EE{A)Ob_Y@=huG@poz^_AC)8m=033T@HD-JQfbjm0WZlouv)xitb)ALd-oR432 zXuqBiM)xfdB{M`Frvb{!s{;7d1jF5F88fwiOb7EVlULm%zDEC5{z(Z9AHQ@PYf8|{ zt@M`Yb3nVs>qaOk1N`giN6d?KGj*PUw{cPb3nzL;o3(#KJrfw0k6-L-r3mPdp!1oo zvB-XH4;(WXkN|$=?Sq&fXg3r;UU=R}ZeBq5(nAyu;Mcbxb9)g83-B$pOvS%af23|e zUR&4_z^|j&haJ+0^O~}ok%X@`DBBpseg5@#K&zfYoWKfx z$r)N9I){J-P^(aX~T7?2j?O z*yQYDeo@W8CX8?BZ7>C};Y`;0Gk4l`m*JPOy=jQ{+SbSF%z9n)$C-Zx@#_%tT<|ZN zmR)A_{=pV|tkA`XR>rTZ--f6+_eIxg00k$t=Jvey0$sR-e~rSc1b$6`cAb@7c4QO_ z_jITWG6(VNBy~_+iUJ*)un4eaK`#`L`S>*n4>kc5t_S!+RHI3(#uHCwAHTjs9q2RQ z&JUn%wcJFpOn`sQ|9KW(?wyf&EDv=7w!-Uqo^4>0k6+)zue#IG{2<0fhizc@?)tZ! zR9_Ik9>T6mHAmzhVt#ZrEf$R_{z*~bL=r6zq*a@Gk*O!?`NxJwEk|fAol?MiG%&@@h`@&pD^xB)n7wz6&6o5 z%ntSp90Ps@`PUw(a0)IKOu=~rq~<{Q^}<`(%kk@jCHTfEx|jq1nz`a@_HX3;(pKPC znSbrn6(3ZzO987`Fm*80;xzOLpMNR*>J6(tCWEh7U_43Jal_+Z9)7J2x2dti@knyR zuucNVeEzkE^}P=~7xoZvlPDrk_JqA`n*CMRCjovL=;OHK3ZaqIPU|yvY7{o18o%sl zX|Nmb+2??#biTviUso&qqNoi!@44}p z;}`r5tLN#&XXoB+yo(KR+nXR_7vz#G2zb(6FODBRxwdl>*tE!aT!Jc|LF|G72!51B z3cJ1dp=0E09oiS#Si<%jQo@52$K3cvIeuvDs4YmmCk+Vb;69^xPtsirdk(f1$E(H37-=>T5NvE?^!LL1`^K#!5{N8Mi z=|Dpf6LkXf0|RU77TgxazZkaC3$=AakB2%aG7bB@1%2Q#cDZYT_@Np_+O$F#SAs%G z(xGv?9b=bRUXE`70-TmfW487a1_N31J-r{G`(;bXn1Tml^JgJ`i1#E%6Q&5+Z&LSY zLsE-Co@GwL8ua4Dw#&a>xc!WFhW>(Xwi&;KTDVepqBhI#;rQVb$>dBV-xN211!i== zrgMaWcW;1y?O)RJ(_Ei0%>#P79!?I-qkm-IFIyEq9Dsx;?`xt1vb_-gN`1<@U$&RR z8$>XE7_yvre1PnIYgKSKYJE#~OopuresTN|u(kfGIK6W;)ekW~OvhzPhD!nbq8a-L zVolmBXrxF}_+@fLQSTHfYB(#*SDG zh*(FTvAqhv3`ITGTaOu5ra6CQJNL<;Pmq7vg`?r^0KF5`y`fz;M%rdSW+l?bgqUxuJ{eK#>Q_PWFTm(L?fdeqOl9>v;)lSmEaZv1 z`V|NNI&Xk&6<56h%uTI}nhelPST5mTUB()@WnF&8T0xNk0R2h$Q4vS0cl9e?!?4vl z0ByQHcf^S??OFtq9+UM2QSa(Sob}7L^66wOZSHr5OZ7`dBYjI+4!ov%SHE2T_0Un{ z?fQAFXcJfViEit!>{h3KJpj>$T9C`XlBM_t?GqqkHx)Y8hOeZTPP^*dO@`K=CPRh9g z{7ZU>7Q`>vQvfUJre|{dr9J^u`7AgGBHOfD?XiA+BONL&oCyCVtX6-%Rbv0l(0z10 z8Pmcl#}5&jHam`mlbaV(4vMy@AST785U_xqE}O^2@%bWwxsVVd2N$c}5~H+<7CG?H zM2Nc(DgKo@ikW9M@1jPw3G9bQOpUY*cPRkBX6Z)YSL-zNtA`pKP^!1lh)z`EhqI*O zy(dAFe?v=3+d#X-bE8;6G+e!K%s1@K1IT~vX!;T%Y{+S^U(pt;g9C}BG8T-pAH_0{ z!%)W^;MbVVPvBI%0;7)~2l};{0Dlr;x+gH4tBU*{JVCs!%)jQ3V|8GSu>=6A6=;0! z=djP+m&6a>6^dOlPP5&9Z4dIz-YqSO_~rA3L8{?#d*d;5|P78bf^JK1M6Wzbus|c*)>sJp4m1|0U_`^jA`$mEvC| z#1EfUPaw08U!!1}2_1%;!8glm`kcjU3jfgOU&F9SsX}yEiv!3I2LSDoFH*OJpHSgn z&9fq9M2}*N0&@wlu#)TzU}}vsGGW5_$nIE?juOR+Phr^$Y0x=AX)RU#;Wgm;Nm~aWWiJHWS7(DWdc+^s64mvw~mB z9`1oXe9JYA*THJ8aMlF*mkzWlxwg*k;NeUZtzZv(VV~2AQoWjaLWkuq2Kbll_JPejq^mxY{8z+%%KF9T0>iN|u6;-$ zg_E&SLKJHyjAs@9QeHO)UOYR7Q4oZ8D){Ak?@DF}KOF*3f$l)&samz?o%!HjCRX`u z>_txJ)kjCLUcZv)T!|kxgMVc^#$eT_tZh!m$HNbRH>rw_>in0T7{RU^mxCsJby7x8 zElN3lShGj+*zuk*0oc0pwyoehYBqfQqMA1pw@MVXU&<3Am5dtTO}}KTj&YUw*AevL z;b`YE9O#!+1H^1p;)etu(%d)I0338q7+pqW`@=B!*Z`3Let{;-7^BrMXck~m2^P6#^}eP z3c+_*Vh$+(@Wrpz&4B&3`eFxi+&>zp?5SICLrcz8t(9zf}Ctj^wpT z@ry#2-SD6WpPv`E8o%s>oz4rma}G$>PR~AT`6~P}I#$=^W0T3hwPSa}n6nLE2-K_K z*AVTs6BBjw#Lvu-Ze?yW@j?LEtw4v7kj3-N^&2xX1q1R1v4}3>_{>AtOq;8r_|1DvDICjcUwqWcYeyRG6Zl32+`YCmNBFa41 zo98KAjXh4#9e3tW)0t4}PhI}yJ~{5%Ues?ezUx3Mrlnm?AlL4i-d@2k9sJAgEP!@> zh`v7XFn~-<(QDKp;V~ZPSw@XV%^KQoB??fhsD*H7DIC~i9)4LN;Fr;E!?XG@4c39e z^bNd398rXa=EdjZh#$TKxQWkb*N9QMIP2!W7}4(0jtli!%)idXud%nygkR?Yk}~+e zq|{M3w|@P`%fPSJLSja{NEc-5B;0sdNCvVQZKA@zUZ9q=aW~ZJQM)y-6wT8wAHNO* zzgnDJU+qgEYY*8*rlNx$er3VG@>ohE+4PLuAF}ezMn%6)mhtPqGd*!4)7rBVcHUew z03c&K27UjfyQa*)&Y;HQ_M&!*-n3Kmu(kX?0sOk4BMvZ);f%{AB6?i&ZOhTsieE7Q zddw-@nVS|rw>IZvEgsPTq7^In1&qs}1OiwfH_@(wa{du@RDE2&?D8)#=p>eVfGinY z(=vV;30Ob2W2;W9uwhtMWOhV`7tG~f?7g?n(mP!6;8bLuy28b;n%NwOA0uxL&Pv4M znj5fQ`gro@Hs)XD_~C2zI+cBe!qhG;Ov!jPxb=Wn~~UFxN~phr7@ytVS_a zvQob>%wcd!@50z0ultgyM}AOjHaaZKhR?q+t9i)7)MJ)X5gZyu*U@J1lnVc9IK%H%nII0uQap(_01_c-c3 zM_s?=G(BApUJ$^q9mXS~Mds|7$ss0I^Orb?A)#o2`okZ|)~s<-ETacIb>Ep61 zo{$ip^Iwet{Q4Q4wGltuuBpZsq7M$fS~&Z+u$ck;dX=8eb!|X6bfHQ!VSr0vk&>$$ z0{C^xMi$sKhI%d93I#DpSOQPth{^c)^#a|iw`7cui}`e~4WnnmkLm|V)v?SvYev5nOEdSZ@UN$dt2K~yK?C7gjvuyk^+6s#|FxUW2;{#^!0{Q8 z8tW_$PSSaK1U^88f92)4yH_XlS=uMClok|ipBdy|$aaYixup=BV#UvecLRVPH!K+s z@UM>&O4R5!>UFT$P#<+O7#t_ivBv`ZOK}IS zUr2jx*m4b>LH;XIRlgCW|IN{FLI=;S|BDi^AP_%9*`bAK;hV7YJ!hgPwRiOA-% z^kgJDy(MBjXTZq7R7$RefTa!Ozj9zww{aXGCpx;r-xzqsIAkMv7r-yBSm0Oz_9_}2 zyeiRSam7k}{uO5i?Szv}NM&+^#0dOD^hpN!mm6oBo8W*O`x2uxjpSXTSm9qY6?^C! z#?UmLsCZPFe}!g8IJz4-sV#@iyeS*~a>d{9@#_L@ktoAHBtB&CqgXn;Pt_lSR|fFw z8P+D2(7+yxj|4Hd%)b!J-I7C}ef9C{_Zf;QpKa8&x zFY1ptEqz?n$3O-ygFR>SXQd5&BMAKcC|3!i_zVWUjc37g_X|6Y5e6Yd_s*ez_xAbyEs1Ir|~ z-!A}U2qcyUIgpr=+XDD?ie?;aQ3)?@Ce00~m1jx(_~EPaX}QnFdY#sxgEn}<<^1d4 z(Iy#NY3yuLVX^FO4+5L8f0$d9$mIFq`uR=sVz%)O{0f2kEPjQCRDJyTVU4+ofL6@{ zq{dEU!t=N>l&~>UKYsWHm`_CGrS=M)6Y!$~GW-1NH%MvqWIHDqzhqAqw$7K?k01Vq zo?$m*LgTn-k9|8DWxnI{uYYlXRvbU%L>Lw)I@P3fL}+At}GDt=MGF9iVO#Rc`Eo710&;X*Q+RXORa~U_xl9u z564y_Y}o&B346Rtk4mqQ9uwuq4{s7*&%{8x5EXr~xs~}>Tvrjr0DgUp24&U>&ojq$ z)T%k*rM$si+xzDw`sk)$}u_Arn9R{+1Z+d!*P_!2M4 z14#rD?*gzMFt2x@Uq1gD0&G3xz(;yXKR{oUf6d_gr0Yyp@C%s;Ahju;#n%5)31$$^ zza3}&^5ciY;)Gl>6_JClTTq#?=;KOw6>#(M3nort6x+3NdLoiCZ|4DeHo?cQY2ep> zM^Tt(RwM1@AQ5(fBZ|`%{JKjF!ajqxZ!|WE*m5IRv4?*BhCy3~&}XYSP5pLko$7-% zWgG6}7i#e_uCUoOjz$5-55AVSre*$x_{IrZ>|nRR{SI}7A`*5CyN=f)5IU5uf8Czs5yX8>q4LT${jJO;) zZEc~2rFb%U{_A0c7BKVUN>tQGO%4sxMv2w&@oSj2H1DEtQRmnxcwC`(YDdoc{7OU^ zeEu~~zqGqnBTb2;8M3DkDXsdY99z?EuL*6NB#nd^>kXpGFib z%XW;Y}IK7?3q53?=i%QwmEPR)H={wf6GJQ|1}V%^m$ zbBSzM3x>0hPK3JU*6o^)UpoZYmUE)7>9bf11QIhS;vGW9$Ed2`fXoG^iu8!IERe@< z8bh+vN~eX7Ut^|hPDrfj8obAvFgUl4**I#f2=cGv4$M2#F3j`L&c6vSifyJ;J~G_u z#}B6wHiXM3wJgn|2rG($SQOIth#x+M&6ec(G0aJXvjAH=U@Fg0*9PGGwRCoS${v1D z^YdS;VZ(t$-&JNAvB7*(8$H&WSR3C7-SP43zi|Fb;TJt@ho2Wq=|_5}vuHy2`1JwM zF66%$3m%QP+#3GGzyf-7sNJs5RPZZHCv_z=ptjHzk1o=P3udUJREZys8ebNWIS-kk zdf;DMUOja7Z&L_KwchAoh0Qj65J{SnUVim4YktI08*Q=3jf0VJd`me-1)(;L|bIPh}m(}t_1j3s4J6D zGHW2b-w9u9o&Ar=m60m`byoAnbw)elbRq_lJWK!m%(ejkDxg}UM}VKQE0P4z{~7q# zN4qF7w8gLAXr}w9L!#1Y2K;MR&L|8lvW^(ByiuyuZ>%=HsV7W>YR7QU(wZ`s)i=<7 zyD(-fj|J*CzAZYX0e{Rm$OgYpG#g;hj&aXG+|{pPod5cV{+lhZtrzJnx%ibx^WZhs zyK-?UGN$?U8(R^*#9n0z1M_Zn?#7~EO@I7DS>a#r&>OIax6f$j=((YuY~z%+j8Dj( z!ka7g8^(Q%M1L+$iu;?}M~%Ch%mtXdSE1JE;jY z7M1xIs!-&SiRdF3*INcK?%Uy?8E3PN&h3XQ{A<>FnRlbt58_xW#7=<+rm^e-QXi=%24I|#utQGzG!}+J_ z#B^5)qhQ=gZfKYaZxqL6lY=6|K>gvxkQ$dd!XO)VhYrJ8da{I(R^eBdvz6nAu&aa@ zCI}w&)tIpfUF{z}|FtEw%Sm(E>+wv?iWWsTZuIpA;)hS>u7%9v8iWn6E!8Di=3EPkCoA|h zZtNdvo5s2)#DGZ1`VYqvLQ0F^w*=yc@6e6IkwQ35$3iz8YG1FRLHlx%!YUuXO8SiT zIO7*=osL3!ImkvYW#LHxzYssXWsMg<W>x&~J9eQD*7#cb>B?PqA~whe z!Bl;C8NWh6wAHap8Z`_Sex-`>(Ad?B9GQ<_HT0PMN~UgJeU14Y+k$zo=Q>6!14Q%u zLzVyHZ9{WOIK+X(RvK_%s3Eh@zh0$(ls(z{9pdwJq5tMg6!|Y3g@`s}_W9Q&=Pwu? z0LS)Xdky0k0>5@7fM2i3T%iz;Z?2Eg;leI5hLHctA(LN)U)H@wi#q=$AGPAPaYyew zcqu@%3jdlvME8o8tdRj^KT3--@g@}@ZM~%`ekh*KboD}>Hel|GY~q_}p#IRtlM4R= zo%C^eX}VK^ot3iDsPHcs!Y&hGRg1={YhEKa#%ReU@k4|Sx$Kb7e`&>rLVa9pCX1i= z^&4=FB=l>!Xfy|;HC(?O`UO@}fX4ap!)7|Tvc*aNx%eR6*W2RMaUuOSYT?Awlxs7& z{_u$0YelBQE5vhhZ?rSA5Oo=!`Z-wr zhdi7WJc`pM1~}5l#uHB@p7{KWP3001Da~CDB8Eg*c8jHR{d{D)!oTjJBYG>ryI4;D zESBEgP>At9To#NUh7#;GIXQNpa-mqME|2y4YeWxV)l2SLFn;YtxmUB<^ph z^DSD>cEi&zu0K4)`Xw=BD2R=NU>2Z0Y2!q5nScF3Abxm3+-x^Gt<$)%;3hjdUBRz& z#&~{78@!Yz8|!5>0^{=I`VvY^Xi2+|ZKh+MCg9hYv2P$Dx5&n1c=y053lR?sx>IoH zd8}rvAlod%AfZbHb*IB~Mb62`t$sKjF_=7l&-@3lGh+_yVSHdqsADv|7u#`DkQ#&~)+ZB-UcfMC^{pd{Jk^@sJ3!;G`SHO6>*V z^RG3mO{;TrgwYEZg2MWJN1b9RPB}B?)z8m_7SWJ=s9Gy7qeJ zUy2tn|2jd*G-y`@&PlfuH3!FN+Bzg7mI&}K_AWZsY11%+JsFJag5AxD%U@^{S7dn( zhik@#8;1l;oS+pH9UA<3{zRzH*7I6D+y(rM&DlXip%#kUs5gdwIbn`nAfjkDXT&$% zK9asGRE0m6n%v)CR|MC^V5Sv-y%rQVaCH%5|I*}xN-O^k(?if4BW=Gz>jQ2R}H z4yWKB!Yde#aQ)$N8!A&+^$T&_K9Jv9XkFp@hiL-a(w`*MAM$zgZi?#Ksr1aPE1KX( z1@Mcv@z#86TOGS$4UZ4D(;0~w%ZG)#$N2sY&iJJBO}Zjt#tyNN9!u`}Xe1Bcugt&1 zHhS1mHv9oX>D~5PAR35R{O^&$w0V9Eol{6Hnd|T1ToTGQjHdha!lUt1x5oeNfCzCH zRllLCc_pf-wo)qIusK{Wr$NLb$F+_tGTdj!)qHF@m2KRi9dkp1od0?Z=fD2w!NFH* zmG11QVf=ztGJf&6un(~z3rjX2VqdPGC*apmY>}~fV1;y(3o!UnhfR>8(H%SL53T!A zp$+S|K&n#7W*CruyYTV!9MM$He+_*Ar~K>{)mne8BX}9tW66!Z>-04sV!EO+JOQ_KF zvvvFPRt~oAR(DMcbIiFM569R)OMk`tIV(#}7d#!>7eB`JB`N?e*f>H7N(+J5rlvd2s&*!Fw-6rdF*W z-8sz8E6M%|90R#p)Y$toD7iG7{>b9WbI_F??z$hE{}928 z>q9#D59z$K!l{2m+bGWyS3b1iuL*HEbN zFN?P5$hp9$HMmc>AFB5tE&B1;zJUTMy)bmVi$gjF&IPFa7aBrR{Ae92>RtVkh#zjz zx{ewQ$6K%{Vc-`knNe4nNBCU5r*QRzc$;t@)()c{fN&p?6Ph-<#X+0-m!|Yf-5(`y zVzxCaebtm0okC6y;q@ztCvbUC5pz;98T@9HV@ue}8& z&sR}`9xFB!fu}z#q9So$5Wl<|lh(i?E=Z`=Y5HqB&h_(w^IuQObzobye@s6DY}MTZ z-g{794|Y@E?b=Mnul=-?+148R7fOyKlB*p0AM_Om^&38Z9rmKTp|7G=4Se~G_V@HF zI+%&}Rq-!2gP0b9<7_fgoXf>j>Rfh!e|gnVFX7l%i;VY)2`EvE1dzSy>X&za6f?wU z>4&mVs=r74gOV9fO0IsX`=e}SQV>@+vF=H6%6fu+(1cYE@UM4G#AMi~eN8SIY6O1K zxzLI{o>cgkioC(Zl@N4FnRT+2{oZASCjtE8`VE-(Q8xIiBl%TWxI))dq>6uew?$0? zzjkFBIKP8J#B6o_hFfh|i(iFeACIGt*o1>B%t2h;;rjWawvqb|@2$h_)j;@7gL55fb{jMN5h)GGaI27dio z=RWuq0*R9t4*n_!2RMT#st=$4;<_g2Eebhuu{OZgD+L4+DHo{U7=_GnmU(DyKUplQ z3MATbQ#|kC*PPu*`JwC(Lk`uos3HFhT8VMxgYiRHHkM~MJrnBsB+FxC=Cf#2_?O}F zuTeA(JDn^%#>E-27hQYk)*mAO#cRqyk7?n?J|iN7=f99Hm*E1`>bMoV4`y(RzRnhM zvJyXBLwj*rc?;}@_&e8JjMJcvV6{FFh#&qabjrc*9oN5a7Gzyt>}7Z|K(q}2dYf%8 z^RGuG$~L%c{#ONr4ex;+8Zo$eXK>Sm{@cY@&=`JHfvYKV-KMG;s7|Xdu!2&`|h)5ArX+50`cr$dOr(z=sTH zuy7X3tj>R>EoC#2RI;Y)*tQ^uIuH7F(zUDZ`7cBvAS#{6?Ry2Z>jIq*C6jpK=fAji z_lRo~z$<&XvxR`RiN+))`LjZZyInBVY2|U4_vCbB8c7O=_WuBllKWX)f4Eovz_|_f z8RPm8o8?(J9*FlI#=$g`-y>^q{)=22PMhYa;_cG{SRjnOP!OB@aQ)#Eq_TLN|B5pN zj1xRz8;t<}!me|+@wG^Br~t>BDnx`q(@I)~-^2BXs?GtTiVNj{oA;y=KV-CWFbcj7 zONFYsXm$vsCXoMn18CLi&@{qpIT^FU2qu9u0(`+4%lLH~P-{7q1Xb*(HXCPV_0T?o z^)rL{FXmrqj@NCrv9WO;KlGjWm#o_gW&EP~e&cBCz(h(@@w(OIt(;AP+=`e>|aEJU?SKxPL>m z&fstohYe#AYJMH1Wk;{JQ&i%Iv|oc`*)5{h0Bw-y4 zuiKp}{Ia@6Bl`wlx6a9B66vWnah$&9AQA85*LK<;e|VJZdnKP0!nRosqVYuv2l8M4 zl@1QKOd)~uvV25dYpLSNAtsM$;pe|bXukswg!ePliW|s(xrpZD7uQU7$*qiE=V%#- zvlh3GBd!$vUI4#1T1cI2;=anbJhEz9&QfPf)ENxm*R-LcSfD4O+iuLS`knv*??dID zpZ{79-Lb&GZfyg8sUuz2(x#O-n_QLudQ6Y4jpK}SeiK}``U$b!egF+)Liq7Ror?CZ zOnhFfM%)|6S>R6(Fmdk8#@Ckh%dMa1u%Q;Cu|g`|xLGT}KBs7nQ;8qGO|woX4U zfGt`hS6MV;cA1fTEBIwVtq=uu#1b^1Uj=cKeI(N=?Wq8MA-{~A0_ztWka)7bk@olR zE?M36x4Qm(A=HiN0qV!P1{O$y%2p=!?ha(12TgRiJM_0P7ouaxe?bRp9T&f{ z^PaN?9n~j7P^&T2Y?tJIdm~pQdhx?U^Z%QC?j%>`A>D9dA~hYI)qVvchQ{GCehtxS zc<;&{z7B$k*iKQPpeUO<8T~c}sPIbyzhL=CBWJWXBpdujcJ-fSn^~&F4>tmLAWyOP zxdBB_rr~eo%#II)cL~3KBY{30BSvxHw4yNeMe(}5Wi_(WRrrN_d$5!!)#f$DBshei zTt6bE9)3y04{`L#g)JP%b{ZLKp-xzX6Dk*nWBzhwL>RPbvYCXUa4^~P~_+Zuxp z$&3SfYgO=TkIB`B@nWn)Y}R9^kRRMbf9Jj@z`uAcfM1RDRDS=RTlxH#TAhMc!7m?| zEntuQm3uDWgAUfhj~{Z}Sotk+`)RW)9T}>;$1LL)uLXRGY0*i!Z{mQ!fW|9`as5p- z|5E-&E%hI@k}x3txB~nO=f6tfFNX&!_h7+A$^#UE{g*&Rvs#`asrQrP==OxCqANI#dBN3LvxKu?)LG$rzC)gI^ z^L?8+e)y0R&y%LZ-nw$D~}`v6wO^z zAHO)K&;|ars+nH2mlSXvDFTTEMwY!4zoK&PsismU)zmqt>;@cnIe4%pIveYJlhe^mS>}l#|MGZc8==tm3yD1Xa0CwsQjQ-2zm~(K!JPwaWn#;31=kZf+6C9O z-isf4_ixzn1{YF)$Qm)s-ck4@Ew+(?%zbQoQ9rMH{Iu;pJ|DN}o5Jto;}_2=^W3mb zN9DfE#(+F=Hy#xa?Ph=8MhVRuakT_R$n32}1;0Wwx;o8m!R+i433g795u?Z@_iuDC zY{lv8*;d&w414Hh#Oht#QRlzdW+qYAD=ql*mcXu)R_T)aH>~za1+7DeF~^Dhqq&eH3lB_omJgUgj~9Gwo}m!Yg5&cn*bN-ce` zb#bg$hh&~&EB#{r<@G`RhTK(5b1ejGC3bIse<{n)vjSL*i8e5z8W?=<_dBenP@@3$b}`vw^vjlxLZf0sPW&Z4?>9 z7&6|IMndgX3zv}eVtxYnb*{ftB=(@sd0LuHJfi)CUdr^`fjt($uXlA7vr>zag{ZT* zqz;y(Dt>sbziUUNpzWa(%`0pa=d@e1_KFOUaiW4>k4x)NI*$5;u!G?+F+4WBdUdXthyq)ppu zpRkrYQ4m8oOUq^8{1@(zdIy>T+Vzr+&9?dqb&;>xvm4`@sLisC;`$9PM_EG}&(Df% zV-i3Hq%L4w0sK0EXkm`k3SmQAIf_6ciAJD)1EnTKz?NI;Z_JAC>IdaImbrpo#{LOw zQ@mO5n(nsY*l$Jy@2QF(zN5DmkvESkQ?N1H`XIeY`(z>*Kg7;Ff?DfAm^ga{)yd84 zY_B3Qz`xFpCGCw@YPT4-p|OJ?dSyVG5e|OLssI4A*kLL5`66jitTM+9QfC8*B3BAzkXg- z%bRfdRKo)@5HZ+JN3C6j+Hc!lY|bzTMO& z5olFoFY_<_Dvk5Y+g(UnefxrN+W-eBAWtQJ$Y`~iOY03Zm{-0Bewp{6Y##he!4~jc zYZ+jE3Q+Lt=VAS<)`C%jrW~;bQGckdC9X(>-&z3kM&T4t@zTcfB3HBz~AGU=+jd!WF^Ma6*>H6~r%Nv9oak5b&gh zefT`~;j46$b18o9D#UlxP7&(N`xo;60Tt4RZedrXBYRb`x5N4YEmD2l zwcz+6!afrEHAY43)p~YL21t3rf%xGQuo96xTpA9}VEeV9I&=lg>}VObbzb~Xf^D5t z*G4r?0FqFc?ciebsoFm7`Zo1sE*rEO{Lf&_7Pg88otv`Kc30eAQ!UmW|& z_0CEZU~vA+$FFB3JcpBz*|8aXuOjh`gs;v(_KNEt;{HRCv(!m9E|UPw*^a;zl7NgC z0sK0i2CtObq*N}%Zk6astyZ|BWG;pF&;^NIHv!mUr()YLw9{y$vYkQv630!vr=Xo8 z6w*75yS0eG2C#$p)g8)7b=$@i{hdI*vZ#I40&%XwuZ<)nWG1WyQ;+&UMxT5o}0AI0Ny+!`4Mx-RSbRjRv;X zAP?|K-eVQ~lE?S07>{gY{92cCwrwB81tZYGAbxGN@5eQ#xFTgW_-j*O;@Ie=bTk6^h4KbFvJ*8_PoRPQJlP9}lM4|8@xv{4 zhaEp$w$DZQQMjMB4;I_UFI{XxA7#U_$82@~2H#c#H$ z^y^T=ouC!nY?g6nqidF5!4}wOVQ2dFhd<}zy?veL=Y9qk0x}o1pVKeokM4x<75swR z%)F8zpeAMCUR;HUqJ8Q8QCzm+m`Uda|GTV^Qml?@B_lb{RL&)@@&yE-< zCyzak&R(GPSOvdWp2W8`gqUo|{0&@qf+tx>SivtBwv@~~F1LYLcd-7D#w_r!`?Qid zV`EK+u%<|aasDfSUtG3f?Cw>zPU2?gDcHkSW@G{U8q9-#1+Lvd{)^N_Hx>MnD6<(e z_}UG%pVy0V3;Hzx1o82!NBkrQ{&mkFpI=t6^>Q!j1_5Lh{Q7SN!0`*62VgFgZTX(| zGZ>j8yl{d17pxzDZOXg!6Y#igv#qEHkUi`q2k`5Dg56jzRDRh3?Rr5#zwB@TzqTrb z1v?(6ZMK&zQ-Q=P{2FjD_9pcC7Mph+>!sow0sJ~Fj*sEm-tF2O1oP!Y{}RGK=VERk z|Aj5;z|A;qV>s?XFbr@4;|k!{yK$J5Da|8dBWU16vklwgtX4h}@?QpE%L(s+S!VmZ zB?m>r_owg|a|HMoww8kwlG`Wj1`^#q0sN8)2W*Q2IA~zgB9N%KjE`Smg<3%#iQ({C zY%6FlVSpG#F^FGaTMqEcli7h2=&?v2zxbLj5(0amZ zeHnDAB!?xg%iusgPLgs($F%Doj@69ICk$&PY=R@Dj&n6*Sv_XU5~^QHb8Oi3%bSF&Gj3&R-Mu66+0&_3kD=E zk#}HUqQbvmx)oYI(>o{&CB)}zvBwGyd?b&5l|t9hlhRrT%g+$d!Vuuz--}v^cilDR z`VHI%!e|BjGSKLn8xdSd7|eg|p|{LyN?1YcLo+ps#<;CcCKdzuMd#B9hZg51)P9Z} z(iSpaIML-b(hb4AK##J11@J42-NI-UM*d5pk;7)2l}ctGzg|T> z67pYb0b9TV{~`|igFb$_^@pgA*sfhC5kI^WMrN7C7tzD}`h2;5RtizN=? zhh`X6@Ps%36EQD-$oC(rXyGTsJPEa02~l-|_s%kZq8vX&{XDhuy+#XYlVIA_i)d;n zwh};Ai5~*3y6gnc^CmP9NL&b3g8T4IZG)>{s{YV9lI_fgCuNk=E zv`R8;aifGUa_XWhs_@H;7RG6SVhmfa(bv%kmxB1EqJ_(m5reZ-f&qC}C|}(|AJ-2L z;p7xY3;$gF0o`x6Oym3PUbfT;tZW6pu7OQZ(ZUtt$Fj&}^UuUv`bU_AndyDe4#jTTHv&CFF@pu>5}g#twP}_gTe1DNNggq?hPE zToe$_mibpRfq$9px-n7PM3p|A2+ImT|20OSCuB5(A9}DgP6KTDt#bXwA-0(ke)#Yf z)^}HCaXgJn4h!Y{m&Eb#b8v~HyS3Ma!etl`I%lbIdHCh#zfv+%g5L`W7=x*N9b5(# z9i?*phScvt{XEXuO^Tc8i9C2p5g>&XRC%Ic{RaF)!q)NviGe;g+f}ZgXW9h_;Jbz} zoTT9B9Bigl_79Q&3Snze1nGOK$jtV+P^sT=qlN#$25cdS!BG3QiFyE*d8*dqU&wzA zV0F%5y)GuvcuVv0U%~jHOS|3?i|ENL#`PNxBo3ev;9nlpE)|mYuLS?%q=_edg@3t2 zPKtu1#-2pH&YOe)|8j>DR+q3j+xP$%KY`;Kh#x8xE^7Z7zf!Q}0dzHfspSq|i#`he z-1h(!CMx)K6Z;a=b{p~c1vF0Mivv7)D){A%;ucLJbjEApk1G&AbZ^@b*I1lXs{gP{ zY8VRw@k3l2#b{+HAVb5;e+Bth*}J%qRrMQ4T$Z0q)Mj~asPkVuu6>#%&s$jTeb|uR z1_;Ctm7974YON0@;rsph00$DGJ5~Hk$@~>@B^@lblyGdu4J1P5O8n3rdr>raV@Djo zThpri7t=1d2j|2-H0H()wi0+!;a?twVgAMVMQ{r}QWM}`%2dLx>TFJ7D%;3=62LDH ztyB>d^9$H#YUD;4ziRjiQ;+&K`C&L7IQCV3B7FRUKTYSOWa3JT45UdR*1fk2<{-tDAutf^C zAiVBjuF_?`f8HH?V;cq-E61qrklQHBoYrF@L-tx`uH2BiF#E z3i%BK5*qyPmEPE&%7Tx=uat%rXoNN+Pi3t1KI{XYE&C%sYEii{OQvR%`ZmGGe z|FhZ8G|xX)bC+}*S9nhxZ@oTpi*}cMDSKmc!!f@R;wS&9xxty^&htlt?@=%O)G>Xr zT!1&vbLP1EMWUi#zM}OhMXQnSYlvz?>*U((2byc{o3jp+z>S)9GM)W&v)|_UC zv-BC7@2JKnX&xH1Mm_O9>m$9C#kUXE8leHzP#ZRj^}-Wbmbq8A@B|^(0o70oXJG~L zq|&Db+GO2f%*O$z{!H>yk@>wL`{*6kJYznU$EAfb&K=45k(yP3hP=a?Z`9c3alzXs zQ>iaEplB-%);L*fh00w%(knuje-^DMt_ckeSCkvxxSq1L zD*a-$3iXA?l*W}mjPztELaWGhyhgJFC^6I%zYnXG?dumB6V!%2>WSB>CWHg+eRJpO zPjMr|jhe-wv_03oTqJ5HHaBfI8tWk}{Nn_32PlotOr1Duccf<03 z#;U1c!4)1lIOR9BHm8r7i-)$Z^BR$Lt)}fXC5N`Ql)F&R#oI6bkBe_#yl{EL@ALaK z68{ul_T$%!`!{l9d)mRd2_FeewG{Gym9h@ zvp3z7J~nsnj&e&xQ|FeGUdnovxOL5r)=&b2~)*}7Z{-(m};W?K#JaG&sLdtX{ zLu)Q;*rwYHa$Snc-V-|n?c^WB@zuuF7U)l<;rG$A@GfqlIr8#`+s6#qB1^b?0L2}b zH3rm2k^PYXF8cuOH5}I-+UQz^%gS8%Pt=QS2*_v-^yDuPt!_A~i~1}dMlWqh@3TVh zh0C6YBHj07LcJ9@zU)2a&$9JQXdZop=3L(Bbw4XjwX{;2S-m-QdBc4TrGar(xapUmaB%s}rV z{z!Sf{^$B-W9;i>a~9fk-(?Ny%0nN?>i2}Mp+A&!N|!atdjsoLh08ubGcLRDv9VrN zxaDu4aa*A)zD%)lF{bT zQ0>dc&Z z`bR=@-lI`ouYfNWT=Rj-T9A*z9xnR;jfVSCSg((1pR`|?xM69-_8<9EV0pR?0u(h#yOIaIqD<%Zwo_j!+U_q@YO7OBQymo=_X%zaS+(5iPJ zZ%*&WaNWl0_pl?$Pw-d#gFf!g4Q^_Ly~icCx!~B*sK3b?|BbhF6*H8o=Z32rCXA_{omH*vL2N6i!N7T z|B2t{cj&U;=XcCcxzBs)a#^YWC%UYxsP`T!kKw&0sdUzgv@ z6#Rdy@0G>JlQ>iy_%>+}Be_h;b!8F+sN-k*W@XW;!Acz*`|HP3+Zm*6nL zU$Xx-&%^s;e}4wvpMm#h;QbkRe+J&4fq$JdfGj^UI=5_0lEnWBhfeIe-)APg{xwM| S@ZWLO0seoql9uvb@_zvy&2EtZ diff --git a/fpga/hi_iso14443a.v b/fpga/hi_iso14443a.v index 46adda12..ccb51d8f 100644 --- a/fpga/hi_iso14443a.v +++ b/fpga/hi_iso14443a.v @@ -112,34 +112,26 @@ end // for noise reduction and edge detection. // store 4 previous samples: reg [7:0] input_prev_4, input_prev_3, input_prev_2, input_prev_1; -// convert to signed signals (and multiply by two for samples at t-4 and t) -wire signed [10:0] input_prev_4_times_2 = {0, 0, input_prev_4, 0}; -wire signed [10:0] input_prev_3_times_1 = {0, 0, 0, input_prev_3}; -wire signed [10:0] input_prev_1_times_1 = {0, 0, 0, input_prev_1}; -wire signed [10:0] adc_d_times_2 = {0, 0, adc_d, 0}; - -wire signed [10:0] tmp_1, tmp_2; -wire signed [10:0] adc_d_filtered; -integer i; - -assign tmp_1 = input_prev_4_times_2 + input_prev_3_times_1; -assign tmp_2 = input_prev_1_times_1 + adc_d_times_2; - + always @(negedge adc_clk) begin - // for (i = 3; i > 0; i = i - 1) - // begin - // input_shift[i] <= input_shift[i-1]; - // end - // input_shift[0] <= adc_d; input_prev_4 <= input_prev_3; input_prev_3 <= input_prev_2; input_prev_2 <= input_prev_1; input_prev_1 <= adc_d; end -// assign adc_d_filtered = (input_shift[3] << 1) + input_shift[2] - input_shift[0] - (adc_d << 1); -assign adc_d_filtered = tmp_1 - tmp_2; +// adc_d_filtered = 2*input_prev4 + 1*input_prev3 + 0*input_prev2 - 1*input_prev1 - 2*input +// = (2*input_prev4 + input_prev3) - (2*input + input_prev1) +wire [8:0] input_prev_4_times_2 = input_prev_4 << 1; +wire [8:0] adc_d_times_2 = adc_d << 1; + +wire [9:0] tmp1 = input_prev_4_times_2 + input_prev_3; +wire [9:0] tmp2 = adc_d_times_2 + input_prev_1; + +// convert intermediate signals to signed and calculate the filter output +wire signed [10:0] adc_d_filtered = {1'b0, tmp1} - {1'b0, tmp2}; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -194,11 +186,13 @@ reg [3:0] mod_detect_reset_time; always @(negedge adc_clk) begin if (mod_type == `READER_LISTEN) - // (our) reader signal changes at t=1, tag response expected n*16+4 ticks later, further delayed by - // 3 ticks ADC conversion. - // 1 + 4 + 3 = 8 + // (our) reader signal changes at negedge_cnt[3:0]=9, tag response expected to start n*16+4 ticks later, further delayed by + // 3 ticks ADC conversion. The maximum filter output (edge detected) will be detected after subcarrier zero crossing (+7 ticks). + // To allow some timing variances, we want to have the maximum filter outputs well within the detection window, i.e. + // at mod_detect_reset_time+4 and mod_detect_reset_time+12 (-4 ticks). + // 9 + 4 + 3 + 7 - 4 = 19. 19 mod 16 = 3 begin - mod_detect_reset_time <= 4'd8; + mod_detect_reset_time <= 4'd4; end else if (mod_type == `SNIFFER) @@ -207,10 +201,10 @@ begin if (~pre_after_hysteresis && after_hysteresis && deep_modulation) // reader signal rising edge detected at negedge_cnt[3:0]. This signal had been delayed // 9 ticks by the RF part + 3 ticks by the A/D converter + 1 tick to assign to after_hysteresis. - // The tag will respond n*16 + 4 ticks later + 3 ticks A/D converter delay. - // - 9 - 3 - 1 + 4 + 3 = -6 + // Then the same as above. + // - 9 - 3 - 1 + 4 + 3 + 7 - 4 = -3 begin - mod_detect_reset_time <= negedge_cnt[3:0] - 4'd4; + mod_detect_reset_time <= negedge_cnt[3:0] - 4'd3; end end end @@ -224,12 +218,14 @@ reg signed [10:0] rx_mod_falling_edge_max; reg signed [10:0] rx_mod_rising_edge_max; reg curbit; +`define EDGE_DETECT_THRESHOLD 5 + always @(negedge adc_clk) begin if(negedge_cnt[3:0] == mod_detect_reset_time) begin // detect modulation signal: if modulating, there must have been a falling AND a rising edge - if (rx_mod_falling_edge_max > 5 && rx_mod_rising_edge_max > 5) + if ((rx_mod_falling_edge_max > `EDGE_DETECT_THRESHOLD) && (rx_mod_rising_edge_max < -`EDGE_DETECT_THRESHOLD)) curbit <= 1'b1; // modulation else curbit <= 1'b0; // no modulation @@ -246,8 +242,8 @@ begin end else begin - if (-adc_d_filtered > rx_mod_rising_edge_max) - rx_mod_rising_edge_max <= -adc_d_filtered; + if (adc_d_filtered < rx_mod_rising_edge_max) + rx_mod_rising_edge_max <= adc_d_filtered; end end @@ -273,7 +269,7 @@ end //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PM3 -> Tag: +// PM3 -> Reader: // a delay line to ensure that we send the (emulated) tag's answer at the correct time according to ISO14443-3 reg [31:0] mod_sig_buf; reg [4:0] mod_sig_ptr; @@ -297,7 +293,7 @@ end //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PM3 -> Tag, internal timing: +// PM3 -> Reader, internal timing: // a timer for the 1172 cycles fdt (Frame Delay Time). Start the timer with a rising edge of the reader's signal. // set fdt_elapsed when we no longer need to delay data. Set fdt_indicator when we can start sending data. // Note: the FPGA only takes care for the 1172 delay. To achieve an additional 1236-1172=64 ticks delay, the ARM must send @@ -477,11 +473,10 @@ end //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// FPGA -> ARM communication: +// FPGA <-> ARM communication: // generate a ssp clock and ssp frame signal for the synchronous transfer from/to the ARM reg ssp_clk; reg ssp_frame; -reg [2:0] ssp_frame_counter; always @(negedge adc_clk) begin -- 2.39.2