SpinalHDL
Nach dem Vortrag über SpinalHDL auf dem 33C3 habe ich die IceStorm Tool-Chain unter MacOS damit endlich mal ausprobiert:
 
    
Anleitung für die Installation: McMayer.
Integration in SBT war dann einfach:
import scala.sys.process._
name := "blinky"
scalaVersion := "2.11.6"
libraryDependencies ++= Seq(
  "com.github.spinalhdl" % "spinalhdl-core_2.11" % "latest.release",
  "com.github.spinalhdl" % "spinalhdl-lib_2.11" % "latest.release"
)
lazy val synth = taskKey[Unit]("Synthesize bitstream")
lazy val prog = taskKey[Unit]("Program ICE40")
synth := {
  val yoSys = Seq("yosys", "-p", "synth_ice40 -top Blink -blif target/Blink.blif", "Blink.v")
  val arachne = Seq("arachne-pnr", "-d", "8k", "-P", "ct256", "-o", "target/Blink.asc", "-p", "Blink.pcf", "target/Blink.blif")
  val icepack = Seq("icepack", "target/Blink.asc", "target/Blink.bin")
  (runMain in Compile).toTask(" de.ideasinlogic.fpga.spinal.blink.Blink").value
  yoSys #&& arachne #&& icepack !
}
prog := {
  val iceprog = Seq("iceprog","-S","target/Blink.bin")
  iceprog !
}
IO-Definition des ICE40-HX8K Demo-Boards:
set_io io_clk J3  
set_io io_led[7] C3  
set_io io_led[6] B3  
set_io io_led[5] C4  
set_io io_led[4] C5  
set_io io_led[3] A1  
set_io io_led[2] A2  
set_io io_led[1] B4  
set_io io_led[0] B5 
SpinalHDL Code:
package de.ideasinlogic.fpga.spinal.blink
import spinal.core._
class Blink extends Component {
  val io = new Bundle {
    val led = out Bits (8 bits)
    val clk = in Bool
  }
  // Create own clock-domain for the
  // 12 Mhz Clock from the FTDI chip
  val myClockDomain = ClockDomain(
    clock = io.clk,
    reset = True,
    config = ClockDomainConfig(
      clockEdge = RISING,
      resetKind = ASYNC,
      resetActiveLevel = LOW
    )
  )
  val myArea = new ClockingArea(myClockDomain) {
    val reg = Reg(UInt(23 bits)) init (0)
    reg := reg + 1
    val ledSel = UInt(3 bits)
    switch(reg(22).asUInt) {
      is(1) {
        ledSel := 7 - reg(21 downto 19)
      }
      default {
        ledSel := reg(21 downto 19)
      }
    }
    io.led := B"1" << ledSel
  }
}
object Blink {
  // Let's go
  def main(args: Array[String]) {
    SpinalVerilog(new Blink)
  }
}