From 3fd792940be0d4958bdd4c3d881766b93953a7f2 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 25 Oct 2017 13:59:49 +0200 Subject: [PATCH] FIX: @satsuoni fixes with pm3 offical version. --- fpga/Makefile | 6 +- fpga/fpga_hf.bit | Bin 42175 -> 42175 bytes fpga/fpga_hf.v | 24 +----- fpga/fpga_hfo.v | 191 ++++++++++++++++++++++++++++++++++++++++++++++ fpga/fpga_lf.bit | Bin 42175 -> 42175 bytes fpga/hi_read_tx.v | 16 +--- 6 files changed, 198 insertions(+), 39 deletions(-) create mode 100644 fpga/fpga_hfo.v diff --git a/fpga/Makefile b/fpga/Makefile index f0b058eeb..578518f7f 100644 --- a/fpga/Makefile +++ b/fpga/Makefile @@ -1,6 +1,6 @@ include ../common/Makefile.common -all: fpga_lf.bit fpga_hf.bit fpga_nfc.bit +all: fpga_lf.bit fpga_hf.bit clean: $(DELETE) *.bgn *.drc *.ncd *.ngd *_par.xrpt *-placed.* *-placed_pad.* *_usage.xml xst_hf.srp xst_lf.srp $(DELETE) *.map *.ngc *.xrpt *.pcf *.rbt *_auto_* *.bld *.mrp *.ngm *.unroutes *_summary.xml netlist.lst xst @@ -9,10 +9,6 @@ fpga_hf.ngc: fpga_hf.v fpga.ucf xst_hf.scr util.v hi_simulate.v hi_read_tx.v hi_ $(DELETE) $@ $(XILINX_TOOLS_PREFIX)xst -ifn xst_hf.scr -fpga_nfc.ngc: fpga_nfc.v fpga.ucf xst_nfc.scr util.v hi_flite.v - $(DELETE) $@ - $(XILINX_TOOLS_PREFIX)xst -ifn xst_nfc.scr - fpga_lf.ngc: fpga_lf.v fpga.ucf xst_lf.scr util.v clk_divider.v lo_edge_detect.v lo_read.v lo_passthru.v lp20khz_1MSa_iir_filter.v min_max_tracker.v lf_edge_detect.v $(DELETE) $@ diff --git a/fpga/fpga_hf.bit b/fpga/fpga_hf.bit index f74ca9236ab30b37af4bde23b6a5eafaac20912c..6388281dc9036282b01ff5bbbf70f65d3a477750 100644 GIT binary patch literal 42175 zcmb5X4|r77oj3lSb8q6!+)3sVg1^+Fdol@hz)3Pp5D{T=2-KYdm8n19eb{~W={s6< zsjqL})b`zncKfy`lK>L}G9YVHOS_j4ZM4)K0wN&l4Msa4=;*pFb*&xPsF7kfQncZZ z@cW#(WF~!|XZLx2X`l8uIo>(vp7Z^FzMs$cdrqjrKj!|2$a4=(y}$kM?)mR)?r&^= z@Sd;Tx4P*YUt3N0k~i|Lmhj(yb51x+Un4UTo^xySoN#mG7Ftaeb8cI3%bW$_+vq-` z{`RZ*dFn_1?fx)H4-s7#_9WE*8(|OkkZf%XlcWBbuKm6uO!&O?&z>*|ic`basM=B= z|0h4XEd1iX?vqx1JX)dWfA&AJ@C){z{krhE+o$@!>ZAYv=p+7%2kC|1U9l)ZwNy?X zS!npBmZt~k26>%L1FgeSb#ltavuCM=d`GmfeOyj)d`HZ7dWUX*)fdy+sa^Gv)>&uE zQ2ki!GF#NuLxH@}&l*x_tE_i=Flqp5sg# zpdKS|#IPwuJ=B*pwlU7}9H(MiGNUKdb7CbJaX^Cw118^Y8<1e<&)Zn zlsyu4eA_ik=c-S(?DMo)G$+g~J5SxzWEqm33HNyXZ&haGAT|(w@?~G5j>Vz1rjZ;* zpAZ?;=8&XN&ZrghvBmJiJvTM1myNc$mK`HBcyJASh1MNu%vX%Fl>3~R5u%~M!e#zy zZJ2e?Lg5Q9InIuVg^thCs@;tvDi0V}s8#w$v~faXseeqnEUr?k7tNhw6nM9S*pvM?b==L zdv@qy*=h4p<2&N3@@H~J-dM}NN*OsTZ=Pfs;_AC%HQ6b)#dX8O?iB+v^iFM`iywN3o{I zouYBNiOep#3nq*o!}=oqh9Yaq)1DDJO6>{EYlOZeBWoz#$=vUf`u$jfK)ac~YoyRH zdf9u_Ed%!&+q48(>N&M#4Qw;*ihJKGKhL&M;BM@(VcN;L@TOV0yB3B%jn+|}Fyn3i ziUyBSb#mCVbB!JMTCA<$M(9B0y_D^U@T!z{gpON**`bZv88+G<;Z0I&(hBR|d*cUm zVQDn(->#uyzbO1~cmB!#t!!}IkOM~Q-Qv)Jv z46=~aj=A;~EL$KCQ9v3tn@<}l@F+jc=Cg-A_0mYdQiOUx!Ll~`nchEcSOJ4NiRTUO zt+G0Y8XO9vPvJdt&vf|$&B$Rt*U|=A*MWcidfJehaT;%9^xAWbYWjCMHy>Ix)yrO& z;nTjXwt!B^TW#N3ES&l(GH%>0F46+WpVmgjC3+!UaEO;Y3nV@{;@X!eJ14Hn);v7P zC3;;oMm@wXKdw3MdhMRF!?&LrhnC;XPSOTXUgJ}~V7 zU83k{&mnD`{SN!bZ)=VCWS;OZ($2VRDrqEm(TY0$eVEtpCG2ZJdyfX41;W2a%e(gF zv2ye}VLGSbThK^UeyCl>K5Vi4qZ%y@tM}8Pe?xAhZ=5uDvvJx&A#Mz4k6VWl0p4RX zE-ckYmfa86-IO&m7_(|rNOqdA%8ohM#@)3r$j6d8<`rgH)~WmtF-dSL(hPfLaZ`(1B!?19#CRo|E-EjdR%8|vfimY zGZ6p z@l9_#d((YC4n0PL&?)o{V+gI{iT56ZV=r zccbhrdY-s|eU;Hp;$QMw)n&9taA8>GM<(!VANusgVrd5a;sG(Rl{L_F?)!PgT?>2K z`vO+bzBxU$%s2&iQI)P}zzC}op>5jeHT?4Q)5m}|cy+7=prg5V>RJ9V9gb~Dm+&h? zSp)A!YNuE>7DmIgmH)w-c6ul9YZg6aH>ZpT*{FDUG3I5np!Gt3pEUE#>#jwxOh_r3 zgfVyhaq18}9}FYx*eipMIp4d?wJ+PV0MS>YFyhJM0P*^h#y11Kd_T>~nwQxc_c;T` z_4Lb*MTyWV?Ol3V?imY>_iUq24t-4{O-CHZ( zs;K*=@vZ7>m_oFVHc+Eu2zHq^^Lreloz+m6)!@Y9$!qwnc+Yx>eoovmX|@mH6CfbWLQJx} zQ?f6rRQMIa2r-?DG-s%?-E1Hb76V2rto|K3uNt``etE|2 z<8>`Y<&n;?e1-3Id`@Rr@8WxHSZ>(0FKPW=?@0$njKi$i>UQcKqk+xVH>Lx&kt*TW zs0yEyC(%W>;0`cX2U;g28Ufe76#q(5AZ7G+b8CAp60>DX{Tt+iBhA~iu`MYVVSUA*MT6Qv8lKIIy&kg9;;qbb@97_lP~2amy-XJtw|>|Ewp8nP zyV#PO#J}tzIX4liHD}ULN=6#<-q%%g+9U!&BUQ}}@Gn}PpM+m* zooH+~ROP^e}XzwLArg? zhdlV;Y7su!00poc>3^d08vi21^TTou_pQ>d$GW%JzESP(=?CeS zem$#^>kkK}^xn0hw$2GAzz2UuJC{~|1&w|GZ`~c0?Sa{DoItdR9u~VEt@tFlh;N92 zauQob`#kmZxdg0xi{vRi^&hbduWpbcsigV5UXbr(5=$Qvk%c|`U=<_H&3Tdf6R35_&&-9I-D zH`q*mr+y5LMT(w`fqxY|WRZWJgXae>=gqJS9B*ir#7qqY9$^9WH`D9ZU;}uH%^H)FrBKT>HwG{UvQh2!R!Rm`U5_7^)_>QlDeY-&o{d)wC{McQ5qAo2V;Q z$Blnr)#CAvIvZF}TIGR3a3I5&7glFAX=uxzqZoVTx)zKV5{vDS|t4! zwQ=jJ^8@K0yRL{|AJA_E;uf{;2v-DvjN_BRH+}m$i~3<2OR!Ubzx!xC1w|~uEcz`K zg1~LAeL3_f{ZK+tTpRc)L6gZFL3V@NSc|nNyq{Q&1Brm&h39Od&W?d20P)JiBM3Z< zTDENhzXs@S8kBz9J5YXXXC&<#F>jz_9yDfa3*7IDkx~nzmY+NVjk(y6yYR{4C_}_p z0Dj5tM4;WfeMymj zDa8zEwY}iOH31(US^|#tmDKhUe(AJVaM4p!z^^*=sczWS;o-|Rrc3;54UL1|0%|!s zruR|kWrbfd6AV!azlN>PhN9xS9pL!z^AHl3ylX!{`oaVL$4dO`JpDEWpP7TtJW<{v z;5TXraTI`Tl72`^HZ&z7SonGT1LN$Zm`6d!`>^|-jk00d3fT~AF-(O((egF`(RQi{ zmh?lTo4(PuJk3TFWG^l_q8~xCLZ9^${A-wgBco!A^5I9tU?QaOv@o9DuTAKOo_@N( z;Yq+#7=*-_KV3f}@rhWut;D~;ws^$yC#RB#i9zLm>JVAYQ;}zpf6b>CWWY8@*lc>3 z>Qe@1wQM6jr5t0Ce|;H2YD1u>Cg5Y83C@GzWyE_VoL(^CoxrafX@6=4gMIn*4LbKA z4702aVwPj9WqCQgdcW5x?HWztzJ1KL0Yp0(=q z)I;o+w#TV{s8MJSOyJjH)km1^-sy1NbyU$_UQ652K$Kg=ua_m3GL1DYXjW8l3oGLp z;#S30Z_Hiyfoc6P^UU0WyacM?FB@#^d;tSQ8z z!~}lLRB9o9l|&B62v9837FvwW<`~$t?phc+Q3ieR9QY0R68KD?XD2l{UYgM775`Fd zq0bJ40Av9Qjln-7GAG!@HT>$o@w{~v%K$%rnO#M&>sNx?WxAbUO-1~=?5@uE)Tr?~ z)(f)XIdNIGGJjSZbMeBluE3-M9BeB9hZc2=!Q|OZdyS?%yn5b!&)Kr$R>AY9F^iug zZ1-~JU={_7JMC##`v>|V4Jg>M!99OYO^!Fs&eC%_6ub-@bJtx=JC1lhEPdflAD!_; zoT!AMU95<9`1f^|@?Y%N)GD?(7~#8+L%%!*vHCNG-RDaDYd5_ej`;94I2|E4{C@Qu ziVXP(w@Si zOz^La2e2gpTdT^e`35-yq8$4b?FT5t)}pgeb65J|8x$6RQNntK$v;=i(#KXtgyxj^ z*AB(MWW_h3fm|ifE(hy{M3~YK|%t$qGKOy*yR%neLu zjK+*sW96{+F=F*U*AIt*Rw_2GSD}8vy}z%bWq?9wQ9oP_x2z;V_~(N(TNpdo2jWN6 z)DDkb#IKobGxS3<$IjEi1hDB%G@fUOA=8uf!*yVzW}HEk6SKYo_x=|BqrhIRE#VjP zU+xIUXxtN_km9)*GY6vmK`X?Ey*Gk(O~msTWHg~*D|11%#wY8C=V=P2<4-Rcq04$$ z0ohzSf!(`1r`_S&7xG_)xYv}`V|cyThsqTUP?O9Ot8(ot2K@So@`q}uaB;%4n2sm~ zYHB*r=Gs>+^!atHK4HGeKE)Ods6IY=5^oIJPWdGKQse2Ze~(|FK@3a-5yLEy7hdDW zt7|;KFM0uev;t3A?B8aNAUhdtd;QPwOX(ylov9xi;|AVOhX#EW+bz_oEz=A8Cs;OL zSG3Et**G0`z(LM>7X%)ztxFkeO8B)DKHNUi6J`j}bKEh)NuP3hTaCHiB7W5X{;-V& zwlUJUqeeTMP6)ar7Ose2RrE_aCl9soUHX%pGZq@vB7{U(9*nGnUkrYpu!4EI6npw) z!Mzt^{`8Wfe)uN+hitJCy+`TwRLdCBURUU9vNexJ5x>%6eH>fsi%CoILC5^x>>cs! zlE$~N>x%rVmwsmKl)-lIS7D6k6K5wmR8YrEB#Zc!rKIF>gOWl``J`EsJPQ65a+do_ z{A)Lj%1F$Y(h~3+yBw_7M|8=Ke(FC^!mp3m1p^*npSGJ{64Cs1z1l}Q=JkgE3A2b_ zSL8dg^$x$|8KbK^TT$l#-*UCKRpp6jX@P@CeWl**G}-0>_K|!pkG$0;_8vXwghq^t zZT19yg{YS|k(n$%4Q_>Gkd6Eo_}7q;2^8_mr*@_TT*jKRkb}6lfCbJ#x;p8BXTcBn z*U92qz{Q2sq9Do@@FWxb3;8dE@s7V;dq?HJls{BNtW}^<#IJXa9SVhG+V||&)3>ko z-37jk45m|&*TSxSN$Y*uD1keYEi!sIiy6OV4f2p|${UX-ZP&h1@T+M8E=#roYZ3g? z*E8iy`Cir}D+1+#3H<6;b_&(84J1^8cBR=&125qv!;W05-{8{_A6kRqP)hqAy=2dC zuk6)U!#}rsnw zg9I11UVsY=u;aB<@MGK)rA}Gb4=lKeo|TQf1L+ffp%@x=1I&e?#r3yfz)3u&;XIANd&ig`;8|>UtCKU`IpsCL-|O1=tuRSU9=$XQvt)!Vj!BO1zo!^ zsNcFE4#)imyu)6|P{26gmqKbY(|OE|ZBV}fZ}X7#7hM{s(R(9SC26*LQ3~HD^h3Q? zyg-2g^KtC~@JejR5$%F_TQ)01JEq<;p?)Jqdu+UUD^NAHqb(sT82bfv@&_H$hd$Tr zYr1E@n6=n^i~a4+bvB+81{OT(MFb*}*W$w<_}4l4WWrplRnZA&uU#245794Ei}L=j zYsXmOyTHGUi!@L8uh-7fZM>-iOE60Rpe8sv!M{Y=yL6|$XvFu9HZOd_X|*9gF0fvg z^$otPc}@QrnDQf9uQv`$!S|8}p&@9?4O8B*dw$ExFuKk$(t=O*m#Gx^6 zp&4Z4yw~t6QFB~uQ~S_rTR~fS=RDntr*S-d(Jxy=R=qO~~zh&hpM2MX};@^D*&XJc(shdIas zx>w-edV=NM^-}p|#4(P^*-~JEsu^H;tCJo~;FBX|g|#5mvmIiE`i+pPuanEuCu%pTM&DCtC8om9>#g#-oSCCP(INpv8!apBd8h2MtBbbRUnc0i_*!5bV3P_+ zUFajN5hIBZ!Wd&`b;$!c<8gLIA)38>V1j?C`oko2Hf$~AVGW*6SqybwkWI}=^@qD@ zqtWL;bv#QQvd|bwKp{tNf*1MMdG?wZbbJ|T7g;-E0dD@CvfGds?x-vBuN`0|i(bN; z|A@Y?06LF-_#FWB%Fz;j?S@~C;5qdn*y*ilUmp3dq4d6Jpo6oazF7D*Z?vxvet9gY0b`1u!YVts@Cykfk8OMh(=esvmk+2BLlDro~l+?!`9 zc7#+G&nV#+A%Y#PxQ*Q;H_KVJxyJh_|Ho8aduo*kyFMybb2ipl5g4inSNnNKECAx1 zgdm{vTxu>W;@4BOQ4GpT+iYR4<=C@TIk`V24C@JRx&f)7t4jnY9goq~o|PzEw=y}PD{UIy5*GJr(b)7SXd=YCBWoYwZ0@0fq2=jH9+^}mZa z>bG>OsGOYt@|>`5p-t(Vl^hxso3>7E&{1!r6ue^o>)(^9-2om1?J}e%1d*O`71JV8 zDdoRj<`^oep;CvZaWN8M*V8k}SqTJPM~e8>)v442i_MTd6iR@e%uPLC-MkdM;FSsf z^*-xfHVPR`_LI=mNpqp_S?n<+#BO zpH#3VT3D6SImR#7!XG+C{3^R$zA#cx2+@Q3MtgR~*v)%U^ z3}d~(LC$*@vDd|3Cp279tUt6ps6L|l+?w{grc;-kMF`9adIEuw4YDI$jam+g;D&VM149c~`fK9b`J>_cow#K!QM`zG)U`7ic6*^>8N)>`Q@ z^eFiG2pT_F?Z2!!ZaklwvV+!H9>@45Xy887Z2#Rt zEK@)X0skuN5zHa3_870p8_-mpAnePR;d~gf#%7)op*PI%ME%A9G^>A8er!x@O^m0Y zBMq{8Z;jVqfU|;KrCyfM~4xb%zV(rzsu0)I&2ksP}fCbXa;Q@4&|1!D)bp#@&gNR+z4^{r_Ao2LCVc1uPj^h9|7(B?Mz=@R-|KbO! zPxSP%5rUx!Bi#mkrz$i8Mg0&Xq{!X=ZQ2M^qQ-6@v=Mh$%$~jbi?5HeauFn|?NG9Eu0}4BMDb zZ}U(J+J$!lzgF^Xw#|W7keCDyqle#lL_)j@m-NGkwZW*XLkcNJdpt-XwI`?34++(M z50&)88^pgR!*vzk(cY#{(=9xt5@ElV3-hR-FY1T3Vv)5~nI)&_HXilCha+KxnS!t! zaqWxB&e5MbZVf|+Y%vhew?j6(0?*$9{jl>Ieho}PS+4~>6KOcnW!>^c;MY51gSAru zSrNZ_#WOUc2F!(EgU}D#*;}YcEHsMvmDTrTA!{s55=p0F2=2X*+*B3O*$Mu&OPq_% z3q!&Uv23cmF+`AeRJ#C>6AYy!=&PnBaG9V(B@(HqxCklP`1HZcUCIXPX zPdyx79epP3OV^QMk*JpU>EK@?hnin{vZKew7sYwTJRG20_LWI z0hI`w3H}A4W1y{wU&pCO(UMfb%U2TP!c=^D15IQA0q$7dXPs8D(uDs1IE^B z?lGw;pURZ*3u$g=Z^XB!6S{<)-|n+KI$PGZaQ<{TseZl-Y9aZ@ZoVQexN_(P>q@$H zaWm@Yt%Q2d!g`uswIW7k*qq5>Xsdi3ojj1Oe&{Q{eZWDk`ee(hSf>QSW>_;lnF_SW z4zMQPBj-tDP6@wOAdKhju&)^?Ip;Mv1Le?QqQMuWwqpH8t8epA-H4&;H=Y=)YcR6q z@6wBM2CDnWaMu+1FY%ICZ!8~$ypNIIl(_TKQe*QHbYW%&Zmd9&J z^N%as`gxrHidb*D_NDa0D|YKZ=uYi6iSZopCw_c8yTh_)a42 z^%+|rs^VxIrG>(uEAg*kK#0p;34n!;RugB?Q&%!up7wS@QXi-aR;9q^w_;rtUE~A7R5A;Ks6$>o9mO45q zppy(~5q8{j-4tI}iGS6yhZFU^;9v8_!})-W_2ZiW&?(~&?3im8!Lk+9*%w>`w5p&- z5B&sfVUZmIL?IXTy%bRH6oYbWJ*AAKWX7o1|3bxQNs`|81eg^qUf2Om@zb?~o z!Oxou`BD1HnD2}hm758;JPE(<&{J7HHak<^BnM6hRw3*mN_ys{mmk&=6ZqA{!CaOa znTVn=PdT-j*+CkBYc+QSxVxsP->{^PWePJao`L{q`0QqCkY<|NJZkEN{1>VW?uPfr$`5MKxFhW&`cq=vM>o3!<>2|R)Udn%+lxI2eUq{UE>c=IL z>|-i%sle_Ch*-fcaQ=&-93^4w@Xp4Vn;HPMJ_LB+j6)^<^&$0HybFR(*1+*zLM#!) zL8p)dMi#h+UsHfzB9KdU89|v!HC32%P(S};^&Fdp-L(+YPSV-*ULG3uoMBmspkf^U z`FGUX4yR{LEU>97`S{{Z$%&Tiu@0X&hgu&`orCHWO3L+HgYx{jidN2V>T)x z7WeTI|3V23_1%rI&=e=BX~6sh^ZFh9hVio!e#NBpaGG7VEoDggppALygrLGP$Xmp( zdETy_ydk)XJtnrN8*S7=+=S{rZSS;b3(}(-B841csPJ{5nkE ztAjM1Gvng2g@wyuf=KX@KVQ-hN9k3RwN$N#`VIQ#gfiOG$k~N2hLW8{{?&^S);au} zfGrr2W3&gRt3rB#!=Xj~_2QHtN}hje{><;vCOPAD#W*``bgILB;9stN#cEzN9@z#) z7WRILBR+I0(yU7EBHm!kD(Qz$(%WM2K-GZx4@s1JZLhSoL$Xj&pD5{vM_Ari$owA7 zrt$CsO9_cEv=@|sQ^YS-Ay6pWK=FV@!uOcg0KPovT$g6d#Y#!5S+_*}d|JDY_Q=4R z;Evemia1+J&k^wJdZrXb z{x|58bnR>6{IV}wZ{z&eAnNC#&!c{R78u!tet6@*8W%(~-n3nNOXVx${;#5;PO9L_m+CjbbJs=g zxwCi4{ouJ6Mz1ylh=u^Kx4y`~o&bIo*w*{A?@4S5ZEodAMNsz0ovugE=#%C*`J#-HRZ3CM;w&=tAY4o#{* z9H1w`5D{GzWJ3qrZxlsG1w=bio>1$h>gV4D+d}kyQPqLi2t1}sWH1vD63O+4sGlcL zs;*#yy+I&i>1B7Z>0%uU=^+wc!xW;;B;$xTVj!hIr21haQ9hrk`a|fw!nH46bBrXK z2H!T+us4@*yg|5&H1V)Gseb+!>{SuTg$}%Qy6fMpLECqrr%C>pB1gbniug4e`#r-f zEX)fVGJ{{8C46$kzZ0K?)wDdQm-<)F9N>kS(Lb|ql_&>^2?ItC+sWeNs`J|lnaD~AY$a* zghog#p^5mgP`}}ch!A`~w$?le*FB)XSFMhtxpB*l)svl3C$xb*C!?#;2)^F@1@UJ|kGfG#2w+guTE7k?pYHd+S zolxH;tf%P1Df6t*;B{x|EX^CPdc5*n$#|O=qv**i5i1Rl~;J_%QFeUOeIKT1?rl>`UU? zYv|eGIYHH)^X#zpk2?%#yrdln47Qr*qomv_c^heVI#Se z2My@+w0BiQ9FaQoL!CqD01g(OGdiu8Ud!*@xyfF>fIbziyZrT#YhED;9h2%e{$1@% z{eMX<&&Nfib_*IYWWb^Sv47f)UQnv% z+XCN#eU+=7xytNK+U|RV0(S(fp+g=F_6hW9z_H-InAwZYLd{+2^B&ZFRn%aM z9@HUvTh%%|8;_gSsUm(QC?+G^7pxCJKa6nrI!Y#YUwL4sYIG`64tb+AAXJ=j%&TMM`7r^2xP1obCVIJ}#SW@-Tfi?40q}Yh)u1AAmF8sy8#Jb+tT94JoIyFt zCAvYm?&CQ95tUn@QI{vwctqJnoO*6a_Hb>8NGk31 zCu^2tE>2pw{|EZ>-%sd=wbV=dsm?O);?wCx7^6AHYWO~*-ZAcGj{6Q1HCZE^0PhZ0 zR}y#%H+4YvP8vvJO;5Tp+rYGkku`4#`>Z8j5PM<~!+%(tiJ)sx`VMKocYS7>&RDP} z?%!_W@&_JG`@3!iE{hlNiI#W$p|mb@R5eK0*F3tKZgHx{IeVK&$I= zpk071$3$%g&VM~G5!heT3Y@Y}#pQ5IyYIAuEvtq5&n<}pI1qv4wIcsIO9xj6vc~(# z2HuSqZhi|QSPw;<*a&!2Sd9nu8y$lgo;99;S#_@F^2gz13SP279d?d*+EpLuhq1jD zcMN-31H+LV8(iiof`aGN+IUVv^$}Cf(nUEqyvf$Cvrfce7a8qm$>VZfK4ecV;@4qB zR;~GFz*Zc`z6b>m-vgq(nDg6Hi};254UEvYQ)>Y2DmHv}%1bdQ_I+lEUM|e5GlccRlXq!F{-h42sQNDNFffZVaGty{X50?|{V)#(y(QTxY_(p? zsK=SPv_j?43hS=!kGeR7D^T)UuY}B!MC|t+DAEzzH!1&>r*V$RN=`}8c&%z^b^!Go zGT#eIp44b(jwBzgj5}pWqh5ri-D1Kx%p*ve)&KO)rOKa>bopRI$C zh8(nwPkMM$yElV_%o!sfaL*EVeVxLuos+ z(+RSe8V^_gnGjiVtzcjFjY>AWk&q=Xl$VR^#!OYev4|9YmA9*X=#-7y!&sfFAuTK} z*W4b%GDQfVIMY>uWuXu5-=Gxl?4nW+e%qJl_^^*FxQY_#AOLP;u6`^C*-&hdvv$VTuxff*avnRGoTML~voaE^gG5-veCe~{pHEX* z;3C9H`r&8RA_s7+u06c9-;aZPZOEiK{`L}njlhdyUTN)V3%G3i2I_Up>mjistrhcM z+x0Cv_*Z+NP;Mb(DC9uJ?@nRFC(eI4Fe(ML6{~<>C`7c8|B8AZg(q3Fwry+zzh0i* ziJ-9}jPqYO$SloSs2O-n0`U)&&VL=C*OD!nN?RLX$7pXyb6&eG`L6ty^qpnJ{1@=c zh*md&cG0+KC7<*pouoK~E6ZshD3WZAmE^w zryB36%xpW(HR|0P1=^WSDS(lcU)=&=~s z4c63Kv@hs~wT1IvhITKF%Ue01Hc!ZW@+SG06ZrKx+!iIVUOP10f9OPU|HdPq_I)I=kBAJvz# zc`$gaq#xp{E9z6bu1nuz-6MjzK#g1%tP|cz`eDCuFcDasQujw4M8=(R)irzrzejAm zyM$lwKlrf&JjFQ$+-*3h23Cj@zFq~f$c^WNo~H@bP;g*9BS=A_{&3rpkuFpu#w!1; z{t*7Bx>A}bYq1Jt8+8o$W%-;XMgDbj>fu~n#^?_$U=LH1jBzErz`kg7$uifzf@Mo7 z$@tQ4<>Go`xSDJ}s{+Sw7@DjfR?&JO%LwD64mNETBE|x0Mvk>Sq5L84KeS#+ z&dK}6>#<&Gz}87^KfT`3nh#CZ53O~zbzR0clQo3e!aHDAbBzsFql0+k8h%;O0dZ!{ z0e+?F8NE&z4(QwC6e434yQXifsd))3fFD751A#Bw2^2TC(Ua*1xlvonfAuRrANL(V zm;v{`(|4frcmTPrBfi}|*S;%FA11~VnAhBTUtcF!(|mJZAY`OuecH@dkJBbmPhW1wZnD(-k!5w1asm!+ z&(!sl)5j1Wj;J+tyh=0>s*jm1-0*SjgB zV%j{*qK>*LT{{1jE7WfQb5-$4EBOT)NeI$o~3)nj97KnT~qKcEM+)V8P>Y!O@tX`VNGDn;T#a{P3&L%pnhIg z_kI2MIDMNML~9JwIV^q<10&0o@ar}Cl8neL8SLkmPDNzppw`S^6_I18=qTbB&MzBv z9cG->FdSrdj9b`rxq-uozMU-IfA~|eq3i3mx_^UjkzdF|NQ?q}XV_>I@#{EsdV+nX z!OD22oTf6))2ejwtSnSq8pFQ}U!AGqvDFoi!LQ;*4#x*=$K7L6@h=$?YL5wZ{tNY@ zjdak7#EndKeiHxUO>Gs5=HM`MV5VfxLy@7?py{W>VnN+_)DcH_{WO+22f~gdaJ^w2h(gf`XE}KRKGC-{xuliv|an9Jeoi~ zzv5reZQ_5Kp3r21o-Tq6wc4NVe4k&Ug=?DA-qq-XdVopyN7;BSK&vi|8{@n{#1KCl z5i7K*RKKCn3UO4PE#QZScI`JlVnO}_tG5v-7V9_epbp93#A#)uy^?&)7+`1!R5jd& zK5=Ciwr3h`5Oqh4wctC?rT_{;<-e%zUN7o5+%+9A%0ZX**g&frP(auM+J(j#_*d0; zO7-*o-b=V15biw>w-c4kQu|Pj1JNpr_(f%(($!&jzqL~r(4QRO*XYz+t*a7^;{Ck? z(C1&|7{<5R6zkdAx+AeSpbhS)dTA_9o^d&ms-J&G+~XMSxHjqq+~EcwvnYf7S4BH> zh^u+=nqk^Y3CEbpgupUoU|$-54B8Hr>JPi2ZcAIfFx*xgcHrh{8xj3tZ~XXP=1DbSYR>EL_CNw2gK)-*u6r1 zm!Ye$xzB+$<@Fw&OVCNe+z|j9rTo`wR2oEtFSBHnjxm_ItvyJ%UqS(yqq*yj^UHAW z0^V<|{4;tUn7d>QHwVHWIwk%!reI3|tu7kP66Gj=tvy7?ot9ePIe=Ze8V}BY<$Bfy z{wmhX-nUX+xQ?HbxQMLGyx)04+o?*L<0qRQt8OPjp7t>DDODFfVhgA5Dz{A-xW6BrVMG*;vc26yy z|9TYjf|mf>5;!nL{;|%>`iWjNCh@O~fEyIk)7YXH15q8hiAFkE6S>>hU&61M)Dv!Y zj3?S~`PHc=$CRwe`HHl8>e&*0#Ux^NGJ;257JHn~o5%sJqpeQEe1n(p>w2+HHrlYS zw`sp@3?t>II$rIbC$-$xxrRR;WS_-~X6YKfiw5gKBxn+Uauo zFVta;od^^clwq$H@k^DLM+KrU&@Q#OX{}-DZ3YUwxBeObq9!PTfnkUkAY#*#Uyui# zzF1}NB>qL+9icXFj=hh4*eo`VL+gId3B(|DOwtcK@SIqjoyTG}E;jEjSBRE~e+jiB z9`$;lA3lJki}EUjg_MGeyVEh@s42qlOqmn>>&8E^PY9JoX%$DYkns1`p&{`}Nk1&$ zSL-rgdMccZDvHQycLUMX88M8fU>ENF8%^n;1Paeb`A`o80V}1?Ca*n7KLma?3u6^d zjNC$v3BcBBeA1xEBXjKw`r+#C&ZaM+e&Z9uwTBK;eht*Y2gGdT{@iu9r@hBeEgvt~ zSE1Czn!1!7wf8^N+&f7>B;4m9wqPw%aDy?}&Idkt$orrlmd<}s7B{npkdh!=*Mqc| z$wfgw?CLD?uLb;J3Z+v0fe&MaYY+46w%T_^eP88d{V>_NG-Mm)%z=x0ka}o+74MAj zlh93aVRNpWpS|DLxVDugL@yQC*y$w-svpn`qhDHzrcMv5gFR8)giI6 z&@q3}6Pt3(8O$4tveYdU!Jxe z{H*}!IXg=@lkZg66a0%5|6-7@ zGfQBe;KB$CM{z?@Muae)3H-uUAt*0zF6=STu78T7WCujd`HM;Tby*_+mEANx^?C+g zDSSuj-=wPsE*Lr2S>#{u$jn25eq+!(Q%^PYeG~cyZbYQ!A>&+0KRm$^4RUWLsZ-K` z`FYqeW3Pd~GZHygsz0OyMj+wM%;fq;-Y1NmY*ai)O-?W~p&#P@dAQ}hbZ1!O5*LIz zo08gTb%BO6JyX&T4;xp+Lecm!J11~NaTq>f41tHzdrSJ^Zf7VSkyxEPe;WY|0>!gH zw6N0{F4fPs5^6#7ltE=ST9A`im-u%p!j6 z=*OP`SZuUwcN-4}5CF&7JNDinPI7&#gkL|E&q{E{wQL(b@uL9+Tev?8V-7;gb?r;t zAGLQoPAlIQIFapfg6bkEWW?OLPtJeQUI{!sM1Qbu??rep%8}QTKD$(Z2-+p0Y>Q+G zW4x`Lnq}u{UB$hBF$uq31};Mi25g}aF?|1~j0X;%B4Xtv{&gR9XPfSW>n_{4Sq2iI zRLIOyfnSvPR{%E#D8|tse{A&)frE?`Imm>4scaWcQ*QU_XxIW*xDS)M%YAvxM11Jp z-y7wS4LQAyKcwPIEdghggJC4X{@~hI;qRvmqio}(hP0Q1#&!*39*W+zaz`=$Ri@w= zxAa)}TR$h91&Q4Xpw+y5lj;xiP*WSGDQ=1Zn92^&N7V8g(fmZ6ShU-VD zBQg5Tn1u}qi(6(`ZAJX*N9{_}Vk2GtUT?Q}O1+;Ex()9Kk?;h5O&MWFMf6^L`!F39 z3qGw(@M{ynnqtjAs(+tdXn+ibG0VbVRGG}bJlWhJZGk>7vvr017gm`D z3HnA6zmR2+yaT6|{~`6X6R<07_Mt4)AKGnRcP)ZtD?3yM+zhuZryi*fV~-(gv+q%#(cp9!fQ*9yeKQespEF=owXI8|TI2iLU(qY_7Qoj3*WT5~#&KNt zw|jfkiad&Y63;!PO0%To`l3?Q>BC>LB#tPOzB+8pKp$2L{joCihgvwr$tha*E1f&i z5*5)gqpE-l2<ZAb34378A$ z&VHP9`@8;d{ZRQ|vSYI8TEiB4OP;zi^#1k^g8wy%15(U9KkU(=LuSS z#xC~vp=5;*{nGvy$8UgYub9Wg6NHz)vuzbUmcctd`d+f~J1D`7L+&nzCf zcg@nng9wTk!59ngS@RdOH*e>emi-u2PUrF_pI=rsGn^li+W*25?sQ@$?}PY5BhU+Y zn%u4`{<=m@ep4}V0g3241lvQ7$MylD^+V%5+AP)j;YK<${3VVTT}KF{=Lt;cfBDW? zi8E^zqB4TJ2zF!8Y{voQ_DQhtbTCgioAljN76Jf95XvRpdj*uy&&ac{BY9vlzC`y zg_kRspK`w{TfPobc$@GduuFKO%C(@L0uCF2t@?0!8j0vBF9FWe58X`?o2@?z^hcs4yknCba;vA)^; zHa$uWUgrc2&}xZ^;@i=j?JvN&VA%Ifq;Zfp=CS|v7X6h(AmRhCqN;xi&FA*XNmoFv z>g6fe4IDY~@pO?(o#OSwXK1`|s+_vi|0}~E**903_F^9OTgV@Un~&EIP4E|J3(bMs z<=`Om6-ylu@Dtkq!WI&&dgCzWkS`76{PJ+Z0+FFz!-ifz#Q93${w~b&IAN1Zz!AGq z9ySzP#r#FjVmEp5usLNOwtu_FK3d*@%zjKz|n8 z^N#}kg8yY6#@cC)_XnY;qn{ftAESq?HR2a1;`3ks=E1!!B5XccerfoYB61F|q%Rm- zx*pc+hx?5u`22FA>1!+SP~;N$Uua<1t~h>!&UzauRfaiL8-;S)G+pKcI92&KZlkXb zwj9IzQ*IXrY0XH3XZ{R|hO7Zq>xXyCewp)g%j@yds6yM7Z;u5`V(^kU+mv%0QfpSh_OW9&476+`~o-+YNA{0%Ix zy(r28uX4+ord@V%qUN?Z{_t<T}E&T?)6++gZ%4q%dOqT>Vd9wsIPPfT z5`3#Ie~#yMS*jPQ3_#-)e@SOL|7xnElER*g`=Rw2iE(IQ#)>?*S04-4&?NjXaMLZ& zub)Ce+7C43uz1ed*ct|q0LtOE%j9Rp;lXx-o&Om<$H$W%!M5p<0mzKhO$N3O=f6ne zDZ{S%JfRT{6$CUQu?(G~NWUcVA7a=@*m>9lRtFqp#`gi|Ci?hVh(E-0-b`zh|HX-X zBS#D%;;-a1Rzb0)KH5KBIiKq&485QDvY5%QKaUkfy?%Jv-{`exkteBtKoOm?$`%9z6P1i{@s4e zUr-Sb*$y99-LkHLxiLrSoMfV(i1^E;uZVV;djdN$N4(biL8F)9S7N>~9P<}aYZ}-q zxdCbCkrYM3ZUpVBr_L~b9{!g=3X6T%nO!P4C;}9~zKlCrzu(mBhbuu_o4VSZ2CMTl zjmXb9i_Y`@m%oH!{(2!bgKR%dKTNzUK*x_aO(SrWec{#b#{BiVaSpVV8UYU?FR@G= zO}s_t+;y)%c`BjzzlQA4L(D?0;C~g%7pdQI&)HrazwwuJ=t1xoVovCgbSqfu{E3ZO z?o{>u*DHj2rgFENOGN)sS7M?5ys2v567$zLFg?KHM+JlZW$X*L!T&-DZtTgJzkKl5 zCW0^HW2}DP!K9rB?e{p5l;*F?^paGxh46+-z6%@H9P_3EG z_8oDSjvA~w!TT%a7Pwsvt=3t2%EkHyZeFf)@5cUDpkMI6OqF@*SOObiVhb-Mazx_y z6sS{UHOu~2rQ;8fZR3^-%-}v45bb}B*YKA+SW@p9X5L37m0DWu;2>ONzaoVG&F zxeJRk9INI)(cpgxfYFe@(gUrqHsCnLU+qHm5AS~s9*g-4_XBf*>A{UA95K;$T-^_J zSMyiSc-+Remr!AcA#L$Jqom6J;`sSnXh`-O_n!4e2F;+w%(@Xu8m3%yKiGiWTlO^oB(n=q*cg_Ui>0*{_+K;TtMc2Eso#wEzrJ+>z6^)wDLR&z z`+c$UpZhmnz=o0bzdoXmM(!wLw`(JQzJ9VT%)c>>61{$SoR578oIYDl4-(qN{-9d7 zDVpC1=7)qi)6=b=oy1ox(^9Ty8P309`7a?b? zfZa%0hiSc;x{^R5L{d9qewVsd$-0l8<2CB%TcJd9g**5R*4}YK*3Z3Q>isXIjdC%@ zo&mLev()Os|6&=~d0E!{#bNWjzl=G_qtf+qBWR#%m*y{O{3E>8b~D?tHtP*KNpSy{ z2loR-i}))Dn}2u$P5u`?2nJyP3A{)Ia)kUvV_OqNanZTeYCK&9wyF|;Eq5W&SXc6Z zu}9qFWX>c%AAtk393?ybwS7uPnuaS2?o!(-&jGSUiI612quq1^C8Y*QkM^h%H;@@C zB=0x&$a~z(S%BpcP$ki|#sqm(^DXRsi6yD&Ug(;F;!Sue;2)MkDZI za-FYA{7`1BGwGFfySwa6IRgDj@3bnBQM)>4wVOL2AM`}kJ$t3B+k@kRRtU=0hEk*3 zQ%GwWFS*;;MLT6C21b@TxkNT1#$q zoq`p~jP)cwFE4mEXB(?Q=@^$p*Ba|d9w_bc?#U*{Ly#G-3raG6_$<165(nf(@78SN zxCX|7(re!DWk2nwgMRLg>dA0D1ys0m+*&JB0BJuR=oguD)T(S02b9M7K{Z5m#$LJG zyCK_sFa*hi$-Ss>S2iOt7WvaHl0{<=-9woGY^P=)CB4R-l!>m@-ASIzx^*^&Cj&KL zJv=Xz$mpIsd9}suw4Jg7U3R)`wc-h)B$i1+o7^3C#$=G+naXq;!r$RG+ewPrl`#7J z9r;WuxvdJw9d5=>3U$Z$$Hp^ul=?DYMYA1foUC)vs-SZDzABON zwOq1=NwBa0(sXH(YM_6Hjw=EZ&_WW~I!2|5H?#x$Zmqs*Q(msmp~+q$2Y%RAllS&Ml&2D!9fRnK*KIg+uhRt(WQW@S=jG*qp#8u`35ZtlvL@&dsEPz`5DU1j@?d8J-w0%I zEls1dfef!@%*V^&3`GY1U>|*4J?c_um$3SbX6mN&T+kU@t03xVt8_doYs>{fHBdeVBp(BLjE ziN*$=R}C*~f@WS0uVr*v`~)>GSA$3fV?#*C1!bF-DAfXr+LfR_zd4^wfz)OL5ngK+ zFKdEk5Qy-Yui<4)&5}MLAERF~ltCZfW-Os?(wUqC!anR1(0qa2Tno{( zvw_bCPjX5zxf({Ifsz?|GrekJd#mhB7 zM%Q9GZnnCO^gJNC);!O=#Zd%SC-0YZ&j;*#)F zMQF7nkO!xh(LbLH@GJh<)zmn;5Q)% zh2jYe7n~1E!~ZO|_V4TewQ1A!zoVw6kNNU{>Z^{KnHirep9}OQ=YFM2{?E$9Dm+K2 z^*zs{gIc?_(Dlcv7WpLg%vC*I64vvvx*X|6Yzp+xHHc+uMt#-bcKHkbAVVKi`25eW z%etPQQJHKHqby zEkjtO!9y}noxfW9&B9*`J+RON3q7#V0}DN{&;tuSu+RhC18Tm62@~c^g8yFlEcC!a z4=nV+LJutTz(Nl!^uYh89>6X?_Fdk)nkR|>DUm0!_>;6hluzc7g@)yWdQQjNQeh?k E1*>}==l}o! literal 42175 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 diff --git a/fpga/fpga_hf.v b/fpga/fpga_hf.v index c6362a68c..7593d8aeb 100644 --- a/fpga/fpga_hf.v +++ b/fpga/fpga_hf.v @@ -18,9 +18,8 @@ `include "hi_simulate.v" `include "hi_iso14443a.v" `include "hi_sniffer.v" -`include "hi_flite.v" - `include "util.v" +`include "hi_flite.v" module fpga_hf( input spck, output miso, input mosi, input ncs, @@ -78,7 +77,6 @@ wire hi_read_rx_xcorr_snoop = conf_word[1]; // divide subcarrier frequency by 4 wire hi_read_rx_xcorr_quarter = conf_word[2]; -wire [1:0] hi_read_tx_speed= conf_word [2:1]; // For the high-frequency simulated tag: what kind of modulation to use. wire [2:0] hi_simulate_mod_type = conf_word[2:0]; @@ -95,9 +93,8 @@ hi_read_tx ht( ht_ssp_frame, ht_ssp_din, ssp_dout, ht_ssp_clk, cross_hi, cross_lo, ht_dbg, - hi_read_tx_shallow_modulation,hi_read_tx_speed, 1'b1 + hi_read_tx_shallow_modulation ); - hi_read_rx_xcorr hrxc( pck0, ck_1356meg, ck_1356megb, @@ -156,23 +153,10 @@ hi_flite hfl( // 010 -- HF simulated tag // 011 -- HF ISO14443-A // 100 -- HF Snoop -// 101 -- HF demod test -// 110 -- Felica modulation, reusing HF reader +// 101 -- Felica modem, reusing HF reader +// 110 -- none // 111 -- everything off -//mux8 mux_ssp_clk (major_mode, ssp_clk, ht_ssp_clk, hrxc_ssp_clk, hs_ssp_clk, hisn_ssp_clk, he_ssp_clk, hfl_ssp_clk, hmf_ssp_clk, 1'b0); -//mux8 mux_ssp_din (major_mode, ssp_din, ht_ssp_din, hrxc_ssp_din, hs_ssp_din, hisn_ssp_din, he_ssp_din, hfl_ssp_din, hmf_ssp_din, 1'b0); -//mux8 mux_ssp_frame (major_mode, ssp_frame, ht_ssp_frame, hrxc_ssp_frame, hs_ssp_frame, hisn_ssp_frame, he_ssp_frame, hfl_ssp_frame, hmf_ssp_frame, 1'b0); -//mux8 mux_pwr_oe1 (major_mode, pwr_oe1, ht_pwr_oe1, hrxc_pwr_oe1, hs_pwr_oe1, hisn_pwr_oe1, he_pwr_oe1, hfl_pwr_oe1, hmf_pwr_oe1, 1'b0); -//mux8 mux_pwr_oe2 (major_mode, pwr_oe2, ht_pwr_oe2, hrxc_pwr_oe2, hs_pwr_oe2, hisn_pwr_oe2, he_pwr_oe2, hfl_pwr_oe2, hmf_pwr_oe2, 1'b0); -//mux8 mux_pwr_oe3 (major_mode, pwr_oe3, ht_pwr_oe3, hrxc_pwr_oe3, hs_pwr_oe3, hisn_pwr_oe3, he_pwr_oe3, hfl_pwr_oe3, hmf_pwr_oe3, 1'b0); -//mux8 mux_pwr_oe4 (major_mode, pwr_oe4, ht_pwr_oe4, hrxc_pwr_oe4, hs_pwr_oe4, hisn_pwr_oe4, he_pwr_oe4, hfl_pwr_oe4, hmf_pwr_oe4, 1'b0); -//mux8 mux_pwr_lo (major_mode, pwr_lo, ht_pwr_lo, hrxc_pwr_lo, hs_pwr_lo, hisn_pwr_lo, he_pwr_lo, hfl_pwr_lo, hmf_pwr_lo, 1'b0); -//mux8 mux_pwr_hi (major_mode, pwr_hi, ht_pwr_hi, hrxc_pwr_hi, hs_pwr_hi, hisn_pwr_hi, he_pwr_hi, hfl_pwr_hi, hmf_pwr_hi, 1'b0); -//mux8 mux_adc_clk (major_mode, adc_clk, ht_adc_clk, hrxc_adc_clk, hs_adc_clk, hisn_adc_clk, he_adc_clk, hfl_adc_clk, hmf_adc_clk, 1'b0); -//mux8 mux_dbg (major_mode, dbg, ht_dbg, hrxc_dbg, hs_dbg, hisn_dbg, he_dbg, hfl_dbg, hmf_dbg, 1'b0); - - mux8 mux_ssp_clk (major_mode, ssp_clk, ht_ssp_clk, hrxc_ssp_clk, hs_ssp_clk, hisn_ssp_clk, he_ssp_clk, hfl_ssp_clk, 1'b0, 1'b0); mux8 mux_ssp_din (major_mode, ssp_din, ht_ssp_din, hrxc_ssp_din, hs_ssp_din, hisn_ssp_din, he_ssp_din, hfl_ssp_din, 1'b0, 1'b0); mux8 mux_ssp_frame (major_mode, ssp_frame, ht_ssp_frame, hrxc_ssp_frame, hs_ssp_frame, hisn_ssp_frame, he_ssp_frame, hfl_ssp_frame, 1'b0, 1'b0); diff --git a/fpga/fpga_hfo.v b/fpga/fpga_hfo.v new file mode 100644 index 000000000..c6362a68c --- /dev/null +++ b/fpga/fpga_hfo.v @@ -0,0 +1,191 @@ +//----------------------------------------------------------------------------- +// The FPGA is responsible for interfacing between the A/D, the coil drivers, +// and the ARM. In the low-frequency modes it passes the data straight +// through, so that the ARM gets raw A/D samples over the SSP. In the high- +// frequency modes, the FPGA might perform some demodulation first, to +// reduce the amount of data that we must send to the ARM. +// +// I am not really an FPGA/ASIC designer, so I am sure that a lot of this +// could be improved. +// +// Jonathan Westhues, March 2006 +// Added ISO14443-A support by Gerhard de Koning Gans, April 2008 +// iZsh , June 2014 +//----------------------------------------------------------------------------- + +`include "hi_read_tx.v" +`include "hi_read_rx_xcorr.v" +`include "hi_simulate.v" +`include "hi_iso14443a.v" +`include "hi_sniffer.v" +`include "hi_flite.v" + +`include "util.v" + +module fpga_hf( + input spck, output miso, input mosi, input ncs, + input pck0, input ck_1356meg, input ck_1356megb, + output pwr_lo, output pwr_hi, + output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, + input [7:0] adc_d, output adc_clk, output adc_noe, + output ssp_frame, output ssp_din, input ssp_dout, output ssp_clk, + input cross_hi, input cross_lo, + output dbg +); + +//----------------------------------------------------------------------------- +// The SPI receiver. This sets up the configuration word, which the rest of +// the logic looks at to determine how to connect the A/D and the coil +// drivers (i.e., which section gets it). Also assign some symbolic names +// to the configuration bits, for use below. +//----------------------------------------------------------------------------- + +reg [15:0] shift_reg; +reg [7:0] conf_word; + +// We switch modes between transmitting to the 13.56 MHz tag and receiving +// from it, which means that we must make sure that we can do so without +// glitching, or else we will glitch the transmitted carrier. +always @(posedge ncs) +begin + case(shift_reg[15:12]) + 4'b0001: conf_word <= shift_reg[7:0]; // FPGA_CMD_SET_CONFREG + endcase +end + +always @(posedge spck) +begin + if(~ncs) + begin + shift_reg[15:1] <= shift_reg[14:0]; + shift_reg[0] <= mosi; + end +end + +wire [2:0] major_mode; +assign major_mode = conf_word[7:5]; + +// For the high-frequency transmit configuration: modulation depth, either +// 100% (just quite driving antenna, steady LOW), or shallower (tri-state +// some fraction of the buffers) +wire hi_read_tx_shallow_modulation = conf_word[0]; + +// For the high-frequency receive correlator: frequency against which to +// correlate. +wire hi_read_rx_xcorr_848 = conf_word[0]; +// and whether to drive the coil (reader) or just short it (snooper) +wire hi_read_rx_xcorr_snoop = conf_word[1]; +// divide subcarrier frequency by 4 +wire hi_read_rx_xcorr_quarter = conf_word[2]; + +wire [1:0] hi_read_tx_speed= conf_word [2:1]; +// For the high-frequency simulated tag: what kind of modulation to use. +wire [2:0] hi_simulate_mod_type = conf_word[2:0]; + +//----------------------------------------------------------------------------- +// And then we instantiate the modules corresponding to each of the FPGA's +// major modes, and use muxes to connect the outputs of the active mode to +// the output pins. +//----------------------------------------------------------------------------- + +hi_read_tx ht( + pck0, ck_1356meg, ck_1356megb, + ht_pwr_lo, ht_pwr_hi, ht_pwr_oe1, ht_pwr_oe2, ht_pwr_oe3, ht_pwr_oe4, + adc_d, ht_adc_clk, + ht_ssp_frame, ht_ssp_din, ssp_dout, ht_ssp_clk, + cross_hi, cross_lo, + ht_dbg, + hi_read_tx_shallow_modulation,hi_read_tx_speed, 1'b1 +); + + +hi_read_rx_xcorr hrxc( + pck0, ck_1356meg, ck_1356megb, + hrxc_pwr_lo, hrxc_pwr_hi, hrxc_pwr_oe1, hrxc_pwr_oe2, hrxc_pwr_oe3, hrxc_pwr_oe4, + adc_d, hrxc_adc_clk, + hrxc_ssp_frame, hrxc_ssp_din, ssp_dout, hrxc_ssp_clk, + cross_hi, cross_lo, + hrxc_dbg, + hi_read_rx_xcorr_848, hi_read_rx_xcorr_snoop, hi_read_rx_xcorr_quarter +); + +hi_simulate hs( + pck0, ck_1356meg, ck_1356megb, + hs_pwr_lo, hs_pwr_hi, hs_pwr_oe1, hs_pwr_oe2, hs_pwr_oe3, hs_pwr_oe4, + adc_d, hs_adc_clk, + hs_ssp_frame, hs_ssp_din, ssp_dout, hs_ssp_clk, + cross_hi, cross_lo, + hs_dbg, + hi_simulate_mod_type +); + +hi_iso14443a hisn( + pck0, ck_1356meg, ck_1356megb, + hisn_pwr_lo, hisn_pwr_hi, hisn_pwr_oe1, hisn_pwr_oe2, hisn_pwr_oe3, hisn_pwr_oe4, + adc_d, hisn_adc_clk, + hisn_ssp_frame, hisn_ssp_din, ssp_dout, hisn_ssp_clk, + cross_hi, cross_lo, + hisn_dbg, + hi_simulate_mod_type +); + +hi_sniffer he( + pck0, ck_1356meg, ck_1356megb, + he_pwr_lo, he_pwr_hi, he_pwr_oe1, he_pwr_oe2, he_pwr_oe3, he_pwr_oe4, + adc_d, he_adc_clk, + he_ssp_frame, he_ssp_din, ssp_dout, he_ssp_clk, + cross_hi, cross_lo, + he_dbg, + hi_read_rx_xcorr_848, hi_read_rx_xcorr_snoop, hi_read_rx_xcorr_quarter +); + +hi_flite hfl( + pck0, ck_1356meg, ck_1356megb, + hfl_pwr_lo, hfl_pwr_hi, hfl_pwr_oe1, hfl_pwr_oe2, hfl_pwr_oe3, hfl_pwr_oe4, + adc_d, hfl_adc_clk, + hfl_ssp_frame, hfl_ssp_din, ssp_dout, hfl_ssp_clk, + cross_hi, cross_lo, + hfl_dbg, + hi_simulate_mod_type +); + +// Major modes: + +// 000 -- HF reader, transmitting to tag; modulation depth selectable +// 001 -- HF reader, receiving from tag, correlating as it goes; frequency selectable +// 010 -- HF simulated tag +// 011 -- HF ISO14443-A +// 100 -- HF Snoop +// 101 -- HF demod test +// 110 -- Felica modulation, reusing HF reader +// 111 -- everything off + +//mux8 mux_ssp_clk (major_mode, ssp_clk, ht_ssp_clk, hrxc_ssp_clk, hs_ssp_clk, hisn_ssp_clk, he_ssp_clk, hfl_ssp_clk, hmf_ssp_clk, 1'b0); +//mux8 mux_ssp_din (major_mode, ssp_din, ht_ssp_din, hrxc_ssp_din, hs_ssp_din, hisn_ssp_din, he_ssp_din, hfl_ssp_din, hmf_ssp_din, 1'b0); +//mux8 mux_ssp_frame (major_mode, ssp_frame, ht_ssp_frame, hrxc_ssp_frame, hs_ssp_frame, hisn_ssp_frame, he_ssp_frame, hfl_ssp_frame, hmf_ssp_frame, 1'b0); +//mux8 mux_pwr_oe1 (major_mode, pwr_oe1, ht_pwr_oe1, hrxc_pwr_oe1, hs_pwr_oe1, hisn_pwr_oe1, he_pwr_oe1, hfl_pwr_oe1, hmf_pwr_oe1, 1'b0); +//mux8 mux_pwr_oe2 (major_mode, pwr_oe2, ht_pwr_oe2, hrxc_pwr_oe2, hs_pwr_oe2, hisn_pwr_oe2, he_pwr_oe2, hfl_pwr_oe2, hmf_pwr_oe2, 1'b0); +//mux8 mux_pwr_oe3 (major_mode, pwr_oe3, ht_pwr_oe3, hrxc_pwr_oe3, hs_pwr_oe3, hisn_pwr_oe3, he_pwr_oe3, hfl_pwr_oe3, hmf_pwr_oe3, 1'b0); +//mux8 mux_pwr_oe4 (major_mode, pwr_oe4, ht_pwr_oe4, hrxc_pwr_oe4, hs_pwr_oe4, hisn_pwr_oe4, he_pwr_oe4, hfl_pwr_oe4, hmf_pwr_oe4, 1'b0); +//mux8 mux_pwr_lo (major_mode, pwr_lo, ht_pwr_lo, hrxc_pwr_lo, hs_pwr_lo, hisn_pwr_lo, he_pwr_lo, hfl_pwr_lo, hmf_pwr_lo, 1'b0); +//mux8 mux_pwr_hi (major_mode, pwr_hi, ht_pwr_hi, hrxc_pwr_hi, hs_pwr_hi, hisn_pwr_hi, he_pwr_hi, hfl_pwr_hi, hmf_pwr_hi, 1'b0); +//mux8 mux_adc_clk (major_mode, adc_clk, ht_adc_clk, hrxc_adc_clk, hs_adc_clk, hisn_adc_clk, he_adc_clk, hfl_adc_clk, hmf_adc_clk, 1'b0); +//mux8 mux_dbg (major_mode, dbg, ht_dbg, hrxc_dbg, hs_dbg, hisn_dbg, he_dbg, hfl_dbg, hmf_dbg, 1'b0); + + +mux8 mux_ssp_clk (major_mode, ssp_clk, ht_ssp_clk, hrxc_ssp_clk, hs_ssp_clk, hisn_ssp_clk, he_ssp_clk, hfl_ssp_clk, 1'b0, 1'b0); +mux8 mux_ssp_din (major_mode, ssp_din, ht_ssp_din, hrxc_ssp_din, hs_ssp_din, hisn_ssp_din, he_ssp_din, hfl_ssp_din, 1'b0, 1'b0); +mux8 mux_ssp_frame (major_mode, ssp_frame, ht_ssp_frame, hrxc_ssp_frame, hs_ssp_frame, hisn_ssp_frame, he_ssp_frame, hfl_ssp_frame, 1'b0, 1'b0); +mux8 mux_pwr_oe1 (major_mode, pwr_oe1, ht_pwr_oe1, hrxc_pwr_oe1, hs_pwr_oe1, hisn_pwr_oe1, he_pwr_oe1, hfl_pwr_oe1, 1'b0, 1'b0); +mux8 mux_pwr_oe2 (major_mode, pwr_oe2, ht_pwr_oe2, hrxc_pwr_oe2, hs_pwr_oe2, hisn_pwr_oe2, he_pwr_oe2, hfl_pwr_oe2, 1'b0, 1'b0); +mux8 mux_pwr_oe3 (major_mode, pwr_oe3, ht_pwr_oe3, hrxc_pwr_oe3, hs_pwr_oe3, hisn_pwr_oe3, he_pwr_oe3, hfl_pwr_oe3, 1'b0, 1'b0); +mux8 mux_pwr_oe4 (major_mode, pwr_oe4, ht_pwr_oe4, hrxc_pwr_oe4, hs_pwr_oe4, hisn_pwr_oe4, he_pwr_oe4, hfl_pwr_oe4, 1'b0, 1'b0); +mux8 mux_pwr_lo (major_mode, pwr_lo, ht_pwr_lo, hrxc_pwr_lo, hs_pwr_lo, hisn_pwr_lo, he_pwr_lo, hfl_pwr_lo, 1'b0, 1'b0); +mux8 mux_pwr_hi (major_mode, pwr_hi, ht_pwr_hi, hrxc_pwr_hi, hs_pwr_hi, hisn_pwr_hi, he_pwr_hi, hfl_pwr_hi, 1'b0, 1'b0); +mux8 mux_adc_clk (major_mode, adc_clk, ht_adc_clk, hrxc_adc_clk, hs_adc_clk, hisn_adc_clk, he_adc_clk, hfl_adc_clk, 1'b0, 1'b0); +mux8 mux_dbg (major_mode, dbg, ht_dbg, hrxc_dbg, hs_dbg, hisn_dbg, he_dbg, hfl_dbg, 1'b0, 1'b0); + +// In all modes, let the ADC's outputs be enabled. +assign adc_noe = 1'b0; + +endmodule diff --git a/fpga/fpga_lf.bit b/fpga/fpga_lf.bit index 89ed6ee03514a5cf225d91950e4eeb872766f99d..44ef60365e23b68c25c2a068972265ff4f8ea495 100644 GIT binary patch delta 26 gcmdmgl4<`*rU^E@rVJ?zoQ9TGrUpQ?(X(s`0C%wnOaK4? delta 26 icmdmgl4<`*rU^E@CJZSIoJK}gCKgu4#v47$mH+^EnFvh) diff --git a/fpga/hi_read_tx.v b/fpga/hi_read_tx.v index e4c433415..fc309cde6 100644 --- a/fpga/hi_read_tx.v +++ b/fpga/hi_read_tx.v @@ -12,7 +12,7 @@ module hi_read_tx( ssp_frame, ssp_din, ssp_dout, ssp_clk, cross_hi, cross_lo, dbg, - shallow_modulation, speed, power + shallow_modulation ); input pck0, ck_1356meg, ck_1356megb; output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; @@ -23,8 +23,6 @@ module hi_read_tx( input cross_hi, cross_lo; output dbg; input shallow_modulation; - input [1:0] speed; - input power; // low frequency outputs, not relevant assign pwr_lo = 1'b0; @@ -38,8 +36,6 @@ reg pwr_oe3; reg pwr_oe4; always @(ck_1356megb or ssp_dout or shallow_modulation) -begin -if (power) begin if(shallow_modulation) begin @@ -56,14 +52,6 @@ begin pwr_oe4 <= 1'b0; end end -else -begin - pwr_hi <= 1'b0; - pwr_oe1 <= 1'b0; - pwr_oe3 <= 1'b0; - pwr_oe4 <= ~ssp_dout; -end -end // Then just divide the 13.56 MHz clock down to produce appropriate clocks @@ -74,7 +62,7 @@ reg [6:0] hi_div_by_128; always @(posedge ck_1356meg) hi_div_by_128 <= hi_div_by_128 + 1; -assign ssp_clk = speed[1]? (speed[0]? hi_div_by_128[3]: hi_div_by_128[4]) : (speed[0]? hi_div_by_128[5]: hi_div_by_128[6]); +assign ssp_clk = hi_div_by_128[6]; reg [2:0] hi_byte_div;