かずの不定期便ブログ

備忘録代わりに書きます

Xilinx FPGA開発環境の学習

目次

Xilinxの開発環境を学習する

Xilinxの開発環境に初めて触れるなら整理された情報を得られる書籍を買った方が良いと思います。webに情報が豊富にあるので学習は容易だと思うのですが、GUIの手順の記載だけでその行為の意味が分からなかったり、逆に内容が高度すぎてさっぱり理解が追い付かないという結果になり時間が溶けていくという結果になります。
僕は「FPGAプログラミング大全 Xilinx編」という書籍を購入しました。おすすめです。こちらのリンクは第2版ですが、僕が学習したものは第1版でした。
www.shuwasystem.co.jp


本書を購入前にやったじたばたを若干残しておきます。本書を購入しても必要であろうという情報は色を変えて残します。

vivado環境を整える

FPGAの開発環境を整えるため、xilinxのページからvivadoをダウンロードします。
https://japan.xilinx.com/
上記ページの上のメニューより、開発者→ザイリンクスの最新ツールとクリックします。

2016.4をダウンロードしました。

ボードファイルのインストール

VivadoにPYNQのボード情報が入ってないので、以下からダウンロードします。
GitHub - cathalmccabe/pynq-z1_board_files: PYNQ-Z1 board files for Vivado
C:\Xilinx\Vivado\2016.4\data\boards\board_files\
にpynq-z1フォルダが見えるようにコピーします。

チュートリアル

https://japan.xilinx.com/support/documentation-navigation/self-paced-tutorials/see-all-tutorials.html
上記から「UG1165 - Zynq-7000 SoC: エンベデッド デザイン チュートリアル (日本語版) (v2019.2)」をダウンロードし、学習する。
本ドキュメントで扱われているボードはZC702なのでボード依存部分は読み替えていく。SoCは同じ" XC7Z020"でパッケージ違いの様である。詳細は下記のpdf資料を見るとよい
https://japan.xilinx.com/support/documentation/data_sheets/j_ds190-Zynq-7000-Overview.pdf
PYNQボードの回路図は以下からダウンロードできます。端子名の参照に役に立ちます。
https://reference.digilentinc.com/_media/reference/programmable-logic/pynq-z1/pynq-z1_sch.pdf
ここまで色々web情報を参照しながら学習しましたが限界を感じ、書籍の購入に至りました。。。



冒頭にも書きましたが、情報のまとまった本は一冊あると便利です。忘れたときも本を見る事で思い出せます。

書籍に従い学習

本書籍はPYNQ-Z1ボードには表立って対応しておりません。書籍のサポートページにいくとPYNQで学習するのに役立つファイルがダウンロードが出来ます。但し、書籍の内容の範囲外であると記載されてますので、質問はしてはいけません。十分な記載はありますので迷う事はないかと思います。

PYNQの搭載SoCはZynq-7020ですので、ほぼZynq-7010を搭載するZyboと同じやり方が適用できます。但しZyboの様にVGAポートは実装されてないのでArtyボードと同様に自作する(方法は書籍に記載)か、PmodVGAを購入するか、がんばってHDMI出力を利用するかができます。僕は、HDMI出力を利用しました。HDMI出力についても十分なヒントがダウンロードできるドキュメントに記載してあったりします。

HDMI出力の利用

HDMI出力するための改造方法を書きますが、書籍に記載のものを変更して公開しているようにしか見えない部分があります。ソースとか書いてないし、書籍を購入しないと実行できないからよいと思ってはいるのですが、書くこと自体が問題かもしれません。

書籍では2章の後半にVGA出力を使った課題が出てきます。いきなりHDMI出力を使って本パートを実践するにはハードルが高いので、机上学習で我慢します。5章のMicroBlazeを使った課題まで(少なくともMicroBlazeを配置するCreate Block Designあたりまで)学習します。ここまでいくとHDMIで画像を出力するためのIP RGB2DVI が配置出来るだけの知識が付いていると思います。

本IPはDigilemtのgithubに置いてあるのでコピーしてくれば入手できます。
GitHub - Digilent/vivado-library
上記ページからClone or download → Download ZIP
して「vivado-library-master.zip」を得ます。
zipを解凍して「vivado-library-master」フォルダごと、どこかのフォルダへ入れます。(学習用フォルダが良いと思います)

書籍記載の「pattern」は、VGAサイズです。上記フォルダのip\rgb2dvi\docs\rgb2dvi.pdfを見ると800x600~1920x1080までのサイズと記載があるので、残念ながらVGAサイズは対応できないのでXGAサイズに改造します。RTLの改造ポイントは

  1. vga_param.hに定義されているサイズをXGA用に差し替えます。9章にXGAのパラメータが書いてあります。
  2. HCNTなどのH系パラメータは10bit定義ですがHPERIODは1344と10bitを超えているので1bit拡張します。
  3. R,G,Bは各4bitですが、RGB2DVIの仕様に合わせ8bit化します。
  4. MMCMに与えるパラメータは書籍のコラムに掲載されているのでXGA用を使います。

書籍の記載通りにvivadoのプロジェクトを作成し、改造したRTLを読み込みます。

次にRGB2HDMI IPを呼び出したいので、「Create Block Design」をクリックします。(MicroBlazeやZYNQシステムを使う場合だけに行う作業だと勘違いしやすいですが、グラフィカルに配置したい場合に使います)

先ほどgithubから持ってきたIPはデフォルトでは入ってないので読み込めるようにIP Catalogに追加します。
Project ManagerのProject Settingsをクリック → IP → Repository Manager → +ボタンでgithubからダウンロードしたものが展開されているフォルダを指定します。

add repository
Diagramのところで+ボタンを押してRGB2DVIをダブルクリックして配置します。

add Sourcesで読み込んだRTLをこのDiagramに配置するため、右クリック→Add Module → TOP階層のpattern(pattern.v)をクリック。

外部端子情報であるxdcファイルをAdd Sources → Add or create constraintsで読み込みますが、書籍にあるようなRGB各色4bit用のポート、および同期信号2本は利用しないのでコメントアウトし、代わりにHDMI用の端子を追加する必要があります。これはサポートページからダウンロードできるファイルのPYNQ-Z1フォルダにあるxdcファイルのHDMI Tx部分をコピーします。他の端子Clk, ResetについてもPYNQ用を使います。

CLK, RST, TMDS信号については、端子をクリックしてMake Externalで外部端子として作成します。TMDS信号はxdcファイルに記述している端子名と本操作で生成される端子名が異なってしまったので、Diagram上で端子名を変更するか、xdcファイル側を合わせてもいいと思います。

pattern → rgb2dvi ipへの結線ですが、PixelClk及びvid_p.VDE端子に入力する信号がないので作成します。これらはpattern.vにPCK出力と、有効期間を示すVGA_DE信号出力を追加します。前者は元々存在しているのでoutputとして出すだけ(大元はMCMMで生成したXGA用65MHzクロックになる)。またVDE端子は先ほどのIPのドキュメントの端子一覧の説明にvideo data validとあるのでRGB信号の有効期間を示す信号であることが分かるので、disp_enableをFFで1clk遅延させてRGB出力とタイミングを合わせて作成し出力端子としました。

RGB2DVIをダブルクリックするとIPの設定画面が開くのでTMDS clock rangeは「<120MHz」をチェック。generate SerialclkはPLLのままとしました。

RGB2DVIのデータ入力は24bitでまとめられています。一方patternはRGB独立しているので、RGBをまとめて24bit化します。RTLなら単にassignでまとめれば良いですが、GUIですのでassignを直接かけないので(やってないですけど纏めるmoduleを起こしても良いと思います)、まとめるためのブロックを配置します。concatというIPが準備されてます(書籍後半で出てきます)。+ボタンでconcatと打ち込んでConcatをダブルクリックして配置します。デフォルトでは1bit 2端子を2bitにまとめるので、concat IPをダブルクリックして8bit 3端子を24bit化するように修正します。

concat IPの設定を8bitx3→24bitへ修正

RGBの結線順序は、IPドキュメントのpData(23:0)に説明があってRBG順でパックされます(RGB順じゃないです)。

これで右クリック→Valid designします。すると以下の様なメッセージが出ます。

ERROR: [BD 41-238] Port/Pin property POLARITY does not match between /rgb2dvi_0/aRst(ACTIVE_HIGH) and /RST(ACTIVE_LOW)

Diagramをよく見るとpatternのRST端子に〇がくっついてます。RTLは正論理なのに。。。修正します。

外部端子のRSTをクリック。左ペインのExternal Port PropertiesのGeneral→PolarityがActive LowとなってるのでActive High(図示)へ変更

Valid designでエラーが消えます。

次にSourcesペインのHierarchyでdesign_1で右クリック→Create HDL Wrapper...でラッパー階層を作成します。ここの作業の理由は理解してないですが、とにかくBlock Diagramを使ったら本作業が必要であると理解します。何度もやってれば特に疑問も感じずに出来るようになるかと。。。Let Vivado manage...を選択します。

本状態だと、合成対象がpatternになってます。Sourcesペインの太文字になってるところです。これをラッパー階層をターゲットとするため、design_1_wrapperを右クリック→Set As TOPを選択します。これでDesign Sourcesの一階層目はdesign_1_wrapperのみになったことが分かります。

下側のmessagesペインにエラーがあるのはTOP階層を変更前にbit streamを作成した際に出たエラーですので無視してください。

次に「Generate Bitstream(コンパイル)」実行、
PYNQのジャンパーピンはJTAG側にして、HDMI OUTとモニターを接続し、PYNQボードの電源をON。
書籍通りにFPGAコンフィグレーション。Program and Debug → Open Harware Manager → Open Target→Auto Connect
Program device → xc7z020-1 → Bitsream fileはそのままで「Program」を押下です。

いきなり画像が出ます。感動です。写真↓

書き忘れましたがタイルのサイズ(HSIZE/VSIZE)をXGA画面に合わせるため、128x192と変更しています。なので写真はVGAサイズで表示した時と同じに見えてます。


学習終了

こんな感じで画像表示はHDMIへ修正し、VRAMを使う課題は16bit/pixのままならRGBを生成するところで下位4bitを拡張すれば出来ました。また、1pixelを16bit→32bitへ拡張した場合には、AXIのバス幅を32bit→64bitへ修正して帯域を倍にすることでpixel当たりの量が倍になることに対応させました。修正は容易ですが多岐にわたります。

難しいと感じた事はZYNQを使ってのファーム作成です。関数名や使い方はヘッダーファイルを読んだりサンプルを見ることで理解できると書籍には書いてありますが、難しいです。

出来るようになった事のまとめ

  1. JTAG書き込みでZYNQのPL部のみの回路を実行。(デバッガ必須)
  2. JTAG書き込みでZYNQのPS部のARMからPLを実行。(デバッガ必須)
  3. SDカードにPL部のコンフィグレーション及びARMプログラムを書き込んでボードを動かします(ARMがPL部の回路を動かしてます)(デバッガ不要)

今後行いたい事

  1. 何か回路を作成する事です(購入時も迷ったですが、買って何するの?というところです。ネタが無いのですよね。。。)
  2. Linux上で動作するARMがPLを制御(LinuxのFileSystemにアクセスしたいです)

この為には、Linuxで確保したメモリ領域(可能ならキャッシュOFF領域としたい)に対し、PLがアクセスする事が出来ればなんとかなりそうです。
Linuxに関しては本書では触れられてないので、Web検索、Xilinxが作成しているドキュメントを読んだりして進めるしかないかと思っています。

以上です。