- ベストアンサー
FIFOのAlomost Flagのメリットとは?
- VerilogでFIFOメモリの記述をしていて,Alomost Flagについて理解できない箇所があります.フラグのメリットがどうしてもわかりません.
- Alomost Empty Flagは読み出し側が早くデータを取り出せるようにするためのフラグです.このフラグによって読み出し側は見切り発進できます.
- Alomost Full FlagはFIFOメモリが満杯になる瞬間を検知するためのフラグです.これによって書き込み側はFIFOメモリが満杯になる前に処理を停止することができます.
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
P.65 Almost Full やAlmost Empty のフラグが有効 にある解説でわからないという事ですか? pdf文書の説明の繰り返しになりますが、 Empty (空)、Full (満杯)を示すフラグが、Almost (概ね)、つまり もうすぐ空、もうすぐ満杯を示すものにする方が高速(というか無駄が生じない)、という事です。 お書きのように「早めに知る」事でもあります。 説明図は、速度が 書込>読出 の場合を示します。 書込み側は「空」を検知すると書込みを開始します。 読み出しにより「空フラグ」が立つと、文字通り「完全に空な状態」が生じます。 これは有効データがない状態なので、読み出し側は読み出したくても待たされます。 読み出し側はただでさえ書込みより遅いのに、待たされる事で全体の速度低下を招きます。 「(完全)空フラグ」でなく「もうすぐ空フラグ」により書込みを開始すれば FIFO が空になる状態が生じず、上の無駄な時間を解消できます。 >見切り発進できる(?)みたな解釈 理屈では、書込み開始をするのに「完全な空」を待つ必要はなく、空き容量ができた時点で開始してよいはずです。 「空フラグ」を待つのは、場合により無駄な時間が生じるという欠点があります。 過去に「空フラグ」が使われてるのは、決定的な不都合でもなく回路が比較的シンプルで済むからでしょう。 「もうすぐ空フラグ」というより「書き込みを開始してよいフラグ」と言い換えれば解り易いかも知れません。 「満杯」「もうすぐ満杯」については図がありませんが、多分 読み出し側が「満杯になったら読み出す」仕掛けを想定してるのでしょう。 「空」の時と同様に考えます。速度は 書込<読出 な場合です。 読出し側は、「満杯」なら読出しを開始します。 「満杯」になれば書き込めませんから、書込み側は低速なのに待たされます。 ならば「満杯フラグ」でなく「もうすぐ満杯フラグ」なら、 満杯になる前に読出しを開始でき、上の事を解消できます。 これも「もうすぐ満杯フラグ」を「もう読み出してよいフラグ」と読み替えれば わかりやすいかと思います。 >Alomost Full Flagの記述もできてなく 書込み・読み出しのブロックサイズが決められてないなら、 さほど厳密でなくラフな設計でも効果は得られると思います。 「FIFO 内の有効データが4分の1以下ならもうすぐ空」、 「FIFO 内の有効データが4分の3以上ならもうすぐ満杯」という程度でいいと思います。 パケットのように、データ列がある程度のサイズを持ち、この単位での読み書きが必要なら オーバーラン、アンダーランしない使用量・空き容量で各フラグが立つように設計すればいいです。 記述については、文法を知らないのでご容赦願います。
その他の回答 (1)
No.1 です。 >「FIFO 内の有効データが4分の1以下ならもうすぐ空」、 >「FIFO 内の有効データが4分の3以上ならもうすぐ満杯」という程度でいいと思います。 とは書きましたが、この通りに造るのも意外に手間 (もしくはリソース消費が多い)かも知れません。 他の手として。 ・FIFO 容量をカウントできるカウンタを1個造る ・書込みパルスでアップカウント ・読出しパルスでダウンカウント とすれば、カウンタ値が「有効データ数」であり、 適当にデコード(大小比較)すれば データ数がx以下=「もうすぐ空」、データ数が△以上=「もうすぐ満杯」を示せます。 ・×以下、△以上 の×や△を「2のべき乗」とすればデコード回路をかなり簡略化できます。 ・FIFO容量やカウンタが2のべき乗なら、「△以上」は1の補数を使うと フラグというよりステータスですかね。
お礼
ご回答ありがとうございます. フラグの認識の仕方が分りました. おかげでFPGA実装もスムーズに進みました.