Python で FPGA/Lチカ(Cora Z7編)

#Cora Z7 買ってみました

Zynq の 7007S というチップで FPGA の容量は少なめです。ARM もシングルコアです。今回の記事では ARM は使いません。

本家の情報はここにあります。
https://reference.digilentinc.com/reference/programmable-logic/cora-z7/start

#Vivado 2018.1 で環境作り
先の本家にすでに動作可能なプロジェクトがあるようなのですぐに使いたい人はそちらをどうぞ。今回は ARM 以外を使うという前提で素からプロジェクトを作ってみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/40d5b398-08ca-e424-4056-3f804335a266.png)

ボードファイルは使わずに XC7z007sclg400-1 を選択することにします。この方法だと ARM の設定がされません（今回は使わないからこれでよい）。もちろんボードファイルをコピーしてそれを選択しても構いません。そうすれば将来的に ARM の設定で悩まないでしょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/00cafccc-0576-8ee7-8fe5-c1369daf2af9.png)

# Blink.py アップデート!
前回の反省点として待ち時間が短かったためちゃんとLチカしませんでした。そこで Blink.py の定数を 10000 から 125 * 1000 * 1000 にします。

```python:blink
blink = Blink(125 * 1000 * 1000)
test(blink)
````

ほとんどかわらないですが gist に置いておきます。

https://gist.github.com/ryos36/96f1f250a5f3d880faeeaa94969bd1bf

## コンパイルとその結果

```text:コンパイル
> polyphony blink.py
```

コンパイル結果を見てみます。

```verilog:インターバル抜粋
  assign interval = 125000000;
```

コンパイラが掛け算をちゃんと計算して定数にしてくれています。

# Create Block Design
前回と同じ作業なので省略気味に書きます。
 
IP Integrator から Create Block Design を選んでDiagram(回路図エディター?)を立ち上げます。
次に Create HDL Wrapper でまずはからの wrapper を作ってしまいます。これが自動的に Top Module になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/251b9364-bd80-f2d3-0311-cd31cd1522af.png)

Polyphony でつくった Blink_blink.v をSources に追加して、さらに Diagram で Add Module。そして 各足を Make External します。今回は外部名称を変えません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/d99ad7bb-b9e5-b541-319c-c6882019606c.png)


# もう一度 Create HDL Wrapper
Diagram の中身が変わったので再度 Create HDL Wrapper を実行します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/1d15a78f-afdb-235e-4385-1fb0c9f059f6.png)

# xdc を新規作成
Constraints で blink.xdc という名称で xdc を新規作成します。中身は
https://github.com/Digilent/digilent-xdc/blob/master/Cora-Z7-07S-Master.xdc
からコピーし、少々編集します。

```tcl:blink.xdc
## PL System Clock
set_property -dict { PACKAGE_PIN H16   IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L13P_T2_MRCC_35 Sch=sysclk
create_clock -add -name sys_clk_pin -period 8.00 -waveform {0 4} [get_ports { clk }];#set

## RGB LEDs
set_property -dict { PACKAGE_PIN L15   IOSTANDARD LVCMOS33 } [get_ports { led0_b }]; #IO_L22N_T3_AD7N_35 Sch=led0_b
#set_property -dict { PACKAGE_PIN G17   IOSTANDARD LVCMOS33 } [get_ports { led0_g }]; #IO_L16P_T2_35 Sch=led0_g
#set_property -dict { PACKAGE_PIN N15   IOSTANDARD LVCMOS33 } [get_ports { led0_r }]; #IO_L21P_T3_DQS_AD14P_35 Sch=led0_r
#set_property -dict { PACKAGE_PIN G14   IOSTANDARD LVCMOS33 } [get_ports { led1_b }]; #IO_0_35 Sch=led1_b
#set_property -dict { PACKAGE_PIN L14   IOSTANDARD LVCMOS33 } [get_ports { led1_g }]; #IO_L22P_T3_AD7P_35 Sch=led1_g
#set_property -dict { PACKAGE_PIN M15   IOSTANDARD LVCMOS33 } [get_ports { led1_r }]; #IO_L23N_T3_35 Sch=led1_r

## Buttons
set_property -dict { PACKAGE_PIN D20   IOSTANDARD LVCMOS33 } [get_ports { rst }]; #IO_L4N_T0_35 Sch=btn[0]
#set_property -dict { PACKAGE_PIN D19   IOSTANDARD LVCMOS33 } [get_ports { btn[1] }]; #IO_L4P_T0_35 Sch=btn[1]
```

# Diagram のピンの名称変更
xdc に合わせてピンの名称を変更します。
clk_0 -> clk
rst_0 -> btn0
led_0 -> led0_b

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/6fcb3041-0591-5fb6-292f-12b4a95193f8.png)

# 合成!!そして実行!!
Generate Bitstream を実行します。RGB の LED の青が点滅しました!!(まぶしい!!)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/cf27d0c6-379d-f894-7e62-a12158169c52.png)

なれてきたのもあってこれを書きながら 25分で達成。