« Cosmo-ZのDACの動作 | トップページ | ビットリバースのバグ? »

2016.07.05

CoreGen FIFOのリセットは非同期?

連日の徹夜デバッグの末、ようやくFFT回路が出来てきました。

デバッグしていてハマったのが、XILINXのCoreGeneratorで作ったFIFOにデータを溜めていくと、なぜか8192を超えたところで急にリセットがかかってしまうという問題でした。

CoreGenのFIFOはリセットがかかるとEMPTYとFULLが同時に立つので、すぐにわかります。

Fifo_error

この波形を見ると、FULLとEMPTYが同時に立って、RDCOUNTが0になっているので、どうしてもリセットとしか思えない挙動でした。FIFOがいっぱいになったときのバグかとも思ったのですが、FIFOの深さを2倍にしても結果は同じ。しかし、FIFOのRST信号をFPGA内蔵ロジアナで見ても、特にアサートはされていない。

いろいろ苦労しましたが、RST信号をFFに通したら直りました。

原因は完全には究明していないのですが、おそらくCoreGen FIFOのRST入力は非同期入力だからなのだろうと思います。

wf_reset <= '1' when (rd_state = "000") and (vfft_start_i = '1') else '0';

という式でFIFOのリセットを作っていたので、rd_stateの動作、あるいはvfft_start_iの動作によっては非常に短いヒゲが出て、それが原因でwf_resetが'1'になってしまい、FIFOがリセットされたものではないかと考えられます。

そう考えると、

  • ISIMのシミュレーションでは期待したとおりに動く
  • 深さを2倍にしても解決しない
  • ロジアナではヒゲが見られない
  • FFに通したら正常に動作するようになった

という実験結果とも一致します。

そんな苦労をしながら、ようやくハードウェアFFT回路ができました。

Hvfft_tim1

このような構成になっています。

メモリの読み出しや、書き戻しのタイミングをオシロで見てみると、

Hvfft_tim2

のようになっていて、期待したとおり、1chあたりの32768ポイントFFTが約80μ秒かかっていて、それを8ch分繰り返しています。

連続して動作させると、このように切れ目なく動きます。

Hvfft_tim3

ようやくFFT回路が動くようになってきました。

|

« Cosmo-ZのDACの動作 | トップページ | ビットリバースのバグ? »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« Cosmo-ZのDACの動作 | トップページ | ビットリバースのバグ? »