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.
ここにある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以外の部分を主に)
プロジェクト新規追加
- プロジェクトを新規作成する (例:
C:\ip_200902\appChrdsp
)- RTL Project
- Do not specify sources at this time
- Boards > PYNQ-Z1選択 (あらかじめボードファイルはVivadoで見えるようにしている)
- Finish
IPを用意
次にIPを用意する
- Tools > Create and Package New IP
- 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に見える
- Edit in Package Project Name
- Project name: edit_ip_project (デフォルトのままとした)
- Project location: デフォルトのままとした
上記でNew IP Creationを完了する。
VRAM IPの生成
この時点でPackageIPペインが表示されていて、以下のようになっている。
SourcesペインにあるVRAMとCGROMは?マークがついている。
VRAM, CGROM IPの生成が必要となる。
VRAM IPを生成する。
(Note: 本の6-2-3 プロジェクトの作成とVRAMの生成、を参照する方が以下の記載よりわかりやすいです)。
- Window > IP Catalogを表示
- Memories & Storage > RAMS & ROMs & BRAM > Block Memory Generator をダブルクリック
- Component Nameを「VRAM」に変更する
- Basicタブ
- Memory Type: True Dual Port RAM
-
Byte Write Enable
- Byte Size (bits): 8
- Port A Optionsタブ
- Write Width: 24
- Read Width: 24
- Write Depth: 4096
- Enable Port Type: Always Enabled
- Primitives Output Registerをチェックはずす
- Port B Optionsタブ
- Enable Port Type: Always Enabled
- Primitives Output Registerをチェックはずす
- OKを選択
Generate Output Products画面で「Out of context per IP」を選択してGenerateする。
この時点でSourcesペインのBRAMが?マークからICのマーク?に代わっている。
CGROM IPの生成
VRAMと同様にCGROM IPを生成する。
- Window > IP Catalogを表示
- Memories & Storage > RAMS & ROMs & BRAM > Block Memory Generator をダブルクリック
- Component Nameを「CGROM」に変更する
- Basicタブ
- Memory Type: Single Port ROM
- Port A Optionsタブ
- Port A Width: 8
- Port A Depth: 1024
- Enable Port Type: Always Enabled
- Primitives Output Registerをチェックはずす
- Other Optionsタブ
-
Load init Fileをチェック
- Coe File:
C:/ip_200902/chardisp/chardisp_ip/ROMDATA/CGDATA.coe
- 本のサイトから提供されるCGDATA
- Coe File:
-
Load init Fileをチェック
- OKを選択
Generate Output Products画面で「Out of context per IP」を選択してGenerateする。
この時点でSourcesペインのCGROMが?マークからICのマーク?に代わっている。
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は以下のようになっている。
Synthesis、Simulationsともに以下のファイルが足りない。
- src/VRAM/VRAM.xci
- src/CGROM/CGROM.xci
以下の手順で足す。
(足し方については、本のp289にAdd Existing IPを使うように記載があったが、こちらの環境では表示されなかった)。
- File Groupsのファイルリスト上で右クリック
- Add Files...
- Add Filesボタン
- Files or type: All Files
-
c:\ip_200902\chardisp\chardisp_ip\src\VRAM\VRAM.xci
を選択 - 同様に
c:\ip_200902\chardisp\chardisp_ip\src\CGROM\CGROM.xci
を選択 - OKを押して完了する。
上記を行い、File Groupsに以下のように3つのファイルがSynthesisとSimulationともにあるようにしておく。
パッケージ作成
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に追加ができる状態になっている。
作成したBlock Designは以下のようになっている。
制約ファイルの指定と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出力されることを確認できた。
はまった
画面表示が成功するまでに13回の試行をした。
とくにVRAMとCGROMがPackage IPに追加されない状況が続き、その対処方法が本を見てもよくわからなかった。
試行錯誤した結果、この記事に書いている方法で対処できることが分かった。
Vivadoのバージョンの違いなのか(あるいはEditionの違い?)、本のp289に記載のある「Add Existing IP」の選択が「Add Source」画面に表示されないということもわからなかった。
代わりにFile Groupsで右クリックしてAdd Filesをすることを見つけた。