From b0653ff4f35f34111614860d418bd3a797401230 Mon Sep 17 00:00:00 2001
From: Erik Strand <erik.strand@cba.mit.edu>
Date: Thu, 30 Sep 2021 20:22:48 -0400
Subject: [PATCH] Add FPGA communication ring test results

---
 GPIO/iCE40/README.md               |   2 +-
 comm/iCE40/README.md               |  35 +++++++++++++++++++++++++++++
 comm/iCE40/img/comm_ring_40mhz.PNG | Bin 0 -> 8788 bytes
 index.html                         |  10 ++++++++-
 4 files changed, 45 insertions(+), 2 deletions(-)
 create mode 100644 comm/iCE40/README.md
 create mode 100644 comm/iCE40/img/comm_ring_40mhz.PNG

diff --git a/GPIO/iCE40/README.md b/GPIO/iCE40/README.md
index 08bc585..5a8c15d 100644
--- a/GPIO/iCE40/README.md
+++ b/GPIO/iCE40/README.md
@@ -1,4 +1,4 @@
-# iCE40 Ring Test
+# iCE40 Ring Oscillator Test
 
 ## Dependencies
 
diff --git a/comm/iCE40/README.md b/comm/iCE40/README.md
new file mode 100644
index 0000000..035ecd6
--- /dev/null
+++ b/comm/iCE40/README.md
@@ -0,0 +1,35 @@
+# iCE40 Communication Ring Test
+
+## Dependencies
+
+- [IceStorm tools](https://github.com/YosysHQ/icestorm)
+- [yosys](http://www.clifford.at/yosys/download.html)
+- [nextpnr](https://github.com/YosysHQ/nextpnr)
+
+Install instructions for all of the above tools can be found on the [IceStorm
+website](http://bygone.clairexen.net/icestorm/).
+
+## Building
+
+The default `make` target synthesizes the design and runs a timing analysis. The target `prog`
+programs an available iCEBreaker via USB.
+
+## Running
+
+I used two iCEBreaker boards. Each board's P1A1 is connected to the other's P1A2. (If you connect
+the two P1A1 pins together, the drivers will fight each other until one burns out.) I monitored P1A4
+on one of the boards with an oscilloscope. By triggering on this signal, I can time how long it
+takes to send 256 packets round trip. (The result of the test is thus the frequency the oscilloscope
+reports times 256.)
+
+## Results
+
+The fastest I can clock the FPGA while passing `icetime`'s analysis is 39.75MHz. This lets us use a
+baud rate of nearly 5Mbit (we want to use 8x oversampling when receiving data since the two FPGAs
+clocks aren't synchronized). At this speed, we see groups of 256 round trips happening at a rate of
+978Hz. So overall this means the individual round trip frequency is 250kHz.
+
+![64.5MHz](./img/comm_ring_40mhz.png)
+
+Out of curiosity, I tried running at 48MHz as well and it seemed to work. At 60MHz however it
+quickly drops a byte. So here it seems prudent to stay within `icetime`'s limits.
diff --git a/comm/iCE40/img/comm_ring_40mhz.PNG b/comm/iCE40/img/comm_ring_40mhz.PNG
new file mode 100644
index 0000000000000000000000000000000000000000..2496ffc09ad521af3d8b87023b02c9b37aecf6ec
GIT binary patch
literal 8788
zcmeAS@N?(olHy`uVBq!ia0y~yV0^&9!0?KLiGhLPYZRjZ1A_vCr;B4q#hkZub7#IX
z5NK6iC^Vs=#cKtNiUK32hXa$)x|XR8EGl>8gWF!J%v8(0v~2fto7!(qLTbx@R&e@0
z+*P;Z`{BK>V?Hd1sg#JcD0pz7aq$DgqG^rV52Y6yFvRYYR(L+A`1|eNzOM`K^&i+6
z$13}e@2y>V-S>sJ%~|(tPQB-3J@0n4)>P4IPp^%i?lM?DpQFva?@>t_;{_d4-=<)-
zLb;VUwf^hP{$a@fyGXO2=he=p{0~L#QK`Q-<gL=(#KUmm_bQ7YSr=|HUU2%$-tl^Q
z5AXMqQ@7XOo$FDV5^z5GgQ?u|Efcd=>R!Kos^|T2|2sDl`5o#*m}`!{e8Z5j(2nWF
z6qjn-CD$%)yuQl9@y7|veNXr3Ik0`T;l8kuTUN7yugtSo`9|foUfs97cNr|d@7wwN
z?YDiFm0L6!W?ijT>Gd^9R{NAJ|Jv~sJNKD$-+R?dC5=`*x9j-3T4r;3)t=TjW~>X2
z=ViFBzaGcVIIFj(;okZF!aMof=h~Vqwqw6w6sxFY#@oy@asA)d4d3FG!!LARU%>cc
zW?qAxcE(Q;?HAv!R=?Py9yMXrF%ur9s&ApkyzA5#yglA^(VekGey19%!+WKDM;^-P
z70S5%%Q1Sk+qWUcfj#p7Y{uO9vom~W<}Qx-A8MOst&^e5@viGG1LK9`Q*7_2E}9i^
z?2yM^E!7>imGztp{y*5L+PXHcVNUU*Y=yIzB;!K@Z`Hp0^N#s#_u{q9*U#;?KG>N2
zo%u3@dolZq9%gpg)oF(wKksE`=aaFxCLhX>8#70$O)m1pEp6?m$0yA)?O$U*_30eu
z1rxtM-;`FblUd$=!bvQX-63D|_Y-sB9FMIDi!b%7>IQJHeVCBE$}Pu&p-TE-TZpn*
z)Pl{~%S;oTR|!hz#XGE?zd!SvSU5-1g4hu53x_Y9-^Z<~be*9@`F+a<#j8!cQuBK)
zZr*Mx-e4HYZI)5<ZhupsZL0#uugACKFSP&YW#wpE@RrrVS%AfK)!g@w0vg&BIGQ4=
z^Mod?S~oX($Bp+1$*aV25+(<5nk|Xiu<^f|B6oH=N0UOlFN0K*0>>waRxJ=`Mc~{0
zo)MwC6$N0sHh8XJkq*+mk&!W307E6?1pyYvUar|K(HtOi8-1NrZ%oKK$Y#c=$k8-Q
zjDgot;K~Yy434G+ZV($*?V8<kuvX$Rlg*|HTOFs#%-P8F+sfry{JBZZ!rDmcpe})$
ze_!Q}6F3xVpdM)Sb>e7Runb}*s#@aRqLm|*rwDcK)CA{MtkO4BS`;|4q8LnA90L|J
zEl}iWk`jgZVT0$6R;ZGYCf=2xpcH6QSdj^JASk%ALLmB9?e>(o({8ADK$$yII_2a+
zN$m~mom2ik)v>hL*wm)L0aKU7d?7ac`5Og}CcZUh47GOGEv-447BH{w%@_K1Qq}nC
zA@e4g9G|OAyf9B+yrh<B3W{Rc@LYx}39<PO*B^3y3(w%v(BSE5=4#Lr-uCLZOVx*}
zwG*TFnF+4o+C7c;7@O^lqisBP()Jr~G~J3l_u+)@emA$+Iic4)4b}vPclDYv)b4yT
zRorUssxRevH@wU|UMj!T-_o|`(7M#-Yd0>s?P~mz)Sc}wKR-{~LAtasEK>d82DeyE
zvs*V*Vi;e1zG=1hsQB+<^-xvmooP~;yt`{A%FYmZB(Zj5+GGRq3!%r^Sm(c;do$^D
zPQi^YA7A=7h~JrO{OXZTa)r(cL-7mSdZ(Fju4b&-ykTn21i$4QXMf*xF(mth*0l+R
zsaHGAcCE|Hp2GCy)GcquT??);RHgPB!5qE!*;MgYzqS6(mEJaqH^^$if2ZsdT5qDv
zGI}GWw=&MX#P{;3*!6i5GxM(BV!PlLJ7+87g5F(0IWlq=4qsrIq;*qa?)jAs>r#}>
zbFN;S5PD;4j)7SaL+sbLT1#awb?dIPH8i@*yMcGXPQCqB%Gte52VyfHe`t93TkF2F
zOk0TBq;=PKHTdlb-ZQE9&W6zFW*6C%>zf?2WAu!L-;_w54iTC;vv+=kPI%3)&WYML
zJFY%e`eD4O>-vsMZql<`UNht#$o@F5S@zoWvrSW@<zJ?0-PGWIp(O2iMXj50Z`$O5
zwz;b3e%frF5Pwsu^Th6$Rd4PTz1`Vh_A9lqHzGDqQ&N0;n|#^EUNtjL_w?0_XZQLs
z7T=d{p589T5G6I?pzzrvT}uy~*uF5zSvBou1Y5@9V^cE9W|lboUMsjp=`YK4MynT&
zcBV}dk(~{4Z71928Ahh%YW&h++hVJ*Ip@f$qC%r%Y;9U|u4-~K$Y!(G#c*FZnD?Ro
zV{EPLg8zSu``dTlziY7Lb?Ka4pALsF;=Som`~Kbcp0{&vpS7L;uB>?bZ0WX>H5T&^
z7b|BdSHv!TfA{gklxH6c`rD=1u78i`uYK>g{G(y$#M@Hes~^M~Ty*>J<>jiXY3&KK
zZ%l8P?_a*ZzMW;Rb>t-8ycwMLo}aG0Sejfeop(O{d(E!bS7X;JuSxY;Rkba<=XUSP
zxmUSsd7G>4?mm5_H+`e~in#sdJ#`;*S6rSitN4BQ?)&@YdZvXxK3gDh`SVM;{(|c^
z^WXg}Is8CxdSOCI>;sn_?td8H+<vyt!*j~x&qb2USM{7+9?yN@{dRB5IQ{Qcq6}Zo
zpO<*`wdno#A0`)>Z%??s>35yaoL0e?Ri*2vZ&Pe$&z{oy@~ORjqtx$vfB)?GZr$0V
zwW-K8^hat)WBvax9+S?c=l=OEZsAzD<VMBbJC6m|dY1*P>DhGftC#eu+8z2S*&fod
z=57m~o`3r-ce2C+OS`FGjyG(1*w4F7Fh=L}<%MzFw;nv3WcKG_R=<GU{Fu{Ur6g`#
ziE)(v{#!!bOyA<JgxtQ~1@rvBSGC@L^7G1bz1#Q8g>oj(m;YYlmvg}+u(M>-_v!;1
z41Fz@iY-_lUcS@fmv_G4m+3)2G<COLyPtMk+cavqjojm1okA}eb+uk57?(`ot@Lfa
z7k)XPdBLRZw|7)5FHc)FW%}ehQrB1SzJEOQ|KE3c=H)wg{I0D@=4YBUUAoh3g_zZg
z-dQ;pHZ`qEW1ez|bw$q>$8dw4t?9R0PJONn%swHuAZo>{+rHHgmTh1>D=VVy%su(_
zRo=rt7`u}`NleIfnqQZ3)K_lB%M;64Oy<h++EnG-cp&JZ{;#5Etz)kP^VC(pzvstf
zPv*@N`}E;`{0^~qQa@K3UW?iCV5y-c&%68k-y1yWbTF$(*~I%!<mbxP>2+ToHrSO*
znY|FHunM?d(0n2J=I^443G(mOM>+(@9y}j0#dSXSN?#45_32MlRE_t^-*1!RF*2;M
zS6X|MQ_3WAhx|(Jw#37}hZ2JO`ofuKouBi+jx8X6PgrGe!@Huq37_mIZakN6&Qq(?
zH|OU@DNVztc^SW(9~yi)X3m|Gn0k2sMxE<zYg})A;GOW|@w~w4ZxnX>yjkG)a*zKz
zqgh)H?%eb$QhMX+Xc?O{=TqAs&R<+*b6Z3vY+IYjnj?I@Qo%VE%jf#cyn1?9NQ$Xl
z@4Dx^n#!F|A6X!|P4KnURgs!U=aeUHTDUCq0>kwk|J5Ge@X4(SOtoFmd}>oT%Z1mW
zEEn3YZO^h=kUq84YG;GlrjR7A!fVX83=&kNOn>QnGJaVzW8Sv*5(oB^GnDFb3zAMT
zbu-GYnZn}W@3eA*E5qE^5A_+UX7bvv=2);fM}*~zku)pg-g|Dg4(e4m7%pt%mE5DS
zAo4f!ElY+fH9iK}(@YB(GZyzmJ05e9HnL!l6=2xg$jdM*n{feShW)vZ3}^3O`Lz8d
zlXSVfgLHM(#x?umKdnj-W3H0;C9xp;_5{<SY5XsGbB{3W_0B$_^J{jtGvB!g#{GIl
zi;f*z!+U#SeE2S2`$BzbM~CA%DOW{L2MNqstL<@2$t<Pd6c>}#={A`;5so02M>ziW
z-`MnQ{r?2kUePT)bxTA`?sYO<NRwgv^5(n~<Atv|3>OYc$ujUdNHZ-k-@xd=d|@Ld
zx7NiW|7Y>yW0Glqa}sPFmfv2%_2Q`6DW<B_>=SE_Hk|vl^Wv(8bGf}<4RL9UEfy44
zFA-XBIrqeaRK{N4Lk=3EV%i!1U&_Zje(pb?$oh6e(>yl&OI%j(T^KWrafX#tL*LaG
zMvSpX*cf;nm@hnB&S1j8>#*A5IJ1cv=k%K^xH58ty!cO>adtERTAwQ<wlPrp!VQ%<
zT-q7Nd|?+h>a1C?vB~Vz4%d`3n-rVnGg;@BFJjmt$==YH`j#o<XYyNyEzAoTGo0($
zFT}Dtyw+imYA`#sLo~%_i()hL1;)Qd4($J5=P_7KV|8G@;3m1fsi)H{<%2S#)a;hi
zIU%ejW}HjgkIrrZ`;gTvi&<)ROK>9VU%{{oorN2kz6oz^3QN7CWR!Mu!omJ6P3Now
z8Gb1<SQ+v$yj5qqunIY0#2#j2czc|2L9?k9$Pp|K*EcXa{4Qj8k<iQ6V5hWTqvwt@
zY-XIokJqr6m~nRB(BK36{D#Vvg&`4Z7W`cv;g}4H+^*t1kjRy1ywF+5kYO*_5SDs}
z%Si3kgoBJP8VWiWxAn%?cPe}DIFfkfMM3A|>5NtdpX42+-wK_MI>Th&&1lP0%X49C
z?ws@QN-jm(fzn~&4%4Q{=vyB)YcX0yT>sW!mh&U|@VeELdUY9fH;b?|uV2NIk?PE5
zFSMXi_?Z3GM-6cwRwZ2XauDB`$Q)(0CM(%?LH3Ogn_s*)Gn>I`=y2R1(IO`Ku>YOY
zZUPrVbC)pBlKqvUljO{{e2v0_%{d+wNvyV<M<a9BEeK}l6)joB>m1>ze(L~N6ezvi
zT6I}`onyTU<Ju-~hwIxGK03m%cO$R;YM}+qh1=LmyjJis<hI-rx^U3KZG~6Ex78aW
zc^szCY+0wa;Bu(wg_o;9N%qg0c!n3LW=);9Z)@<qh~b~gFgMScjeP+#(}L_93=95R
zFqCX?V|S1jym0XC!4(CakCkH{dGu@+y0B3;N13m65uX;v3#I86X|E5d_URaHE9gw#
z?t7?VL(@MF?H5NZs@E>)X0DpaJJllk`u!Nk&r=R^Nj2ytH`_U~H#1+T6Jy|YxSh(7
z!LVyd@7D%BC5Bu5myH(8WM$Z*#q7X*K{Yplb*=<^!?e!LrHmICzOY=lp%Rm}_!XDb
z?3PQ1^KYrd>~H!vb#_ZPC{wMx#<**WRJ`NvmdQuCcFp5mv*2$)gyZQ4?op1<=V~zg
z6=awzk?!vBdATHmRKqk-{4>0eGGoZF=VN%=&a@!4fWb<EVOJY3!>xX1hu;esG9>S$
z8%k&JU67pJ5*yBcVSnc23v1bsQhC0R-iAQw3ro#7uQTkL>3e8aL!1nkcE*|op)yEz
zr_WJk&}DH@KgPHq^-)eNILnHEU_ci5%greJM?WTcJ?nz(+aESFWH8*)V|Hj~{A+E-
z=?%(Wt~oy<!G2US>jGt~OU!1Rix+NaI>r@s^dQ$Q{#Ix?b}W+Vf)hhY(ww~vXZsm5
z*d6>q8JF>bX%54MIvIvr{HzYAA25_SFqH60Gi;G(Z}{fSc){q$M254o4gNhXo2$f-
z8#B8<_3PhB;jEh_>JMKy&JcV1*vlv9(&s*9-nEU_^6gG&;(w99j@Qy6nf1@E6DJM6
z7&@>!-{kwd>r(ECBR6-gy2Zh?YZWi+i<`TekdpF=gPo!!7FYVTGuXDs%V=jzJsMpm
zed7R%^SAM4{BLr8v$dY(f@XdcL&=A&thp<W+}y>G!64P3_kgj%uZP*;G!B6(rWf&_
zeGe%$ocpDgXzL*UQ|)1ugZLk{he;0l|I`u-9oGL;Qw+C_4p)^v%GjGPWcB>c>!%-l
zovcN|E<`x4w%}d2fSajmChwXBsUM6Q>h^M6P+_o=>8diX2rqiG)z!`3QC&=?AuN)?
zgdunOP1y@3bAxjQ<}$vx8Nl!*kiqx=@o#LP<RrqN+q|CD<Z`48Ly3h5LoP$rHeZGp
z53;#$DKK8x&vha1u;`cfH&k?3UzA9PGR9_2E>K+%{_nuDGf_MlIiNyY=EDB`$p-uv
z-c|ET&29<PShL`Eq~mplFG<p%V(sm5P0ozx1-w;uA`G=04#Dh<7eJZAooR~zgDfAb
z!*PbWm(&<aPHC>$=m@HD8LYl;UCQuwz96&)-p#`x%l1XkoHI4J_px22$xWRTw^Y6`
zPh~1`%l7f#qqCqm_eO)+uM-<4ZuQhiRA79&E6>Q!Y3f-e&E3H+I;<I4t5Z|XY&y8u
zq(>rf!L;7<2RvA|NV#rKIkQ3Wna*`p**^IW%feR|HZ=MknjkE=O<}=jn<ET!6PC^B
zeYq<nFd<o*t?*50$V0!GOtbz)^1nzmvq&t8{`Jf(sbO7S^XiV{zsh<qH*dSb6~*e$
zRI&`*=S-P0f0fFDqo)eq#6JGKIejskr24_*qL2B^)DnenrC2*mo*BTocUMfVGxM*K
zUrbhci&Z4|Mwu)y-!ABOhRtk8SER$`DJxlCWPX_Fs`Qcj#Zt3H4d*WPHRzeYQ)`er
zyzGBceT(u<uB#sNmjyG#t}&g$D`~dWx9b*%`y^Qr#*&BE9(a08v$(j$@LQ~4<<^?>
z6NMh9%sG0~NqS-H!mq4<eq8OhQDvxFqwV5W6|=ywW8W&%BL{xWTO*^puXl&2@P&oz
z<=Xl+7n`$|d{Qcp`}B{KYc^j-YVyXV3B4`PL>#7P@uoVr`DRXDWOis`3j0xpx%X;0
z&Gt1+3q8Hx&}do~Z~ot#E069@Je*Lz>rYhE0+ZY+j3pDw<0SvuY31}R-+ZZ)$)q*3
z;hWH5GbO)CjBoc$u~=+u#+mtJ9pjguHjJ;o*lgDO_WHJk-|`;*lbe=Yzq8W!qO0As
z%lUU$>tFh1N-Q$ll_w$Or=9_J#Ob9e*(|GP@2+3;dd)S7<ImrSe9igtS6#=~vMT3C
zNUvm0Z;kXXnRG_oZcU|<yB20?Pj5fiuqkM<Y1>2YjJk(g;y>9)ymc#O_2xT#q=B2K
z-*BR~??%T&*GDf!JhtR?>`F7^oIAVDFviwEa_+{aWz|eiYR-k;_h)0-ubJ8z=lWLl
z@F~f>*JZ!Ww(Otf$9X9Bo&MzW&kbwEE?j?oond|66X~ySvii7I2ru8DVtMs)E{ng}
z^|p}vyFcGFxLhhP{prY6r=o9@H*GoCux!H=kH2{eo$cH2|2sA5;gQXP7VggjBVHA8
zhN$TJR_5NEpspP~Lv)FmriI<#Np9IImKnHR{CcZY(6}VL$*Ok$jHrjJbndgYigqp!
zRw%sJw!-SOkh{Uf<S&n(+fJH(z4nf3&2uf)IK4cHJD)A>&e~>l#p%5(lTLs0^wGKW
z^1ZtfIYj!dI<4Pze}7(kqD@E7rw76hGoEkWefQ4GC+n_He3R1FTr6<ZH+B8{yI-wl
zExbCx=J>wy@4wB9K9sDGJ;C;Kxr?2<<b3554PTt>1ihAQc=D%6viL8D%#*tR`?_ui
z?D~4!#Z-T0_+O3MpvKcrtF7v`Z{n4bu(_9_UwnGS!&3%QZSP+woj385<G=nrxgaa_
z>14iFe0mE0?NW`me^y;hKd9@hx>8S0;?CouC9&%thCStoQRWZ7DQ*+Bgq_dz*;A85
z@4C&aH|pN~^y7>A^_R?cH>EzsoUq|f-p}<;^QLK0r*iIviU)@4qvl<zEIS?bBJ|E$
zBOTu$za`fyY_?ooC++=d&eX&2gOf8I_Q##udHnqCy_fs0pWb`_-A4~y`5uRMo)i9?
zbN>8!G384@%=&n{yFFIoQ`gC`@oO!Ra<n^ZB`X>>^W@fz3w(Q$G-Xq^xJ~1|`eu`U
zPhEKJtL<*T7MNDqTVx~)hA=7{UUb{A!O-h+`=gw^YYHZtg4iZq+*ub<`s<*};bSI6
zd<%kKoN2J@yt=4H{+apVcg0_4-qWi{z1XQcee(8q-|Q!SFlq^R{u92};K!%S>7ggy
zPnMZ>pP|_?L`mQ61b^+Kg+~8QX{7Zu74&YJ`l47h-h<O^!S@uS!@UQx*>4&h?4P-(
zLQ(zC!ZY!q6P@?lTB_Af`kMXZ&>gibn-iuYx^92Y%iK{j@mtaJN^09d`BfSUx-}{L
zPY1k;@tbd|tY3d(Moeg6aBxz=iqri`CQdte+CQ=9t}#uKUiDFPw`b*pk8kQ%D0zQk
zo)9(jRP*$QtK^qP|2v@+oYFtX@4oBm{I6erJ~%Z0#+CSYUR+C$?eB4$>>5}7gk#hD
zCnkZ<o%nt#_t_g{9NLt-E^wZ>?bJ@0mg+|4pmjeu=56+z;r9Id?T>1S1*;1tU8-H5
zviE+T#IGCG5eD7I-WhzEJo&k{%d>gS+b)*At6KVfZK4F{?b36x>rb&oUiE7-vzxx!
zD5oXrakXaIx`j+;M;_--OLXQFted(+tj0=rlj6C;du;n(6?a}<?_GAGhqwOKr^=Hq
zi%plAsdeu0yz%{^q7~2NU3&s&WgWKMZ@Q1oh4F5{pR@<J1J*i<7A8eym+X0Yd{<n3
zos#gj_lwsmzUJzcu{E;`|F*c`gI{D?>D<{jW?ZvadHRG<{`ULVCR~5I``lOCt4C`E
zHz=O>zA|IKr-gg^cg8LD-*sZwpMU;ipG0+VkL<&@7cV@SAAa9nZZR*H_s7cA$+^ih
zXBH;ZMnA5WK47q8o$(x&oFBTAAGKc-k(d5t$Fizb-;4e1nfy)aw|?yN^tqNYS?kxl
zTSv-;a(P3)u8~Z9EFFCB^vBF~lKcm&l5It|AAId?S8Hh#bA4t1f@>x-OP_jQF}n9-
z2^at2&o5UrWKB3(tL7%UQEW1+UHXyh2M+7%mpxAjJN{n#&-EGmH|ktmbwz6Kt!Zzp
z+{=IS9)4=nHfgTW#)thaSA3mTT3V&wXMbz=d+lkL*f^Jx$;&uymu^YAbE}Q-=s{&}
z|JX}%zchoCgRWR_^X%eXyvs%UUY1|@MOLwSjM6*5N|}Z1y}Z2f1KXscvo$$Baq5qk
zn_RE*lzzUs_+DpCUfH>9URC4oC0$$E;=?~A&&jt=z4n9E<%4Io52LTDyVz|r8{?z<
zRy?vRiDP@Q=Tp$;4Ia~b4krpXi?eL8f3`$&_cW)q7rzHfYrP3GThsOB)|z#_@4ej5
zo{W@cGnszV;8A`?a*v2hk6~fP&ds;nzVJF+{rXZZ*2wJ`tKF3w0i9p?KCbk(_RQ!t
zivL>HbnZComOZ>tF-QHX3s+vW|6A6|Wmg|vrYQZZ?{?;mpX*nNY)uS3xW6s%{xOM{
z!S7$Z{cQ4!Eq8zGlaBo5eMh&y3s|3`d?e}LFV`DxCi>2?50-rhP-J}JdD6-3%h|J!
za*KSXyr288!e@iw|76eiEH}KYp4U#Eu!ZfyvzNO6>^XPpzT8`8E*)&_nWB^ET>mji
zs!Vl3_n-MKp1Da?5#Q>CUYWO@mzn)F)57!Pg4`27=I=K?o0_$-S0JhB`qJ08II^bo
ztj>MG{d<1ghio3Tb9_BZ=1ce94O8q7wV(Fn8sn}xO*($8C8^SLLX&u>JUJ-wxA(@4
zGd>sG9&NpU%WM-@PTJwAJL)!EYBLHx%wIj>V6&;-wu=YO_gZa#wcX;B<__5%whMY=
zPr99m_^|1}l=SSGmRt+AZ#0bdUikV<cCLo;Y(}dHWrkP>M<ca+M*;)fdS_3(C<nEp
z%_pb5r}sv|S%z8bi?4hT-ZNQ&<HgbU!nq7qrRwX}HRW#S?G(zsbEe03lG%cWH7C|(
zGaEZf8yOx=SCx)r?aG+eW4Ad=<73KdrYJs!&}6TqE~y{(oUsM*YkEHY^FNdYp5%D)
zcYe#%xo>h0?!5EgY%`;D=+&m)w156i+mE-#aWpM>c9m_x_WgYfjsjQq%wjP4!Q&|K
zWHl#fhQe{*ts5$9mWkO|+?WBLSAk5LY}w+;;V8gTi88eUnI3BOJ){esXF8y^PzW?@
z#yq=4fW^_58+mF4qA&EW@1X~FJ%x;*SvUo6zH<?cwX#aD_0vxt>=ebEx`CRX51Z`S
z2c6J5pr**;7;qV4CUlwys+M@Sh?;S37l1m~3p_=YBjhB&VyX+7Nkf?)x&fQT$`R5!
z*cQTVwgD6xSGLqyE{LvBFWF!yn&WY>O(aKy@d9W%Ey0<~Y)OK1CcA^QdcRJJB6sA8
zB*qIToWwRwxSBL=HG75(XbyVgKMj5eEATzTf<n-w^u=VBFWgObLCz`p)^E9ZOF3k>
z^zUn^+Z%W6YW9ouFIA739BWfFxuSUFZpj)urQ7c!mMzS6X=YAN4$D~K+;MG5_3jhb
zUVmj;u(094T$hCl`4+}Az4&hZ(ql?|(B3=!%ZjA0{QT=@8Fct(^RutBR8}p2rF!*P
z%mnNAFDv)n&!4$yUf#0r$)6(Zc-4-blGxeyr!C6T>7M*e);})F=3zG~Yok0bU5!3*
z-n8ac^I1Dh&WzhW25Cu+kAf4JUPyF{8(2m3%rA<VnrD;ea?Iy+n#n|Sw)m<A^KSKb
zpL*VB@BD=MYl*a=k81Q)W_!c1V<)yQm0ER$qti5b!`z+OLe+`M4##68=hZeX-=p$l
z#*v0?XID%qX?L4r`itq7!-q$uUmTd$ykTHq;s>n-&}S~mdAE{XvZqWgF`9LY)JnbL
zb7$7MT+<M|@NIQY&2Ro68*^4{QdYSUV5r1W?dYU(Vt0gY>Qp<kB>fQ0&W35r^O<ke
zsdw;}-cS5^YzxC*v+xU38QwnMw)nx9&(9M}9e(c=4Pm}8H6kH?U%={|{XTjNLjOcM
z=*uY@I;=L|DKg~-!z~BH+eYR;Rz*nuSAD-SL;y5gQDyf+kYO%s{B9p!rIgr50WUkn
z9YQ2$M)O}d7Zb8fV5h9Z@th+<Z$+&AHZ(B4xZ~Dmx#r>whLX0T=lAlNN^%k(U3%72
z6Hp_wo@Gl+()ArjHm0>K+2CBp%OKl5lRIN^Xfhu^&kKc#$qjtVwk)`_b2>YeBQkZr
z=Zj^RlO-3#wie1Tm;92td2Xw4Fhg$o**SN&`0$ABZ1|>pC3q3<f7|45wMW^u_;|9E
zgsr}{UU!i%<JpBNjR|v@8Lg)66S$!F(9Ak?Utb#I+dWS={0~uG#k5pp_dc23#d@#J
ztp9Ivd#BnLQDwE@ZP_yy`|W}byHDKUcqa8@v$Ueww-<)Yx6FjQXTG>#|8eRsrdzHK
zIZOUK-W1lEeU4X~<3&lX<<HlePt$f^zmr?G=|jGh;_*o=Um8sqw{+`Ib4;JMQR<g(
zalYz;|9yYjekm(IiLf$QV92kyRJ@K^!#87v^NZ3K^4?Z=)_-u^+8Te+M?~tCfK`V4
c#E1WNT$e;GEHPkZU|?YIboFyt=akR{00TDNr~m)}

literal 0
HcmV?d00001

diff --git a/index.html b/index.html
index 708cac4..990d578 100644
--- a/index.html
+++ b/index.html
@@ -203,12 +203,20 @@ The communication test measures how quickly two nodes can exchange messages; thi
 <th>date</th>
 </tr>
 
+<tr>
+<td>0.250</td>
+<td><a href=comm/iCE40/ring.v>iCE40, Verilog</a> (<a href=comm/iCE40/README.md>notes</a>)</td>
+<td>two 22 gauge jumpers (tx/rx)</td>
+<td><a href=comm/iCE40/ring.v>iCE40, Verilog</a></td>
+<td>September 2021</td>
+</tr>
+
 <tr>
 <td>0.010</td>
 <td><a href=comm/termios/ring.termios.c>i7-8700T, C, termios</a></td>
 <td>USB 2.1</td>
 <td><a href=comm/SerialUSB/ring.SerialUSB.ino>ATSAMD11C, Arduino, SerialUSB</a></td>
-<td>April2021</td>
+<td>April 2021</td>
 </tr>
 
 <tr>
-- 
GitLab