Posted at

Python で FPGA/Lチカ(Lattice iCE40 編)


小規模 FPGA でも Lチカ

Zynq は ARM CPU を持った比較的リッチなFPGA を搭載したボードです。より消費電力も小さいFPGA

で高位合成を利用する事は可能でしょうか?Polyphony ではコンパイラとして最適化を意識した設計になっておりリソースの消費量はそう多くありません。


ターゲットは iCE40(Lattice)

消費電力も少ない小規模なFPGA であるLattice のiCE40 UltraPlus UP5K でPython のコードを走らせてみましょう。iCE40 UltraPlus はチップ内にSPI コントローラのプリミティブとLED ドライブ用のプリミティブを持っています。このチップを搭載した評価ボードiCE40 UltraPlus Breakout board を使ってLチカとSPI の制御をしてみましょう。

image.png

iCE40 Ultra Family Data Sheet より抜粋


ターゲットボードの RGB LED をLチカ

評価ボードにはRGB のLED が搭載されています。これを今までのPython のコードblink.py を用いてコントロールしてみましょう。システム構成は図のようになります。

image.png

blink.py から 生成されるモジュールのclk, rst, led の信号線を使ったトップモジュールをVerilog-HDL で作成し、ベンダーのツールで合成、実装することで動作可能なバイナリができます。

image.png

Polyphony が出力するVerilog-HDL はベンダーに非依存であるためX 社で動いた同じPython のコードをL 社ので動かすということが容易にできます。

iCE40UP の特別な点としてトップモジュールにLED ドライバのプリミティブを使用するという指示を書いておく必要があります。その記述によりツールが自動的にLED のドライバを組み込んでくれます。


rgb_primitive.v

//------------------------------

// Instantiate RGB primitives
//------------------------------
SB_RGBA_DRV RGB_DRIVER (
.RGBLEDEN (1'b1),
.RGB0PWM (0),
.RGB1PWM (green_wire),
.RGB2PWM (0),
.CURREN (1'b1),
.RGB0 (REDn), //Actual Hardware connection
.RGB1 (GRNn),
.RGB2 (BLUn)
);

defparam RGB_DRIVER.RGB0_CURRENT = "0b000001";
defparam RGB_DRIVER.RGB1_CURRENT = "0b000001";
defparam RGB_DRIVER.RGB2_CURRENT = "0b000001";