FPGAの部屋FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。Generatorで生成したFIFOがフリーランクロックでないとおかしくなる件だが、結局、XilinxCoreLibフォルダのFIFO_GENERATOR_V4_4.vを見てもよくわからなかった。FIFO(verilogのサンプル)を見つけたが、これを非同期リセットに書き換えてやってみたが、まだシミュレーション結果がおかしい。Designがあったが、結構長いので、あまり読む気がせずに困っていた。検索していると、なつたんさんの”FPGAで非同期のクロックを扱う方法”がヒット。Optimization"を買ったんだった。職場にあったので、取りにって見てみると、96ページにありました。そのものばっちりの図が。図を見たら一発でわかりました。(誤解しているかもしれませんが。)初めてこの本を買ってよかったと思いました。説明を加えると、非同期FIFOはWriteのクロックとReadのクロックが非同期だ。普通の同期FIFOの構成だと、たぶんたまに動作がおかしくなる。Counterから入力している。各カウンタの値でEmptyかFullかを判定するロジックがある。CounterのときにFullとする。ここで各Counterは4ビットアドレスだとmodulo=16で演算されているのでリングバッファになる。Counterのアドレスの変化が同期しなくなる。バイナリカウンタは例えば、"0111"という値の次は"1000"になる。その時に、配線遅延などのために、ビット2~0が"111"から"000"に変化するj時間よりも、ビット3番目の0が1に変わるのが速かったとしよう。そのような仮定に基づくと、ある時間カウンタの値が"1111"に見えるときが出てきてしまう。同期クロックの場合はそのような時間はクロックのすぐ後となり、次のクロックまでには"1000"に安定している。非同期クロックの場合はタイミングによってはそのような状況が反対側のクロック領域へ影響してしまう。1カウントに1ビットしか変化しないグレイコードを用いる。グレイカウンタならば、一回に1ビットしか変わらないので、"0111"の次を"1111"に間違うようなことは起こらない。よって、非同期FIFOはグレイコードカウンタを使う可能性が大きい。私の考えた非同期FIFOは以下のようになった。これは上記の本の図を参考にしている。ここで、わざわざグレイコードをバイナリに直して演算しなくてもいいかも?とは思った。4ビットなのでテーブル持っていてもそんなに大変じゃないと思う。上図で作ってみることにしようと思う。バイナリ-グレイコード変換についてはここ、グレイコード‐バイナリ変換についてはここを参照する。ちなみに、相手側のクロック領域のカウンタのカウント値がFFが2つ入ることになる。flagにどんな影響が出てくるかを考えてみよう。Generatorに入力されるカウント値が遅れるわけだ。Counter値が遅れてくる。Counterが進むとするとFullが出力されるのが速くなって、Write側の書き込みが、必要以上に早期に止まる可能性がある。これは、フェールセーフの面から言っても安全方向に振れているわけで不正に書き込みができるということはない。Generatorはどうかというと、これも同様で必要以上に早期にEmptyとなる可能性はあっても、データがないのにReadする可能性はない。して安全面に振れるのでどちらもOKということになる。何か間違いがあったら、指摘してください。コメント:9プロフィールAuthor:marseeFPGAの部屋へようこそ!FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。WEBブログデザイナ。