2012年12月11日火曜日

DFT IPの作成 8

RTL全体でシミュレーションしてみたところ、以下のような結果だった。


上記は開始から約10msecの時点での波形だが、右端に小さなピークが見える。
入力信号は上図の左側のスペクトルに対応する単一周波数の正弦波なので、右側のピークはおかしい。 さらに波形とRTLを追って見たところバグっている箇所が分かった。入力信号は1024点の演算実行期間、値を保持していなければならないのだが、それが抜けていた。
(単体シミュレーションではテストベンチ側で値を保持していた。)


上記波形でxpが入力信号であるが、値が保持されていない。
これを以下のように修正した。


xdはxp - xp-Nの結果で、16bit整数値で演算してその結果を32bit浮動小数に変換しているが、この変換器でstb信号を入れて変換結果を保持させるようにした。
この修正の結果、表示されるべきスペクトル(上図の場合は左側)のみが表示されるようになった。

但し、誤差問題は解決していない。
これまで、Cモデルやシミュレーションでは発生せず実機動作で発生すると考えていたのだが、これは誤りで、恐らく、Cモデルやシミュレーションでも誤差は発生している。これが見えなかったのは実行時間が短すぎたためと思われる。シミュレーションの場合、私はIcarus verilogでシミュレーションをしているが、全体シミュレーション環境で10msec程度をシミュレーションするのに12時間位要している。シミュレーション時間はRTLのノード数・・・というか回路の規模に比例する。浮動小数乗算器や加減算器等はcoregenで生成したモデルを使用しているが、これはネットリスト形式になっているので、演算器の部分はゲートレベルシミュレーションしているようなもので、これもシミュレーション時間が長時間になる要因になっているだろう。しかし、誤差問題はこの演算部分に関わることなので、ビヘイビアモデルを作って置き換えるという訳にもいかない。何れにしてもシミュレーション時間が短すぎる為に、誤差問題を見落としていたのは間違いないだろう。

で、この誤差のキャンセル方法について、これまでに考えたのは次の2つだった。
1. 2048点演算毎にアキュムレーションRAMをクリアする。
2. 縮小係数をかける。

結局、1の方法で普通に2048点毎の演算としたほうがいいのかも知れない。

0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

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