Testing the Linux Kernel driver for the Lattice iCE40 FPGA
Summary
Jan 9, 2017Demonstration and testing of the new Linux Kernel driver for the Lattice iCE40 FPGA with sigrok, including an introduction to device-tree and driver development.
IceStorm FPGA Synthesis Tool-Chain
Patches
Device Tree
Overlay
/dts-v1/; /plugin/; / { compatible="brcm,bcm2708"; fragment@0 { target = <&spi0>; __overlay__ { status = "okay"; spidev@0 { status = "disabled"; }; spidev@1 { status = "disabled"; }; }; }; fragment@1 { target = <&spi0>; __overlay__ { /* needed to avoid dtc warning */ #address-cells = <1>; #size-cells = <0>; ice40: ice40@0 { compatible = "lattice,ice40-fpga-mgr"; reg = <0>; spi-max-frequency = <10000000>; cdone-gpios = <&gpio 24 0>; reset-gpios = <&gpio 22 1>; }; }; }; };
Test Firmware
Makefile
outdir=_out/ src= synthesize: $(outdir)counter.bin $(outdir)counter.bin: counter.v counter.pcf $(src) mkdir -p $(outdir) yosys -q -p "synth_ice40 -blif $(outdir)counter.blif" counter.v $(src) arachne-pnr -d 8k -p counter.pcf $(outdir)counter.blif -o $(outdir)counter.txt icepack $(outdir)counter.txt $(outdir)counter.bin .PHONY: synthesize
counter.v
module top(input ref_12mhz, output test1, output test2, output [7:0] leds); reg [23:0] counter = 0; always @(posedge ref_12mhz) counter <= counter + 1; assign leds[0:7] = counter[16:23]; assign test1 = counter[4]; assign test2 = !counter[4]; endmodule
counter.pcf
set_io ref_12mhz J3 set_io test1 M1 set_io test2 M2 set_io leds[0] B5 set_io leds[1] B4 set_io leds[2] A2 set_io leds[3] A1 set_io leds[4] C5 set_io leds[5] C4 set_io leds[6] B3 set_io leds[7] C3
Credits
- Intro Music: Logan Takashi - Orb-O (CC-BY-NC-ND).