From 1c55b4203842e7b0c483b95cf954ef990023ad07 Mon Sep 17 00:00:00 2001
From: Erik Strand <erik.strand@cba.mit.edu>
Date: Wed, 29 Sep 2021 23:30:08 -0400
Subject: [PATCH] Add iCE40 FPGA

---
 GPIO/iCE40/.gitignore         |   6 ++++
 GPIO/iCE40/Makefile           |  29 +++++++++++++++
 GPIO/iCE40/README.md          |  41 ++++++++++++++++++++++
 GPIO/iCE40/icebreaker.pcf     |  54 ++++++++++++++++++++++++++++
 GPIO/iCE40/img/ring_12mhz.png | Bin 0 -> 5643 bytes
 GPIO/iCE40/img/ring_55mhz.png | Bin 0 -> 5457 bytes
 GPIO/iCE40/img/ring_60mhz.png | Bin 0 -> 5578 bytes
 GPIO/iCE40/img/ring_64mhz.png | Bin 0 -> 5256 bytes
 GPIO/iCE40/ring.v             |  64 ++++++++++++++++++++++++++++++++++
 index.html                    |   7 ++++
 10 files changed, 201 insertions(+)
 create mode 100644 GPIO/iCE40/.gitignore
 create mode 100644 GPIO/iCE40/Makefile
 create mode 100644 GPIO/iCE40/README.md
 create mode 100644 GPIO/iCE40/icebreaker.pcf
 create mode 100644 GPIO/iCE40/img/ring_12mhz.png
 create mode 100644 GPIO/iCE40/img/ring_55mhz.png
 create mode 100644 GPIO/iCE40/img/ring_60mhz.png
 create mode 100644 GPIO/iCE40/img/ring_64mhz.png
 create mode 100644 GPIO/iCE40/ring.v

diff --git a/GPIO/iCE40/.gitignore b/GPIO/iCE40/.gitignore
new file mode 100644
index 0000000..9bc6787
--- /dev/null
+++ b/GPIO/iCE40/.gitignore
@@ -0,0 +1,6 @@
+/*.asc
+/*.bin
+/*.json
+/*.rpt
+/*.nplog
+/*.yslog
diff --git a/GPIO/iCE40/Makefile b/GPIO/iCE40/Makefile
new file mode 100644
index 0000000..44aaad5
--- /dev/null
+++ b/GPIO/iCE40/Makefile
@@ -0,0 +1,29 @@
+PROJ = ring
+
+all: $(PROJ).rpt $(PROJ).bin
+
+$(PROJ).json: $(PROJ).v
+	yosys -ql $(PROJ).yslog -p 'synth_ice40 -top top -json $@' $<
+
+$(PROJ).asc: $(PROJ).json icebreaker.pcf
+	nextpnr-ice40 -ql $(PROJ).nplog --up5k --package sg48 --freq 111 --asc $@ --pcf icebreaker.pcf --json $<
+
+$(PROJ).bin: $(PROJ).asc
+	icepack $< $@
+
+$(PROJ).rpt: $(PROJ).asc
+	icetime -d up5k -c 111 -mtr $@ $<
+
+prog: $(PROJ).bin
+	iceprog $<
+
+sudo-prog: $(PROJ).bin
+	@echo 'Executing prog as root!!!'
+	sudo iceprog $<
+
+clean:
+	rm -f $(PROJ).yslog $(PROJ).nplog $(PROJ).json $(PROJ).asc $(PROJ).rpt $(PROJ).bin
+	rm -f $(PROJ)_tb $(PROJ)_tb.vcd $(PROJ)_syn.v $(PROJ)_syntb $(PROJ)_syntb.vcd
+
+.SECONDARY:
+.PHONY: all prog clean
diff --git a/GPIO/iCE40/README.md b/GPIO/iCE40/README.md
new file mode 100644
index 0000000..08bc585
--- /dev/null
+++ b/GPIO/iCE40/README.md
@@ -0,0 +1,41 @@
+# iCE40 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.
+
+## Results
+
+When clocking the FPGA at 24MHz, the resulting ring oscillation is still identifiable as a square
+wave.
+
+![12MHz](./img/ring_12mhz.png)
+
+By 111MHz, it's more of a triangle wave. But still stable and nearly rail to rail. This is the
+fastest clock speed that `icetime` approves.
+
+![55.5MHz](./img/ring_55mhz.png)
+
+Despite not passing the timing analysis, when the FPGA is clocked at 120MHz no problems seems to
+occur.
+
+![60MHz](./img/ring_60mhz.png)
+
+Even at 129MHz, stable ring oscillation can occur. I (Erik) thought that the first time I ran it I
+got a chaotic, aperiodic signal. But I haven't been able to reproduce this so I might have made a
+mistake. Still, I'll hold off on declaring this result official.
+
+![64.5MHz](./img/ring_64mhz.png)
+
+At faster clock speeds things start to go wrong. Usually there's still a periodic ring oscillation,
+just much slower than one would hope.
diff --git a/GPIO/iCE40/icebreaker.pcf b/GPIO/iCE40/icebreaker.pcf
new file mode 100644
index 0000000..03088f2
--- /dev/null
+++ b/GPIO/iCE40/icebreaker.pcf
@@ -0,0 +1,54 @@
+# 12 MHz clock
+set_io -nowarn CLK_12MHZ  35
+
+# RS232
+set_io -nowarn RX          6
+set_io -nowarn TX          9
+
+# LEDs and Button
+set_io -nowarn BTN_N      10
+set_io -nowarn LEDR_N     11
+set_io -nowarn LEDG_N     37
+
+# RGB LED Driver
+set_io -nowarn LED_RED_N  39
+set_io -nowarn LED_GRN_N  40
+set_io -nowarn LED_BLU_N  41
+
+# SPI Flash
+set_io -nowarn FLASH_SCK  15
+set_io -nowarn FLASH_SSB  16
+set_io -nowarn FLASH_IO0  14
+set_io -nowarn FLASH_IO1  17
+set_io -nowarn FLASH_IO2  12
+set_io -nowarn FLASH_IO3  13
+
+# PMOD 1A
+set_io -nowarn P1A1        4
+set_io -nowarn P1A2        2
+set_io -nowarn P1A3       47
+set_io -nowarn P1A4       45
+set_io -nowarn P1A7        3
+set_io -nowarn P1A8       48
+set_io -nowarn P1A9       46
+set_io -nowarn P1A10      44
+
+# PMOD 1B
+set_io -nowarn P1B1       43
+set_io -nowarn P1B2       38
+set_io -nowarn P1B3       34
+set_io -nowarn P1B4       31
+set_io -nowarn P1B7       42
+set_io -nowarn P1B8       36
+set_io -nowarn P1B9       32
+set_io -nowarn P1B10      28
+
+# LEDs and Buttons (PMOD 2)
+set_io -nowarn LED1       26
+set_io -nowarn LED2       27
+set_io -nowarn LED3       25
+set_io -nowarn LED4       23
+set_io -nowarn LED5       21
+set_io -nowarn BTN1       20
+set_io -nowarn BTN2       19
+set_io -nowarn BTN3       18
diff --git a/GPIO/iCE40/img/ring_12mhz.png b/GPIO/iCE40/img/ring_12mhz.png
new file mode 100644
index 0000000000000000000000000000000000000000..32bfb41babac05c30731b593a01f29e03533c659
GIT binary patch
literal 5643
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
E4}Ls%4FCWD

literal 0
HcmV?d00001

diff --git a/GPIO/iCE40/img/ring_55mhz.png b/GPIO/iCE40/img/ring_55mhz.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e6bed31b2ccb922130a8d2571b6d1d03940ce37
GIT binary patch
literal 5457
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
PDFCKxc%w|)F5*7`MiwCI

literal 0
HcmV?d00001

diff --git a/GPIO/iCE40/img/ring_60mhz.png b/GPIO/iCE40/img/ring_60mhz.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b8e2b9d547b618a2279b6cfa5389df5b19faaac
GIT binary patch
literal 5578
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
bdQJcp%%izT>%zPIM+;DrQ<trfejM^&-O@xK

literal 0
HcmV?d00001

diff --git a/GPIO/iCE40/img/ring_64mhz.png b/GPIO/iCE40/img/ring_64mhz.png
new file mode 100644
index 0000000000000000000000000000000000000000..f91a302a7e93ff797e3b5ccdc0bc433dc69fd88d
GIT binary patch
literal 5256
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

literal 0
HcmV?d00001

diff --git a/GPIO/iCE40/ring.v b/GPIO/iCE40/ring.v
new file mode 100644
index 0000000..4e4c830
--- /dev/null
+++ b/GPIO/iCE40/ring.v
@@ -0,0 +1,64 @@
+// Cause yosys to throw an error when we implicitly declare nets
+`default_nettype none
+
+module top (
+    input CLK_12MHZ,           // system clock
+    output P1A1,
+    input P1A2,
+);
+    wire clk;
+    wire clk_lock;
+    SB_PLL40_PAD #(
+        .FEEDBACK_PATH("SIMPLE"),
+        .PLLOUT_SELECT("GENCLK"),
+        .FILTER_RANGE(3'b001),
+        // == 24 MHz == (boring slow)
+        //.DIVR(4'b0000),
+        //.DIVF(7'b0111111),
+        //.DIVQ(3'b101)
+        // == 48 MHz == (getting interesting)
+        //.DIVR(4'b0000),
+        //.DIVF(7'b0111111),
+        //.DIVQ(3'b100),
+        // == 96 MHz == (knocks the socks off MCUs)
+        //.DIVR(4'b0000),
+        //.DIVF(7'b0111111),
+        //.DIVQ(3'b011)
+        // == 111 MHz == (fastest I can go while still passing timing tests)
+        //.DIVR(4'b0000),
+        //.DIVF(7'b1001001),
+        //.DIVQ(3'b011)
+        // == 120 MHz == (overclocked -- doesn't pass the icetime analysis, but seems stable)
+        .DIVR(4'b0000),
+        .DIVF(7'b1001111),
+        .DIVQ(3'b011)
+        // == 129 ==
+        // (possibly unreliable -- once saw unstable oscillation, though it's worked since then)
+        //.DIVR(4'b0000),
+        //.DIVF(7'b1010101),
+        //.DIVQ(3'b011)
+        // == 141 == (breakdown -- resulting oscillation is stable but only 35.25MHz)
+        //.DIVR(4'b0000),
+        //.DIVF(7'b0101110),
+        //.DIVQ(3'b010)
+        // == 165 MHz == (breakdown -- resulting oscillation is stable but only 41.25MHz)
+        //.DIVR(4'b0000),
+        //.DIVF(7'b0110110),
+        //.DIVQ(3'b010)
+    ) clk_pll (
+        .PACKAGEPIN(CLK_12MHZ),
+        .PLLOUTGLOBAL(clk),
+        .LOCK(clk_lock),
+        .RESETB(1'b1),
+        .BYPASS(1'b0)
+    );
+
+    always @(posedge clk or negedge clk_lock) begin
+        if (!clk_lock) begin
+            P1A1 <= 1'b0;
+        end else begin
+            P1A1 <= !P1A2;
+        end
+    end
+
+endmodule
diff --git a/index.html b/index.html
index 8725abd..dc2fe4b 100644
--- a/index.html
+++ b/index.html
@@ -39,6 +39,13 @@ The GPIO test measures how quickly pins can communicate with a processor core; t
 <th>date</th>
 </tr>
 
+<tr>
+<td>60.00</td>
+<td>iCE40UP5K</td>
+<td>iCEBreaker V1.0e, 120 MHz, <a href=GPIO/iCE40/ring.v>Verilog</a> (<a href=GPIO/iCE40/README.md>notes</a>)</td>
+<td>September, 2021</td>
+</tr>
+
 <tr>
 <td>23.08</td>
 <td>IMXRT1062</td>
-- 
GitLab