11月1日に都内に出かけたのだが、その辺りから風邪をひいてしまって体調を崩していた。
風邪の症状自体は1週間位で治まったのだが、咳が酷くて全然治まらない。酷い時には咳き込んでいる途中でフッと意識が飛んで体が痙攣を起こしたりしていた。そこで仕事以外では暫くおとなしくしていようと思い自宅にいる時はひたすら安静にしていた。病院には毎週末行っていたのだが、先週、吸入薬を処方してもらいそれを使うようになったら劇的に改善し体調も復調してきた。まさか、風邪ごときで4週連続で通院するとは思ってもいなかった。
体調も復調したのでまた活動を再開しようと思う。
やっほーい!!
2016年11月27日日曜日
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の生成まで完了した。

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

前回までの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で回路開発ができると、例えば計算する周波数の数を変更したり、スペクトルの出し方を変えたりといったことも簡単に出来そうだ。色々と試行錯誤するには良いかも知れない。
2016年9月25日日曜日
VIVADO_HLS 5
Vivado_HLSでの開発の仕方が大体判ったので、以前Verilogで開発したDFT IPをHLSでやってみることにした。このDFT IPはAC'97 IPから出力されるAudioデータを離散フーリエ変換でスペクトルに変換するIPで、2012年10月〜2013年2月にかけて開発した。
通常、DFT演算の式は以下のような式だが、
回路はVerilogで記述し、動作検証はDegilentのAtlysボード(Spantan6)で行った。RTLにつまらないバグを仕込んでしまったのだが、それを見つけられずにかなり苦しんだ。
また、2014年11月にはZYBO(Zynq)にも実装して動作させた。
DFT IP開発時にC言語でリファレンスモデルも作成したが、今回はそれのコードを流用して高位合成用のソースを作成した。以下にソースを示す。
68行〜94行のdft_proc()がDFT演算を行う本体だ。
41行〜66行のget_arc()はsin(ω), cos(ω)を求めるルーチンで、予め計算した値を配列に持ち、表引きで値を返している。このDFT IPは単精度浮動小数で演算を行っているがアルゴリズムがIIR型のため、ずっと動作させると演算誤差が累積していき、無信号でもスペクトルが存在するように見えてしまう場合がある。その対策として三角関数の値を正規の値に縮小係数(0.9999999)を掛けた値をテーブル値としている。
テーブルの値は小数点データだが、0.123e-456の様な記述で表現してしまうと値によっては桁落ちで精度劣化してしまうので、floatとunsigned intの共用体で新しく型を定義し、テーブル値はunsigned intとしてHEX表記で記述している。この型定義はdft.hの33行目で行っている。
Directiveは以下のように設定した。
arc_tblは本来ならROMとするべきだが、ROM_T2P_BRAMという設定項目がなかったのでRAM_T2P_BRAMとした。
合成結果は以下の通り
浮動小数点演算器(加減算、乗算)にDSP48が使われている。DSPを使わないLUT型の演算器にしたいのだが、Directiveで設定できない。この段階では問答無用でDSPを使うRTLが生成されてしまうようだ。
ともあれ、HLS合成は成功した。Fmaxも150MHz位まではいけそうだ。
以下のような固定値を入力するテストベンチを書いてVivado Simulatorでシミュレーションをしてみた。固定値入力なので、出力スペクトルは最初は正弦波状になり段々収斂していって最終的には周波数0 (DC) 部のみスペクトルが立つ筈だ。
結果
アナログ波形で見えているのが出力スペクトルで、最初に正弦波状波形から始まって段々と収斂していっているのが判る。
2016年9月11日日曜日
VIVADO_HLS 4
XilinxのUG871, Vivado Design Suite Tutorial - High-Level Synthesis を読んでいる。
全体的な傾向としては判りやすく書かれているのだが、文中の図番号がズレていたり、Vivado-HLSのレポートに対する説明がどう見ても間違っていたりする箇所があって、読んでいてそういう箇所に出会うたびにちょっと混乱してしまう。。。
例えば、40ページ。

Figure 2-27 Shows: とあるが、Figure 2-27はfor loopのloop unrolling設定の図なので、これは 明らかに間違い。正しくはFigure 2-26 Shows:でなければいけない。(こんな感じで参照している図番号が微妙にズレている箇所が他にもある。) また、Figure 2-26の内容に対する説明文も間違っている。 1番目の項目で The reads on the ports x and y. とあるが、図を見れば判るとおり port y はwrite だ。 また、2番目の項目で There are two multipliers being used in this design. とあるが、このデザインで使われている(instanceしている)乗算器は1つだ。
この乗算器は32bitの乗算器だが、FPGAのDSP48は18bitの乗算器なのでこれを4つ使って32bit乗算器を実現している。なので、仮にtwo multipliersがDSP48の18bit乗算器を指していたとしても記述は間違っている。

このUGは2016年6月8日に更新されたものだが…
はは〜ん、さては、担当者がちゃんと仕事してねぇな? -_-);; ・・・てことは無いか。
それとも、私の理解が間違ってるのか?
全体的な傾向としては判りやすく書かれているのだが、文中の図番号がズレていたり、Vivado-HLSのレポートに対する説明がどう見ても間違っていたりする箇所があって、読んでいてそういう箇所に出会うたびにちょっと混乱してしまう。。。
例えば、40ページ。

Figure 2-27 Shows: とあるが、Figure 2-27はfor loopのloop unrolling設定の図なので、これは 明らかに間違い。正しくはFigure 2-26 Shows:でなければいけない。(こんな感じで参照している図番号が微妙にズレている箇所が他にもある。) また、Figure 2-26の内容に対する説明文も間違っている。 1番目の項目で The reads on the ports x and y. とあるが、図を見れば判るとおり port y はwrite だ。 また、2番目の項目で There are two multipliers being used in this design. とあるが、このデザインで使われている(instanceしている)乗算器は1つだ。
この乗算器は32bitの乗算器だが、FPGAのDSP48は18bitの乗算器なのでこれを4つ使って32bit乗算器を実現している。なので、仮にtwo multipliersがDSP48の18bit乗算器を指していたとしても記述は間違っている。

このUGは2016年6月8日に更新されたものだが…
はは〜ん、さては、担当者がちゃんと仕事してねぇな? -_-);; ・・・てことは無いか。
それとも、私の理解が間違ってるのか?
登録:
投稿 (Atom)
ERROR: Failed to spawn fakeroot worker to run ...
なにかと忙しくてなかなか趣味の時間を確保できない。 ...orz 家の開発機のOSはLinux Mintなのだが、最近バージョンを22に更新したところ、myCNC用のpetalinuxをビルドできなくなってしまった。ビルドの途中で ERROR: Failed to spawn ...
-
FT232RというUSB-UART変換ICがある。このICにはBit Bang Modeという機能があって、UART用の端子がGPIO的制御が可能になる。 FT232Rを搭載したUSB-UART変換基板は秋月電子やマルツパーツ等色んなところで売られていて私もSparkfunのF...
-
これまではTCM8230MDの出力形式はRGB565にしていたが、画像もちゃんと表示できるようになってきたのでYUV422形式も扱えるようにして両者の画像の違いを見てみた。 まずTCM8230MDの出力をcolor bar出力にして、取り込んだ値に変換式を適用してどんな感じの...









