<   2017年 10月 ( 21 )   > この月の画像一覧

Arty Z7 で FPGA プログラミング大全 の9章のグラフィック表示回路を設計します。
サポートページ の PYNQ 用設計データを参考にして HDMI 出力のできる回路にします。
f0054075_01205104.jpg
要点
サポートページのデータはEdgeではダウンロードできない。
display と ZYNQ の間を自動接続すると AXI SmartConnect になるので、AXI Interconnect に変更する(Vivado 2017.2)。
disp_fifo は 24bit 幅の 1024 段に設定する。
RGB to DVI Video Encoder IP には RBG の順でデータを入れる(RGB to DVI 1.4)。
RGB to DVI Video Encoder IP の出力とポートの接続時に、データのビット0とビット1を交差させる(RGB to DVI 1.4)。
RGB to DVI Video Encoder IP の設定は MMCM のほうが良いみたい。
display IP と RGB to DVI の間で HSYNC と VSYNC の極性があっていない。

準備
FPGA プログラミング大全を買う。
サポートページ から PYNQ 用設計データをダウンロードする。
Digilent の IP を ここ からダウンロードしてきて、Installation に書いてある通りにインストールする。

実装
いろいろとすっ飛ばして 9-2-2 から始めます。コードの入力も自分ではやりません。本に書いてある通り進みます。
で、最初に本の内容から変わるのはグラフィックス IP に FIFO を追加するところ。
PYNQ 用の説明にある通り、FIFO は 24bit 入力、24bit 出力です。
PYNQ のデータの中に準備してくれているようにも見えるけど、これ(disp_fifo)は消しちゃって自分で生成します。
IP Catalog から FIFO Generator を選びます。図9-11 を参考に作りますが、少し違って 24bit 幅、深さ1024 の FIFO を作ります。
Add Sources で disp_ip の 下にできた src/disp_fifo/disp_fifo.xci をファイルのコピーなしで追加します。
これって自動で追加してくれないんですかね?
f0054075_20260115.png
また本の記述に戻ります。グラフィックス IP を組み込んで自動配線をするのですが、ディスプレイ IP と ZYNQ が AXI SmartConnect で繋がれます。互換性あるって書いてあるのですが、なんか怪しいので AXI Interconnect に取り替えます。AXI Interconnect の Master Interface 数は 1 に変更します。
GPIO をつないだ後は、当然ですが VGA 出力を出力ポートに接続しません。
PYNQ の資料を参考に RGB to DVI などを接続するのですが、以下の違いがあります。
RGB to DVI への入力は RBG の順です。
なぜかここをRGBの順からRBGの順に変えるだけで動かなくなります。まったく意味不明ですが、別のところで対策することにしました。
RGB to DVI の設定は MMCM を使用しました。
display IP と RGB2DVI は HSYNC と VSYNC の極性があっていないので、間にインバータを挟みました。
出力ポートは Create Port を使って、自分で作成しました。
全部できるとこんな感じです。
f0054075_21302586.png
Synthesis, Implementation と進んで、ポートを以下のように接続します。
f0054075_21261510.png
また Systhesis からやり直し?いつもこうやっているけど、この手順しかないのかな?

動作確認
ここから先は PYNQ のデータを使って、本に書いてある通りに実行するだけです。

ずいぶん強引な対策をしたので、この絵以外でもちゃんと動くのかはよくわかりません。
それにしても映り込みがひどい液晶です。
f0054075_01212162.jpg

[PR]
by tom01h | 2017-10-31 23:18 | 本・映画など | Trackback | Comments(0)
結論だけ知りたい方は こちら

大体上手く行った?
うちの環境では RGB to DVI Video Encoder IP の設定は MMCM のほうが良かったみたいです。
他に RGB のつなぎを間違っていたので直しました。
が、今でも G と B 逆だよね?もう間違っていないはずなんだけどなぁ。
f0054075_21382409.jpg
[追記 RGB to DVI の仕様書見ると RBG の順って書いてあるよ。
pData (23:0) vid_io I N/A Video pixel data packed as RBG.]

[PR]
by tom01h | 2017-10-30 21:38 | 本・映画など | Trackback | Comments(0)
結論だけ知りたい方は こちら

display と ZYNQ の間を AXI SmartConnect から AXI Interconnect に変更してみました。
が、なんか Vivado の使い方が良く分からなくてとっても手間取りました。
そしてだいぶましになったけど、まだなんか違う…
f0054075_00413747.jpg
これは時間かかりそうですよ。

[PR]
by tom01h | 2017-10-30 00:44 | 本・映画など | Trackback | Comments(0)
結論だけ知りたい方は こちら

Arty Z7 には HDMI 出力ついているし、何とか 9章の課題が出来ないか調べてみました。
公式のサポートページ におまけとしてだけど、参考情報が置いてありました。
まあ、PYNQ 用なのでそのままは使えないかもだけど…
小さくて見えないと思うけどこんな感じになります。
f0054075_19125098.png
display と ZYNQ の間は自動で繋いでもらったんだけど、AXI Interconnect じゃなくて AXI SmartConnect になっています。
そしてそこに、Critical warning が出ています。
  • [xilinx.com:ip:smartconnect:1.0-1] design_1_axi_smc_0: RUSER_WIDTH (1) of S00_AXI must be integer number of bits per byte of RDATA (32).
Digilent の IP は ここ からダウンロードしてきて、Installation に書いてある通りにして使いました。
なんか動いたけど、これって期待通りの動作じゃないよね?
f0054075_18133941.jpg

[PR]
by tom01h | 2017-10-29 21:05 | 本・映画など | Trackback | Comments(0)
FPGA プログラミング大全 7.2 に従って、Aryt Z7 の Arm でソフト Lチカをしてみました。
Vivado SDK ってなんか使いにくい…

[PR]
by tom01h | 2017-10-28 23:52 | 本・映画など | Trackback | Comments(0)
いよいよ V-scale に使っている乗算器の話です。
V-scale の乗算器は3入力加算器が64bit幅のものと32bit幅のものを1個ずつ持ちます。この2個の加算器を使って5サイクルで32bit乗算をします。後々同じ回路でFloatの乗算もしたいので、4サイクルで24bitの乗算もできるように準備をしておきます。
前回同様、32bit乗算器の部分積は下図のようになります。そして、赤枠で囲ってある部分がFloat用の部分積です。こっちは符号なし限定です。
f0054075_23284224.png
オレンジの部分を64bitの加算器で足しこみ、紫の部分を32bitの加算器で足しこみますが、その前に、右上部分を下にずらして考えます。
f0054075_00095435.png
そして、前回と同じ要領で赤枠内のオレンジと紫のそれぞれを3サイクルかけて1個ずつにまとめます。
f0054075_23520922.png
その後2サイクルは64bitの加算器だけを使って32bit乗算完了です。Github 更新しました。


[PR]
by tom01h | 2017-10-27 23:57 | 論理設計の話 | Trackback | Comments(0)

Interface 12月号

とりあえず買ってみた。膨大な情報の羅列と、すごくマニアックな記事の組み合わせ?
なんだか読むの大変そうです…
f0054075_19434952.jpg

[PR]
by tom01h | 2017-10-25 19:49 | Trackback | Comments(0)
少ない資源を繰り返し使って乗算結果を得る話です。
今時こんなケチな設計はあまりやらないと思うのですが、V-Scaleに使った乗算器は結構しょぼいのでその説明の前哨戦です。
verilog 上ではちゃんと記述していませんが、X+Y+Z=S+C*2 となるような計算を桁上げなしで計算する回路をCarrySaveAdderと呼びます。ちなみに*2はただの1ビットシフトなので、回路上は何もないようなものです。
贅沢な乗算器ではこのCSAをたくさん使い、部分積が2個になるまで計算してから最後にキャリー伝搬のある加算器で積を求めます。
ここでは、CSA1段に加算器を付けて3入力の加算器として使います。
V-Scaleでは3入力加算器を64bit幅のものを1個と32bit幅のものを1個使っていますが、まずは簡単な64bitの3入力加算器1個のバージョンです。
まぁ、最初の1回は3個の部分積を足す。2回目以降はその加算結果に2個づつ部分積を足しこんでいく。というだけなのですが…
f0054075_22525223.png
32bit乗算では上のような感じにたくさんの部分積ができるのですが、最初の1回は最下位3個、つまり上の3行を足しこんで、
f0054075_22550229.png
2回目以降はその結果を4bitシフトしてさらに2個の部分積を足しこみます。
f0054075_22572798.png
ちなみに下にはみ出ているSと上位に拡張しているSは意味が違って(ややこしくてすみません)、はみ出ているのは×-1の時のインクリメントの意味で、上位に拡張しているのは前回説明した符号拡張の省略形です。
そして、一番下にはみ出している赤字のSですが、符号なしの場合は最上位が×-1倍のわけないので必要ないし、符号付きの場合はそもそも最上位の部分積が必要ないことがわかります。
あまり面白くないですが、Github 更新しました。


[PR]
by tom01h | 2017-10-23 23:52 | 論理設計の話 | Trackback | Comments(0)

4値アクセラレータ完成

4値アクティベーションのアクセラレータも完成しました。
必要な工夫はモデル作成時の想定通りだったので、昨日以上のコメントもなく…
テストベンチは別に良いけど、回路部分だけはBNNと共通にしたいんです。
でも今はBNNが使えなくなっているはずで、直さなくちゃいけないけど Github は更新しています。

[PR]
by tom01h | 2017-10-22 23:57 | Trackback | Comments(0)
とりあえず C 言語で書いたサンプルモデルが出来上がりました。
やはり精度低下はバグが原因で、途中の演算精度を落としたせいではなかったようです。
ちなみに4値アクティベーションは、学習時は±1/3,1を使っていましたが、推論時は全体を3倍して±1,3を使います。
それに合わせて、正規化用の平均と分散も3倍します(正確にいうと分散を3倍するのではないですが…)。また、入力値から平均を引くのは良いとして、偏差で割るのは大変です。前もって逆数を計算しておいて掛けるのだって、やはり大変です。なので、次段の活性化で比較に使う1/2の方に偏差を掛けておきます。これで、2値の時と比べても、計算量は倍にはならないと思っています。
Github 更新してます。

[PR]
by tom01h | 2017-10-21 23:15 | Trackback | Comments(0)