小規模 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 の制御をしてみましょう。
iCE40 Ultra Family Data Sheet より抜粋
ターゲットボードの RGB LED をLチカ
評価ボードにはRGB のLED が搭載されています。これを今までのPython のコードblink.py を用いてコントロールしてみましょう。システム構成は図のようになります。
blink.py から 生成されるモジュールのclk, rst, led の信号線を使ったトップモジュールをVerilog-HDL で作成し、ベンダーのツールで合成、実装することで動作可能なバイナリができます。
Polyphony が出力するVerilog-HDL はベンダーに非依存であるためX 社で動いた同じPython のコードをL 社ので動かすということが容易にできます。
iCE40UP の特別な点としてトップモジュールにLED ドライバのプリミティブを使用するという指示を書いておく必要があります。その記述によりツールが自動的にLED のドライバを組み込んでくれます。
//------------------------------
// 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";