2016年1月24日日曜日

VIVADO_HLS 2

今回は、cpx_powerモジュールの高位合成をやってみることにした。
このブログで作成したI2Sコントローラのデザインでは、I2S IPの出力をDFT(離散フーリエ変換)して、スペクトルをDVIに出力している。
以下はDVI出力を録画してVLCメディアプレイヤーで再生した画像である。

以下はI2SコントローラのvivadoのブロックデザインのDFT IP部である。

dft_coreでDFTされたスペクトルデータは単精度浮動小数形式の複素数で出力(sfp_rが実部、sfp_iが虚部)される。 cpx_powerで複素数を16bit整数形式のパワースペクトルに変換し2ポートRAMにバッファする。 vif(video interface module)は自分のタイミングでその2ポートRAMからデータを読出してDVIに出力する。

以下はcpx_powerのverilog ソースである。
浮動小数の加算、乗算、√の演算器はISEのCORE Generatorで生成しそれをインスタンスした。

今回はこれをCで書き直しでvivado_hlsで合成してみることにした訳だ。
まず、以下のように記述してみた。ただし、この記述の場合バッファ読出し部のクロックが明示されていないという問題がある。
Directiveは以下のように定義した。

合成は成功した。


上記のとおり、現状の記述では全体として単一のクロックで動作する回路が生成されてしまうという問題がある。意図した回路を生成させるためには、関数をバッファの書込側と読出し側で別々に分けてスレッドとして記述し且つクロックも明示する等の工夫が必要なんじゃないかという気がしている。

つづく。
2016.02.07 追記

UG902 Vivado Design Suite User Guide High-Level Synthesis を見ると、複数クロックを使う今回のようなデザインはSystemCによるSC_THREAD記述しか方法が無いみたいだ。


しかし、SystemC で記述する時点で既に高位合成では無い気がする。そもそも、C及びC++にクロックという概念が無いので仕方ないのだろうけど、それを無理してSystemCで上記のように記述するんだったら、この部分はVerilogやVHDL等で記述したほうがマシだろうと思う。
ということで、全てをCで記述するのでは無くて、C記述とHDL記述を適材適所で用いて行くのが良いのかな?と思った。

2016年1月10日日曜日

VIVADO_HLS 1

今回は高位合成をやってみることにした。

vivado_hlsを起動する

初期画面

Open Example Projectを見てみた。

Design ExamplesとCoding Style Examplesのカテゴリがあるが、どちらも多くのExamplesが含まれているようだ。


次にDocumentationのTutorialを開いてみた。

Video教材を幾つか見てみたが、結構判りやすかった。

さて、高位合成で何を書くか…と考えて、bin2bcd回路(バイナリをBCDコードに変換する回路)をやってみることにした。

Cソース
bin_inが入力で0〜9999の範囲のバイナリ値が入力され、これを4桁のBCDコードに変換して出力する。


projectを作成する。






Directiveは特に定義せずに合成してみた。

あっという間に合成が完了した。

生成されたverilogコードは以下のようだった。
結構ゴチャゴチャしている。

Utilization Estimationを見ると回路リソースの使用率は以下のようだった。

入出力 I/F 部の回路も含んでいるとは言え、規模としては大きい感じがした。除算や剰余演算があるのでやむを得ないのだろう。でも、まぁ、Cでチャッチャッとソースを書いて合成するとあっという間にverilogのコードが生成されるというのは、楽かも知れない。


ちなみに、bin2bcdに関しては以前このブログに書いたことがあるが、その時にネットで見つけたverilogソースをvivadoでIP化して合成してみた。


規模は以下のようであった。(LUT 77個のみ)

こちらは、剰余演算等を使わない神業的な回路方式なのでこの規模になっている。
Cでも旨く工夫して書けばもっと小さい優れた回路を生成できるようになるかも知れない。

Cベース記述(高位合成)と言っても、また、HDLベース記述と言っても方法論の違いでしかなく、記述する中身(アルゴリズムやアーキテクチャ)が最も重要なんだろうなと思った。


自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...