PYNQ > Pmod VGA > FPGAプログラミング大全 Xilinx編 > 「6-2 文字表示回路の設計とIP設計」をPYNQ-Z1で動かす時にはまったこと

```txt:動作環境
PYNQ-Z1
Windows 10 Pro v1909
Vivado v2019.1
Pmod VGA
```

### 概要

- FPGAプログラミング大全 Xilinx編 の6-2にある文字表示をPYNQ-Z1で行う
- HDLとROMDATAは本のサイト提供のものを使う
- VRAMとCGROMはVivadoにて作成する
- XSDKの実装は本のコードを使用する

### 謝辞

この記事の内容は小林優様の著書「FPGAプログラミング大全 Xilinx編」の内容および関連ファイルを使用しています。
この本はVivadoでFPGA学習をする上でいろいろ勉強になることが掲載されています。
本の執筆および関連ファイルの提供に謝意を表したいと思います。


### 前準備1.

- [FPGAプログラミング大全 Xilinx編](https://www.shuwasystem.co.jp/support/7980html/4753.html)

ここにある`XilinxFPGA.zip `を取得しておく。

中にある`Arty\dai6sho\chardisp`をコピーしておく。
この記事では`c:\ip_200902\chardisp`にコピーをした状態で作業をした。
`c:\ip_200902\chardisp\chardisp_ip`以下にPackge IPで追加するVRAMやCGROMの関連ファイルが生成されることになる。
また、`c:\ip_200902\chardisp\chardisp_ip`はプロジェクトSettings > IP > Repositoryに追加されるようになる(後述)。

### 前準備2. CGROM, VRAMフォルダの削除 (***失敗の回避***)

先ほどコピーをした`c:\ip_200902\chardisp\chardisp_ip`にあるフォルダについて、以下のように二つのフォルダを削除する。

- CGROM/ => 消す
- HDL/
- ROMDATA/
- VRAM/ => 消す

CGROM, VRAM, 二つのフォルダがある場合、Run synthesis時に以下のようなエラーで困ることになる。

- module VRAM not found
    - IPパッケージにVRAMの情報が追加されなくなり起きる
    - (実際にはVRAM.xciをPackage IPに追加してない理由だったかもしれない)
- xxxx.digilent.xxxx does not match xxx.pynq.xxx
    - 読み込んだCGROM, VRAMがArty向けに生成されているため、Vivadoで作るPYNQ向けと整合しないというエラー

## bitstream生成まで (MicroBlaze以外の部分を主に)

### プロジェクト新規追加

1. プロジェクトを新規作成する (例: `C:\ip_200902\appChrdsp`)
    - RTL Project
    - [x] Do not specify sources at this time
2. Boards > PYNQ-Z1選択 (あらかじめボードファイルはVivadoで見えるようにしている)
3. Finish

### IPを用意

次にIPを用意する

1. Tools > Create and Package New IP
2. Package a specified directory選択
    - [ ] Package as a libray coreは未選択
    - `C:/ip_200902/chardisp/chardisp_ip`を選択する (前準備で用意したフォルダ)
        - このフォルダにこれから作るCGROM, VRAMのファイルが生成される
        - また、`C:\ip_200902\appChrdsp`プロジェクトのIP Repositoryとしても登録される
            - Tools -> Settings > IP > Repositoryに見える
3. Edit in Package Project Name
    - Project name: edit_ip_project (デフォルトのままとした)
    - Project location: デフォルトのままとした

上記でNew IP Creationを完了する。

### VRAM IPの生成

この時点でPackageIPペインが表示されていて、以下のようになっている。

![コメント 2020-09-02 212803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/2fa3c98c-c6cf-2e24-2c8d-c0a9761ddcb3.png)

SourcesペインにあるVRAMとCGROMは?マークがついている。
VRAM, CGROM IPの生成が必要となる。


VRAM IPを生成する。

**(Note: 本の6-2-3 プロジェクトの作成とVRAMの生成、を参照する方が以下の記載よりわかりやすいです）**。

1. Window > IP Catalogを表示
2. Memories & Storage > RAMS & ROMs & BRAM > Block Memory Generator をダブルクリック
3. Component Nameを「VRAM」に変更する
4. Basicタブ
    - Memory Type: True Dual Port RAM
    - [x] Byte Write Enable
        - Byte Size (bits): 8
5. Port A Optionsタブ
    - Write Width: 24
    - Read Width: 24
    - Write Depth: 4096
    - Enable Port Type: Always Enabled
    - [ ] Primitives Output Registerをチェックはずす
6. Port B Optionsタブ
    - Enable Port Type: Always Enabled
    - [ ] Primitives Output Registerをチェックはずす
7. OKを選択

Generate Output Products画面で「Out of context per IP」を選択してGenerateする。

この時点でSourcesペインのBRAMが？マークからICのマーク？に代わっている。
![コメント 2020-09-02 212803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/53e7d0bb-7eaa-3da9-8bde-dfc971915ffe.png)

### CGROM IPの生成

VRAMと同様にCGROM IPを生成する。

1. Window > IP Catalogを表示
2. Memories & Storage > RAMS & ROMs & BRAM > Block Memory Generator をダブルクリック
3. Component Nameを「CGROM」に変更する
4. Basicタブ
    - Memory Type: Single Port ROM
5. Port A Optionsタブ
    - Port A Width: 8
    - Port A Depth: 1024
    - Enable Port Type: Always Enabled
    - [ ] Primitives Output Registerをチェックはずす
6. Other Optionsタブ
    - [x] Load init Fileをチェック
        - Coe File: `C:/ip_200902/chardisp/chardisp_ip/ROMDATA/CGDATA.coe`
        - 本のサイトから提供されるCGDATA
7. OKを選択

Generate Output Products画面で「Out of context per IP」を選択してGenerateする。

この時点でSourcesペインのCGROMが？マークからICのマーク？に代わっている。

![コメント 2020-09-02 212803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/d7a07d7e-eef3-e6f2-d0fa-cb2262e09f4f.png)

### File GroupsにVRAM, CGROM IPのxciファイルを追加

二つのIPの生成内容をPackage IPに追加する。
これをしないと「`module VRAM not found`」というエラーがRun Synthesisで発生するように思う。

Package IP - chardisp_ip_v1_0ペインにあるFile Groupsに「Merge changes from File Groups Wizard」という確認があるので実行しておく。

この時点でPackage IPのFile Groupsは以下のようになっている。

![コメント 2020-09-02 212803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/6235b6bd-ad73-2daa-c8fd-16f94afd9104.png)

Synthesis、Simulationsともに以下のファイルが足りない。

- src/VRAM/VRAM.xci
- src/CGROM/CGROM.xci

以下の手順で足す。
(足し方については、本のp289にAdd Existing IPを使うように記載があったが、こちらの環境では表示されなかった）。

1. File Groupsのファイルリスト上で右クリック
2. Add Files...
3. Add Filesボタン
4. Files or type: All Files
5. `c:\ip_200902\chardisp\chardisp_ip\src\VRAM\VRAM.xci`を選択
6. 同様に`c:\ip_200902\chardisp\chardisp_ip\src\CGROM\CGROM.xci`を選択
7. OKを押して完了する。


![コメント 2020-09-02 212803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/dbcf725f-7eb0-4315-7565-c00a9bfb1fab.png)

上記を行い、File Groupsに以下のように3つのファイルがSynthesisとSimulationともにあるようにしておく。

![コメント 2020-09-02 212803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/a5fa1c93-e82e-a3f7-3e4d-a225f5e68819.png)

### パッケージ作成

Package IPにおいてReview and Packageの「Package IP」を実行してパッケージを作成する。

### MicroBlazeとchardisp_v1_0の追加

MicrboBlazeの追加とchardusp_v1_0の追加をしたBlock Designを生成する。
このあたりは本に記載のことをそのまま実行したので、詳細は省く。

chardisp_v1_0_0は、以下のようにIP Repositoryに含まれているためBlock Designに追加ができる状態になっている。

![コメント 2020-09-02 221437.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/b0b95612-6ecd-eaf5-135c-ee6c51146b8c.png)


作成したBlock Designは以下のようになっている。

![コメント 2020-09-02 212803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/6da31110-d895-0e31-d163-2a203818bc4c.png)

### 制約ファイルの指定とbitstream生成、XSDKでの実行

制約ファイルを指定する。
https://www.shuwasystem.co.jp/support/7980html/4753.html
にある「PYNQ-Z1.zip」に含まれる`PYNQ_constraints_PmodVGA.xdc`を使用した。
このうち、CLK, RST, VGA_R[], VGA_G[], VGA_B[], VGA_HS, VGA_VSをアンコメントして使用できるようにしている。

また、VRAM IP, CGROM IP生成時に作成された以下の二つの制約ファイルも追加しておいた。

- `C:\ip_200902\chardisp\chardisp_ip\src\CGROM\CGROM_ooc.xdc`
- `C:\ip_200902\chardisp\chardisp_ip\src\VRAM\VRAM_ooc.xdc`

以上の作業でbitstreamを生成した。

提供されるXSDKのサンプル`XilinxFPGA\Arty\dai6sho\chardisp\SDK\char_test.c`を実行すると以下のようにVGA出力されることを確認できた。


![618722c97825f960.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/fa882319-fa4b-b3ed-78fc-5aae93c56584.jpeg)

### はまった

画面表示が成功するまでに13回の試行をした。
とくにVRAMとCGROMがPackage IPに追加されない状況が続き、その対処方法が本を見てもよくわからなかった。
試行錯誤した結果、この記事に書いている方法で対処できることが分かった。

Vivadoのバージョンの違いなのか(あるいはEditionの違い?)、本のp289に記載のある「Add Existing IP」の選択が「Add Source」画面に表示されないということもわからなかった。
代わりにFile Groupsで右クリックしてAdd Filesをすることを見つけた。