V-scale に使っている FPU 乗算器の話です。
V-scale に使っている乗算器の話 にも書いた通り、整数乗算と FPU 乗算では 4サイクル目までの動作は同じです。
4サイクルで仮数部の乗算結果を求るのは、整数乗算器の説明の通りです。
そして、5サイクル目は正規化と丸めをします。ここは前回と変わりありません。
ただ、今回はちょっと高速化を狙って正規化シフタを変更しています。あまり効果ありませんでしたが…
ちなみに、実際に V-scale で使っている記述とは表現が全然違うのですが、構成も若干違うところがあります。
表現の違いは合成に過大な期待をしていない(加算器をたくさん生成しないとか)ため、構成の違いはディレイ対策の有無と思ってください。


[PR]
# by tom01h | 2017-11-19 23:45 | 論理設計の話 | Trackback | Comments(0)
V-scale xbar の先のペリフェラル用マスターポートには、AHB に代えて AXI ポートを付けようと思っています。
その際、クリティカルパスになりがちだったリクエストを 1サイクル遅延させたいと思います。
AXI がノーウェイトだったらこうなるのかな?
f0054075_20512547.png
でもって、AXI の RVALID が1サイクル遅れる時がこんな感じ。
f0054075_20593847.png
最後に、リクエストすら受け付けてくれない場合。
f0054075_21021808.png


[PR]
# by tom01h | 2017-11-18 22:47 | PCとか | Trackback | Comments(0)
前回は 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)
そう思って部品だけ買い集めてみました。
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)