(57)【要約】【課題】ＦＩＦＯバッファの入力に無効となる可能性があるデータを含み、それが有効か否かが後に確定する場合、ＦＩＦＯバッファの前段にバッファを設けることを不要とするため。【解決手段】データを記憶する記憶部と、不確かなデータの入力が開始されたことを示す不明データ開始信号入力と、不確かな入力データが有効であったことを示すデータ有効信号入力と、不確かな入力データが無効であったことを示すデータ無効信号入力と、データ有効信号から不明データ開始信号までの期間の記憶部へのライト信号とリード信号により動作する第一の制御部と、すべての期間のライト信号とリード信号により動作する第二の制御部と、データ有効信号により第一の制御部の内部状態を第二の制御部の内部状態と同じ状態にする手段と、データ無効信号により第二の制御部の内部状態を第一の制御部の内部状態と同じ。【選択図】        図１
2004362286.tif 000002
【特許請求の範囲】
【請求項１】
入力データを書き込む入力ポートと書き込まれた順にデータを出力（先入れ先出し）する出力ポートを持つＦＩＦＯバッファ回路において、
データを記憶する記憶部と、
入力データを前期記憶部に書き込むことを知らせる書き込み信号の入力と、
前期記憶部から書き込まれたデータを読み出すことを知らせる読み出し信号の入力と、
有効であるか否かが不明であるデータの入力が開始されたことを示す不確定データ開始信号の入力と、
有効であるか否かが不明であった入力データが有効であったことを示すデータ有効信号の入力と、
有効であるか否かが不明であった入力データが無効であったことを示すデータ無効信号の入力と、
前記データ有効信号から前記不明データ開始信号までの期間の前記書き込み信号と前記読み出し信号を入力し先入れ先出しのための内部状態を保持しそれを実現する第一の制御部と、
すべての期間の前記書き込み信号と前記読み出し信号を入力し前記第一の制御部と同様のの内部状態を保持する第二の制御部と、
前記第一の制御部が前記記憶部のデータの読み出し位置を制御する手段と、
前記第二の制御部が前記記憶部のデータの書き込み位置を制御する手段と、
前記データ有効信号により前記第一の制御部の内部状態を前記第二の制御部の内部状態と同じ状態にする手段と、
前記データ無効信号により前記第二の制御部の内部状態を前記第一の制御部の内部状態と同じ状態にする手段と、
を有することを特徴とするＦＩＦＯバッファ回路。
【請求項２】
前記第一及び第二の制御部は前記記憶部のすべての領域が書き込まれたデータで満たされている間にさらなる書き込みがあった場合のオーバーフローを内部状態として持つことを特徴とする請求項第１項記載のＦＩＦＯバッファ回路。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、入力ポートと出力ポートを持ちデータの先入れ先出しを実現するＦＩＦＯ回路に関するものである。
【０００２】
【従来の技術】
連続的に流れ来る一連のデータを逐次処理を行う回路において、流れてくるデータの速度と処理の速度が異なる場合、その緩衝（バッファ）として、先入れ先出しバッファ（ｆｉｒｓｔ−ｉｎ  ｆｉｒｓｔ−ｏｕｔバッファ、以下ＦＩＦＯバッファと記す）が広く用いられている。流れ来る一連のデータをＦＩＦＯバッファに書き込み、そのデータを逐次処理を行う部分はその書き込みとは独立にＦＩＦＯバッファからデータを読み出すことができる。ＦＩＦＯバッファからの読み出しでは最初に書き込まれたデータが最初に得られ、以降の読み出しで、書き込まれた順番でデータを得ることができ、データ処理部分は一連のデータの逐次処理が可能となる（例えば、特許文献１を参照）。
【０００３】
図１０はＦＩＦＯバッファ回路の従来例を示すブロック図である。１はデータを記憶するための記憶部であり、ｗｒｉｔｅ＿ｄａｔａ信号により入力データが書き込まれ、ｒｅａｄ＿ｄａｔａ信号によりデータが読み出される。２は先入れ先出しのための制御部であり、ｗｒｉｔｅ＿ｄａｔａ信号とｒｅａｄ＿ｄａｔａ信号から記憶部１の書き込む位置を示すｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号と読み出す位置を示すｒｅａｄ＿ｐｏｉｎｔｅｒ信号を制御することで先入れ先出しを実現する。また、制御部２はＦＩＦＯバッファを使用する周辺回路のためにＦＩＦＯの状態を示すＦＩＦＯ  ｓｔａｔｕｓ信号を出力する。一般に、ＦＩＦＯ  ｓｔａｔｕｓ信号の内容はそれら周辺回路がどのような情報を必要とするかに依存する。最も簡単な場合は、ＦＩＦＯバッファ内にデータが全くないことを示すｅｍｐｔｙ信号とＦＩＦＯバッファ内がすべてデータ満たされているを示すｆｕｌｌ信号である。ｅｍｐｔｙ信号をアクティブにすることで、ＦＩＦＯバッファからデータが読み出せないことを周辺回路に知らせ、ｆｕｌｌ信号をアクティブにすることで、ＦＩＦＯバッファへデータが書き込めないことを周辺回路に知らせる。場合によっては、あと一つデータを読み出すとｅｍｐｔｙ状態になることを示すａｌｍｏｓｔ＿ｅｍｐｔｙ信号や、あと一つデータを書き込むとｆｕｌｌ状態になることを示すａｌｍｏｓｔ＿ｆｕｌｌ信号、ＦＩＦＯバッファ内のデータの個数を示す信号を出力することもある。
【０００４】
図１１は制御部２を説明するための図である。制御部２は内部状態として、ｅｍｐｔｙ状態（同図でＥｍｐｔｙ）か、ｆｕｌｌ状態（同図でＦｕｌｌ）か、そのいずれでもない状態（同図でＨａｌｆ＿Ｆｕｌｌ）を保持するｓｔａｔｅ信号と記憶部１の書き込む位置を示すｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号と読み出す位置を示すｒｅａｄ＿ｐｏｉｎｔｅｒ信号を有する。ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号とｒｅａｄ＿ｐｏｉｎｔｅｒ信号はそのまま、記憶部１に出力されている。ｅｍｐｔｙ信号とｆｕｌｌ信号はｓｔａｔｅ信号から作り出される。初期状態では、ｓｔａｔｅ信号はＥｍｐｔｙを表し、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号とｒｅａｄ＿ｐｏｉｎｔｅｒ信号はともに０である。ｗｒｉｔｅ＿ｄａｔａ信号が１になると、記憶部１の０の位置に入力データが書き込まれ、同時に制御部２のｓｔａｔｅ信号はＨａｌｆ＿Ｆｕｌｌを示し、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号は１となる。以後、ｗｒｉｔｅ＿ｄａｔａ信号が１になるたびに、一連の入力データは記憶部１の１、２、…に書き込まれ、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号は２、３、…となる。もちろん、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号が記憶部１の最後の位置を示す場合は、次には０に変化する。一方、ｒｅａｄ＿ｄａｔａ信号が１になると、記憶部１の０の位置のデータが記憶部１から出力され、同時に制御部２のｒｅａｄ＿ｐｏｉｎｔｅｒ信号は１となる。以後、ｒｅａｄ＿ｄａｔａ信号が１になるたびに、記憶部１の１、２、…に書き込まれたデータが読み出され、ｒｅａｄ＿ｐｏｉｎｔｅｒ信号はｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号を追いかける形で２、３、…となる。もちろん、ｒｅａｄ＿ｐｏｉｎｔｅｒ信号も記憶部１の最後の位置を示す場合は、次には０に変化する。バッファがｅｍｐｔｙ状態かｆｕｌｌ状態にならない限り、ｓｔａｔｅ信号はＨａｌｆ＿Ｆｕｌｌを示している。ｓｔａｔｅ＝Ｈａｌｆ＿Ｆｕｌｌで、もし記憶部１から読み出しだけが発生し（つまり、ｗｒｉｔｅ＿ｄａｔａ信号が０で、かつｒｅａｄ＿ｄａｔａ信号が１）、かつｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号＝ｒｅａｄ＿ｐｏｉｎｔｅｒ信号＋１（つまり、この読み出しの後にｒｅａｄ＿ｐｏｉｎｔｅｒ信号がインクリメントされ、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号とｒｅａｄ＿ｐｏｉｎｔｅｒ信号が等しくなる）時に、ｓｔａｔｅ信号はＥｍｐｔｙに戻る。また、ｓｔａｔｅ＝Ｈａｌｆ＿Ｆｕｌｌで、もし記憶部１への書き込みだけが発生し（つまり、ｗｒｉｔｅ＿ｄａｔａ信号が１で、かつｒｅａｄ＿ｄａｔａ信号が０）、かつｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号＝ｒｅａｄ＿ｐｏｉｎｔｅｒ信号−１（つまり、この書き込みの後にｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号がインクリメントされ、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号とｒｅａｄ＿ｐｏｉｎｔｅｒ信号が等しくなる）時に、ｓｔａｔｅ信号はＦｕｌｌへ移行する。ｓｔａｔｅ＝Ｈａｌｆ＿Ｆｕｌｌで、それ以外の場合にはｓｔａｔｅ信号はＨａｌｆ＿Ｆｕｌｌのままである。ｓｔａｔｅ信号がＦｕｌｌを表す時には、ｒｅａｄ＿ｐｏｉｎｔｅｒ信号が０となり、記憶部１からデータが読み出されると、ｓｔａｔｅ信号はＨａｌｆ＿Ｆｕｌｌとなる。このように、制御部２はｒｅａｄ＿ｐｏｉｎｔｅｒ信号をｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号を追いかけるように変化させることにより、先入れ先出しを実現する。
【０００５】
また、図１１の下のブロック図は、上の状態遷移図や信号定義を回路の形に書き換えたもので、２２はｓｔａｔｅ信号やｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号、ｒｅａｄ＿ｐｏｉｎｔｅｒ信号を記憶するためのラッチ（フリップフロップ）回路で、現在のｓｔａｔｅ信号、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号、ｒｅａｄ＿ｐｏｉｎｔｅｒ信号と外部からのｗｒｉｔｅ＿ｄａｔａ信号、ｒｅａｄ＿ｄａｔａ信号から次のｓｔａｔｅ信号、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号、ｒｅａｄ＿ｐｏｉｎｔｅｒ信号（それぞれ、ｎｅｘｔ＿ｓｔａｔｅ信号、ｎｅｘｔ＿ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号、ｎｅｘｔ＿ｒｅａｄ＿ｐｏｉｎｔｅｒ信号）を計算する組み合わせ回路２２から成る。ラッチ（フリップフロップ）回路２１は組み合わせ回路２２からのｎｅｘｔ＿ｓｔａｔｅ信号、ｎｅｘｔ＿ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号、ｎｅｘｔ＿ｒｅａｄ＿ｐｏｉｎｔｅｒ信号をラッチすることで、ｓｔａｔｅ信号、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号、ｒｅａｄ＿ｐｏｉｎｔｅｒ信号を作り出す。
なお、図１０におけるＦＩＦＯ  ｓｔａｔｕｓは、図１１で示す、それぞれＦＩＦＯのｅｍｐｔｙとｆｕｌｌの状態を表すｅｍｐｔｙ＿ｓｉｇｎａｌ信号とｆｕｌｌ＿ｓｉｇｎａｌ信号に対応する。
【０００６】
図１２は、ＦＩＦＯバッファの記憶部１の内容と、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号とｒｅａｄ＿ｐｏｉｎｔｅｒ信号が示す記憶部１の位置をタイミングチャートともに示した図である。同図において、ＷＰはｗｒｉｔｅ＿ｐｏｉｎｔｅｒを表し、ＲＰはｒｅａｄ＿ｐｏｉｎｔｅｒを表すものとする。最初のｗｒｉｔｅ＿ｄａｔａ信号によって、入力データＡが記憶部１のＷＰが示す位置に書き込まれ、ＷＰが一つ進む。ｓｔａｔｅ信号はＥｍｐｔｙからＨａｌｆ＿Ｆｕｌｌに移行する。この時、ＲＰはデータＡが書き込まれた位置を示しているので、出力データとして、Ａが出力される。続くｗｒｉｔｅ＿ｄａｔａ信号で、入力データＢがＡの次の位置に書き込まれ、ＷＰはさらに一つ進む。この時には、ＲＰは変化しないので、出力データはＡのままである。この後のｒｅａｄ＿ｄａｔａ信号により、ＲＰが一つ進み、出力データはＢに更新される。この次のｗｒｉｔｅ＿ｄａｔａ信号で入力データＣが書き込まれ、ＷＰが進む。引き続くｒｅａｄ＿ｄａｔａ信号で、ＲＰが進み、出力データがＣとなり、最後のｒｅａｄ＿ｄａｔａ信号でＲＰが更新され、ｓｔａｔｅ信号はＥｍｐｔｙに戻る。同図から、データの先入れ先出しが実現されていることがわかる。
【０００７】
【特許文献１】
特開平６−２８８４０号公報。
【０００８】
【発明が解決しようとする課題】
しかしながら、上記従来例では次のような問題点がある。一連の入力データが有効なものでないかも知れないものが含まれていて、有効か否かがそれら入力の後に確定する場合には、それら無効なデータがＦＩＦＯバッファに記憶されてしまう。このような入力データの一例として、コリジョン（衝突）を利用するイーサネット（登録商標）の受信データが挙げられる。
【０００９】
イーサネット（登録商標）では同一のネットワーク上では、データを送信できるステーションは同時に一つである。しかしながら、送信するステーションは送信しようとする時点にネットワーク上が空いていれば、何の調停なしに送信を開始することを許し、複数のステーションが同時に送信する可能性がある。そのため、送信するステーションは複数の送信データによるコリジョン（衝突）を検出機能を有し、もし送信開始後に、コリジョンを検出したならばすぐに送信を中止し、あるランダムな期間を置いて、再送信する。イーサネット（登録商標）の規格を満たすネットワークでは、送信するステーションがコリジョンを検出して、送信を中止すれば、送信されるデータ量は必ず、６４オクテット（１オクテットは８ビットの情報量）未満となる。イーサネット（登録商標）の規格で最小パケット長を６４オクテットとすることで、受信するステーションは６４オクテット未満のパケットを受け取った場合は送信中にコリジョンが発生したものと判別でき、そのデータは無効とみなす。
【００１０】
このような受信データをＦＩＦＯバッファの入力とする場合、パケットの先頭から６４バイト受け取った時点で、初めてそのパケットのデータが有効であることがわかる。
【００１１】
このような場合、ＦＩＦＯバッファの前段にさらに何らかのバッファが必要となり、データが有効であることが確認できるまで、前段のバッファに格納し、有効と確定すれば、バッファからＦＩＦＯバッファに入力し、無効となれば前段のバッファの内容を捨てるという制御回路も必要となる。
【００１２】
本発明は上記従来例の問題点に鑑み、記憶部を制御する制御部を二重に持ち、不確かなデータの開始を示す不確定データ開始信号と、その後のデータ列が有効であったことを示すデータ有効信号と、その後のデータ列が無効であったことを示すデータ無効信号を利用し、二つの制御部の内部状態を適宜、相互に置きかえることにより、前段のバッファなしに、無効データをＦＩＦＯバッファから出力されることを避けることができるＦＩＦＯバッファ回路を提供することを目的とする。
【００１３】
【課題を解決するための手段】
本発明は上記目的を達成するために、ＦＩＦＯバッファ回路において、データを記憶する記憶部と、入力データを前期記憶部に書き込むことを知らせる書き込み信号の入力と、前期記憶部から書き込まれたデータを読み出すことを知らせる読み出し信号の入力と、有効であるか否かが不明であるデータの入力が開始されたことを示す不確定データ開始信号の入力と、有効であるか否かが不明であった入力データが有効であったことを示すデータ有効信号の入力と、有効であるか否かが不明であった入力データが無効であったことを示すデータ無効信号の入力と、前記データ有効信号から前記不明データ開始信号までの期間の前記書き込み信号と前記読み出し信号を入力し先入れ先出しのための内部状態を保持しそれを実現する第一の制御部と、すべての期間の前記書き込み信号と前記読み出し信号を入力し前記第一の制御部と同様の内部状態を保持する第二の制御部と、前記第一の制御部が前記記憶部のデータの読み出し位置を制御する手段と、前記第二の制御部が前記記憶部のデータの書き込み位置を制御する手段と、前記データ有効信号により前記第一の制御部の内部状態を前記第二の制御部の内部状態と同じ状態にする手段と、前記データ無効信号により前記第二の制御部の内部状態を前記第一の制御部の内部状態と同じ状態にする手段とを有することを特徴とする。
【００１４】
また、この発明の制御部の内部状態に、記憶部のすべての領域が書き込まれたデータで満たされている間にさらなる書き込みがあった場合のオーバーフローを含めば、無効データによるオーバーフローを無視することができることを特徴とする。
【００１５】
（作用）
本発明は上記構成により、前述したＦＩＦＯバッファの前段のバッファやそれらを制御する回路を不要となる。
【００１６】
【発明の実施の形態】
以下、図面を参照して本発明を説明する。図１は、本発明に係る情報処理装置の一実施例の概略構成を示すブロック図である。同図において、１はデータの内容を記憶する記憶部、３ａと３ｂはともに先入れ先出しのための制御を行う制御部（Ｗ）と制御部（Ｒ）、４は入力データが有効であることが確定しているデータに対する書き込み信号を生成する有効ライト生成部である。ｕｎｓｅｒｔａｉｎｔｙ信号は、有効であるか否かが不明であるデータの入力が開始されることを示す信号であり、ｖａｌｉｄ＿ｄａｔａ信号は有効であるか否かが不明であった入力データが有効であったことを示す信号、ｉｎｖａｌｉｄ＿ｄａｔａ信号は有効であるか否かが不明であった入力データが無効であったことを示す信号である。前に述べたイーサネット（登録商標）の例に当てはめると、ｕｎｓｅｒｔａｉｎｔｙ信号はパケットの先頭データに先駆けて（言い換えると、前のパケットの最後のデータを受けっとた後に）出力され、ｖａｌｉｄ＿ｄａｔａ信号はパケットの６４バイト目を受け取った時に出力され、ｉｎｖａｌｉｄ＿ｄａｔａ信号は６４バイト未満でパケットが終わった時に出力される。
【００１７】
図２は有効ライト生成部４を説明するための図である。有効ライト生成部４は有効であることが確定した入力データに対する書き込み信号であるｗｒｉｔｅ＿ｖａｌｉｄ＿ｄａｔａ信号を生成する部分で、ｖａｌｉｄ＿ｄａｔａ信号がアクティブになってからｕｎｃｅｒｔａｉｎｔｙ信号がアクティブなるまでの期間、ｗｒｉｔｅ＿ｄａｔａ信号を通過させ、それ以外の期間にはｗｒｉｔｅ＿ｄａｔａ信号をマスクすることにより、ｗｒｉｔｅ＿ｖａｌｉｄ＿ｄａｔａ信号を生成する簡単なブロックである。
【００１８】
図３は制御部（Ｗ）３ａのブロック図である。制御部（Ｗ）３ａは従来例での制御部２とほとんど同じであり、状態遷移図も省略している。３１は内部状態の次の状態を計算する組み合わせ回路で、組み合わせ回路２１と同じロジックである。３２はラッチ回路であり、これもラッチ回路２２と同じである。３３が新たに追加されたセレクタ回路である。制御部２と機能的に異なる点は、第一にｒｅａｄ＿ｐｏｉｎｔｅｒ（Ｗ）信号はもはや内部信号となり、外部へ出力されず、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ（Ｗ）信号だけが記憶部１と接続される。第二にｎｅｘｔ＿ｓｔａｔｅ（Ｗ）信号、ｎｅｘｔ＿ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ（Ｗ）信号、ｎｅｘｔ＿ｒｅａｄ＿ｐｏｉｎｔｅｒ（Ｗ）信号が制御部（Ｒ）３ｂに対して出力されている。第三に図示はされていないが、ｆｕｌｌ＿ｓｉｇｎａｌ信号のみがＦＩＦＯ  ｓｔａｔｕｓ（Ｗ）として入力ポート側に出力されている。最後に、最も大きく異なる点が組み合わせ回路３１の出力をそのまま、ラッチ回路３２に送らずに、セレクタ回路３３を設け、ｖａｌｉｄ＿ｄａｔａ信号がアクティブな時には、制御部（Ｒ）３ｂからのｎｅｘｔ＿ｓｔａｔｅ（Ｒ）信号、ｎｅｘｔ＿ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ（Ｒ）信号、ｎｅｘｔ＿ｒｅａｄ＿ｐｏｉｎｔｅｒ（Ｒ）信号をラッチ回路３２に送るようになっている点である。したがって、ｖａｌｉｄ＿ｄａｔａ信号がアクティブになると、制御部（Ｗ）３ａの内部状態は制御部（Ｒ）３ｂの内部状態に置き換えられる。
【００１９】
図４は制御部（Ｒ）３ｂのブロック図である。制御部（Ｒ）３ｂは従来例での制御部２とほとんど同じであり、状態遷移図も省略している。３１は内部状態の次の状態を計算する組み合わせ回路で、組み合わせ回路２１と同じロジックである。３２はラッチ回路であり、これもラッチ回路２２と同じである。３３が新たに追加されたセレクタ回路である。制御部２と機能的に異なる点は、第一にｗｒｉｔｅ＿ｐｏｉｎｔｅｒ（Ｒ）信号はもはや内部信号となり、外部へ出力されず、ｒｅａｄ＿ｐｏｉｎｔｅｒ（Ｒ）信号だけが記憶部１と接続される。第二にｎｅｘｔ＿ｓｔａｔｅ（Ｒ）信号、ｎｅｘｔ＿ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ（Ｒ）信号、ｎｅｘｔ＿ｒｅａｄ＿ｐｏｉｎｔｅｒ（Ｒ）信号が制御部（Ｗ）３ａに対して出力されている。第三に図示はされていないが、ｅｍｐｔｙ＿ｓｉｇｎａｌ信号のみがＦＩＦＯ  ｓｔａｔｕｓ（Ｒ）として出力ポート側に出力されている。最後に、最も大きく異なる点が組み合わせ回路３１の出力をそのまま、ラッチ回路３２に送らずに、セレクタ回路３３を設け、ｉｎｖａｌｉｄ＿ｄａｔａ信号がアクティブな時には、制御部（Ｗ）３ａからのｎｅｘｔ＿ｓｔａｔｅ（Ｗ）信号、ｎｅｘｔ＿ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ（Ｗ）信号、ｎｅｘｔ＿ｒｅａｄ＿ｐｏｉｎｔｅｒ（Ｗ）信号をラッチ回路３２に送るようになっている点である。したがって、ｉｎｖａｌｉｄ＿ｄａｔａ信号がアクティブになると、制御部（Ｒ）３ｂの内部状態は制御部（Ｗ）３ａの内部状態に置き換えられる。
【００２０】
図５は、ＦＩＦＯバッファの記憶部１の内容と、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ（Ｗ，Ｒ）信号とｒｅａｄ＿ｐｏｉｎｔｅｒ（Ｗ，Ｒ）信号が示す記憶部１の位置をタイミングチャートともに示した図である。同図において、ＷＰ（Ｗ）はｗｒｉｔｅ＿ｐｏｉｎｔｅｒ（Ｗ）信号が示す位置を、ＲＰ（Ｗ）はｒｅａｄ＿ｐｏｉｎｔｅｒ（Ｗ）信号が示す位置を、ＷＰ（Ｒ）はｗｒｉｔｅ＿ｐｏｉｎｔｅｒ（Ｒ）信号が示す位置を、ＲＰ（Ｒ）はｒｅａｄ＿ｐｏｉｎｔｅｒ（Ｒ）信号が示す位置を、それぞれ表すものとする。さらに、ＷＰ（ＷＲ）はｗｒｉｔｅ＿ｐｏｉｎｔｅｒ（Ｗ）信号とｗｒｉｔｅ＿ｐｏｉｎｔｅｒ（Ｒ）信号が同じ位置を示すことを表し、ＲＰ（ＷＲ）はｒｅａｄ＿ｐｏｉｎｔｅｒ（Ｗ）信号とｒｅａｄ＿ｐｏｉｎｔｅｒ（Ｒ）信号が同じ位置を示すことを表すものとする。同図で注意することは、記憶部１へのデータの書き込みは、ＷＰ（Ｗ）の位置に書き込まれ、記憶部１からのデータの読み出しは、ＲＰ（Ｒ）の位置から読み出されることである。ＲＰ（Ｗ）とＷＰ（Ｒ）はあくまでも、制御部（Ｗ）３ａと制御部（Ｒ）３ｂの内部信号である。
【００２１】
最初の状態はＦＩＦＯバッファがｅｍｐｔｙ状態で、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ（Ｗ）信号、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ（Ｒ）信号、ｒｅａｄ＿ｐｏｉｎｔｅｒ（Ｗ）信号、ｒｅａｄ＿ｐｏｉｎｔｅｒ（Ｒ）信号はすべて、記憶部１の同じ位置を示しているとする。
【００２２】
７番目のクロックで、有効なデータＡがｗｒｉｔｅ＿ｄａｔａ信号により、記憶部１のＷＰ（ＷＲ）の位置に書き込まれ、制御部（Ｗ）３ａはｗｒｉｔｅ＿ｄａｔａ信号によりＷＰ（Ｗ）を一つ進める。同時に、ｗｒｉｔｅ＿ｖａｌｉｄ＿ｄａｔａ信号もアクティブになるので、制御部（Ｒ）３ｂもＷＰ（Ｒ）を進める。よって、ＷＰ（Ｗ）とＷＰ（Ｒ）は同じ位置を示し、ｓｔａｔｅ（Ｗ）とｓｔａｔｅ（Ｒ）はＥｍｐｔｙからＨａｌｆ＿Ｆｕｌｌに移行する。
【００２３】
９番目のクロックで、ｃｅｒｔａｉｎｔｙ信号がアクティブになると、次からの入力データは無効となる可能性があり、有効ライト生成部４はｗｒｉｔｅ＿ｖａｌｉｄ＿ｄａｔａ信号をアクティブにしないようにする。したがって、１１番目のクロックのｗｒｉｔｅ＿ｄａｔａ信号がアクティブになっても、ｗｒｉｔｅ＿ｖａｌｉｄ＿ｄａｔａ信号はアクティブにならない。結果として、このｗｒｉｔｅ＿ｄａｔａ信号で、記憶部１には、Ｂが書き込まれ、ＷＰ（Ｗ）は進むが、ＷＰ（Ｒ）は変化しない。なお、Ｂ（  ）の記述はＢが無効になる可能性があることを表している。
【００２４】
１５番目のｒｅａｄ＿ｄａｔａ信号で、ＲＰ（Ｗ）とＲＰ（Ｒ）が進む。ここで、制御部（Ｒ）３ｂのｓｔａｔｅ（Ｒ）だけがＨａｌｆ＿ＦｕｌｌからＥｍｐｔｙに戻ることに注目する。記憶部１にはデータＢが書き込まれてはいるが、入力ポート側からは記憶部１にデータがないように見え、データＢを読み出すことはしない。
【００２５】
さらに、１９番目でもデータＣが記憶部１に書き込まれ、ＷＰ（Ｗ）が進むが、制御部（Ｒ）３ｂの状態は変化せず、Ｅｍｐｔｙのままである。この段階でも、入力ポートからのデータの読み出しはできない。
【００２６】
２３番目のクロックで、ｖａｌｉｄ＿ｄａｔａ信号がアクティブとなり、記憶部１にかきこまれたデータＢとＣが有効であったことが確定する。制御部（Ｒ）３ｂはｖａｌｉｄ＿ｄａｔａ信号のアクティブで、制御部（Ｗ）３ａの内部状態を自身の内部状態にコピーする。この時点で、制御部（Ｒ）３ｂのＷＰ（Ｒ）は一気にＷＰ（Ｗ）の位置まで移動し、ｓｔａｔｅ（Ｒ）がＨａｌｆ＿Ｆｕｌｌに移行する。したがって、入力ポート側からのデータの読み出しが可能となる。
【００２７】
２７番目と３１番目のクロックで、ｒｅａｄ＿ｄａｔａ信号をアクティブして、データＢとＣが読み出されている。この時点で、制御部（Ｗ）３ａと制御部（Ｒ）３ｂがともに、ｅｍｐｔｙ状態となる。
【００２８】
図６は図５と同様な図であり、異なる点は２３番目のクロックで、ｖａｌｉｄ＿ｄａｔａ信号がアクティブならずに、ｉｎｖａｌｉｄ＿ｄａｔａ信号がアクティブとなり、記憶部１に書き込まれたデータＢとＣが無効なデータであったところである。それ以前は図５と同じなので、２３番目のクロックから説明する。
【００２９】
２３番目のクロックで、ｉｎｖａｌｉｄ＿ｄａｔａ信号がアクティブになると、図５とは逆に、制御部（Ｗ）３ａが、制御部（Ｒ）３ｂの内部状態を自身の内部状態にコピーする。この時点で、制御部（Ｗ）３ａのＷＰ（Ｗ）はＷＰ（Ｒ）の位置まで戻され、ｓｔａｔｅ（Ｗ）がＨａｌｆ＿ＦｕｌｌからＥｍｐｔｙに移行する。
【００３０】
なお、Ｂ（ｘ）、Ｃ（ｘ）はデータＢ、Ｃが無効なデータであることを表す。
【００３１】
２７番目のクロックで、入力データＤが書き込まれる。ｃｕｒｔａｉｎｔｙ信号がアクティブとなっていないので、データＤは有効なデータである。書き込まれる記憶部１の位置は、以前データＢが書き込まれた位置となる。ｓｔａｔｅ（Ｗ）とｓｔａｔｅ（Ｒ）はＨａｌｆ＿Ｆｕｌｌに移行する。
【００３２】
３２番目のクロックのｒｅａｄ＿ｄａｔａ信号で、出力ポートからデータＤが読み出され、ｓｔａｔｅ（Ｗ）とｓｔａｔｅ（Ｒ）はＥｍｐｔｙに戻る。ここで、以前書き込んだデータＢが読み出されることはない。
【００３３】
これまで、説明した通り、制御部（Ｗ）３ａと制御部（Ｒ）３ｂは、ｃｕｒｔａｉｎｔｙ信号がアクティブになるまでは同じ内部状態を保つ。ｃｕｒｔａｉｎｔｙ信号がアクティブになってから、不確かなデータが書き込まれることにより、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号が変化するのは、制御部（Ｗ）３ａのみである。制御部（Ｒ）３ｂのｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号は不確かなデータが書き込まれる前の状態を保持し続ける。
【００３４】
ｖａｌｉｄ＿ｄａｔａ信号がアクティブとなり、それら不確かなデータが有効であった場合には、それらデータの書き込みを反映した状態を持つ制御部（Ｗ）３ａの内部状態を制御部（Ｒ）３ｂにコピーする。逆に、ｉｎｖａｌｉｄ＿ｄａｔａ信号がアクティブとなり、それら不確かなデータが無効であった場合には、それらデータが書き込まれる前の状態を持つ制御部（Ｒ）３ｂの内部状態を制御部（Ｗ）３ａにコピーする。出力ポート側（データの読み出し）は制御部（Ｒ）３ｂのＦＩＦＯ  ｓｔａｔｕｓ（ｅｍｐｔｙ＿ｓｉｇｎａｌ信号）を参照することで、書き込まれた不確かなデータが有効とわかるまで、読み出しを禁止できる。
【００３５】
図７は本発明に係る情報処理装置の第二の実施例の概略構成を示すブロック図である。記憶部１にデータを書き込む場合に、制御部（Ｗ）３ａの出力するｆｕｌｌ＿ｓｉｇｎａｌ信号を参照して、記憶部１がｆｕｌｌ状態でない時にだけ書き込まなければならない。さもなければ、書き込もうとするデータか、すでに書き込まれたデータが失われてしまう。しかしながら、データの書き込みを待たせられない場合も多く存在する。このような場合には、ｆｕｌｌ状態での書き込みが行われ、データを喪失した（オーバーフロー）ことを検出する必要がある。同図は、オーバーフローを検出し、それを制御部（Ｗ）３ａと制御部（Ｒ）３ｂの内部状態に追加した例である。制御部（Ｒ）３ｂからのオーバーフロー状態をｏｖｅｒｆｌｏｗ信号としている。制御部（Ｗ）３ａと制御部（Ｒ）３ｂとの間の信号にｎｅｘｔ＿ｏｖｅｒｆｌｏｗ（Ｗ）とｎｅｘｔ＿ｏｖｅｒｆｌｏｗ（Ｒ）が追加されている。
【００３６】
同図において、５は論理積回路であり、記憶部１がｆｕｌｌ状態の時の書き込みに対して、記憶部１内のデータを保護するために設けている。
【００３７】
オーバーフローの検出は制御部（Ｗ）３ａでは、ｓｔａｔｅ（Ｗ）がＦｕｌｌでｗｒｉｔｅ＿ｄａｔａ信号がアクティブになった時であり、制御部（Ｒ）３ｂでは、ｓｔａｔｅ（Ｒ）がＦｕｌｌでｗｒｉｔｅ＿ｖａｌｉｄ＿ｄａｔａ信号がアクティブになった時である。
【００３８】
制御部（Ｒ）３ｂでのオーバーフローの検出は有効データの書き込み時（ｗｒｉｔｅ＿ｖａｌｉｄ＿ｄａｔａ信号のアクティブ時）のオーバーフローであり、その有効データは失われ、即座に、ｏｖｅｒｆｌｏｗ信号がアクティブとなる。
【００３９】
制御部（Ｗ）３ａでのオーバーフローの検出は、その時の書き込みデータが不確かなデータである場合には、制御部（Ｒ）３ｂでのオーバーフローの検出されずに、制御部（Ｗ）３ａの内部状態として保持されるだけである。ただし、その不確かなデータは失われている。
【００４０】
もし、この状態で、ｖａｌｉｄ＿ｄａｔａ信号がアクティブになれば、制御部（Ｗ）３ａの内部状態が制御部（Ｒ）３ｂへコピーされ、ｏｖｅｒｆｌｏｗ信号がアクティブとなる。失われた不確かなデータは有効なデータであったので、これは正しい動作である。
【００４１】
一方、ｉｎｖａｌｉｄ＿ｄａｔａ信号がアクティブになった場合、制御部（Ｒ）３ｂの内部状態が制御部（Ｗ）３ａへコピーされる。制御部（Ｒ）３ｂでのオーバーフローの検出されていないので、制御部（Ｗ）３ａで保持されていたオーバーフローの検出はクリアされる。これは、失われた不確かなデータは元々無効なデータであったので、オーバーフローとして扱わないのは、望ましい動作である。
【００４２】
この説明のように、図７の例では、無効なデータによるオーバーフローは無視できるようにでき、その後の有効データも正常に扱うことができる。
【００４３】
今までの説明では、制御部（Ｗ）３ａと制御部（Ｒ）３ｂのｒｅａｄ＿ｐｏｉｎｔｅｒ信号は常に同一であり、制御部（Ｗ）３ａのｒｅａｄ＿ｐｏｉｎｔｅｒ信号は必要ない例であったが、制御部（Ｗ）３ａのｒｅａｄ＿ｐｏｉｎｔｅｒ信号が必要な場合もある。例を挙げて説明しよう。ＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）の設計では、設計が正しく行われたかを検証するために、シミュレーションが行われる。ＡＳＩＣ内で、ＦＩＦＯバッファを実装するために記憶部１として、ＳＲＡＭを用いた場合、ＳＲＡＭの内部構成によっては、同一クロックで、リードアドレスとライトアドレスを等しくして、ライト動作をさせた場合、シミュレーションではリードデータが不定となり、その不定が周辺のロジックへ伝播するために、シミュレーションが実際の動作と異なる場合が出てくる。これを避けるためには、リードアドレスとライトアドレスを常に、異なる値にしなければならない。
【００４４】
図８はリードアドレスとライトアドレスを一致させないようにした場合の制御部３のｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号とｒｅａｄ＿ｐｏｉｎｔｅｒ信号の設計例で、状態遷移図（前の例と全く同じ）組み合わせ回路３１のロジックを示す。
【００４５】
Ｈａｌｆ＿Ｆｕｌｌ状態から、ｒｅａｄ＿ｄａｔａ  ＝  ’１’で、Ｅｍｐｔｙ状態に移行する際、前の例ではｒｅａｄ＿ｐｏｉｎｔｅｒ信号をインクリメントし、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号と同じ値としてたが、この例では、Ｈａｌｆ＿Ｆｕｌｌ状態から、ｒｅａｄ＿ｄａｔａ  ＝  ’１’で、Ｅｍｐｔｙ状態に移行する際に、ｒｅａｄ＿ｐｏｉｎｔｅｒ信号をインクリメントしない。その代わりに、Ｅｍｐｔｙ状態から、ｗｒｉｔｅ＿ｄａｔａ  ＝  ’１’で、Ｈａｌｆ＿Ｆｕｌｌ状態に移行する際、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号とｒｅａｄ＿ｐｏｉｎｔｅｒ信号を同時にインクリメントする。
【００４６】
Ｈａｌｆ＿Ｆｕｌｌ状態から、ｗｒｉｔｅ＿ｄａｔａ  ＝  ’１’で、Ｆｕｌｌ状態に移行する際、前の例ではｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号をインクリメントし、ｒｅａｄ＿ｐｏｉｎｔｅｒ信号と同じ値としてたが、この例では、Ｈａｌｆ＿Ｆｕｌｌ状態から、ｗｒｉｔｅ＿ｄａｔａ  ＝  ’１’で、Ｆｕｌｌ状態に移行する際に、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号をインクリメントしない。その代わりに、Ｆｕｌｌ状態から、ｒｅａｄ＿ｄａｔａ  ＝  ’１’で、Ｈａｌｆ＿Ｆｕｌｌ状態に移行する際、ｗｒｉｔｅ＿ｐｏｉｎｔｅｒ信号とｒｅａｄ＿ｐｏｉｎｔｅｒ信号を同時にインクリメントする。
【００４７】
図９は前の例における図６に対応する図である。記憶部１に入力されるＷＰ（Ｗ）とＲＰ（Ｒ）はつめに異なる位置を差している。同図の通り、１５番目のクロックのデータの読み出しで、制御部（Ｗ）３ａと制御部（Ｒ）３ｂのｒｅａｄ＿ｐｏｉｎｔｅｒ信号は異なる値となり、さらに、２３番目のクロックのｉｎｖａｌｉｄ＿ｄａｔａ信号のアクティブで、制御部（Ｒ）３ｂのｒｅａｄ＿ｐｏｉｎｔｅｒ信号を含む内部状態が制御部（Ｗ）３ａへコピーされる。したがって、この場合には、制御部（Ｗ）３ａのｒｅａｄ＿ｐｏｉｎｔｅｒ信号は必要となる。
【００４８】
【発明の効果】
以上説明したように本発明は、ＦＩＦＯバッファの入力データとして、無効である可能性があるものが含まれ、それらのデータが有効であるか否かが後に確定するような場合における従来必要であったＦＩＦＯバッファの入力の前段の追加のバッファとそれらの制御回路が不要となるので、全体のバッファの容量を減らすことができ、回路も単純な構成にできる。
【図面の簡単な説明】
【図１】本発明に係るディジタル回路の一実施例の概略構成を示すブロック図である。
【図２】図１の有効ライト生成部を説明するための図である。
【図３】図１の制御部（Ｗ）３ａのブロック図である。
【図４】図１の制御部（Ｒ）３ｂのブロック図である。
【図５】図１におけるＦＩＦＯバッファの先入れ先出し動作時の主要信号を示すタイミングチャートである（不確かな入力データが後に有効であると確定した場合）。
【図６】図１におけるＦＩＦＯバッファの先入れ先出し動作時の主要信号を示すタイミングチャートである（不確かな入力データが後に無効であると確定した場合）。
【図７】第２の実施例の概略構成を示すブロック図である。
【図８】別の制御部の実装例を説明するための図である。
【図９】別の制御部の実装例におけるＦＩＦＯバッファの先入れ先出し動作時の主要信号を示すタイミングチャートである。
【図１０】従来のＦＩＦＯバッファの概略構成を示すブロック図である。
【図１１】図１０の制御部を説明するための図である。
【図１２】図１０におけるＦＩＦＯバッファの先入れ先出し動作時の主要信号を示すタイミングチャートである。
【符号の説明】
１  記憶部
２  制御部
３ａ  制御部（Ｗ）
３ｂ  制御部（Ｒ）
４  有効ライト生成部
５  論理和回路
２１  組み合わせ回路
２２  ラッチ（フリップフロップ）部
３１  組み合わせ回路
３２  ラッチ（フリップフロップ）部
３３  セレクタ回路
【図１】
2004362286.tif 000003
【図２】
2004362286.tif 000004
【図３】
2004362286.tif 000005
【図４】
2004362286.tif 000006
【図５】
2004362286.tif 000007
【図６】
2004362286.tif 000008
【図７】
2004362286.tif 000009
【図８】
2004362286.tif 000010
【図９】
2004362286.tif 000011
【図１０】
2004362286.tif 000012
【図１１】
2004362286.tif 000013
【図１２】
2004362286.tif 000014