見出し画像

FIFO Generator : Common Clock Builtin FIFO

 FIFO Generator の続きです。Basicタブで『Common Clock Builtin FIFO』を選択した時の残りの設定項目について説明します。

 とは言っても、Basicタブで『Common Clock & Block RAM』を選んだ時と設定内容はほぼ同じです。既に『Common Clock & Block RAM』の記事を読んでいて、『Common Clock Builtin FIFO』を今すぐ使うのでなければこの記事を読む必要はありません。

1.Native Ports

画像1

Read Mode

 Standard FIFO と First Word Fall Through の二択です。

 ここで何が変わるのかというと、FIFOに入力された始めの1word目が出力にどのタイミングで反映されるかの選択となります。

 基本的には、FIFOに入力されたデータはRead信号を入力することで出力信号に反映されます。こちらがStandard FIFOです。

 一方 First Word Fall Through を選択した場合には、FIFOに入力された時点で出力信号に反映され、Read信号を入力すると2word目のデータが出力されるようになります。

 出力信号とRead信号の数が一つずれると思って下さい。

Data Port Parameters

 入出力のデータ幅、FIFOの深さの設定を行います。

 Write Width が入力データ幅の設定で、Write Depth が FIFO の深さです。

 出力のデータ幅は Read Width です。こちらは Write Width で決めたデータ幅と同じか、半分、2倍、4倍、8倍という感じで入力データ幅を基準に選択式になります。

 同様に、 Read Depth は自動で決まります。入出力ポートのデータ幅が等しければ Write Depth と同じ値に、半分の幅であれば倍の深さに設定されます。

ECC, Output Register and Power Gating Options

 ECC の設定と出力レジスタの有無、パワーゲーティングと呼ばれるスリープモードの設定を行います。パワーゲーティングは UltraScale デバイスで使用可能な機能ですので、今回、説明に使用しているプロジェクトでは使うことが出来ません。

 ECC のチェックボックスにチェックを入れると ECC が有効になります。

 ただし、『Common Clock Builtin FIFO』では ECC を有効にすると Output Register が使用出来ません。

 ECC 有効時のみ Single Bit Error Injection、Double Bit Error Injection が使用可能です。この2つはテスト用の機能で、故意にエラーを発生させることが出来ます。

 ECC Pipeline Reg は ECC パイプラインのレジスタを有効にするもので、有効時には1クロックの遅れが発生します。これを有効にすることによって、配線遅延をレジスタで切ることが出来ますので、最終的な動作クロックを向上させることが可能です。この機能は Built-in FIFO ブロックを使った時だけ設定可能です。今回は Basic で Block RAM を選択しているため、使用出来ません。

 Dynamic Power Gating はスリープモードを言ったほうが分かり易いと思います。スリープ中は FIFO を動作させることは出来ませんが、消費電力を少なくすることが出来ます。この機能を使用出来るのは UltraScale デバイスだけです。

 Output Registers は出力ポートにレジスタを挿入するものです。この機能を有効にすることで1クロックの遅れが発生します。これを有効にすることによって、配線遅延をレジスタで切ることが出来ますので、最終的な動作クロックを向上させることが可能です。

 Output Registers は ECC を使わない時だけ使用可能です。

 個人的な経験で言うと、Output Registers は入れたほうが良いです。入れないと出力遅延が大きくなりすぎて、クロック周波数が高く出来なかったり、レポート上は間に合ってるはずなのにデータ化けが発生したりと、トラブルになりがちです。

 今回の構成では ECC と Output Register はどちらか一方しか有効に出来ません。構成を『Common Clock & Block RAM』にすることで両方共に使用することが出来ます。ECC が必須の場合は、こちらの構成も検討下さい。

 挿入するレジスタは Embedded Registers のみ選択出来ます。

Initialization

 最後は初期化の設定です。リセット時の出力データの値を設定します。

 他の構成の時には他にも設定可能な項目があります。今回の構成では、リセットは非同期のみ、リセット中のフルフラグ出力はゼロ固定と決まっており、変更は出来ません。

2.Status Flags

画像2

Handshaking Options

 オプションの信号を使うかどうかの設定です。

 Write Acknowledge は書き込み応答、 Overflow はFIFOの深さを超えた書き込みの発生。 Valid Flag は有効データ、 Underflow Flag は FIFO が空っぽなのにリード要求を出してしまったときにアクティブとなります。

 それぞれ、発生時に H を出力するか、 L を出力するかが選択出来ます。

Programmable Flags

 FIFO が一杯であることを示す Full Flag と 空っぽであることを示す Empty Flag のオプションです。

 ここを変更することで、完全に Full にならなくても一定量のデータが入力されたときに Full Flag を立てたり、完全に空っぽでなくても Empty Flag を立てたりすることが出来ます。

 例えば、入力データが 16word セットになっていて、読みだす時も 16word 溜まってから読み出したい、という場合に使用します。

 ここを良く見ると分かるのですが、デフォルト設定では FIFO の深さを1024に設定した場合でも、Full Flag が立つのは 1023word 溜まった時になります。

 これ以上増やすことは出来ません。つまり 1024 の深さがあっても、 1024word 保存することは出来ないということです。

その他

 他の構成では存在する Optional Flags は今回の構成では存在しません。

 Almost Full Flag、Almost Empty Flag は使用出来ません。

 また、 Data Counts タブも存在しませんので、使用可能なのは、Full Flag と Empty Flag の二つだけとなります。必要に応じて Programmable Flags の設定を変更して対応して下さい。

3.Summary

画像3

 最後の Summary は書いてある通り、結果の表示です。変更する項目はありません。

 今までのタブで設定してきた結果が表示されますので、設定洩れや、設定ミスがないか確認して下さい。ただし、深さを 1024 と設定したのに、Summary では 1025 になってしまいます。これは、今回の Summary では2うのブロックを連結して使う結果となったからで、常に指定数よりも大きい数字になるわけではありません。

 また、一番上に表示されている Estimated FIFO Usage も確認して置くと良いでしょう。

画像4

 ここには設定の結果、Built-in FIFO を幾つ使ったのかが表示されます。

 Built-in FIFO は18kbit または 36kbit の構成で作成されます。これは Block RAM の構成と同一です。使用量がそのまま Block RAM の消費と考えてもらって構いません。

この記事が気に入ったらサポートをしてみませんか?