2024.10.06 21:17
FPGAのIP作成
・さて、VivadoでのIPの作り方を少し。とりあえずAXI4バスはつながっていないとCPUからいじりにくいのでVivadoに雛形を作らせる。
・VivadoのTool=>Create and package new IPしてやって、Create AXI4 Peripheralしてやると、雛形のVerilog(Verilogなプロジェクト扱いにしているので)ファイルができる。
・このファイルではレジスタを4個持っていて、AXI4バス経由でレジスタに書き込んだ値がそのまま読めるというプロジェクトができる。
・このレジスタの先にゴニョゴニョとつけてやれば良い。とりあえずZyboのLEDにつないでみる。
・これで「Package Steps」の項目を順番にクリックして勧めていって終わればユーザ定義のIPとして登録されて元のプロジェクトに戻る。
・あとはBlock DesignでCPUと自分で作ったIPをIP Catalogから引っ張り出してきてMake Externalして外部に引っ張り出して、信号名を.xdcと合わせておく。
・これで残りは「勝手につないで」しておけば、リセットだのAXI4のバススイッチだのが勝手に生成されて完了。
・あとはビルドしてExport HadwareすればVivadoでの作業は終わり。あとはVivadoだな。
2024.10.01 08:10
ILAを試してみる
・FPGAでILAを使ってみる。以前Block DesignでやっていたときはILAモジュールを貼り付けた後にあちこちのファイルに検索をかけて中身をごちゃごちゃといじってやらないといけないという超のつくような面倒臭さだったのだけど、今度は簡単というか、当たり前になった。
・Flow navigatorのOpen Synthessis DesignのSetup Debugを選択。あとは眺めたい信号をピックアップしていけば良い。ただ、問題はソースコードの信号がどれなのかわかりにくくなるということ。たとえばcounterというのがあると、これはF/Fというのかラッチというのか……が生成されるわけだけど、こいつの入力、出力、リセットに全部counterのプリフィックスがついてくる。ここに「reset」とかわかりやすい名前が付けば良いのだけど、そうはいかない。
counter_reg_n_0_0_0[0]とかcounter_reg[8]_i_1_n_5とか、判じ物状態。
・入出力に関しては入出力バッファがあるおかげでわかりやすいのだけど中身はそんな感じ。まぁ、仕方ない。
・とりあえず信号をピックアップして、GenerateBitStream。ロジックアナライザの機能もまた論理回路としてターゲットに付加されることになるので、当然のように再ビルドが必要になる。
・xdcファイルの書き換えも必要になるらしくて、「新しく作るか、既存のものに上書きするか」と聞いてくるのでとりあえず「上書きして良いよ」としてみる。
・さて、その後ロジックアナライザ画面はどうやってだすのだろうと思っていたら、普通の場合と同じようにダウンロードしてやれば勝手にロジックアナライザ画面が起動する。なかなかサービスがいい。
・で、右下のペインでトリガ条件とかを設定してGoしてやれば普通にロジアナ
。簡単だな。
・ところでロジックアナライザ機能を外して元に戻すには、再びSetup Debugすれば良い……はずなのだけど、自動で書き換えられたxdcファイル(実際には後ろにロジアナ用の記述が足されるだけだけど)が元に戻っていない感じ。
・まぁ、このあたりは普通にエディタを使うなり、Vivado内蔵のエディタなりで開いて削ってしまえば良いだけの話だけど。
・そんなところでUG-908の説明
を見ると、verilogの場合には
(* mark_debug = "true" *)reg [`CMIN+3:0] counter;
のような感じで、(* mark_debug = "true" *)をつけてやるという手もあるらしいので、これをやってみると、信号名選択のところで、自動的にピックアップされた。
・ただ、この例みたいに配列の全信号がターゲットになると大きすぎるときもある。
(* mark_debug = "true" *)reg [`CMIN+3:`CMIN] counter;
reg [`CMIN-1:0] counter;
なんていう具合に分割すれば良いのかな?と思ってやってみたら良い感じ。
たぶんこれをつけておけば論理合成のときに最適化で無くなったりしないんだな。実用的にはこんなふうにソースコードをいじるほうが正解かな。
2024.09.27 20:58
シミュレーションをやってみる
・そんなところでシミュレーション
・まずはbehavior simulation。とりあえず動いているLED点滅をベースにして、ここにテストベンチを追加。
・Add SourcesでAdd or create simulation sourcesでテストベンチを追加。Window=>Sourcesでソース一覧のところでSimulationの下にあるテストベンチをトップモジュールに設定。
・記述はちょっと記憶のサルベージに手間取ったけど、なんとかリハビリ。
・与える信号はreg、受け取る(出力されてくる)信号はwire
・モジュール名 インスタンス名(.モジュール信号(テストベンチ信号名),…);でインスタンス化
・initial begin 〜 endで上から順に
・#1000;などで時間稼ぎ
・$finish;でシミュレーション終了
・always begin 〜 endで繰り返し(クロック生成など)
まぁ、なんていうあたりでとりあえずの用は済む。
・iverilog+vvp+twinwave/gtkwaveあたりをするなら
・$dumpfile("ファイル名");でダンプファイル指定
・$dumpvars(2,テストベンチ名);でテストベンチの信号を取り込み
を追加しておけば良い。
・これでシミュレーション。普通にビルドした後なら、論理合成前後、インプリメンテーション前後の波形も何事もなく眺められる。もちろん、インプリメンテーション後だと内部のディレイなんかも。
・というあたりで、難しくはない……というかこのくらいまでなら結構簡単。
2024.09.24 07:43
rgb2dvi(HDMI出力)IP
・そういえば、HDMIの入出力があるなぁとDilignetさんのページを見るとサンプルがある。HDMI入力を受けてHDMI出力しようという感じか。
・そういえば、DilignetさんのRGBからHDMIへの変換をするIPって製作事例で使っている例を見たな。
・ちょっと検索をかけてrgb-to-DVI(HDMIの名称を使うにはお墨付きが必要になるという大人の事情でDVIなのだろう)のIPコアのドキュメントがあったので、開いてみたらDDCは使わないんだな。
・ということは、通常のRGBなディスプレイと一緒でこっちの都合の勝手なタイミング(もちろん、ディスプレイ側が対応している範囲で)で送ってしまっても良いとことなのかな。
2024.09.23 07:52
VivadoでVerilog
・今までは回路図+CPUという感じだったけど、今回はなるべく言語……VerilogとHDLで片付けようと思って、VivadoでVerilogしてみることに。
・ちょうどいい感じでZyboでLEDBLINKをVHDLでやっている例があったのでちょっとやってみる。一応論理合成してGenerate Bitstreamまでちゃんとできた。
・ならばということで、VHDLをVerilogにして同じものを作成。Verilogもだいぶ忘れていたけど、IcarosVerilog(iverilog)とvvp、TwinWaveで遊んでいたときのものが出てきたのでそちらを眺めて記憶の底からサルベージ。
・とりあえずさらっと書いて同じように通ったけど、Open Implimentation Designを開いたらこんなメッセージ。
----------
WARNING! Critical violations of the methodology design rules detected. Critical violations may contribute to timing failures or cause functional issues in hardware. Run report_methodology for more information.
----------
・単純にclkでカウントして出力しているだけだなんだけどなと思ってふと。このデザインって、32ビットのカウンタを作って24ビット芽からLEDへ出力……ってことは上の桁は未使用?
・ということで、こいつが怪しんじゃないかとカウンタのサイズを必要な分だけに。これでもう一度やってみたら……消えた。なるほどそういうことか。わかりにくいメッセージだな。
・というところでなんとなく解ったので書き味をしてみる。Zyboのジャンパピン設定は
JP5:JTAG
JP6:USB
として、表側の左上にあるUSBのMicro-BコネクタとPCをつないで、左上のSW4をON!
・これでPCにはCOMポートとして認識されるので、あとはVivadoの左端のFlow Navigatorの一番下の方にある「Open Hardware Manager」。なんかデバッグコアがねぇぞとかほざいてるけど、知ったことではないので、そのまま強行してProgram。
・LEDが点滅したので動いたらしい。試しにカウンタを書き換え、更に信号をwireにしてassignする形にしてみる。そういえば、Verilogなんだからiverilogで構文チェックもできるよなと思って試したらOK。いいんじゃないかな。
・ところで、これではピン番号を直接指定したのだけど、Zyboの制約ファイルがあるはずだから、それに従っておいても良いはずだな。ということで、今度はZyboZ7の制約ファイルをダウンロード。まぁ、適当な場所で良いんだろうということで、プロジェクトの上に置いて、指定してやる。
・中身を見るとコメントだらけになっていて、どうやら「使うものだけコメントアウトしてね」というスタンスらしい。Vivadoの上で制約ファイルを開いてLEDとsysclkを選択して画面上の"//"ボタンをクリックしてコメントアウト。
・これでもう一回合成すれば……とその前にモジュールの入出力信号をこの制約ファイルの名前にあわせておかないとな。
・で、変更して再び合成。ちょっとつまらないミスもあったけど、修正してうまくいった。めでたし、めでたし。
・あとはC/C++との合体とか、IP化して内部のCPUから利用できるようにするとか、もうちょと開拓していかないといけないな。
2024.09.22 17:24
VitisHLSチュートリアル
・とりあえずVitisHLSのチュートリアル
・ちょっと本文と画面の不一致はあったけど、とりあえず最後まで到達
・まぁ大まかな流れはわかったけど表示されるレポートなどの細かいところやら最適化などに関する説明は「わかってる人なららわかる」というシロモノだなぁ。
・さて、Web上に誰か実際にやった人はいないのかな?と検索してみたけど、出てくるのは結構古いものばかり。まぁ仕方ないか。
・とりあえず、全体のフローとか相関が見えないことにはな。ぼちぼちやっていこう。
2024.09.19 16:31
VitisHLSのチュートリアル開始
・とりあえずVitis HLSを動かしてみる。新規にEmptyなものを作っておいて、
デバイスは、Diligentさんのサイトで見るとXC7Z020-1CLG400Cと書いてあるけど、そのものズバリ……は無い模様。xc7z020clg400-1で良いのかな?まぁ、とりあえずやれるところまでやってみよう。
・チュートリアルに従ってdctのソースコードを、テストベンチを追加して、Simulate,Synthesis。エラーもなく通ったけど、結果表示で「フリーのライセンスが必要だよ」というメッセージ。検索したら昔は不要だったんだけど必要になったらしい。
・表示されたリンクをたどって、Macアドレスでライセンス取得。メールで届くんだな。
・xilinx.licファイルだけど、このままの名前だと既存のものとぶつかるんじゃないだろうかな。
・とりあえず、%APPDATA%(C:\Users\PastelMagic\AppData\Roaming)\XilinxLicenseの下にコピーされるらしいけど、ここにすでにxilinx.licファイルはある。まぁとりあえずバックアップをとっておいて……あとはスタートメニューからManage Licensesを起動してやる。これでLoad licenseしてCopy Licenseボタンをクリックしてやっていったら、「上書きしちまうぞ」という警告。やはり名前を変更しないといけないか。Xilinx_VitisHLS.licにしてみよう。
・うん、なんとなくうまくいったらしい。というか、単にコピーしただけに見えるけどな。
・これでもう一度Vitasを起動して先ほどのプロジェクトのフォルダを開く。なるほど、今度はFunction Call Graphで関数の呼び合い関係の表示だの、Scedule Viewerだのがちゃんと見えるようになった。
2024.09.18 13:18
VitisHLS始めるかな
・出かけたついでにATMに立ち寄って現金を少し引き出したら渋沢一万円札とご対面。
・そんなこんなで次の仕事には高位合成が適切っぽい感じなので、ぼちぼちVitisHLSも使っていくことにするか。
・とりあえずXilinxなツールをまだインストールしてから使っていなかったけど、Zyboを使うので、ボードファイルの追加が必要。
・あれこれ検索したけど、結局Dilignetさんのwebサイトの説明が正解。
C:\Xilinx\Vivado\2024.1\data\boards\
の下にboard_filesディレクトリを作って、ここにコピーしてやってVivadoを起動して新規作成していったらちゃんとボードが選択できるようになった。
・さて、HLSはどうだろう。とりあえずVitis チュートリアル: 入門 (XD098)あたりをやってみるか。
・なんとなくVitisを起動してみたらVitis-HLSと大差ない画面。結局Vitis Unified IDEが起動するようだ。
・とりあえず、Vitis-HLSではなくVitisのショートカットで起動してTutorialをぼちぼちやっていこう。
1