Posted at

Python で FPGA/Lチカ(Zybo 編)


Lチカ(Zybo編)

ネタがなくなってきたので Zybo でも Lチカをこころみることにします。


Lチカ アゲイン(Python での記述)

Python のソースを掲げます。


blink.py

from polyphony import testbench, module, is_worker_running

from polyphony.io import Port
from polyphony.timing import wait_value
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

@testbench
def test(dut):
v = 0
for i in range(4):
print("loop:", i)
wait_value(1, dut.led)
wait_value(0, dut.led)
print("finished")

blink = Blink(125 * 1000 * 1000)
test(blink)



Python でシミュレーション

Python で実行します。


Pythonで実行

> python3 blink.py

loop: 0
loop: 1
loop: 2
loop: 3
finished


Polyphony でコンパイル

コンパイルすると Blink_blink.v が出来ます。


Polyphonyでコンパイル

> polyphony blink.py

> ls Blink_blink.v
Blink_blink.v


Vivado で合成・実行

Zybo 用ですが ARM の部分は使いませんので簡単に作れます。

作業の詳細はこちらも参考にしてください。ほぼ同じです。

https://qiita.com/ryos36/items/0f757c674ef90a33ddf2


Vivado のプロジェクト作成

XC7z010clg400-1 を選択します。

image.png


デザインを追加してソースも追加


  1. 空の design を作り

  2. wrapper も設定し

  3. Blink_blink.v も追加します。

image.png


Block_block.v を追加

image.png

make external でピンを生成します。名称は変えました。

image.png


ピン情報を追加(xdc の追加)

ピン情報を追加します。


zynq.xdc

## PL System Clock                                                                 

set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { clk }];
create_clock -add -name sys_clk_pin -period 8.00 -waveform {0 4} [get_ports { clk }

## LED
set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { led0 }];

## Buttons
set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { btn0 }];


これは回路図の赤で囲った部分から作ります。

image.png


合成して実行

合成した上で Zybo を JTAG で立ち上げて実行します。Lチカの完成です。

image.png