FIFOの部分もこの投稿で終わりにしたいと思います
風に揺らぐのれんの様な不具合を直すと、絵はすっきりと表示されました。
この時は更に感動しましたが、それでももうひとつ不可解な不具合が残っていました。
FIFOの不具合(俺の不具合ですけどね)で最後に残ったのは
黒い妙な点でした。
基本的には綺麗に表示されているのですが、画面中に百個くらいの点が
規則性なくバラバラと表示されるのです。
まだまだアマチュアだった私は「見なかったことにしよう」かと思いましたが
流石にそういうわけにもいかず、原因を調査しました。
まず、よく見るとこの黒い点は点ではなく短い横棒でした
つまり、センサーの中でピクセル単位で起きている現象ではなく、これもデータを転送する過程で、ロジックの不具合により発生している現象でした。
とても不可解だったのは、画像の縦横が揃っていたという事です。
それのどこが不可解なのかと言うと、不具合になる点があるにも関わらずデータの総量は正しいという事です
元々予定した信号は、有効信号に対してデータが同期しているもの でした
黒い点のエラーが発生する場合、それに押し出されて画素がずれるのではないか?と思いました。
しかし実際には、該当する部分の画素がすっぽり抜けてしまっていたのです
この理由は、ちょっと変わったFIFOにありました
この時使っていたFIFOは、データを読み出す指示を出した最初の一クロックを無視します、更に、2クロック目のreadが発生してから1クロック遅れてデータが発生しています。
また、read=outputではなく、read=アドレスの進行なので、readによってデータ(D0)が読まれてもenableが出ていないと、このデータは有効にはなりません
つまりこれが黒ドットだったと言うわけです
なぜreadしたにもかかわらず、enableは別に存在するかと言うと
これは、このFIFOがFPGAの外にある事に起因するのだと思います
例えばFIFOが複数存在している場合、outputのバスを共有にしたいケースがあるとします、FIFO1が出力をしている間に、FIFO2,FIFO3は読み進めて一部のデータを捨てたいとします、その時にFIFOのoutputが競合しない様にするなどの使い方が考えられます
結果として、readとenableのタイミングが合っていない事がわかり、ここまで修正すると、おかしな点のない絵が出る様になりました。
やれやれでしたが、一切不具合なく、センサの出力をはっきり出せる様になった時も、気持ちは感慨深いものがありました。