今回は無限大と非数に対応します。また、検証環境として 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)
FPU 乗算の話です。FPU で扱うデータは正規化数以外にサブノーマル数や無限大から、数字じゃないデータまであるのですが、今回は正規化数に限った話。32bit で表現する単精度浮動小数で言うなら以下のようになります。
ビット31が符号を表す。
ビット30~23が指数を表す。正規化数の場合は1~254。
ビット22~0が仮数の小数点以下の部分を表す。ただし、仮数は 1.**** で表す。
で、F[31:0] の値は↓です。
((-1)^F[31]) * (1.F[22:0]) * (2^(F[30:23]-127)) ^はべき乗です
A[31:0]*B[31:0] を考えた時、
F[47:0]={1'b1,A[22:0]}*{1'b1,B[22:0]}
が仮数の掛け算の結果です。小数点以上が1桁、小数点以下が23桁の数同士の掛け算なので、小数点以上が2桁、小数点以下が46桁の乗算結果が得られます。つまり、F[46]の下に小数点があります。この結果を再度、浮動小数点フォーマットに戻すために、1.**** の形式に変換する必要があります。具体的にはF[47]の値によって分岐する必要があり、
F[47]==0の場合は桁上げ無しなので指数は A[30:23]+B[30:23]-127 になります。
仮数はF[45]が小数点以下第1位になって、[23]が最下位ビットでそれ以下は四捨五入をします。ただ FPU の四捨五入はちょっと特殊で、ちょうど真ん中、つまり[22]が1で[21:0]==0の時は、[23]=0となるように切り上げたり切り捨てたり、[23]によって動作が異なります。
F[47]==1の場合は桁上げ有りなので、指数は A[30:23]+B[30:23]-127+1 になります。
仮数はF[46]が小数点以下… 以下同文
だらだら言葉で説明してもわかりにくいので、Github を見てください。

[PR]
# by tom01h | 2017-11-04 21:25 | 論理設計の話 | Trackback | Comments(0)

大菩薩

久々の登山。大菩薩に行こうと思ったのですが、上日川峠へのバスが大混雑。駅から歩けるコースに変更しました。
f0054075_19442796.jpgf0054075_19445261.jpg
紅葉がとってもきれいでした。緩いコースに変えたかと思っていたのですが、これが結構急な斜面でなかなかの歩きごたえでした。
笹子側の沢は雨の後だったこともあるのか迫力満点でした。
f0054075_19491904.jpgf0054075_19494533.jpg

コースは良かったのですが、下山地に何もないのが、ここら辺のつらいところですかねぇ。

[PR]
# by tom01h | 2017-11-03 23:59 | 山歩き | 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)
いよいよ 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)