Newer
Older
<title>ring oscillator timing tests</title>
</head>
<body link="black" alink="black" vlink="black">
<font face="bitstream vera sans,arial,helvetica,sans-serif">
<div style="margin-left:2.5%;margin-right:2.5%">
<p>
<center>
<b>Ring Oscillators</b>
</center>
<p>
This page collects <a href="#GPIO">GPIO</a> and <a href="#communication">communication</a> ring oscillator timing tests for embedded systems (the prior page is <a href=prior/index.html>here</a>).
The GPIO test measures how quickly pins can communicate with a processor core; this is relevant for implementing real-time algorithms that are not supported by processor peripherals. In this, two pins are connected; a bit is output on one, read on the other, inverted in software, and the loop repeated, with the frequency of the resulting oscillation reported. Twice this frequency is the rate of reading, modifying, and writing to pins (plus the loop overhead).
<center>
<table border="1" style="text-align:center">
<tr>
<th>frequency (MHz)</th>
<td><a href=GPIO/iCE40/ring.v>Verilog</a> (<a href=GPIO/iCE40/notes.html>notes</a>), 120 MHz, iCEBreaker V1.0e, </td>
<tr>
<td>41.7</td>
<td>RP2040</td>
<td><a href=https://gitlab.cba.mit.edu/quentinbolsee/rp2040-ring-pio/-/blob/main/py/ring.RP2040PIO_NO_SYNC.py>PIO, 250 MHz, XIAO, input sync bypass</a></td>
<td>March 2023</td>
</tr>
<td><a href=https://gitlab.cba.mit.edu/quentinbolsee/rp2040-ring-pio/-/tree/main>PIO, 250 MHz, XIAO</a></td>
<td><a href=GPIO/Arduino/ring.ino>Fast</a>, <a href=GPIO/IMXRT1062/ring.IMXRT1062.ino>GPIO</a>, 600 MHz, Teensy 4.1, </td>
<td><a href=GPIO/BeagleBoard/index.html>C, PRU</a></td>
<td>March 2019</td>
<td><a href=GPIO/RP2040/ring.RP2040.ino>Arduino, SIO, 250 MHz, XIAO</a></td>
<td>December 2022</td>
</tr>
<tr>
<td>4.62</td>
<td><a href=https://gitlab.cba.mit.edu/pub/ring/-/tree/master/GPIO/ATSAME54>C, SRAM (aligned)</a></td>
<td>January 2021</td>
<td><a href=GPIO/ATxmega8E5/hello.ftdi.8E5.ring.c>C, VPORT</a></td>
<td>October 2015</td>
<td><a href=GPIO/ESP32/ring.ESP32.ino>C, GPIO</a></td>
<td>December 2020</td>
<td><a href=GPIO/ESP32/ring.ESP32C3.ino>Arduino, GPIO, 160 MHz, XIAO</a></td>
<td><a href=prior/gpio/atsamd51/index.html>C, PORT</a></td>
<td>November 2018</td>
<td><a href=GPIO/bcm2835/ring.bcm2835.c>C, bcm2835, Buster</a></td>
<td>December 2020</td>
<td><a href=GPIO/bcm2835/ring.bcm2835.c>C, bcm2835, Buster</a></td>
<td>December 2020</td>
<td><a href=GPIO/SAMD11C/ring.D11C.ino>C, IOBUS</a></td>
<td>November 2020</td>
<td><a href=GPIO/AVR128DB32/index.html>C, VPORT</a></td>
<td>December 2020</td>
<td><a href=GPIO/ATtiny412/ring.t412.ino>Arduino, DigitalReadFast/WriteFast</a></td>
<td>March 2021</td>
<td><a href=GPIO/ATtiny412/ring.t412.ino>C, VPORT</a></td>
<td>November 2020</td>
<td><a href=GPIO/SAMD11C/ring.D11C.ino>C, PORT</a></td>
<td>November 2020</td>
<td><a href=GPIO/RP2040/ring.RP2040.ino>Arduino, digitalRead/Write, 250 MHz, XIAO</a></td>
<td><a href=GPIO/ATtiny412/ring.t412.ino>C, PORT</a></td>
<td>November 2020</td>
</tr>
<td><a href=GPIO/ESP32/ring.ESP32C3.ino>Arduino, digitalRead/Write, 160 MHz, XIAO</a></td>
<td><a href=GPIO/RP2040/ring.RP2040.py>MicroPython, 250 MHz, XIAO</a></td>
<td>Raspberry Pi 4</td>
<td><a href=GPIO/RPi.GPIO/ring.RPi.GPIO.py>Python, RPi.GPIO, Buster</a></td>
<td>March 2021</td>
<td><a href=GPIO/ATtiny412/ring.t412.ino>Arduino, digitalRead/Write</a></td>
<td>November 2020</td>
<td><a href=GPIO/libgpiod/ring.libgpiod.c>C, libgpiod, Buster</a></td>
<td>December 2020</td>
<td><a href=GPIO/gpiolib/ring.gpiolib.c>C, gpiolib, Buster</a></td>
<td>December 2020</td>
</tr>
<td>Raspberry Pi 4</td>
<td><a href=GPIO/gpiozero/ring.gpiozero.py>Python, gpiozero, Buster</a></td>
<td>March 2021</td>
</center>
<p>
The communication test measures how quickly two nodes can exchange messages; this is relevant for implementing real-time and high data-rate algorithms. In this, the "from" node sends a byte to the "to" node, which adds 1 to it and sends it back. This is repeated many times, and the number of round trips is divided by the total time. Twice that frequency is approximately the byte rate in one direction, and 16 times that frequency is approximately the bit rate in one direction.
<center>
<table border="1" style="text-align:center">
<tr>
<th>frequency (MHz)</th>
<th>from</th>
<th>link</th>
<th>to</th>
<th>date</th>
</tr>
<td><a href=comm/iCE40/ring.v>iCE40, Verilog</a> (<a href=comm/iCE40/notes.html>notes</a>)</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>
<tr>
<td>0.007</td>
<td><a href=comm/pySerial/ring.pySerial.py>i7-8700T, Python, pySerial</a></td>
<td>USB 2.1</td>
<td><a href=comm/SerialUSB/ring.SerialUSB.ino>ATSAMD11C, Arduino, SerialUSB</a></td>
<td>March 2021</td>
</tr>
</table>
</center>
<br><br>