FC2カウンター FPGAの部屋 2022年09月04日
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

”MicroZed Chronicles: PYNQ Interrupts”をやってみる2

”MicroZed Chronicles: PYNQ Interrupts”をやってみる1”の続き。

PYNQ での割り込みを学習するために、Adam Taylor さんの”MicroZed Chronicles: Memory Scrubbing”を ZYBO Z7-20 の PYNQ でやってみることにしたということで、前回は、Vivado 2022.1 で pynq_int プロジェクトを作成してブロック・デザインを作成し、論理合成、インプリメンテーション、ビットストリームの生成を行った。今回は、ZYBO Z7-20 上の PYNQ Linux にビットストリームと hwh ファイルをアップロードし、pynq_int.ipynb ファイルを生成して、割り込み動作を確認した。

ZYBO Z7-20 の Jupyter Notebook の my_project の下に pinq_int ディレクトリを生成した。

Vivado 2022.1 で作った pynq_int プロジェクトの pynq_int/pynq_int.runs/impl_1 から pynq_int_wrapper.bit を pynq_int ディレクトリにアップロードし、名前を pynq_int.bit に変更した。

Vivado 2022.1 で作った pynq_int プロジェクトの pynq_int/pynq_int.gen/sources_1/bd/pynq_int/hw_handoff から pynq_int.hwh ファイルを pynq_int ディレクトリにアップロードした。

pynq_int.ipynb ファイルを新規作成した。
MicroZed Chronicles: Memory Scrubbing”のコードを引用した。変数名を多少いじってあるが、ほとんどコードを引用してある。
ZYBO_Z7_PYNQ_248_220904.png

ZYBO Z7-20 の PYNQ Linux にログインして、cat /proc/interrupts を行った。
ZYBO_Z7_PYNQ_249_220904.png

たぶん fabric が PL からの割り込みを表すと思う。
現在、CPU0 のカウントは 0 になっている。

pynq_int.ipynb ファイルを全部実行した。
最後の

asyncio.get_event_loop().run_until_complete(handler_task)

で実行待ちになっている。
ZYBO_Z7_PYNQ_250_220904.png

ZYBO Z7-20 の押ボタン・スイッチのどれかを押すと、最後の行を実行できた。
LED が全て点灯した。
ZYBO_Z7_PYNQ_251_220904.png

handle() 関数を割り込みで実行できているようだ。

cat /proc/interrupts を行うと fabric の CPU0 のカウントが +1 されていた。
ZYBO_Z7_PYNQ_252_220904.png

MicroZed Chronicles: Memory Scrubbing”を引用した Python コードを貼っておく。

#!/usr/bin/env python
# coding: utf-8

# ## PYNQ Interrupt

# In[1]:

from pynq import Overlay, Interrupt, GPIO
import asyncio

# In[2]:

# Download bitstream
pi = Overlay("./pynq_int.bit")

# In[3]:

pi.interrupt_pins

# In[4]:

intc = pi.axi_intc_0
intr_inst = Interrupt('axi_gpio_0/ip2intc_irpt')

# In[5]:

from pynq.lib import AxiGPIO

# In[6]:

gpio0 = pi.ip_dict['axi_gpio_0']
gpio1 = pi.ip_dict['axi_gpio_1']

# In[7]:

leds = AxiGPIO(gpio1).channel1
sw = AxiGPIO(gpio0).channel1

# In[8]:

async def handle():
    await sw.wait_for_interrupt_async()
    leds[0:4].toggle()

# In[9]:

handler_task = asyncio.ensure_future(handle())

# In[10]:

asyncio.get_event_loop().run_until_complete(handler_task)

  1. 2022年09月04日 04:44 |
  2. PYNQ
  3. | トラックバック:0
  4. | コメント:0