2016年10月30日日曜日

VIVADO_HLS 7

vivadoを使い始めた頃は、target boardの選択肢にzyboが存在して無かったので、vivadoのフォルダ構造を自分で解析し、独自にzyboのpreset parameterを追加し選択できるようにしていた。
http://bravo-fpga.blogspot.jp/2014/10/zybo-6.html

が、時は過ぎvivadoの版も上がり、今時はdegilentからzyboのboardfileを入手してvivadoに追加すればtarget boardにzyboが選択できるようになっている。boardfileのインストールは定義ファイルをインストールディレクトリ下の/data/boards/board_filesに置くだけだ。preset parameterを変更するよりも簡単だ。そこで、ここらでboardfile方式に移行することにした。
boardfileはここから入手できる。
https://reference.digilentinc.com/reference/software/vivado/board-files

boardfileをインストール後以下のようにしてdesignを移行した。

まず、現行のprojectを開いてblock desginをexportした。


次に新しいproject用のフォルダを作成し、exportしたtclファイルをコピーした。

tclファイルを編集する。
preset parameterを指定している行を削除する。

create_projectしている部分に以下の様にzyboの情報を追加する。


gpioの定義の修正
exportされたtclでは何故かgpioの入出力とbit幅の定義が抜けているので、それを修正する。
修正前

修正後


vivadoを起動してprojectをcreateする。

Default partのページで素子名ではなくBoardsのZyboを選択する。

Create Block Designを実行してBlock Designerを開き、IP Repositoriesに自作IPのRepositoryを追加する。



tcl Consoleで先ほど編集したsystem.tclをsourceするとBlock Designが実行される。




構築が終わったら、Generate Block Designを実行後、HDL Wrapperを生成する。


 
これでBlock Designが出来たので、Run Implementationボタンをクリックして合成、Inplementationまでを実行、最後にGenerate BitstreamしてBitsteramを生成した。
おっと、制約ファイルを取り込むのを忘れていた。
元のprojectのxdcファイルを新しいprojectにloadする。



気を取りなおして、Run Implementationからretry

タイミングはMetした。入出力遅延を設定していないピンがあるため、Check Timingに!マークが付いてはいるが。

Generate Bitstreamを実行してBitstreamの生成まで完了した。



2016年10月10日月曜日

VIVADO_HLS 6

ソースは最終的に以下のようになった。

前回までのdirectiveの定義だと、モジュールI/Fにap_start、ap_ready等のポートが付いてしまい、信号入力 xp はvldとこれらの信号とのハンドシェイクでやり取りされる回路が生成されてしまう。

RTL版は以下のようにストローブ信号(valid信号)のみでxpを取り込んでいた。

今回はRTL版のDFT IPを高位合成版で置き換えて動かしてみたいのでI/Fもなるべく同じにしたい。そこで、dft_proc関数自体にap_ctrl_none directriveを定義してみたところxp_ap_vldだけを使うRTLが生成された。

しかしである。ここで一つ問題が発生した。C-RTL Cosimを実行しようとしたらエラーになってしまった。

ap_ctrl_noneを定義する前はエラーにならなかったので、ap_ctrl_noneを追加したことが原因と考えられるが、エラーメッセージを見る限りではap_ctrl_noneはサポートされている筈であり、問題無いように思える。。。dft_procに対してap_ctrl_noneを、入力xpに対してap_vldを定義しているがどうやらこれが原因のようだ。ということは生成されたRTLは動作しないんだろうか?と思ってRTLを見てみた。

xp_ap_vldが1のタイミングでxpをラッチしているようなので問題ない気がする。本当にOKなのかシミュレーションで確認したいのだが、Vivadoはエラーと言ってシミュレーションをさせてくれない。。。うーむ。ツールバグのような気がするんだがなぁーー
仕方がないので実機で動かしてみることにした。

合成結果をIP化してI2S IPのデザインに取り込んだ。


合成は成功した。

で、時報のデータを流してみた。

RTL版と同じ動作だ。問題なし、素晴らしい。パチパチパチパチ
やっぱり、ツールバグだと思う。

以前作ったファンクション・ジェネレータから信号を入力して色々見てみた。


周波数掃引

高域に行くに従ってスペクトルが広がっているように見えるのは、画面のフレームレートよりも周波数の掃引が速いのが原因。また、周波数が高くなるとファンクション・ジェネレータのDDSの分解能不足によると思われる高調波が発生している。

このファンクション・ジェネレータはDDSを2ch持っていて、その出力を加算したり乗算したり出来る。


CH2を10KHzの正弦波にしておき、これとCH1側は周波数掃引信号を掛けあわせた。これはDSB変調と同じなので、両側波帯が掃引する波形になる。


こちらは加算した場合

高調波が沢山でている。波形が飽和してクリッピングしているかも知れない。

音楽での応答性
このDFT IPは1サンプル毎にスペクトルが生成されるので、応答性は良い。


ということで、問題なし。素晴らしい。。
Cで回路開発ができると、例えば計算する周波数の数を変更したり、スペクトルの出し方を変えたりといったことも簡単に出来そうだ。色々と試行錯誤するには良いかも知れない。


TE0720 No.4 (BNN-PYNQを動かしてみる 2)

TE0720でBNN-PYNQを動かすことが出来た。 以下は前回に続いてBNN-PYNQが動くまでの記録。 gdb (GNU debugger)で例外が出る原因を調べてみた。 例外が発生しているのはシェアードライブラリ(python_hw-cnv-pynq.so)の中であ...