Edited at

Python で FPGA/ これが Lチカだ


これが "Lチカ" だ

LED チカチカ。通称 Lチカ。Polyphony で書くとこんな感じになります。


blink.py

from polyphony import testbench, module, is_worker_running

from polyphony.io import Port
from polyphony.typing import bit

@module
class Blink:
def __init__(self, interval):
self.led = Port(bit, 'out')
self.interval = interval
self.append_worker(self.main)

def main(self):
led_bit:bit = 1
while is_worker_running():
self.led(led_bit)
led_bit= 1 - led_bit
self._wait()

def _wait(self):
for i in range(self.interval // 2):
pass

blink = Blink(10000)


ひとつひとつ説明していきましょう。


習うより慣れろ

いやいや説明なんてよいという場合はもうコンパイルして使ってください。使い方は次の記事に書くことにする予定です。

書いてみて Lチカは Polyphony では最初の一歩ではないことが分かってしまいました(がそのまま続行しましょう)。もうちょい初歩の初歩としては足し算を用意する予定なので、Python ビギナーや FPGA ビギナーで初歩の初歩からやりたいひとは、そちら(まだ書いてない)を見てほしいと思います。


@module と class Blink

いきなり @module という Python のデコレータ機能が出てきてしまい面食らうかもしれません。ここが初歩の初歩としてはむずかしいところです。Polyphony では @module というデコレータ用のキーワード(?)が用意されていてハードウェアの module (Verilog-HDL のmodule) に対応していることを明示します。

細かいことは気にせずに、Lチカの場合はそういうものだと思って進めましょう。


__init__

__init__ 関数は Python で class を定義する際の初期化関数(コンストラクタ)です。


__init__

    def __init__(self, interval):

self.led = Port(bit, 'out')
self.interval = interval
self.append_worker(self.main)

LED をチカチカさせるためには、なんらかのハードウェア的な出力が必要で、それを Port(bit, 'out') で作っています。interval は点滅の間隔です。そして、worker という無限ループをする実体を append_worker という関数で定義します。


main

初期化関数 __init__ で worker として登録された main 関数が実際に動作する本体です。

Port の led に 1 を書くことで LED が点灯、0 を書くことで LED が消灯としましょう。led_bit は初期値が 1 です。led_bit = 1 - led_bit で値が反転してもとが 1 なら 0 になります。self.led(led_bit) で LED の点灯/消灯がコントロールできます。その後、毎回 _wait 関数を呼びます。


main

    def main(self):

led_bit:bit = 1
while is_worker_running():
self.led(led_bit)
led_bit= 1 - led_bit
self._wait()


_wait

_wait は点灯および消灯時間の調整です。for 文で interval の回数だけまわります。


_wait

    def _wait(self):

for i in range(self.interval // 2):
pass