From 5c1f7686f615fcbdd7fdebc2b43f71fbc14e9e87 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 10 Oct 2017 14:01:58 +0200 Subject: [PATCH] ADD: FPGA code to support FeliCa / ISO 18092. Thanks to @satsuoni --- fpga/Makefile | 9 +- fpga/fpga_hf.bit | Bin 42175 -> 42175 bytes fpga/fpga_lf.bit | Bin 42175 -> 42175 bytes fpga/fpga_nfc.v | 121 ++++++++++++++ fpga/hi_flite.v | 427 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 555 insertions(+), 2 deletions(-) create mode 100644 fpga/fpga_nfc.v create mode 100644 fpga/hi_flite.v diff --git a/fpga/Makefile b/fpga/Makefile index c1ff5087a..f0b058eeb 100644 --- a/fpga/Makefile +++ b/fpga/Makefile @@ -1,14 +1,19 @@ include ../common/Makefile.common -all: fpga_lf.bit fpga_hf.bit +all: fpga_lf.bit fpga_hf.bit fpga_nfc.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 -fpga_hf.ngc: fpga_hf.v fpga.ucf xst_hf.scr util.v hi_simulate.v hi_read_tx.v hi_read_rx_xcorr.v hi_iso14443a.v hi_sniffer.v +fpga_hf.ngc: fpga_hf.v fpga.ucf xst_hf.scr util.v hi_simulate.v hi_read_tx.v hi_read_rx_xcorr.v hi_iso14443a.v hi_sniffer.v hi_flite.v $(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) $@ $(XILINX_TOOLS_PREFIX)xst -ifn xst_lf.scr diff --git a/fpga/fpga_hf.bit b/fpga/fpga_hf.bit index 864b52394dcb821b24bb42ac9b8d6d01a34832f8..59b25f924a37e36c9b668cc23740be76f2f440ec 100644 GIT binary patch literal 42175 zcmeIb4RjpUl`guwsw7IPmb)y=xe6FkY6+)p+EQC~jALZ!ST>9TeppFJ;yaU-*AUN) zU#^oYa3xX{->7A zzjjIMLi%H(Z9Nz9^W(q%!k?r_Mu_OLR3y#+nyH8rA=xo6MK1q0`M!yCZd1HE4;_vd$fN;o7&&k#_-(Oz zl%{&Bq=nhiL~j3sY7`?T0BT&6Kv1a@2$=)8Y~J z9(U#=^fYF9VtELAsXZMV(dE)cdV2awYPUUGC|s6 zEHV5zk*jEzoL4YMwXZ}Vq^YDx_?V=Xf6xFjJ%p`c$2wDGIZEq>A}R%We)XI}~8C+#a*{@Ux;fmn9=8aiFwCSsTChdldA z*f}*mF&-bDTnPN6m8MC(+Ow~Ok$_b;ODm_bkjz>+O3+`9K0ILNv}(^T625&|scNh- zN|Keoe3O|MiO%X2+Ng1MB5E1C)`Z3j8|%4Mn?-*~bJ)ow{P&nw(fe{~A+}yuLR0L! z`VZ)B`RVk{>#eyOPX(D*DxWX{ccE-28_V~dq+ilP7f%j&_9c9O7+bI1A^uf%IG0W0 zg)hhjh3KSC-h2%y`;cmNO#JpYmu{X{{N>%7w`DOEmG|#Ylv{`~} z5IVzUus&&JUrE_i1Yy{?HLNw~-ZI8w+hBXmiBMcdny7cD%rCytyz*b;m^;UtlcAO2p1ZQBv+w6u!5^Bhc*>7^_T}Rj!J1OWIqG;@1B7R+|@XPhOLmd?RxpmIGz^k`lU5a1%#>?oCJB$U;i1BfNXgU4OFn-O; zm=ju^(`z;e9kxTe?0If=T6@u3^FDs1&DGU^NO#IPIqSRHRnD&dmV&ufoAB(*$FF1N z7VSpr%_bt&Vr?4j$Tb(L9lS@ac^|*>(Olnu5{JY!GPcG_m1>XH3=aQUENln|ywCFSD{cNjn=P;oyUho*JLyM4 z3561V{Rr;eyjS5@5^d;e+TgW$+P5#pFM(gxX_X9Q+;|&3M9CF+a-f7?YM{E}@wv18V2bXs(DwTwkhIj5baU9lJS*Dq7!Q(ticSa9vK z?~UoF=vM=+-2k$y?PqM*X|^1{;spFE*aKqGoWwx2mKl&+=OzwSPxJcj;a8KWN@*i> zFU?7B`CO(>-l^T%WqvLb!msTV@5Fqaph3|j%r9znbf?oG%xBMXIc{BrKI>f%quVPA!+#qpb|Pc{|IL=nGo5njCw z_<+u1&fU~7RyC2C<=ic<9y8Yz@oNb9by3dG#k%z8=_$D*H*c-}huZUUS1vhOhF@YI z@YM73a$2r&96{F-S;8-3{Bj$&#m4n^1A%=ydQ@NJ9%O$w8pf|DsUd5v@$u`Rr^ zlRhPCmT5kwc=**o)~%XNk5LPmB4hV%qEA+ut2H0L9ED#_ljUeJ+L3B@stheIq->%p zTQj|RXZ*TI!*#I%y~TOgg@NR)r1q@2s1S9ma{L;LJz?#aFg-Um>~)ZRoo^Qrgb5)K1U1Wtb)Fno`(>du*&c&{;Kt$_FLK@uaRatzL@TzMv2HFz^^32jJRnHX}^_& zGA`zDpx8@sVR7`O>^*8QY&jDBI*hP6A*!;~hSp0tZd1gsnsw+`D_j9o#qy&n1VT2i zA2>$BNaM%DuO|sn?u2=cmeMrW7r;}-FYDnpz%Oy`z6EO#U9{5A5N5>Q(J#=iX+Gi& zE5NUla*yMT(y-RVIv1?-nV-5pF%}hSc8Bq6yOS6-QyItUBl!7N?XYt{Fm9lXf9;TS zfnVt9Al(MM===xz3C%7<@?rcsE%%PB%%k^D(eQpNj}HDb04SOQ?kJrV|I)54w4Br5 z#~{GH_gE)MMJW?u{6Y-rMmYijti#Xi>$GR7wSXsMUVK>OU(jbi;*Gd#O*XEh&938C z=e2jdxd8u?2zT8?UVExx2Vm=_#o9W%uLo^X+9Y-J7%Kji0smU7z2fYWe_OB?Z~O|~ zEgMcxnN58OEv%jSFG4!h(zg#n|9U<5|=3?W62M`3hH9cYc+Ud3& zhc&&+surw2ul@n}*Std2dM$)skIQ7il(nv=<}|Nu!h9v!i-z#)!m@U>!lxeq4U84^ zt@34RlQlWuSDO2!@XJ(a1=yl}ylAEA2kjyJ!ZLPa-`A5S(*X!+dM4NE8fEykLBzXZ zUsrSZB&;o$H^I>2q9&^a_+@CS%>%_YS#1q%h{V&?SuMb?3hEWPZmUkKP!tCI%NXgE z@$_|e7{8P?!3q&;4b!T-`<7{=a+ts`-qO{)Z@KbyI-ddSKdS$N<^wdrQzqQg<89EV z#J^r+^X!g30N8pCa2(qYTz)RMzy)4B?Zq35?c+3%+nPvJSGQ&cK*X#}XM-5(-byu6 zdp^J~d8gR`w9@KiFQ&kSy-TokF2i9fx76&0RmiKvkjd0e)!; zt+wb_JI}B_S!*@|s#F^KjQjkH@hc0odO&BeLmSD0ITgQJX{EI0)2OB<*P-#q62|vK zo_!@0egUm=i1h9u5HSh3xyNi|{5s^>h2me*DVWT*G8`5z1`*52#0cWvL!N!*BK5RO zG>n-&+Q)%|^IYpaZI--?8VD*9E{<5_u%;Y5A!_?7v#=?n(J+2XXkDo_(2D zs$79oKJyH`A#Cusax&5;;OBk*#rX9*pcQyrE8X1RQHV|I?am8w{+j5x?t1ezG<^&0 zqy}O2U>zuZI6l0~o-?f`t-a}uGvn72)Sy|e_AyXJ=!`bn-PFiByX3H4G}Vn#KJAdD zX@4s3BM`9^V&h(d!*{gN5`LX^odVq8ocPOdM6o;w6lSo%@v8S(lE&$*-R`c+>*Mq$ zweN?od&@i{Fe!{*DgG?RuM0q{s5_$#umzv_E&UM=Wk}Zc3J~+D(7F_$^Fof z(643**L|4o2S6v{MgBz*&L6_huhVKFd>uqA{)%?DY%G`o|5^+D+M#{dHRFga-lg{J zycG2LrIvD|<^0R;7;7oam=Nd=t>XEDFfxUI6{3k5bAey&g=u;HFa*`FOYuw8))T{4 zSC4j#ZO4V}l<}|R323;)yj!;9s@K*4sybO2PgB~)qN8AgiHCC zgmqtc&ql2yJ1wW5rss35LrLaeX||mr|JuC4V*FCRt^n{?LI}T3-^cEBh9Y7R;4`0r z6+{F4${A}6&@KTAd_pD4ARMHZmc^Nf`S`WC!b_c5_ttuC2D6o~QLj0d+XVOp{w0&$ zmfd*}__a>lRIj~8_X06W{A&y64}Du@OImy~}F@au$enx^%vnwaqmI&Ccd z8gxEI=OfpO*jNd_PSAO3UlaB7qRY@7?$O7_-_4{k@~wR0jB^Aj!{Xwy$P= z`dRZmASDfz||-7nFiDf|m&)jy+v7){aA0*wmzAMh{FKQn&q zgUOh=&T)GqMImT!QZ-HCUtRDUCd{gjAQ+j$h`@npW&Gl1|Iq-_S8|&E=+OOzN z5V3Op^`2aMd{dYHiu{@E;0=+N>3O-}68?p$JlgUYU<*FM1$i9jbtudE*D1N+MD(P7 z(Rl&yL2$B&kUzYHe?4k995z3z9YcHwZ0hcOl=Ts&8|Gh+QiHok1Z}jebC>x;t(<=i zBaHvdQt%z_J7SWIHb6~;$qn(ZNm}66^urZA3l|rYjgQc??xI36%)jhOdeVg}IN5}L zjl}wqQ9Nxfam(@R9DHr`P~SP^qdMFgY_(KBPdj8e|H`wM$ZIFTFFuVtTV|XFFkb+v z5dYd+A9oWHu5u6m-1T1CI$W zu5;D?SKP4%Gz5xHvt!){?RE?`7p&b{!Eo3|jaD3ndq*rmnoH6|9^1|s&JITf6~`kA z-@W~>xMs;rAwFO>>sEGS69b2f@tN>)O2AEZ=z48IQ; zUKDe|`jq$=a3_b%ZS^#*Zva9L@nIk3Tm(x#|Ju#?)eFzRUc1V;JHrqV{}?G!Q^vpE zb%0jLA4;ZO^^RVn1O$O0{`Eei)!Ue_i#CKe*dJp5>l0=C>s_f>B&S0m3^gR_&w*bU zA0NL)r$1=#!VCd!SXBs)N_2pT1^i2@{Vz{vr7B?S2lS)_5i8?gm{adPgPMBJCaide z`yS$7XJ}Z$ni7bYArx-fOJ{P!61H;*egOhp1MUKgEs_>Wka`%u6dllK%V%;+1eWoL zfjE%{Df$$z*F!Xd7rNBU-?}eEfP*TWEZ*^BQ4|0qj(M101AiUkm}* zw&>>cnm{1kT|1If_EpBeprNxF`9p0~?sa0L`tknJZrE3de=&ZwcgG&!{Gkis2lrpd z{m$z}X#WfNmA?7qhq3J?7p#qLxqqSN5uXzODllx3*{@;SOJE)L!xaofK*R$6)m1S9 zov~-fv}=cOy5Zu$zkpV7dIA61Mtcl|m)_oAoPmt_sY3h`|5EscZLcN>_lYhRo*^cW zMgFyx@ylov$mE=$w^erDdS&^Us^)$Ljn-O zQQAxJhdHbj!G0sj`(F~UrBc%f$FXQf;YpNz1^i2GGr8us)G|h!9=vB)POaw<|9W4x z6{3qRBocd<=924yUmS;nNd^4t5n|YCfuDzfTmci7vqJfn5dV5#UWdQJd!CaEa?#1Y zGtLX6*Rnqh_!suJu-j$bjx8;~7V9%fo9mT6A^x?C=CH-hVrWB~%u%6|AwBSr4)@*9 zAF?$?v5XyQwrS5geV%=V_}AM6B+Bc`-evT>{!3@G9Ofqh{{mW}UwFd(YLhLhU*3}t z|H7`Ti(VX)tC)zft9*fg2)#=q>i`$xl_ zC+SBrjy9mczRxTa?F+FwIqprsugZt0NhVU2+(zZB{QNxgFQi#KoqvS6h_cQv0AbOK zBL4z@T?8%zl1|YPS}K)$XPz=`qJ&>(#Nq6Yrsx~kraUjNb*7E$?~w{TfL~rbChbuv z%O{ zLn-YM?EPUG@2)%{|E7pvX`WM>{suiGTis+1^L6^jqWah)eIo`F%+2Um5x;h8?A2Rb z_Vd({h)pcVMi}~4!Y^U}2v*tZuFMW5>6vt^9UIb{oL_o#I#$HoYiNTTA2ajTe-{5Z z5~rJXFK?j1ZiS~M{92aD94FK1j79Fn6dB20a5=~yej;+$SVLRlGul_^FJ!|S zYi)JA%EejhD@*x9dBAj{$$S4p)cHp<#qNCt{bPa)Il}mLN2DYApHJ)O1Og8NO+F(2 z)$7+-r5Ycu-(VD;mb+;h?UyMB19gJVWYtOt@vqJFked+JF}588wCjku3(;T+zj*)a zZuwB*#?_Tyq0O=}Wp-(=M4rqwT!LSHX=kh}ui_{tg^<`4yfVZ1HJ}|@79YANcgenZ%EHQdR3Ey&`1md<7h+L^WjDNs$kga zuD*r2i~t1GX(y|TSWuys;qDrjj#8d(7P?bENmsF32EXt)W5B;&*Y@v0x2Dxc67n%J%K3Pk9&RmLj6YM z?qv-Jz_z*_e;JRNyCNzn=i65T`NQYs_5yahYEj4m*jlasg5DpP$M|(fQ*+Ao8;D8V zRa-G%f4+7fyUG&|?;S(%@k>;^Lce9$`W5m~pl`2YBWwv>=vVkPR?Ht}fkY2U^Ya;- z?yi4mzjbTo_0+tifx-xc#QU-T#q6epU%m7l+7xe0jJkRwJ>Jypew;d65N{}d z7~~Jv>AeOjxN_BTXD@xj{UgL$qS(gE_ac9YY@s8Ow~;1tam>+RXmTC*tB7BqIQt_h zF^_b|oYdM~Bsvl*x`58E*3A>9@`sTQ+U)8!A+UFA1ROpK(7Ck#1<${u5c`aN2Z1;j zVrabL1&}%BUq$?Si}s|k?UmvBjZFN&;7_aJ=W}?%{L9C$!?d>^o=wwMQoh%D#-ez& zc-ZrGMf}2EoOKl<uNNoCyX#6R=ZKNE(&N-MJAD7+O?dafC{DQl1;r&z$3HZ~T{%18f{D6OP z{b4@$kPCisjC^~yVR6ddL;1sr4A^vqi0~j$cSsWrqda zDFli1TD{&ZeV!8HU)x>Kt_MM>whJWKvrdJrHhQvJ3BPEM85jD!oMW`(B5@xk*KZT% zUjo^TI`r#ta)epC(E$JQu|WAcRevbqmUFB#{PW6<`rOQDx6(PlFTfVN_oIjpLA$=T zc}#yg=VL*Ue?`z{2>t5T4YXOn_{E!3_^S|pfq&%!*wQ@w;$q*yfPbm_jRbT?{?OPH zfuFZ;teg?(+`~%OPv1s+Ff5>@O~xJrLb&gK{%|@|s#dXTy2UU$ELLS_R2t84k}zB3 zUx^6#m(tKe{f4LN3CRLJ{YFajXQ}$b^f1t>&oM?F2pK(B#P=e8RUm&TUpv$Aht2GtVQ6|vYb^T10Kf1n_Tdj{NnT@JsA0G!Xj6<2 zL1Bpd)ro$=zAUOX$@d#Y{3`M<@D#NU;l3P1=4vjA{Hs`hSg_6^ZTJZhOE-=cc}kE! zJVWPXhZ&pbJLjB|*czMAdH<`!MMXy{z%OHWqJwU<+$iHc)+FmQipuky`Zv9~;QINzmXua19wnqrCjeWABdT9{ z7^8|4P`@D_9h-Nn_3ijobeC)>Sl_LDg&vjj3WzMay!W7f!7V4+N^#~!Vj)jv0tN$jD1i)zmNLmL&q7mgi0GO26;qd-v3IG z!#=93?m3cPmyr-~(|mSdCB`T2nzFjKLbVy6`6D_cTl2A;m7og)3vv*+kRAzvZF;GG zJ~L^zX$T8ln!I(N5$lJqo4iF;)Cc)P%yOiCd{b6`onb4z^7{ZXRZqLOtbV?~xd-{N z*J(pjG;KbR0Z56h!h8_S#b%vV{k)A8#d~B3MMjjMc9XN2%A$R73J&#$Ht_3SJt-0p z1RO}GIlY*lXZ)I=_FNJXDGDe9rB4cO{|@&=F^;2W-=xA)LGcL04i2aRS?HIOigDv`b#?R`qDdoWF|9J7BG-JVrZ(<02^+!mszUj~=gCKjV4rXL4y8{Oc9? zvH83a7U0)5Sjv*_N_GXm5$Fzz-&UMspDBy{i}CA%yv~95yI{YtzvETF)&=CF{+o*^ zg*<;aH2nd3Y*|CU*`pnyAJ(CeUTEj+U#$JQYyCXD|AqXaNI++XEun%*2!}z$$g?k} z?x4tLkqU-Ou^(QB4O!9-(|vBzMK0d-{3_}X&9ia|S7#ydBHFW?ZTPxp;h$sq!MR2L zby8mBZLfSIjOZcMZ)DMUQlMYkuxL}f4!M5gywQiX9gBJW*rosDPP4JmG zY6L7myg^Y01s5F*;nxJUN#&mbzPz;H$9OJsLH_W{bLKhYTDbQ{Y@-mci358S$+Mpi z@C#@~V8`Q_rjyRKX4LJQaIg_pxQutilntu$Ut?ffL)uBFsv&-3SO0yl(njc9l?(H) z9T8AqM>|}tbv13mq&$uKsHFQxc91^=|59asIqjq|XkrU2U;8=@Ch(p-_P^5HcW?h| z5%=OG!ns8bHn7HN)J4DU>do>=4T)A+14l$>BJHmxQIF)!7xS;3%(l|n zG2|`~1hNr5h9_p4Li~%*tg+5ebN= znhEi*GdZv=R0N@}>2X(%5S|411rJHBX)NO= zOcUnx0sUX-nE^bxuMEEkVTSEds@3`y?R5?Hhuza22;&!O$Zuet!nA7z1mq7dpUXlB zzYrfXn?NDr+T@K^?Olhr^(KZyb!|qA@G>Nie=)z9LE1pBJrVn{eq4^`7E1^v{G#*h z2FI#Vh$uV07JIqxz1(?Y(bsN%xi7#k?w2x878L(lNYAk`j)m|Gr@flVa<$_!?-4Om z<3hwi8Lr>JoU$7nakiT|7tX=3dwY}OiZFg5?rjmg_*R&Isq-_n)UJUtD^w4;xK+e4uwf)j2E&qwwb4k_%#6gf;EjpC7~d zudl9v;A0ArYU4s@wCQRP_1&4nba$jd)_2DP`~v^tzT4>g4#W8zLXks8pXtc@g(3X% z>^-F;M3=)N343qF4uXho(o6V7XC=DxsIHuYz{cfkgv75M>kZ@AMWf?H?2OfBz{w22 z;iu3B3v!?@gkMOxPk^4Z(Ua7igTrrlD9p60BuoIv0{r@WjzEO>9NDMF zZZL#jdC@GP>Pgzsv#4M$u1&yaAog1uKK})<5rE^v2!Mx%AfU!oI{Q%+QNl0rXm(y2 z^&79yli5!)?P{mL-_Kko6T&ZeYyq})*mxTxCbDj zvXt|O$HYH#MaQcp{CbN}j^e6*ArI+B9eq>eDZ-N+_?H?V#;<3zI1F*IqI)j%Ty znZhq{TK+84_ShDiC!H3<>16f_)D=Wp*V6ZaU#g9&-$>_#qEy=*1g;9CK%AL>dAP&; z3)Up67`8yWZZUC~xAI4Byu12=Fn$5!x~pt$g!YKIfZu4MUdoATdt(^CU`;g&b0I|8 zzEF!r%>!0|Uq_IOTbkBb=Zn3VIBYbV=V|FzYqo^(3v5d?t2Xp$ksQ<4Dg25a?F-H? zk0T2amtF7@0J1m@@c!2joI|2Nj9<(mtL@GatiuEk!W!rd+X>^B++%O$vW*kb$D1@B zpC+0^$u!yo{Off(oo*G=)Hu6)aUN~PA7`F9gq4Z05bW&oqjGOybG;CR$yKj{CQHwM$Isb)T zuzl@y6T6`*dy*u8Osg)#uhA~7XL{1SMs{^WxRwx)*;>NGL9U;FA6^S(8?VrN^3%B} z^DjJcP*Fcu<0V!+zx;9xzQuUkm@S#7*oX!Re#77YBJ6*?kePp+`4_#Hy|w^<2%h3} zq(Q_2{`DZN=~E*$(8t)B`jj-gfu}ggyuu2d|9S##8V|tqptJT#nHbBUjXh6-tOfY> zoa{?Cy-~$|-|jX^l)vI2nBZ(r3BNYcQ@I5b%HAis7UpmOr^S5Nt7i-2m+;^iw$q;H zeu=aE1p7dg;=VKg;%bfL1boW{b3rEhVqcqsj3Qeltx#?F{PLhgi5iz-@7cd~xN8eQ z>hx%wfJBb4`8~1%Cu9fUA=zi{mAB>0EG6x|a&`ndJKkKFMiMI%ZMa{%DJ>yHVUrN>;>NAKp(;`3jpeD`jsvcn!E5`RnAxncfwPWok{ zm?pe1I)RPL5jo!h@177n{2tf-SK8<_zlwBvk`0YasWlt$^93MU!SiFNKNNjYjwLdH zEpiAtb1#tJAVigpde6*9G(J{99x=OZF?C^q!WhOk^p_%7Ql?BZq?{|*%adp!< zR1g2WvsAzFAY5g~c&wmbq_eb$upkw|&0~oA4a_oDCitm~xYxyEPe!m&C`xhf==A@t*cSNL z;U<(k5sb(-9@B1>R!{AVl@7lL^@q~uU%!^yq~oA~xz>5&&IZTo>U1%G_~G-*h!5>Q za!}sz6Tu6TC->gmD3Zf3dTspk%emO!BQ$z*U|2>UX`D;Qv*lt#eP<}G-a`dUWqTAy zp9+~Tn~0yo!BX*#ie<`0?z`|~2cRHI+Gr7Lc(kR963DqB-sN9g-DiRM?f702L zZe9tZ5zZfa9ONWzuu;tLS?y8rQ}0QLf9(|DGPh{^>CQyMjW_~aM>`G0ZZNz2S-Wd) z!?qVZo2wruH`kho{+M%~2A&kazm#2Uxe{fE5;||u-=)(-?Qh1u-**BzVO7g_+*{9E zB1nhY3%EOrKqtR*TXc)g^?r;ORuR8|?*lR(iEh*!ZD8oOx#s2!1ja8{o96YstKy)t zCNM;U?xZ;aJ`=^0=of@qFFxe^H{dtA=GvN3u_1zTZk(%?-_u&gAk6mi8#$a`#_+D^ z`osQbXfEP;>uUKKtqqAp;Fs$A+DJdx*1j~J;Mg)3SSqlC&JbSq=AHMyu>AN~!K-vQ zf@4JP^7(>eV~kj6|7#;PNRNLRtqf$<1V)wvqd&x>?C~#D^Y&t^<*@cQl-r-k--tD4 z!jq)XM%hkodep$}783Ve9MiINHJL)Qk?WqP0SiXGHbaD4GV=3tu{-)+={zD+1zg}$ zOQ+;g2Pc{jRjT)x@IUbC5=SNvcmBp$!hXZgW<1(gtlx-$cJ(fJC_35LjubqtD zF35<(eNV%_5YKNhpU_rmeIsO>k0K#}(5(~LUGMo-&L85OZ!UVS@4q2!*t*!78Ge*e8mj&U`@v1H6z6 zR7C8QzJG<%hwBe7B95{qw4}C~8YiO@T9w@JKs;;phxr%cL#gtIC@CZWnL}G>Hd+0h z1ux#<{2?kIBxW#5l5%bpK>)etIX%EVhb;rYc2TQDKC_Knjt@ys;w}_q-tws5@aA3Z ze=UX1z+C1j)A+#DNpFpX^M|sdK02bOILz1xyh!DcKQyB+;)$|T|Nbc3ybIfTk9WuO z<|Zwo4ScS-&io7TrWETlP{Hm!xe_BEVWHPFuxAHsri5MF8d2}@>gT~_a=72-aoQ^D zWhUX&o6Q;y8l()t@A2}7?L*04y`kwMQfJA7%jeTE6w7tN+OdFSNPOSd2fPXQ5wKHCzti?{bF+-oj%*Dn@(mKyhM=O$0!^hJn2^*It)C&0>4%|GeY=1{HwJ81uVe+SL7#% z)me}*s|js!1Sjju@`vs2ro1}8yhMD@R(@UqndW_#k6&p;EB4ScTls8P8Gbc) zG40|!z_O~b>N@(KXzVtR)Q0d2dr4ymcTpB45Mp&}GwDuoYj@%nO`Fck(90hZw!O^d zahjA%oSK2p$IVgM>Z}|s@h_ECyS?SX8Na2|`}gtw7hlA|74@b4FF*6f5O7{Dxpn21 z<$OS(6@~NwXk{1P{ZR-+6#tsQ^6N!G+5l~>ON@m17jzbut$}|<$5$lmYC~}Gzj;d- zztpu_f2p02dm>-s@reTC(5Ab@zmz^6B%P-v%T{KW&!#FbU?}k~;FpTtQS1>}#QCTb z89Wh}F@B|aeEj>P>XVFLqrlkBJg0o(8xADIzmRL%&HPK-IFM05h6px3m4A(?SRG4r z{~&;j9+sD$|H67MboC%U?6d#YwV2fWP&E9!{QMW^4}mhz)6a7Axsc-(dQ0xeA(2?l zzYfKA>I_>;T-eS@+;s*-3+fL!e~9c;E_Uv+cI^duZ9(mSp^!cu9i0)vFX)rS-B7b6 zfYs9nanq6@}?cfkuF zpw23?R3e`Db7=nkQG}9=ll0Sm6lvtOImGogiM-a}#R<&6;4^dh6*!t5-wz?7>Z24H z5!^4vFZ4^oU2x7y^~)r#H8QDqKO6He^b7hdN1hGcf$|BgA29l??&#h89{>I*Pv`UO z=TY8ZewXoUEXW^LsQL|O^Qis~o#O>Csh=A-htK~WN)^iRi>nRaG9SMSX~W&xNr8w_ zAaV%h4>`{UhUnstabX235B`OVElc^sA)r% zz1MMow9Uovo})vY$>{-aQuYq~GQd+rtnk%I_<5B-JgFU&s-h!=UwF>}6*^*|_&q1Z zn_aD6hEU{R6>|jatKRw_+MAN~!8DyCOT^RWJEi)KE*efHZA6TtGQV0SI$n@D5zm^f zMgEnJp#HFTUcp-3`3u@5TfC&4WE)(sb(Qez9cmLXM<1nkjpPU?66sZulF`)i0Kazg zX|I0F&M7*_*B^9wA;D$_itLlxsZ?`&}=4X!(da0kW*^FE=6_P-FF3Ph)4Y(y?> z=N0WP`nsD~Uw(cWI&;p`2Qt1hWL|DyePyu!HAAB)T~xLW?Ep4wxEzn*`^ z3p;~_J?`1pka>BLZM{gR`j?&nexZIov$POfTdLnsF)iG(&iIAk7Fb|kM|ZFh75SH{ z-{^1<8@~tI)p1kWS4$f&3xnG^LFe@#{w>N(#qeR_qwz6QDD_ zE81U#;D1(@4)??K2zh|l=}fKi3E2MNhx+Zyr%+#5njzn{gYtxTmd0wSqSnrjZ~i zvF*iJkVglB1)~~RHo?9QL|7fgzx--L%msJ~+_Fl%Na*Yq@r&=@;57!?1%dsc63X!F z0{fQ3(RYwGd|~m90`@E02^FLh0J4b^el6*5IcC0(-2CR-;%@a;7}?_z38f%^$ovcO zp^FrggAm<0gd+fou<)kI@qm9BkE=G-;4y^v3}hJ1!3)ajHzw=b-DF;`a-PHeQR*V! zvo`oeUJuo8To_Q(^d3@7=$DJU=tcPn?qC?d#2x%s32agfyEPL0)CaOL!{ISh{L4hO z;e>`*9rfX6ufC4KcNF@(cFqb2;BK;M(|!M~u-fg0JzjI5o3>_v^$QTIn-noxfz0b6c|yZKe% zmk-bZeqp*(xCU)lpW~{sL)EVYkA@Z6|Jr3I4`D85iCuK9i)$Qa;Y71CqS_Gu>YsPg z{0?(Q37xyDuPOpr%Cj%UzXXx6 z0GSi2KLqV!7w6r-VYl=TG7(cwubh90Xtr^-Ks*Lv`5K-tW(pzx^|+(X=c4dN#8=}Y zL?&4bWa0V^eggN7UkQX*TeLN*%@ra10__59nRT7G|FAO$K{KNKWD0&c$pIYSnCNXK z5RJ6q>m2NV@t$3K&#DIj0q5QJ^#3>t0S-S6!V;?AK&X%I=qNixx@Ov#z71_UL=?sL zVg7}lj)l6n^{~?c0w7mY%nayd#xz0Xn++vUhyF6XOFLiD2MD(0>xr2+O3eidHD}?>86V2uLwRX{g z*kgll&=R9vZqBQF=i0k!Li=Bef8ozPH|Rtsm$%zo4-i{xh4#N5Wxvs*U5WVTVb^@e z+y4^C*w6LsOYtv28~W8vDC-qytoF!Uv;p;Edk6nA*=HtFnjoC}ljbAU7zAF=PHF$^ z5#*@h-Y2X-#bSdS+`)cK!rozV-e*bV)Xs=DhPH>&IB%Y9Q2@<*WVs@KfqzBLxgGnH z6Nrs*@r6u|>EBhp1(8AszxJjTBq3(YHcr$`b}F`oj9D1JU|;aql_v!bs%$lfai1Oo zSv}f#zK;19hr8%IjtEjtR$+1tW}3*``1r;AYd0VXFnR*Z2Kx^A8SAhYi6^-deg)Nr z>YgPT<3f7)Lje>n<_{ykrk`cEPb6Q`+ikx85EG})FLU8&fM4UZ!HJLJ{IWwTy_QEI z$DnL3{81Tx-H+`dSV|(dF@d>AX(x<6RP!R1DB%}v5RMD0U1}#;W@6VgAMS^P%%!AAbV7lfbXf z>c_Z)C%ArIOu?_nZwO@@Io;rm41s<Ex>L3`h0m9>lwjGLvc<6{*|DOoT=ER(ol_y z^<3?BMIsj9R~N2Y&ryOj2@)E|rK?)CjgJJY8SjT4D)dhsFOe+Un-A0A*GchH4^XwVaU{zVlp^ZDg8_}3yD z>0R*N&69nL=wh~m6Nw@Ibr1HoZc1a@>+bp=jlirPAn3!wn??NE4QPAl2I~vew;=WL z(AX7RL$wPz5VZ06mjnKFpN#)C&Qkp!)Z3MSi>thoean6fLcqT^&^spfiH17A*7>a4 zIzDYeZ&5nKANrq#`w!(CrdmA*UknGfU<5$c##rFO zXBP2`*3ULz#MluA#XSjxlup zONAME{Z&lCq7>Zw)$V`NQUlR^>HOCd^scT(-n%Cd)PwIF2GcC#U;g&c3BVu9x%2v; z(z6aKI`TpOFp?zn%e^^|D;hS_G-;mE;KN)bekV%#LyiVj3U>r>93>n}`QzH3j5({V zRA+eqs~7bf>$P7PxJ%Fheq9y8{#W{n#nk1^ski@yZMgaRsP+`RA@FMrD(dru4hH$d zC-_9h0o99(v{YU*p`Yh|WdLMh{^hieqC0QNXB~vQduQ}Zvv>szJz!ynKt>5L4(e$!f_h4~k4#qx{4K=)G; zWiXv{*8GG}NROHm4^zDTuT}{>9hZk_X+MOY0MT0eW4ZADmtQSkkPwWPe*IN#HKO-e zdHxV^+?It)QT*%s=pgSCS+=DW@e52!L)ZgIG8NI-()k*_l#7ocqgb~86<_AV)@?2e z27;wdvj7HfP?cCJu0h%m(J~y!gC+c82w*zN5Ws>B=kOfvpT}QShWS^H09yqFr7#(ZIwIuf zIe!?O{~Cd+j)2Y(4CstIhjV>#tjuuzq4z63ABTZr>~7LHP(+(b&#!X*1|M5aX7$$` z2z>qv_4720UX;#%Z9^OIFV-3H{Mwe3QeJW4F#qB(jA5Ol>|{oFdPYrE(NVVlg-{mz zU$l`NX>P0Li+tmVZBWP|7<1M6FW48R0B1Br4k_2x$)7s7ZGNJRe-ZeX z7dn3Z2&SMe}J-`5q;1_#gaeH^ea(_8c2{qraT$T#x+hrA(T;R_m& zP{NK_h<~Z>0FF%`wvZVR$bqCVJ1X|`_P_l4!=GXQYZZeODiR6ahE}LH-u@TTP`tOr z`LV&eA73kf;<~A31G2xs?cRbB)iulDW5*6CsoaS6~$AANI2#3>s z`(pmZ<$`7&u{v+(VX-x7yidgX=-s?F%D+E_=?QPFoY$0}591dt;QQxQy^X61=~4Jc zH4{brQuiMk@hVexIyPb?P8+`E8QK_dNA(@`htN4b+QsJrc=;*icM$f5Q(9U5##RZl zavb#@9;nA@wu2|Z{uf6?V4t714DBgr*oC9USv*>loA%#9BGkt|(FD58 zMWK&NL`~-?&3*U2|7#KZ)h3KjYD~QcHxJ0@_QA6H4Rj}4nV^zBPD&!_)auOz=MPc& zDNH+V5`qe^UwL;Mp+dmNuR??~Z;cMphKnM6?V;jdJ7q%-U{_YZvCxf5&15&|D*kmw zEV7e!3BMje-`gY*c0{NY0rwpXvOl)x68xf?dfnmo{K6j}0NH)Ik6)vxkJ{CR(z`Ui z{|gu0j3(HK5FbkO_G-U=L*0Kk)R3zh_4wCBJpAS(IJ}L3M=Hm!^vVZjG?_2a@Mn}hr(GWBM!$YT-G7+H_kU%t zVXy;!alhVf*e6=DR;YesRJ77P{#4rj__W*6Oi;fO0so>nY!LPHdl9oKAlt{nco@I> z424$gKvXhKtufbpqB_8@tC)X{Ab*JSAe>0VMi}i9oWaY4@aw73`N#3KU$2Pw-KD2g zAw4QOCX$Ow__YaMec#VxkFi;$+l~UrI9O7dHy^(Q$MbSQVdXjff`h3nz%lX;3km~{ z>b5sus6Uju0HcZ9J+pdRffRo~kr|v{w&}shE>mGHR7E+ZvcX5GWhBw9`S`{4hdW&7 zHPpO4FYrYVhz~Vn6w%oHc&Ppmetx?fJ%>;hG;l)M`&n8F$5_O#2arF6ml%z0Z}bK3 z*BKX?fd`8C#r210t2*3ud{4ziZT|iw`%LCv(Qg&&H@N=ral)u7w;X|EWMMat^O2%` z`Slxq8;WCNoZEnZu~!e{S8*zfK64mt5>64nxc-no-B$y^$~rT7#Da7_2*2n_HwK;2 z4**#yf2igQDY*B5UnuwCWZLit0m(Hnu(Net9CTZy^_(?xwk`(OC# z#@rxsXc5(&hGGXp`9rmHbQ>~n{ua_&?Ta)ufA}seH^yIE$!Wu1(+s|dzAS&}eSeCG z{jN_fEk5>zdx?3zCd%-O5LrE1?3dIZDfTPK9|FJV(}ykonmJPQ%qhL~gT5O9dGUWX)Fqa~Jc^NZ= zvYz055twQdmSMrKFiV)pjV~dLd*Ux)#ctkB@fz|7+XE+&O2-R=+*+M?H%!P=n_#!EF zqB)d5RF<+jwyRJ1dAI^^|BHRXCH!j>$Meb!9<|y{|326tfA}CS1sgkN~#Wt=NANuu&v+;e1-1l{^_3=!NlfHk3Tjuj$#oVA!_T}T3S!y$kJ35MO zNFanP)*n*wJ4t!b`jeXq?|(r%1D^P84t7<1GxBBmC1>VnSXjwVil22*P`dQR(!n=O zdqPp?E+ZcC7-Lb8hT}bv#WpuqboO@VZb{6nE(%(OkhkP-NzSBVzoL=P(-+*Csfv}J z&;#L1B;4t!_z(I;0`AkG2o(hr8sgL-(K5fy!8C|hh8&4K%#skvAPZtH^FQmLs7Oct zqZ%J2d{NAlm#v9((HCiEptI1^xLI}))ySeSfbS;vp7{N`zSBtcMxEuR4bLA4Qave- zArTS_ICO#IeI=pQ@SZsMEq){pUP;vVn=1}PJi&OXqLnNDO~ZABYICr&BHg>%`Jy>9 zql7P+Gy5vi`_&U!>{qAiHO)8!B$^{c`$C^%YP1!px^H^PU9rb^Q(c?ebU}fBv*D zTnVA~So;60uW_e)pLKolJu{2%x$^0X`I6r})1B_w7inc?)u0S5?OB}kUPDwFxmB)C zf2{ucyQX_W#a$J*_O4EUvA&|%=6X@l6Ztaz0nK!k@Oi3(fGoq8u*&_E&3)X)ki#m52PA_h?HtmcOR`A66PfBenL~plqi#Zc!)!Uu=LbReYBHUY?I&&r! z`=v*^-CI&KqZP|Tg1p681ZeETZuLq;kRrR8M1b)Hb~B0W2x zo&;^!tVGzp#;6Gzno&@h{=rp@Cbq>Cb?oy%HgsLN&6gfL#6ot~0piNZ&JRNaAm8w~( zgj6cJa>nN)>WL^eGAq7Gj0F`%ESNrenU4-`u}x!r*VFd={!O>~LiE-~Te!8U{!I+ZPu*Z1!_@!QiZ+;{DX@14GGeb>`7wx2lp?VwFW>k$vypERoWUn101xy43C2$utZ z_Jp8~R^~U#09qE`L-ZkdS|8XKqLOb$X30NrrjJe$g3tQU_fYsfm*Vn(2heFd&}Xi3 zV{dJ4#nAMrg0HgaMoGD@RAl88!3(t*+2~SS_MeCdtdoCCR}{^LrV2qDBOR%y8)&+m zDtK+|h|to+=OC-(6d|KNio^%wvIo$v=MM#%PQ~TmiF%QMrYWGgjsxUV1XndtpEVUv z{U_4@tcZupp?IVep-AsN-H{K%<>GsapCyd$NF7~I)29lZ-e+}DB`uS7+Nh6A6};C_ z7clNpTn?W2Z3OVN43`6dh9G=QiQHh^-a9M(2ldmRo+7xu&XF6m+vS7lPu5pGJw@=_ zbWg?Q0H9|cD9)GmzqBubzTYbA)0Op+yQT=z(}%848|#tB{{uO_5C|0s?@4iOV7|(5 zIRIz~{(A)Gs|=R|fQC?PgLNo+Z3mF8O%bTrFP*x9ZWYnU@+pGwbQZvzA}&u6ye7O3 z%WydWXcmf}6%kX-DtO|5*6*_~>9@fcE{;s2<E&j{V|LPhT{+LE6UTT7l}w0!!e_ zm+Oq{Bhx=XD9%?X77NdL2BgP(4gS9f#{n*v1iy{A{(sXyFOH0TYGKV(K@|JdH3b3! zP;iSM#&BF)#N{$!S+U9gqqtlS$3=ktufb;Uv*r(c+usTPZffXocgQa$^UQLOflh-Q3pEH zhuUDsPCtCD{@;5KQ@1h`4y@9D&+oP6qFt0cK=9{*P-^qRtDaYR&}OO$2Ty`FzsHt? zHXm$*%KH`De2^^{jrxOaS($L~X8%3qw(OZOe&yM2X)Z#x?3-}##BWq?%bp1bfB%s! ze~>Hq|JL4v$@x$LWswnHCMoLt%!fAm=ocT2z(*tS(FlAr0w0aQMd%90TnMH zU_!hk{v8j)M_vDD1U?#pk4E655%_2XJ{p04rz3z}{s_?@&q|TRzoe%~RQ+3q!f#)Z Tq8$GnR~_Kr{iSUw|0Vwy*k-J@ literal 42175 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 diff --git a/fpga/fpga_lf.bit b/fpga/fpga_lf.bit index bd4d821bbd7db5d6ff01190fc2204e259e467c50..43fbee16c4e7af230f1c5dfb2c31feffe47f3d5d 100644 GIT binary patch literal 42175 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 literal 42175 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, June 2014 +// Satsuoni <>, October 2017 , added FeliCa support. +//----------------------------------------------------------------------------- + +`include "hi_flite.v" +`include "util.v" + +module fpga_nfc( + 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]; + +// 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_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: +// no major modes here for now, except NFC demod/sim. Maybe I should remove mux at some point, unless I can think of more modes +// 000 -- +// 001 -- +// 010 -- +// 011 -- +// 100 -- +// 101 -- HF NFC demod, just to copy it for now +// 111 -- everything off + +mux8 mux_ssp_clk (major_mode, ssp_clk, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_ssp_clk, 1'b0, 1'b0); +mux8 mux_ssp_din (major_mode, ssp_din, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_ssp_din, 1'b0, 1'b0); +mux8 mux_ssp_frame (major_mode, ssp_frame, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_ssp_frame, 1'b0, 1'b0); +mux8 mux_pwr_oe1 (major_mode, pwr_oe1, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_pwr_oe1, 1'b0, 1'b0); +mux8 mux_pwr_oe2 (major_mode, pwr_oe2, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_pwr_oe2, 1'b0, 1'b0); +mux8 mux_pwr_oe3 (major_mode, pwr_oe3, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_pwr_oe3, 1'b0, 1'b0); +mux8 mux_pwr_oe4 (major_mode, pwr_oe4, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_pwr_oe4, 1'b0, 1'b0); +mux8 mux_pwr_lo (major_mode, pwr_lo, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_pwr_lo, 1'b0, 1'b0); +mux8 mux_pwr_hi (major_mode, pwr_hi, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_pwr_hi, 1'b0, 1'b0); +mux8 mux_adc_clk (major_mode, adc_clk, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_adc_clk, 1'b0, 1'b0); +mux8 mux_dbg (major_mode, dbg, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 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/hi_flite.v b/fpga/hi_flite.v new file mode 100644 index 000000000..c7b9d4648 --- /dev/null +++ b/fpga/hi_flite.v @@ -0,0 +1,427 @@ +// Satsuoni, October 2017, Added FeliCa support +// +//this code demodulates and modulates signal as described in ISO/IEC 18092. That includes packets used for Felica, NFC Tag 3, etc. (which do overlap) +//simple envelope following algorithm is used (modification of fail0verflow LF one) is used to combat some nasty aliasing effect with testing phone (envelope looked like sine wave) +// only 212 kbps (fc/64) for now 414 is relatively straightforward... +// modulation waits for + +//market sprocket -doesn't really mean anything ;) +`define SNIFFER 3'b000 +`define TAGSIM_LISTEN 3'b001 //same as SNIFFER, really. demod does not distinguish tag from reader +`define TAGSIM_MODULATE 3'b010 +`define TAGSIM_MOD_NODELAY 3'b011 //not implemented yet. for use with commands other than polling, which might require different timing, as per Felica standard + +module hi_flite( + pck0, ck_1356meg, ck_1356megb, + pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, + adc_d, adc_clk, + ssp_frame, ssp_din, ssp_dout, ssp_clk, + cross_hi, cross_lo, + dbg, + mod_type // maybe used +); + input pck0, ck_1356meg, ck_1356megb; + output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; + input [7:0] adc_d; + output adc_clk; + input ssp_dout; + output ssp_frame, ssp_din, ssp_clk; + input cross_hi, cross_lo; + output dbg; + input [2:0] mod_type; // maybe used. +assign dbg=0; + +// Most off, oe4 for modulation; No reader emulation (would presumably just require switching power on, but I am not sure) +assign pwr_hi = 1'b0; +assign pwr_lo = 1'b0; +assign pwr_oe1 = 1'b0; +assign pwr_oe2 = 1'b0; +assign pwr_oe3 = 1'b0; + + +//512x64/fc -wait before ts0, 32768 ticks +//tslot: 256*64/fc + +assign adc_clk = ck_1356meg; + + +///heuristic values for initial thresholds. seem to work OK +`define imin 70//(13'd256) +`define imax 180//(-13'd256) +`define ithrmin 91//-13'd8 +`define ithrmax 160// 13'd8 + + +//minimum values and corresponding thresholds +reg [8:0] curmin=`imin; + +reg [8:0] curminthres=`ithrmin; + +reg [8:0] curmaxthres=`ithrmax; +reg [8:0] curmax=`imax; + + +//signal state, 1-not modulated, 0 -modulated +reg after_hysteresis = 1'b1; + +//state machine for envelope tracking +reg [1:0] state=1'd0; + + +//lower edge detected, trying to detect first bit of SYNC (b24d, 1011001001001101) +reg try_sync=1'b0; + +//detected first sync bit, phase frozen +reg did_sync=0; + + +`define bithalf_212 32 //half-bit length for 212 kbit +`define bitlen_212 64 //full-bit length for 212 kbit +`define bitmlen_212 63 //bit transition edge +`define bitmhalf_212 31 //mod flip + + +//ssp clock and current values +reg ssp_clk; +reg ssp_frame; +reg curbit=1'b0; + +reg [7:0] fccount=8'd0; // in-bit tick counter. Counts carrier cycles from the first lower edge detected, reset on every manchester bit detected + +reg [7:0] tsinceedge=8'd0;// ticks from last edge, desync if the valye is too large + +reg zero=1'b0; // Manchester first halfbit low second high corresponds to this value. It has been known to change. SYNC is used to set it + +//ssp counter for transfer and framing +reg [8:0] ssp_cnt=9'd0; + +always @(posedge adc_clk) + ssp_cnt <= (ssp_cnt + 1); + + +reg getting_arm_data=1'b0; + + +reg [47:0] delayline=48'd0; //48-bit preamble delay line. Just push the data into it starting from first SYNC (1) bit coming from ARM Made this long to keep all ARM data received during preamble +reg [5:0] delay_read_ptr=6'd0; // this is supposed to count ARM delay in the buffer. +reg preamble=0; // whether we are sending preamble + + + +always @(negedge adc_clk) +begin + //count fc/64 - transfer bits to ARM at the rate they are received + if(ssp_cnt[5:0] == 6'b000000) + begin + ssp_clk <= 1'b1; + ssp_din <= curbit; + + //sample ssp_dout? + if(mod_type==`TAGSIM_MODULATE||mod_type==`TAGSIM_MOD_NODELAY) + begin + delayline<={delayline[46:0],ssp_dout}; + if ((~getting_arm_data) && ssp_dout) + begin + getting_arm_data <=1'b1; + delay_read_ptr<=delay_read_ptr+1; + end + else + begin + if (getting_arm_data & preamble) + begin + delay_read_ptr<=delay_read_ptr+1; + end + end + end + else + begin + getting_arm_data <=1'b0; + delay_read_ptr<=6'd0; + end + + end + if(ssp_cnt[5:0] == 6'b100000) + ssp_clk <= 1'b0; + //create frame pulses. TBH, I still don't know what they do exactly, but they are crucial for ARM->FPGA transfer. If the frame is in the beginning of the byte, transfer slows to a crawl for some reason + // took me a day to figure THAT out. + if(ssp_cnt[8:0] == 9'd31) + begin + ssp_frame <= 1'b1; + end + if(ssp_cnt[8:0] == 9'b1011111) + begin + ssp_frame <= 1'b0; + end +end + + + + +//send current bit (detected in SNIFF mode or the one being modulated in MOD mode, 0 otherwise) +reg ssp_din; + + + +//previous signal value, mostly to detect SYNC +reg prv =1'b1; + + +reg[7:0] mid=8'd128; //for simple error correction in mod/demod detection, use maximum of modded/demodded in given interval. Maybe 1 bit is extra? but better safe than sorry. + +//modulated coil. set to 1 to modulate low, 0 to keep signal high +reg mod_sig_coil=1'b0; + +// set TAGSIM__MODULATE on ARM if we want to write... (frame would get lost if done mid-frame...) +// start sending over 1s on ssp->arm when we start sending preamble + +reg counting_desync=1'b0; // are we counting bits since last frame? +reg sending=1'b0; // are we actively modulating? +reg [11:0] bit_counts=12'd0;///for timeslots... only support ts=0 for now, at 212 speed -512 fullbits from end of frame. One hopes. + + +always @(negedge adc_clk) //every data ping? +begin + //envelope follow code... + //////////// + if ((mod_type==`SNIFFER )||(mod_type==`TAGSIM_LISTEN)) + begin + if (adc_d>curmaxthres) //rising edge + begin + case (state) + 0: begin + curmax <= adc_d>155? adc_d :155; + state <= 2; + end + 1: begin + curminthres <= ( (curmin>>1)+(curmin>>2)+(curmin>>4)+(curmax>>3)+(curmax>>4)); //threshold: 0.1875 max + 0.8125 min + curmaxthres <= ( (curmax>>1)+(curmax>>2)+(curmax>>4)+(curmin>>3)+(curmin>>4)); + curmax <= adc_d>155? adc_d :155; // to hopefully prevent overflow from spikes going up to 255 + state <= 2; + end + 2: begin + if (adc_d>curmax) + curmax <= adc_d; + end + default: + begin + end + endcase + after_hysteresis <=1'b1; + if(try_sync) + tsinceedge<=0; + end + else if (adc_d>1)+(curmin>>2)+(curmin>>4)+(curmax>>3)+(curmax>>4)); + curmaxthres <= ( (curmax>>1)+(curmax>>2)+(curmax>>4)+(curmin>>3)+(curmin>>4)); + curmin <=adc_d<96? adc_d :96; + state <=1; + end + default: + begin + end + endcase + after_hysteresis <=0; + if (~try_sync ) //begin modulation, lower edge... + begin + try_sync <=1; + counting_desync<=1'b0; + fccount <= 1; + did_sync<=0; + curbit<=0; + mid <=8'd127; + tsinceedge<=0; + prv <=1; + end + else + begin + tsinceedge<=0; + end + end + else //stable state, low or high + begin + curminthres <= ( (curmin>>1)+(curmin>>2)+(curmin>>4)+(curmax>>3)+(curmax>>4)); + curmaxthres <= ( (curmax>>1)+(curmax>>2)+(curmax>>4)+(curmin>>3)+(curmin>>4)); + state <=0; + + if (try_sync ) + begin + if (tsinceedge>=(128)) + begin + //we might need to start counting... assuming ARM wants to reply to the frame. + counting_desync<=1'b1; + bit_counts<=1;// i think? 128 is about 2 bits passed... but 1 also works + try_sync<=0; + did_sync<=0;//desync + curmin <=`imin; //reset envelope + curmax <=`imax; + curminthres <=`ithrmin; + curmaxthres <=`ithrmax; + prv <=1; + tsinceedge <=0; + after_hysteresis <=1'b1; + curbit <=0; + mid <=8'd128; + end + else + tsinceedge<=(tsinceedge+1); + end + end + + //move the counter to the outside... + if (adc_d>=curminthres||try_sync) + if(fccount==`bitmlen_212) + begin + fccount<=0; + if (counting_desync) + begin + + if(bit_counts>768) // should be over ts0 now, without ARM interference... stop counting... + begin + bit_counts<=0; + counting_desync<=0; + end + else + bit_counts<=bit_counts+1; + end + end + else + begin + fccount<=fccount+1; + end + + if (try_sync && tsinceedge<128) + begin + //detect bits in their middle ssp sampling is in sync, so it would sample all bits in order + if (fccount==`bithalf_212) + begin + if ((~did_sync) && ((prv==1&&(mid>128))||(prv==0&&(mid<=128)))) + begin + //sync the Zero, and set curbit roperly + did_sync <=1'b1; + zero <= ~prv;// 1-prv + curbit <=1; + end + else + curbit <= (mid>128) ? (~zero):zero; + + prv <=(mid>128) ?1:0; + + if(adc_d>curmaxthres) + mid <=8'd129; + else if (adc_d128)?1:0; + mid <=128; + end + else + begin + // minimum-maximum calc + if(adc_d>curmaxthres) + mid <=mid+1; + else if (adc_d512) + curbit<=mod_sig_coil;//delayline[delay_read_ptr];//bit_counts[0]; + else + curbit<=0; + end + + fccount<=0; + if (bit_counts<=576) //we don't need to count after that... + begin + bit_counts<=bit_counts+1; + if (bit_counts== 512) //should start sending from next tick... i think? + begin + sending <=1; + mod_sig_coil <=1;//modulate... down? + preamble<=1; + end + else + if (bit_counts== 559) + begin + preamble<=0; + end + end + if (sending) + begin //need next bit + if(preamble) + mod_sig_coil<=1; + else + mod_sig_coil<=~delayline[delay_read_ptr]; + end + end + else + begin + fccount<=fccount+1; + + if ((fccount==`bitmhalf_212)&&(sending)) //flip modulation mid-bit + begin + mod_sig_coil<=~mod_sig_coil;//flip + end + end + end //sim mode end + +end + +assign pwr_oe4 = mod_sig_coil & (mod_type == `TAGSIM_MODULATE)&sending; + +endmodule