Add TinyFPGA platform based on Migen.
authorWilliam D. Jones <thor0505@comcast.net>
Tue, 19 Dec 2017 01:36:59 +0000 (20:36 -0500)
committerFlorent Kermarrec <florent@enjoy-digital.fr>
Tue, 26 Dec 2017 23:00:05 +0000 (00:00 +0100)
litex/boards/platforms/tinyfpga_b.py [new file with mode: 0644]
litex/build/lattice/programmer.py

diff --git a/litex/boards/platforms/tinyfpga_b.py b/litex/boards/platforms/tinyfpga_b.py
new file mode 100644 (file)
index 0000000..d99be74
--- /dev/null
@@ -0,0 +1,40 @@
+from litex.build.generic_platform import *
+from litex.build.lattice import LatticePlatform
+from litex.build.lattice.programmer import TinyFpgaBProgrammer
+
+_io = [
+    ("usb", 0,
+        Subsignal("d_p", Pins("A3")),
+        Subsignal("d_n", Pins("A4")),
+        IOStandard("LVCMOS33")
+    ),
+
+    ("spiflash", 0,
+        Subsignal("cs_n", Pins("F7"), IOStandard("LVCMOS33")),
+        Subsignal("clk", Pins("G7"), IOStandard("LVCMOS33")),
+        Subsignal("mosi", Pins("G6"), IOStandard("LVCMOS33")),
+        Subsignal("miso", Pins("H7"), IOStandard("LVCMOS33"))
+    ),
+
+    ("clk16", 0, Pins("B4"), IOStandard("LVCMOS33"))
+]
+
+_connectors = [
+    # B2-J1, Pins 4-13
+    # D9-C9, Pins 18-19, Pins 21-24
+    # E8, Pin 20 (Input only)
+    ("GPIO", "B2 A2 A1 B1 C1 D1 E1 G1 H1 J1 D9 C9 A9 A8 A7 A6"),
+    ("GBIN", "E8")
+]
+
+
+class Platform(LatticePlatform):
+    default_clk_name = "clk16"
+    default_clk_period = 62.5
+
+    def __init__(self):
+        LatticePlatform.__init__(self, "ice40-lp8k-cm81", _io, _connectors,
+                                 toolchain="icestorm")
+
+    def create_programmer(self):
+        return TinyFpgaBProgrammer()
index 94282d42c90f16f22a52206fb8016e5163c42b73..e9e5791b4a431d1932b50fd1b0a651df24da9452 100644 (file)
@@ -41,3 +41,18 @@ class IceBurnProgrammer(GenericProgrammer):
 
     def load_bitstream(self, bitstream_file):
         subprocess.call([self.iceburn, "-evw", bitstream_file])
+
+
+class TinyFpgaBProgrammer(GenericProgrammer):
+    needs_bitreverse = False
+
+    # The default flash address you probably want is 0x30000; the image at
+    # address 0 is for the bootloader.
+    def flash(self, address, bitstream_file):
+        subprocess.call(["tinyfpgab", "-a", str(address), "-p",
+                        bitstream_file])
+
+    # Force user image to boot if a user reset tinyfpga, the bootloader
+    # is active, and the user image need not be reprogrammed.
+    def boot(self):
+        subprocess.call(["tinyfpgab", "-b"])