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


動作環境
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以外の部分を主に)

プロジェクト新規追加

  1. プロジェクトを新規作成する (例: C:\ip_200902\appChrdsp)
    • RTL Project
    • 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ペインが表示されていて、以下のようになっている。

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
    • 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のマーク?に代わっている。

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タブ
    • 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のマーク?に代わっている。

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を使うように記載があったが、こちらの環境では表示されなかった)。

  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を押して完了する。

上記を行い、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をすることを見つけた。