« 2017年1月 | トップページ

2017年2月の記事

PYNQ-Z1のOverlay読み込みとPythonからのFPGA PLの制御(2)

前回の「PYNQ-Z1のOverlay読み込みとPythonからのFPGA PLの制御」の続編です。前回のポストでは、Overlayのダウンロードに"/dev/xdevcfg"というデバイスファイルを叩いたり、LEDの点滅のためにmmapを直接叩いたりと非常に低レベルな処理になっていました。今回は、PYNQらしく、PythonのOverlayクラスを使ってOverlayをダウンロードし、LEDの制御もMyLEDクラスを使って、より抽象化した処理で動くようにしてみました。

Overlayクラスを使えるようにする

Overlayクラスを使ってOverlayをダウンロードするためには、カスタムOverlayのbitstreamを作った際のVivado tclファイルが必要になります。まず、カスタムOverlayのVivadoプロジェクトを開いて、Block Designを表示します。

MyLED BD

「File > Export > Block Design..」を実行すると、Block Designをtclファイルとしてexportしてくれます。ここでは、led.tclというファイル名で保存しました。

 BD export

生成した、tclファイルをPYNQのカスタムbitstreamと同じディレクトリーに保存します(/home/xilinx/pynq/bitstream)

2017 02 04 Overlay tcl

次に、以下のPyhonコードを実行すると、Overlayクラスのインスタンス作成性時に、led.tclがパースされて、bitstreamに含まれるI/Oとそのアドレスが抽出されます。この例では、axi_gpio_0が0x41200000で識別されていることが分かります。

Instansiate Ovlerlay

次に、axi_gpio_0に値を書き込むことによってLEDを制御するコードを書いて、/home/xilinx/pynq/boardにmyled.pyというファイル名で保存します。14行目のコードで、PL.ip_dictアトリビュートから、GPIOのアドレスを抽出して、mmioクラスのコンストのラクターに渡しています。これで、GPIOのアドレスの紐付けができました。

from pynq import MMIO
from pynq import PL

LEDS_OFFSET0 = 0

class MyLED(object):
    """This class controls the onboard LEDs vi axi_gpio_0. """
    _mmio = None
    _leds_value = 0

    def __init__(self):
        """Create a new MyLED object. """
        if MyLED._mmio is None:
            MyLED._mmio = MMIO(int(PL.ip_dict["SEG_axi_gpio_0_Reg"][0],16),16)
        MyLED._mmio.write(LEDS_OFFSET0, 0x0)

    def set(self, value):
        """Turn on a LED.
        
        Parameters
        ----------
        Value = GPIO out data
        
        Returns
        -------
        None
        
        """
        MyLED._mmio.write(LEDS_OFFSET0, value)

/home/xilinx/pynq/board/__init__.pyに最後の一行を追加しておきます。

from .led import LED
from .rgbled import RGBLED
from .switch import Switch
from .button import Button
from .myled import MyLED

 これでMyLEDクラスが使えるようになりました。

Jupyter Notebookの作成

以下のように、Overlayをダウンロードして、MyLEDクラスを使ってLEDを点灯させます。

Jupyter Notebook

 これで以下のように、カスタムOverlayを使ってLチカができます。前回のコードよりだいぶ簡潔で分かりやすなりました。

後書き

ということで、思ったより簡単にカスタムOverlayをPYNQのお作法に従って動かすことができました。PYNQにもZYBOのように安価なSDSoCのボード限定ライセンスが提供されればソフト屋さんもFPGAを使ったハードウェアオフロードが簡単にできるようになるのではと思います。PYNQのSDSoC、来ないのかな。

 

« 2017年1月 | トップページ

2017年2月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28        
無料ブログはココログ