カテゴリ:本・映画など( 302 )

前回は 1024x768 出力だった Arty Z7 の HDMI out の1280x800 に挑戦していますが、なかなかうまく出来ません。
まずはディスプレイの各種パラメータをいじってから流してみたら
disp_fifo がアンダーフローしてまともな表示になりません。
それならと、DDR の読出しを高速化すると fifo アンダーフローはなくなったみたいですが、
まだ表示はおかしなままです。
で、問題のありかがさっぱりわからなくなりました。
そんなわけで、解像度はそのままに、DDR の読出しだけ高速化してみたいと思います。

1280x800 を表示するために必要な転送速度は、平均で
1280x800x4x60 = 246MByte/sec

Arty Z7 の DDR の転送速度は、理論値の最速で
1050MHz x 2(DDR) x 16bit = 4.2GByte/sec

最大と平均の違いがあるからっていくらなんでもここがネックになるとは思えません。

display IP のマスタポートの転送速度は、理論値の最速で
100MHz x 32bit = 400MByte/sec

ここがネックの可能性が高いでしょう。
いろいろネットを漁ってみると、Zynq の HP ポートは 250MHz 64bit幅が理論値の最速みたい。
周波数を上げるのは大変そうだけど、バス幅なら…

ということで、64bit 幅にしたいと思います。
バスの幅を広げて、バスプロトコルも広げて、アドレスインクリメントのステップも2倍にします。
fifo を 48bit ライト、 24bit リードに変更します。書き込み側の段数はそのままで良いかな。

上手く行かない…
面倒ですが、24bit 幅の fifo を 2個インスタンスして、自力で切り替えながら使ってみると上手く行きました。
賢いはずの fifo IP をうまく使いこなせていないみたいです…

まぁ、これでいい事にして、WXGAに挑戦です。

各種パラメータは
localparam HPERIOD = 11'd1680;
localparam HFRONT = 11'd72;
localparam HWIDTH = 11'd128;
localparam HBACK = 11'd200;
localparam VPERIOD = 10'd831;
localparam VFRONT = 10'd3;
localparam VWIDTH = 10'd6;
localparam VBACK = 10'd22;

ピクセルクロックの生成は83.5MHzが欲しいので
100×41.75÷5÷10

もう一個、71Mhzの別のパラメータがあったんだけど、そっちでは動きませんでした。
f0054075_23460531.jpg


[PR]
by tom01h | 2017-11-17 23:51 | 本・映画など | Trackback | Comments(0)
9章の本題 同様に、課題の方にも PYNQ 用のサンプルがあって、そのまま実行すればいいはずなんです。
なのに、すごく手間取りました。Xilinx SDK の使い方難しすぎ。
これだけ出れば十分かと思ったけど、別のディスプレイにつなぐと表示されません。インチキ臭い繋ぎ替えがいけないんでしょうかね?
[追記 HSYNC と VSYNC がネガポジ反転しているみたいです。そこを直して、RGB2DVIの入力データはRBGの順にして、ポート接続を無理やりねじっているのも元に戻すとちゃんと表示できました。たぶん… ちゃんと確認できたら過去の9章まとめも修正する予定です。]
f0054075_21102307.jpg

[PR]
by tom01h | 2017-11-06 21:36 | 本・映画など | Trackback | Comments(0)
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)

量子コンピュータ

今の流行は量子アニーリングかもしれませんが、たぶんもっと古くからある量子ゲートの本です。量子の話はなかなかイメージし辛いですが、なんとなしに良く分かるように説明されています。
しかし、このサイズの本で横書きにすごい違和感。いや、横書きじゃなくて後ろから読むことに…
f0054075_22444461.jpg

[PR]
by tom01h | 2017-09-26 22:45 | 本・映画など | Trackback | Comments(0)
いろいろと試しています。
まずネットの構造は大体決まって、

3層の畳み込み層と2層の全結合層(出力層含め)。
畳み込み層のカーネルサイズは3×3で、パディングとストライドはどちらも1。チャンネル数は順に32,32,64。
畳み込み層の後には BatchNormalization と サイズ2、ストライド2のMaxPooling がある。
つまり、層毎に縦横のサイズが半分になる。
全結合の隠れ層の数は512で後にはやはり、BatchNomalization がある。
こんな感じの結果が出てます。
f0054075_13364425.png
BatchNormalization はいろいろと覚えておかないといけないので無しで試してみた。全然だめだ。
f0054075_13380578.png
なら、BatchNormalization の β と γ を固定した簡易版を作って試した見た。これで良いみたいな感じです。
f0054075_13393528.png
よく考えてみると、BatchNormalization を使うときはバイアスは要らないって書いていたのを思い出したので、バイアス削除。
f0054075_13405052.png

これをスタート地点にしてみようと思うのだが、ゼロから作る Deep Learning の畳み込み用の BatchNormalization の実装間違ってませんか? 入力を4次元で N, C, H, W とすると、N の平均と分散しかとってないですよね。ここ とか見るとN,H,W 全部の平均と分散を取っているように見えるけど… どっちが正しいの?

[追記]
N,H,W 全部の平均と分散を取るように変更してみました。これで覚えておくパラメータがだいぶ減るはずです。そして肝心の認識精度は… 上がってるじゃん。パラメータ数が減って過学習が抑えられたのかな?良いことづくめじゃん。
f0054075_18454297.png
GitHub 更新しました。

[PR]
by tom01h | 2017-09-23 13:45 | 本・映画など | Trackback | Comments(0)
8章は読み物でした。
で、7章の実験の続き。やっぱり CIFAR-10 は全データを使わないとちゃんと学習できないのかな?
覚悟を決めてやってみた。頑張ったのはコンピュータですけどね。
ネットワークの拡張としては、
  • 畳み込み層を3層にしてチャンネル数を32にする
  • 全結合層のニューロン数を256にする
その前に、どれだけ学習させればよいのかわからないので、「詳解 ディープラーニング」に載っていた Early Stopping を導入しました。しばらく(今回は5エポック)の間、test accuracy の最高値を更新できなければ学習を打ち切ります。
左が畳み込み1で右が畳み込み3、上が全結合層100ニューロンで下が256です。
f0054075_13594527.pngf0054075_00060031.png

f0054075_15283483.pngf0054075_14003658.png

とにかく時間がかかって大変でした。特に右上の学習の進みがとっても遅かったようです。出口付近のネットが貧弱だとこうなるのかなぁ?もう少しいろいろ試してみたいけど…

[PR]
by tom01h | 2017-09-19 00:26 | 本・映画など | Trackback | Comments(0)