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
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
U3$FkJ{}us^&Y0>K>pBwu2Lm?Ur~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