<   2017年 11月 ( 12 )   > この月の画像一覧

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)
そう思って部品だけ買い集めてみました。
DVI で使うなら これくらい適当 でも動くことを期待しています。
SD の基盤は、そのまま PMOD に刺さるかと思いきや、電源とグランドが逆でした。
しかも3.3V電源では動かないようです。レギュレータっぽいICを取っ払って直結すれば動くとの情報もあります。
f0054075_21410969.jpg

[PR]
by tom01h | 2017-11-16 22:40 | Trackback | Comments(0)

V-scale chip 更新はじめ

Vivado が Fall Creators Update で起動しない問題は この情報 を参考に解決できました。
とりあえず、V-scale の Vivado IP 化の準備としてメモリインタフェースをAHBもどきから同期SRAMもどきに変更しました。
合成してみると、Dが遅れるために面倒になっていたメモリ周りのスラックが緩和されたおかげで、FPU のスラックがトップに躍り出ました。
FADD 用のアラインメントシフタから加算までのパスと、正規化シフトから丸めてレジスタに書き込むまでのパスです。
やっぱり FPGA ってシフタが遅いのかな?粗粒度でも細粒度でも、リコンフィギュアラブルってこんな感じですよね?
アラインメントシフタは前のサイクルがスカスカなので論理を移動すれば対策できそうです。
正規化シフトは、サブノーマル出力のための回路を工夫すればよいと思っています。
まだ動かない対策をして試しただけですが、4ns スラックくらいまで行きそうな感じです。
しかし、久々に ARTY で動かしてみたら結構はまってしまった…

[PR]
by tom01h | 2017-11-15 00:46 | PCとか | Trackback | Comments(0)

Vivado が立ち上がらない

V-scale を修正して、憎むべき D が1サイクル遅れるプロトコルから解放してみたんだけど、
Windows Update のせいかな? 1週間前には使えていた Vivado が立ち上がらない。
何もしてないのに壊れた。
[追記 この1週間で Fall Creators Update にしていたのを忘れていました。
こんな情報出てました。]
合成結果を確かめられないけど、とりあえず AXI 化も進めるか。

[PR]
by tom01h | 2017-11-14 00:27 | Trackback | Comments(0)

Arty ファミリ

なんかすごいの出るみたいですね。3倍ですよ。まぁ、2年も経ちゃそんなものですかね。

f0054075_18212699.png

[PR]
by tom01h | 2017-11-13 22:03 | Trackback | Comments(0)
今回はサブノーマル数に対応します。回路化は全く考えていない構成ですが、機能的にはすべてが実装されます。
サブノーマル数は指数フィールドが0で示され、その値は↓です。
((-1)^F[31]) * (0.F[22:0]) * (2^(1-127)) ^はべき乗です
つまり、サブノーマル入力を考慮した指数は
expx = (x[30:23]==8'h00) ? 8'h01 : x[30:23];
で表され、仮数は
fracx = {(x[30:23]!=8'h00),x[22:0]};
で表されます。
また、正規化数しか入力されない場合は、正規化シフトはシフトなしか1ビットの右シフトの2通りから選ぶだけでした。
サブノーマル数が入力された場合は左シフトも必要になります。この先どうせ立派なのが必要になるので、63ビットまでのシフト量に対応した正規化シフタを追加します。
ちなみにこの正規化シフタは、サブノーマル数を出力可能とするために正規化後の指数が1となるところで止まります。
あと、今は必要ないですが、仮数が負の数にも対応しています。
また、サブノーマル数の出力にはこれだけじゃ足りなくて、正規化前の指数が負になっちゃった場合は仮数を大きく右シフトして、その分を指数に足してあげます。
そして、正規化シフタで指数が1となるところまで戻してあげると、サブノーマル数が出力できます。
具体的な実装は Github を確認してください。

[PR]
by tom01h | 2017-11-12 12:43 | 論理設計の話 | Trackback | Comments(0)

V-scale SubSystem 構想

V-scale chip を Arty Z7 に移植していないのは、どうしてもわからないことがあったためで…
ボード上の USB-UART って、PL からアクセスできるの?
これって、PS MIO Pin につながっているので、PL の UART ロジックからは使えないですよね?
じゃあ、PS の UART を使えば良いじゃないですか。PS の UART は GP0 からアクセスできるよね?
理屈の上ではそうなんでしょうが… と思って色々調べていたんだけど、やっとそれっぽい解が見つかった気がします。

ここ での似たような質問が解決しているようです。
そもそも、 Xilinx が サンプル を示しているみたいですね。ただ、これ見ても全然わからないけど…
でも、こんなにわかりやすい 手順 を書いてくれる親切な人がいるんですね。

とりあえず、いずれ試してみるぞ宣言。
その前に、V-scale SybSystem 作るぞ宣言。

V-scale のメモリアクセスポートは、単純な同期 SRAM もどきに変更 (Dを遅らせない)。
X-bar のマスターポートは V-scale の命令とデータ用に2個。
スレーブポートは SRAM 用2個と AXI 用1個。
AXI用だけ READY 制御ありにしようかと思います。

これを Vivado IP 化して、AXI インターコネクトと、AXI Uartlite につないでチップにする。
これが Arty で動いてからその先のことを考えようと思います。

[PR]
by tom01h | 2017-11-11 21:03 | PCとか | Trackback | Comments(0)

FPU のフラグの話

FPU は演算結果と同時に例外フラグを生成する必要があります。
V-scale で使っている演算器の場合は
ビット0が不正確フラグで、演算中に精度落ちがあった場合に通知します。
ビット1がアンダーフローフラグで、こいつはとっても複雑なので下のほうで。
ビット2がオーバーフローフラグで、演算の結果が正規化数で表すことができないくらい大きくなった場合に通知します。
ビット3が0除算フラグで、除数0の除算を通知します。ただし、被除数も0の場合はエラーを優先します。
ビット4がエラーフラグで、例えば0×無限大などの答えを決められない場合に通知します。

アンダーフロー検出について。
アンダーフローはTininessか検出されて、かつ、精度落ちがあったときに通知されます。
Tininessの検出は丸め前検出と丸め後検出を選ぶことができますが、同一のアーキテクチャの中では一貫している必要があります。
Tininessの丸め前検出の場合は簡単で、指数の範囲、演算精度ともに制限なしで計算した結果が正規化数で表すことのできる最小の値よりも小さいときに検出されます。
RISC-Vで使うのは丸め後検出なのですが、こいつが厄介で、演算精度がフォーマットの定める桁数で、指数の範囲の制限なしで計算した結果が正規化数で… 以下同文です。
これの何が厄介かというと、サブノーマル数の演算結果を得るためには正規化シフトは指数を見て止める必要がありますが、Tininessの検出には正規化シフトを止めてはいけないという矛盾が生じます。
でも2つの正規化シフタを持つのは現実的じゃないし…
演算結果がサブノーマル数の場合はTininessを検出してよい。これで足りないのは指数を気にせず正規化シフトした場合の指数が0で、仮数が以下の1番上のケース。この値だけが、正規化シフトを指数に応じて止めてから丸めた時だけ最小値に昇格します。

Tininess 検出のときには丸めで桁上げがない。
1.11111111111|0xxxxxx |は有効桁数の境目
サブノーマル数の演算結果を得るために正規化シフトを止めちゃった場合は桁上げがある。
0.11111111111|10xxxxx |は有効桁数の境目
ただ、演算結果がサブノーマル数になる数を余分に検出しちゃっても構わないので、
0.xxxxxxxxxxxx|x0xxxxx |は有効桁数の境目
を検出すればよい。

この考え方で作った回路が Berkeley Test Float をパスするので、多分この考えで正しいかと思います。

[PR]
by tom01h | 2017-11-08 20:26 | 論理設計の話 | 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)
今回は無限大と非数に対応します。また、検証環境として Berkeley Testfloat を導入します。
無限大は大体の想像がつくと思いますが、単精度浮動小数の場合は指数としてとれる範囲が 1~254 であるので、その範囲で表現できる数を超えた大きな数は無限大として扱います。正の場合が 7f800000 で 負の場合は ff800000 です。
非数は、例えば無限大×0とかどうして良いか分からないときの演算結果として生成されます。一度生成されるとその後の演算で伝搬されます。ほかにもいろいろあるのですが、詳しく知りたい方は IEEE 754 を調べてみることをお勧めします。
乗算の場合には以下の優先順で判定します。
  1. 入力のどちらかが非数の場合には非数入力を伝搬する。
  2. 無限大×0は非数を生成する。
  3. 演算途中の仮数が0なら答えは0。
  4. 演算途中の指数が小さければ答えは0。
  5. 演算途中の指数が大きければ答えは無限大。
  6. どれでもなければ普通に計算。
次に Berkeley Testfloat ですが、簡単に言うと膨大に生成した入力データと Berkeley Softfloat という FPU シミュレーションソフトで生成した期待値を使って、FPU の検証を行うソフトです。ホスト CPU の検証をすることが主な目的?なのかもしれませんが、入力値と期待の演算結果を標準出力に表示するテストがあるのでそれを利用します。
例えば
$ ./build/Linux-x86_64-GCC/testfloat_gen -f32_mul
とか打つと、入力×2 期待演算結果 期待フラグの順に表示します。
8683F7FF C07F3FFF 07839504 01
00000000 3C072C85 00000000 00
こんな感じのがすごくたくさん出てきます。これを標準入力から受け取って、FPU 乗算器に演算させた結果と比較して、合否判定をするテストベンチを作成しました。まだサブノーマル数に対応していないので、↓みたいに実行してもらえるとサブノーマル関連のエラーを除くことができます。
$ {PATHto}/testfloat_gen -f32_mul | ./sim/Vfmul_1 | grep FAIL | grep -v " 00[0-7]" | grep -v " 80[0-7]"


[PR]
by tom01h | 2017-11-05 19:41 | 論理設計の話 | Trackback | Comments(0)