ソースは最終的に以下のようになった。
前回までの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で回路開発ができると、例えば計算する周波数の数を変更したり、スペクトルの出し方を変えたりといったことも簡単に出来そうだ。色々と試行錯誤するには良いかも知れない。
0 件のコメント:
コメントを投稿