"有効バイト位置を示す2値情報バイトイネーブルに応じたライトデータをライト要求に応答してFIFOに書き込み、リード要求に応答してリードデータを前記FIFOから読み出し前記バイトイネーブルを添付するデータ転送装置において、前記FIFOの最新のライトアドレスに書き込まれているデータの前記バイトイネーブルを保持するライト用バイトイネーブル保持回路と、前記FIFOの最新のライトアドレスに書き込まれているデータの前記バイトイネーブル、または該バイトイネーブルと1タイミング前の自保持内容との論理和、または1タイミング前の自保持内容を保持するリード用バイトイネーブル保持回路と、前記リードデータの前記バイトイネーブルを解読して前記FIFOのライトアドレスとリードアドレスが一致する時に1ワード未満のバイトイネーブルで読み出したことを記憶し、1ワード分に達した位置まで読み出したときに消去されるバイト読出し判定フラグと、前記バイト読出し判定フラグがセットされているときは前記リード用バイトイネーブル保持回路が保持する前記バイトイネーブルを選択し、また前記バイト読出し判定フラグがリセットされていて、かつ前記FIFOのライトアドレスとリードアドレスが一致するときは前記ライト用バイトイネーブル保持回路が保持する前記バイトイネーブルを選択し、また前記バイト読出し判定フラグがリセットされていて、かつ前記FIFOのライトアドレスとリードアドレスが一致しないときは全バイト読出しを示す前記バイトイネーブルを選択し、それぞれ前記リードデータの前記バイトイネーブルとするセレクタとを設けたことを特徴とするデータ転送装置。前記ライト用バイトイネーブル保持回路が保持している前記バイトイネーブルにより、前記FIFOが初期状態または前記ライトデータが1ワード分に達したか、否かの判定結果を出力するライト用バイトイネーブル判定回路と、前記ライト要求があり前記FIFOが初期状態または前記ライトデータが1ワード分に達したときは前記ライトデータの前記バイトイネーブルを選択し、また前記ライト要求があり前記ライト用バイトイネーブル判定回路における判定結果が否のときは前記ライトデータの前記バイトイネーブルと前記ライト用バイトイネーブル保持回路の保持内容との論理和を選択し、前記ライト用バイトイネーブル保持回路へ出力するセレクタとを有することを特徴とする請求項1に記載のデータ転送装置。前記セレクタの出力を解読して前記ライトデータが1ワード分に達することを検出するデコーダと、前記最新のライトアドレスを指定し前記検出によりカウントアップするライト用アドレスカウンタとを有することを特徴とする請求項2に記載のデータ転送装置。前記リード用バイトイネーブル保持回路が保持している前記バイトイネーブルにより、前記FIFOが初期状態または前記リードデータが1ワード分に達したか、否かの判定結果を出力するリード用バイトイネーブル判定回路と、前記ライトアドレスと前記リードアドレスが一致しないときは前記リード用バイトイネーブル保持回路が保持している前記バイトイネーブル、一方、前記ライトアドレスと前記リードアドレスが一致し、かつ、前記リード要求があるときまたは前記リード要求がなく、かつ、前記FIFOが初期状態または前記リードデータが1ワード分に達したときは前記ライトデータの前記バイトイネーブル、前記ライトアドレスと前記リードアドレスが一致し、かつ、前記リード要求がなく、かつ、前記リード用バイトイネーブル判定回路における判定結果が否であるときは前記ライトデータの前記バイトイネーブルと前記リード用バイトイネーブル保持回路が保持している前記バイトイネーブルとの論理和を選択するセレクタとを有することを特徴とする請求項1に記載のデータ転送装置。前記FIFOから1ワード分のリードデータが読み出されたことを検出するデコーダと、前記リードデータのアドレスを示し前記検出により1更新されるリード用アドレスカウンタとを有することを特徴とする請求項4に記載のデータ転送装置。前記ライト用アドレスカウンタの保持内容と前記リード用アドレスカウンタの保持内容を比較するアドレス比較器を有し、前記比較の結果によりアドレスが一致し、かつ前記ライト要求がなくて前記リード要求があるとき、前記FIFOは空であることを示すEMPTY信号を出力するメモリEMPTYフラグを有することを特徴とする請求項5に記載のデータ転送装置。解決しようとする問題点は、バイト単位のデータ転送を実現するには、FIFO等の使用するハードウェアが大規模になることである。本発明は、1ワード未満のライト/リードを小規模な回路で実現可能とするため、有効バイト位置を示すイネーブルデータをライト側とリード側のレジスタで管理し、選択してリードデータに付与することを最も主要な特徴とする。本発明のデータ転送装置は、イネーブルデータをライト側とリード側それぞれのレジスタで管理し、リード時に選択してリードデータに付与するという構成を採用したため、FIFOのバイト幅に合わせて回路構成論理を変更する必要が無いので、バイト単位のライト/リード動作が1ワード以下のバイト幅を持つFIFOを使用しても実現できるという利点がある。従って、1ワードのバイト幅を拡張したFIFOを使用する場合であっても、バイトイネーブルに関連する回路のみを拡張すれば、同じ回路構成論理で足りるため、ゲート規模の増加も少なくて済む。本発明のデータ転送装置は、有効バイト位置を示す2値情報バイトイネーブルに応じたライトデータをライト要求に応答してFIFOに書き込み、リード要求に応答してリードデータをFIFOから読み出し、バイトイネーブルを添付する。ライト側には、FIFOの最新のライトアドレスに書き込まれているデータのバイトイネーブルを保持するライト用バイトイネーブル保持回路を設け、リード側には、FIFOの最新のライトアドレスに書き込まれているデータのバイトイネーブル、または該バイトイネーブルと1タイミング前の自保持内容との論理和、または1タイミング前の自保持内容を保持するリード用バイトイネーブル保持回路を設ける。リード側には、更に、バイト読出し判定フラグとリードデータ用のセレクタとを設ける。バイト読出し判定フラグは、リードデータのバイトイネーブルを解読してFIFOのライトアドレスとリードアドレスが一致する時に1ワード未満のバイトイネーブルで読み出したことを記憶し、1ワード分に達した位置まで読み出したときに消去される。セレクタは、バイト読出し判定フラグがセットされているときはリード用バイトイネーブル保持回路が保持するバイトイネーブルを選択し、またバイト読出し判定フラグがリセットされていて、かつFIFOのライトアドレスとリードアドレスが一致するときはライト用バイトイネーブル保持回路が保持するバイトイネーブルを選択し、バイト読出し判定フラグがリセットされていて、かつFIFOのライトアドレスとリードアドレスが一致しないときは全バイト読出しを示すバイトイネーブルを選択し、それぞれリードデータのバイトイネーブルとする。以下、本発明の実施例について図面を参照しながら説明する。図1は、本発明のデータ転送装置の一実施例を示すブロック図である。このデータ転送装置は、ライトREQが入力すると、イネーブルデータライトBEが示す書込みバイト位置のライトDATAがFIFO40へ書き込まれ、リードREQが入力すると、リードDATAをFIFO40から読み出し、読出しバイト位置を示すイネーブルデータリードBEを出力する。ライトBEとリードBEは2値情報で指定される。FIFO40は、1ワードが複数バイトから成るデータを記憶する先入れ先出しメモリであって、複数バイト幅のライトデータIFおよび複数バイト幅のリードデータIFを有する。なお、メモリEMPTYはFIFO40に記憶されているデータが無いことを示す。また、以下の説明では、FIFO40は4バイト幅のワードを格納するものとする。1書込み系の構成先ず、図1の左側に示されている書込み系について説明する。書込み系は、ゲート回路401、ライト用アドレスカウンタ12、ライト用バイトイネーブル保持回路10、ライト用バイトイネーブル判定回路11、OR回路102、セレクタ103、デコーダ104およびAND回路101から成る。ゲート回路401は、ライトDATAの内のライトBEが指定するバイト有効バイトのみをWDATAとしてFIFO40へ入力する。WDATAは、ライトREQWREQの1アサートと同時に、その時にライト用アドレスカウンタ12が出力するFIFO40のライトアドレスWADDが示すメモリエリアへ格納される。ライト用アドレスカウンタ12は、FIFO40における1ワードを構成している全バイトへの書込みが行なわれると、1更新されて次のWDATAは1更新されたWADDに格納される。即ち、ライト用アドレスカウンタ12は、次のタイミングでWDATAを書き込むべきWADDを指定する。ライト用バイトイネーブル保持回路10は、FIFO40の最新のWADDに書き込まれているWDATAの有効バイト位置を2値情報により保持する。例えば、1ワードが4バイトから成るので、有効バイトが1バイト目のみなら2値情報は0001、有効バイトが1~3バイト目なら2値情報は0111となる。ライト用バイトイネーブル判定回路11は、ライト用バイトイネーブル保持回路10が保持している2値情報により、初期状態上例では0000であるか、またはWADDに書き込まれたデータが1ワード分に達した上例では1111か、ということと、FIFO40に書き込まれたデータが1ワード未満である上例では0001、0011または0111か、ということとの判定結果前者なら0、後者なら1を出力する。OR回路102は、ライトBEとライト用バイトイネーブル保持回路10が保持している2値情報の論理和を出力する。つまり、現状の有効バイト位置に、新規入力のライトBEを加えるのである。セレクタ103は、ライト用バイトイネーブル判定回路11における判定結果をセレクト信号とし、ライトBEまたはOR回路102の出力を選択してライト用バイトイネーブル保持回路10へ出力する。デコーダ104は、セレクタ103の出力を解読して、これからFIFO40に書き込むWDATAにより、FIFO40のそのアドレスに1ワードセレクタ103の出力が1xxxに達することを検出すると1アサート状態となる。AND回路101は、ライトREQとデコーダ104のとの論理積により、ライト用アドレスカウンタ12を1更新するためのイネーブル信号ENを1アサートする。図2は、ライト用バイトイネーブル保持回路10を設定するためのセレクタ103の真理値表を示す。ライト用バイトイネーブル保持回路10は、ライト用バイトイネーブル判定回路11の出力が0ならライトBEを格納しケース1、ライト用バイトイネーブル判定回路11の出力が1ならライトBEとライト用バイトイネーブル保持回路10が保持している2値情報を論理ORして格納するケース2。この時、ライト用バイトイネーブル保持回路10に格納される値は、初期値0000または1ワード1111、1ワード未満の場合はLSB側またはMSB側から1アサートし論理ORして格納するので0001、0011、0111または1000、1100、1110の全5通りとなる。図3は、ライト用バイトイネーブル判定回路11の真理値表を示す。ライト用バイトイネーブル判定回路11は、ライト用バイトイネーブル保持回路10の出力が0000または1xxx、すなわち初期値または1ワード分のバイト数の書込みがされている時は0を出力し、ライト用バイトイネーブル保持回路10の出力が0000または1xxx以外、すなわち1ワード未満のバイト数のライトである時は1を出力する。ここで、Xはdontcareであることを示している。図4は、デコーダ104の真理値表を示す。デコーダ104は、セレクタ103の出力が1xxxなら1を出力し、これ以外なら0を出力する。また、図5は、ライト用アドレスカウンタ12の真理値表を示す。ライト用アドレスカウンタ12は、AND回路101を介してライトREQが1をアサートし、かつ、デコーダ104の出力が1、すなわちライト動作時に1ワード分のバイトイネーブルに達した時のみ1カウント更新する。2書込み系の動作図6および図7は、以上に説明した書込み系の動作を例示するタイムチャートである。図6は、ライトDATAを1バイト単位に順次にFIFO40へ書き込んでいくときの各回路の状態遷移を示している。また、図7は、ライトDATAを1~4バイト単位に順次にFIFO40へ書き込んでいくときの各回路の状態遷移を示している。ライトBEは4ビットから成り、1をアサートしているビットの位置がライトDATAの有効バイトの位置に当る。当初、アドレスカウンタ12は0、ライト用イネーブル保持回路10は0000を保持しているものとする。ライトBEは4ビット未満が1アサートの場合、例えば、LSB側から1をアサートし、次のライトのタイミングでは、前のライトタイミングで1アサートしたビットは0としMSB側まで1をアサートしたら再びLSB側を1にアサートすることを許可する。これは、1ワードを構成している全バイトへの書込みが行なわれた後で、次アドレスへの書込みを行なうようにするためである。なお、ライトBEへの1アサートの方向を上記とは逆に、MSB側からLSB側に向けて行うようにしても差し支えない。211バイト書込み動作図6では、ライトDATA01~07を7回に亘って連続して書き込んでいる。タイミング10まで1アサートが持続するライトREQが立ち上がるタイミング3では、ライトBE0001を伴ったライトDATA01が入力する。即ち、FIFO40のWADD0の1バイト目にライトDATA01を書き込むための動作が始まる。ライト用イネーブル判定回路11は0を出力しているので、セレクタはライトBE0001を選択する図2のケース1。しかし、ライト用イネーブル保持回路10が0001を保持するようになるためは、次のタイミングを待つ必要がある。タイミング4において、ライトBE0010を伴ったライトDATA02が入力する。ライトDATA01のFIFO40のWADD0への書込みが完了し、WADD0の2バイト目にライトDATA02を書き込むための動作が始まる。ライト用イネーブル保持回路10が0001を保持しているので、ライト用イネーブル判定回路11は1アサートし図3参照、セレクタ103はOR回路102の出力0011を選択する図2のケース2。ライト用イネーブル保持回路10が0011を保持するのは次のタイミングにおいてである。タイミング5において、ライトBE0100を伴ったライトDATA03が入力する。ライトDATA02のFIFO40のWADD0への書込みが完了し、WADD0の3バイト目にライトDATA03を書き込むための動作が始まる。ライト用イネーブル保持回路10が0011を保持しているので、ライト用イネーブル判定回路11は1アサートし図3参照、セレクタ103はOR回路102の出力0111を選択する図2のケース2。ライト用イネーブル保持回路10が0111を保持するのは次のタイミングにおいてである。タイミング6において、ライトBE1000を伴ったライトDATA04が入力する。ライトDATA03のFIFO40のWADD0への書込みが完了し、WADD0の4バイト目にライトDATA04を書き込むための動作が始まる。ライト用イネーブル保持回路10が0111を保持しているので、ライト用イネーブル判定回路11は1アサートし図3参照、セレクタ103はOR回路102の出力1111を選択する図2のケース2。ライト用イネーブル保持回路10が1111を保持するのは次のタイミングにおいてである。なお、この場合、デコーダ104は1を出力する図4参照。タイミング7において、ライトBE0001を伴ったライトDATA05が入力する。ライトDATA04のFIFO40のWADD0への書込みが完了し、FIFO40の1バイト目にライトDATA05を書き込むための動作が始まる。デコーダ104が1を出力しているので、ライト用アドレスカウンタ12が1更新されて図5参照、1となるため、ライトDATA05の書込みは、WADD1に対して行なわれる。ライト用イネーブル保持回路10が1111を保持しているので、ライト用イネーブル判定回路11は0アサートし図3参照、セレクタ103はライトBE0001を選択する図2のケース1。ライト用イネーブル保持回路10が0001を保持するのは次のタイミングにおいてである。タイミング8において、ライトBE0010を伴ったライトDATA06が入力する。ライトDATA05のFIFO40のWADD1への書込みが完了し、FIFO40のWADD1の2バイト目にライトDATA06を書き込むための動作が始まる。ライト用イネーブル保持回路10が0001を保持しているので、ライト用イネーブル判定回路11は1アサートし図3参照、セレクタ103はOR回路102の出力0011を選択する図2のケース2。ライト用イネーブル保持回路10が0011を保持するのは次のタイミングにおいてである。タイミング9において、ライトBE0100を伴ったライトDATA07が入力する。ライトDATA06のFIFO40のWADD1への書込みが完了し、これでFIFO40のアドレス0の4バイト全部がライトDATAで埋まったことになる。FIFO40のWADD1の3バイト目にライトDATA07を書き込むための動作が始まる。ライト用イネーブル保持回路10が0011を保持しているので、ライト用イネーブル判定回路11は1アサートし図3参照、セレクタ103はOR回路102の出力0111を選択する図2のケース2。ライト用イネーブル保持回路10が0111を保持するのは次のタイミングにおいてである。なお、タイミング10以降は、ライトREQが0されているため、タイミング9における現状を維持する。22アトランダム書込み動作図6は、1バイト書込みを繰り返す単純な書込みパターンを示したが、図7では、より複雑な書込みパターンを提示する。即ち、アトランダムな書込みパターンの一例として、2回の1ワード幅書込みに続いて、2回の2バイト書込み、1回の1バイト書込み、2回の3バイト書込みを順次に行う態様を提示する。図7において、タイミング10まで1アサートが持続するライトREQが立ち上がるタイミング3では、ライトBE1111を伴ったライトDATA01~04が入力する。即ち、FIFO40のWADD0の1~4バイト目にライトDATA01~04を書き込むための動作が始まる。ライト用イネーブル保持回路10が0000を保持しているので、ライト用イネーブル判定回路11は0アサートし図3参照、セレクタ103はライトBE1111を選択する図2のケース1。しかし、ライト用イネーブル保持回路10が1111を保持するようになるためは、次のタイミングを待つ必要がある。なお、この場合、デコーダ104が1を出力する。タイミング4において、ライトBE1111を伴ったライトDATA05~08が入力する。デコーダ104が1を出力しているので、ライト用アドレスカウンタ12が1更新されて1となるため図5参照、FIFO40のWADD1の1~4バイト目にライトDATA05~08を書き込むための動作が始まる。ライト用イネーブル保持回路10が1111を保持しているので、ライト用イネーブル判定回路11は0アサートし図3参照、セレクタ103はライトBE1111を選択する図2のケース1。ライト用イネーブル保持回路10は次のタイミングにおいても引き続き1111を保持する。この場合も引き続き、デコーダ104が1を出力する。タイミング5において、ライトBE0011を伴ったライトDATA0910が入力する。デコーダ104が1を出力しているので、ライト用アドレスカウンタ12が1更新されて2となるため図5参照、FIFO40のWADD2の1~2バイト目にライトDATA0910を書き込むための動作が始まる。ライト用イネーブル保持回路10が1111を保持しているので、ライト用イネーブル判定回路11は0アサートし図3参照、セレクタ103はライトBE0011を選択する図2のケース1。ライト用イネーブル保持回路10は次のタイミングにおいて0011を保持する。この場合、デコーダ104は0を出力する。タイミング6において、ライトBE1100を伴ったライトDATA1112が入力する。デコーダ104が0を出力しているので、ライト用アドレスカウンタ121更新されず、2のままであるため図5参照、FIFO40のWADD2の3~4バイト目にライトDATA1112を書き込むための動作が始まる。ライト用イネーブル保持回路10が0011を保持しているので、ライト用イネーブル判定回路11は1アサートし図3参照、セレクタ103はOR回路102出力1111を選択する図2のケース2。ライト用イネーブル保持回路10は次のタイミングにおいて1111を保持する。この場合、デコーダ104は1を出力する。タイミング7において、ライトBE0001を伴ったライトDATA13が入力する。デコーダ104が1を出力しているので、ライト用アドレスカウンタ12が1更新されて3となるため図5参照、FIFO40のWADD3の1バイト目にライトDATA13を書き込むための動作が始まる。ライト用イネーブル保持回路10が1111を保持しているので、ライト用イネーブル判定回路11は0アサートし図3参照、セレクタ103はライトBE0001を選択する図2のケース1。ライト用イネーブル保持回路10は次のタイミングにおいて0001を保持する。この場合、デコーダ104は1を出力しない。タイミング8において、ライトBE1110を伴ったライトDATA14~16が入力する。デコーダ104が0を出力しているので、ライト用アドレスカウンタ121更新されず、3のままであるため図5参照、FIFO40のWADD3の2~4バイト目にライトDATA14~16を書き込むための動作が始まる。ライト用イネーブル保持回路10が0001を保持しているので、ライト用イネーブル判定回路11は1アサートし図3参照、セレクタ103はOR回路102出力1111を選択する図2のケース1。この場合、デコーダ104は1を出力する。タイミング9において、ライトBE0111を伴ったライトDATA17~19が入力する。デコーダ104が1を出力しているので、ライト用アドレスカウンタ12が1更新されて4となるため図5参照、FIFO40のWADD4の1~3バイト目にライトDATA17~19を書き込むための動作が始まる。ライト用イネーブル保持回路10が1111を保持しているので、ライト用イネーブル判定回路11は0アサートし図3参照、セレクタ103はライトBE0111を選択する図2のケース1。ライト用イネーブル保持回路10は次のタイミングにおいて0111を保持する。この場合、デコーダ104は1を出力しない。なお、タイミング10以降は、ライトREQが0されているため、タイミング9における現状を維持する。以上の一連の動作から、1ワード未満のライト動作は、FIFOアドレスをホールド状態にしたまま1バイト単位でFIFO40にデータを格納し、1ワードに達したらFIFOアドレスを更新し、ライトDATAをFIFO40の1ワード単位でアラインしていくことが分かる。3読出し系の構成次に、図1の右側に示されている読出し系について、アドレス比較器50およびメモリEMPTYフラグ60を含めて説明する。リードREQRREQの1アサート時に、FIFO40のリードアドレスRADDからリードDATARDATAが読み出される。このとき、リードDATAの内、リードBEで指定されるバイトが有効である。読出し系は、リード用アドレスカウンタ22、デコーダ204、AND回路201、アドレス比較器30、リード用バイトイネーブル保持回路20、リード用バイトイネーブル判定回路21、OR回路202、セレクタ203、AND回路501、AND回路502、バイト読出し判定フラグ50およびセレクタ503で構成されている。リード用アドレスカウンタ22は、RDATAのRADDを示し、FIFO40から1ワード分のRDATAが読み出されると、1更新される。即ち、デコーダ204はリードBEの4バイト目が1なら1アサートし、AND回路201は、リードREQとデコーダ204の1アサート状態によりリード用アドレスカウンタ22を1更新するためのイネーブル信号ENを1アサートする。アドレス比較器30は、ライト用アドレスカウンタ12の出力とリード用アドレスカウンタ22の出力を比較し、これら2つのカウンタの出力の値が一致した時は1を出力し、不一致の時は0を出力する。なお、2つのカウンタの間にはキャリーフラグが設けられていて、カウンタが最大値を超えた後、2つのカウンタの関係がフリーランにならないように制御している。AND回路601は、アドレス比較器30における比較の結果により2つのカウンタの出力の値が一致し、かつライトREQがなくリードREQがあるときにメモリEMPTYフラグ60をセットする。即ち、メモリEMPTYフラグ60は、FIFO40に保持されているデータが空になると1にアサートするEMPTY信号を出力し、ライトREQがあるとリセットされる。リード用バイトイネーブル保持回路20は、ライトBE、ライトBEとリード用バイトイネーブル保持回路20の出力との論理和またはリード用バイトイネーブル保持回路20の出力のいずれかを保持する。リード用バイトイネーブル判定回路21は、リード用バイトイネーブル保持回路20が保持している2値情報により、初期状態であるか、または読み出したデータが1ワード分のデータに達したかということと、1ワード未満であるかということとの判定結果前者なら0、後者なら1をアサートする。OR回路202は、ライトBEとリード用バイトイネーブル保持回路20が保持している2値情報の論理和を出力する。つまり、現状のリード用バイトイネーブル保持回路20の出力に、新規入力のライトBEを加えるのである。セレクタ203は、ライトREQ、リードREQ、アドレス比較器30の出力およびリード用バイトイネーブル判定回路21の出力をセレクト信号とし、ライトBE、またはOR回路202の出力、またはリード用バイトイネーブル保持回路20の出力のいずれかを選択してリード用バイトイネーブル保持回路20へ出力する。AND回路501は、リードREQが1アサートで、かつアドレス比較器30の出力が1で、かつデコーダ204の出力が0即ちバイト読出しのときに、バイト読出し判定フラグ50をセットする。AND回路502は、リードREQが1アサートで、かつデコーダ204の出力が1、即ち1ワード分に達した位置まで読み出したときはバイト読出し判定フラグ50をリセットする。バイト読出し判定フラグ50は、ライト用バイトイネーブル保持回路10またはリード用バイトイネーブル保持回路20に保持されているバイトイネーブルを選択するために使用される。セレクタ503は、バイト読出し判定フラグ50の出力と、リードREQと、アドレス比較器30の出力をセレクト信号とし、All0の値またはリード用バイトイネーブル保持回路10の値またはリード用バイトイネーブル保持回路20の値の値またはAll1の値を選択してリードBEとして出力する。図8は、リード用バイトイネーブル保持回路20を設定するためのセレクタ203の真理値表を示す。セレクタ203は、アドレス比較器30の出力が0ならリード用バイトイネーブル保持回路20の出力を格納ホールドするケース2。一方、アドレス比較器30の出力が1で、かつライトREQとリードREQが1ならライトBEの値を選択するケース3。また、アドレス比較器30の出力が1で、かつライトREQが1で、かつリードREQが0で、かつリード用バイトイネーブル判定回路21の出力が0ならライトBEの出力を選択するケース4。ただし、このとき、リード用バイトイネーブル判定回路21の出力が1なら、リード用バイトイネーブル保持回路20が前回のライトで格納した値にライトBEの値を論理ORした値を選択するケース5。そして、以上の全ての場合でないときは、リード用バイトイネーブル保持回路20の出力を格納ホールドするケース1。図9はリード用バイトイネーブル判定回路21の真理値表を示す。リード用バイトイネーブル判定回路21は、リード用バイトイネーブル保持回路20の出力が0000即ち初期値、または1xxx即ち1ワード4バイトに達した読み出しのときは0をアサートし、リード用バイトイネーブル判定回路20の出力が0000または1111以外、即ち1ワード未満のバイト数を示している時は1を出力する。このリード用バイトイネーブル判定回路21の論理は、図3に示したライト用バイトイネーブル判定回路11の論理と同じである。図10はデコーダ204の真理値表を示す。デコーダ204は、セレクタ503の出力が1xxx即ちリードDATAが1ワードに達したときに1、セレクタ503の出力が1xxx以外のときに0を出力する。図11はリード用アドレスカウンタ22の真理値表を示す。リード用アドレスカウンタ22は、デコーダ204の出力が1にリードREQがあると、1クロック後に1更新される。その他の場合には、リード用アドレスカウンタ22は現状の出力を保持する。図12はアドレス比較器30の真理値表を示す。アドレス比較器30はライト用アドレスカウンタ12のカウント値とリード用アドレスカウンタ22のカウント値が等しいときに1を出力し、その他の場合には0を出力する。図13はバイト読出し判定フラグ50の真理値表を示す。バイト読出し判定フラグ50は、アドレス比較器30の出力が1で、かつデコーダ204の出力が0即ちリードDATAが1ワードに達しないときに、リードREQがあると1にセットされる。そして、デコーダ204の出力が1即ちリードDATAが1ワードに達したときにリードREQがあると0にリセットされる。図14はセレクタ503の真理値表を示す。セレクタ503は、リードREQが0なら0000を出力するケース1。一方、リードREQが1で、かつバイト読出し判定フラグ50の出力が1なら、リード用バイトイネーブル保持回路20の出力を選択するケース2。また、リードREQが1で、かつバイト読出し判定フラグ50の出力が0で、かつアドレス比較器30の出力が1ならライト用バイトイネーブル保持回路10の出力を選択するケース3。ただし、このときにアドレス比較器30の出力が0なら1111を選択するケース4。図15はメモリEMPTYフラグ60の真理値表を示す。メモリEMPTYフラグ60は、アドレス比較器30の出力が1で、かつライトREQが0で、かつリードREQが1なら1にセットされる。新たに書き込まれるデータが無い状態で最後にライトした1ワード未満のデータの読出しが行なわれるからである。また、ライトREQが1なら0リセットされる。4読出し系の動作図16図と図17は、以上に説明した読出し系の動作を例示するタイムチャートである。図16は、リードDATAを1バイト単位に順次にFIFO40から読み出していくときの各回路の状態遷移を示している。また、図17は、1以上のバイトから成るリードDATAをアトランダムに読み出していくときの各回路の状態遷移を示している。当初は、ライトアドレスカウンタ12とリードアドレスカウンタ22は0であり、ライト用バイトイネーブル保持回路10とリード用バイトイネーブル保持回路20は0000を保持しているものとする。従って、アドレス比較器30は1を出力し、メモリEMPTYフラグ60も1を出力している。また、バイト読出し判定フラグ50はリセット状態にある。411バイト読出し動作図16は、図6に示した書込み動作中にリードREQが入力し、順次に1バイトずつ読み出した場合を示し、ライト系の波形は図6のコピーとなっている。リードREQは、メモリEMPTYが0の時、即ちFIFO40に1バイト以上のデータが格納されている時、1にすることが可能である。タイミング4からタイミング11の間でリードREQが1となっており、この間にFIFO40に順次書き込まれるライトDATA01~07がリードDATA01~07として順次読み出される。タイミング3では、リード用バイトイネーブル保持回路20は0000を保持しているので、リード用イネーブル判定回路21は1を出力している図9参照。また、アドレス比較器30は1を出力し図12参照、ライトREQは1、リードREQは0であるため、セレクタ203はライトBE0001を選択する図8のケース4。リードREQの入力は未だないので、セレクタ503は0000を出力している図14のケース1。タイミング4になると、タイミング3で1アサートされたライトREQのため、メモリEMPTYフラグ60は0を出力し、タイミング11まで持続する図15参照。リード用バイトイネーブル保持回路20はタイミング3においてセレクタ203が選択した0001を保持し、リード用バイトイネーブル判定回路21は1を出力する図9参照。リードREQが1アサートされるので、セレクタ203はライトBE0010を出力する図8のケース3。また、セレクタ503はライトバイトイネーブル保持回路10が保持している0001を選択する図14のケース3。即ち、タイミング3で入力しタイミング4でFIFO40に書き込まれた1バイト目のライトDATA01が、1バイト目のリードDATA01として読み出されることを示す。この場合、デコーダ204は0を出力するので、AND回路501の出力は1となる。タイミング5では、上記末文のセット条件成立を受けて、バイト読出し判定フラグ50が1にセットされる図13。従って、セレクタ503はリード用バイトイネーブル保持回路20が保持する0010を選択する図14のケース2。即ち、タイミング4で入力しタイミング5でFIFO40に書き込まれた2バイト目のライトDATA02が、2バイト目のリードDATA02として読み出されることを示す。タイミング6もタイミング5と同様に推移する。タイミング7では、ライト用アドレスカウンタ12とリード用アドレスカウンタ22の不一致が生じるのでアドレス比較器30は0を出力する図12参照。従って、AND回路501の出力は0となる。また、リードBEは1000となるので、AND回路502の出力は1となって、バイト読出し判定フラグ50のリセット条件が成立する図13。また、デコーダ204が1を出力する。更に、リード用バイトイネーブル保持回路20が1000を保持しているので、バイト読出し判定回路21は0となる図9参照。タイミング8において、バイト読出し判定フラグ50が0にリセットされる。また、デコーダ204が1を出力しているので、リード用アドレスカウンタ22が1に更新され図11参照、アドレス比較器30は再び1を出力する図12参照。従って、セレクタ503はライト用イネーブル保持回路10が保持している0001を選択する図14のケース3。これによって、AND回路501の出力は1、AND回路502の出力は0となる。セレクタ203はライトBE0010を選択する図8のケース3。タイミング9において、バイト読出し判定フラグ50の出力が1となり図13参照、セレクタ503はリード溶媒とイネーブル保持回路20が保持している0010を選択する図14のケース2。セレクタ203は、ライトBE0100を選択する図8のケース3。タイミング10においてもタイミング9におけるのと同様に動作する。この時点で、ライトREQは0となるので、メモリEMPTYフラグ60のセット条件が成立する図15参照。タイミング11において、メモリEMPTYフラグ60の出力が1となる。リードREQも0となるので、これ以降、セレクタ503は0000をセンタし続ける図14のケース1。42アトランダムな読出し動作図17は、アトランダムな読出しパターンの一例として、1バイト,2バイト,1バイト,4バイト,4バイト,2バイトを6回連続して書き込み、5タイミング後に1バイトのみを書き込み、一方、1回目の連続書込みの間に、1バイトのみを読み出し、1回目の連続書込みと2回目の書込みの間に、1回目の連続書込みで書き込まれた残り全てのデータを読み出し、2回目の書込みの後でそのデータを読み出している。このような複雑な書込み読出しパターンであっても、これまでの詳細な説明によって習得されたところにより、各回路の動作は容易に理解できると考えるので、これ以上の説明を省略する。ただ、タイミング9において、リードBEが1110となっているのは、タイミング4でのライトDATA0203とタイミング5でのライトDATA04とが結合されて、リードDATA020304とされていることを示す。このように、FIFO40からの読出しは、ワード区切りで行なわれるのである。43リードBEの生成ここで、図18から図22までのタイミングチャートを用いてリードBE信号の生成方法を説明する。これらの図では、ライト動作はいずれも同じであるが、リード動作はリードREQを1にアサートするタイミングを変えた複数のケースを示す。リードREQを1にアサートするタイミングにより、図18、図19、図20、図22は、1ワード未満のリード動作のケース、図21は1ワードのリード動作のケースとなっている。また、いずれも図16のタイミングチャートのリード動作と異なり、1バイトでライトしたデータが結合されて複数バイトでリードされるケースである。図18のケースは、タイミング3からライト動作が始まり、タイミング4のリード動作時ではライト用バイトイネーブル保持回路10とリード用バイトイネーブル保持回路20は同じ0001を保持しており、バイト読出し判定フラグ50は初期値0のままで、ライト用バイトイネーブル保持回路10の0001をリードBEとして選択する図14のケース3。タイミング5以降は、バイト読出し判定フラグ50を1にセットする。これは、1ワード未満でリード動作が行われたことを意味し、次回のリード動作では1ワードに達する残りのバイトデータを選択する機能で使用する。また、ライト用バイトイネーブル保持回路10は、タイミング3にセレクタ103が出力するライトBEを新規に格納した後図2のケース1、タイミング4からタイミング6までライトBEとライト用バイトイネーブル保持回路10の保持内容を論理ORした値を順次格納する図2のケース2。一方、リード用バイトイネーブル保持回路20は、タイミング3にセレクタ203が出力するライトBEを新規に格納した後図8のケース3、4クロック目で再び新規にライトBEを格納することにより図8のケース4、タイミング5からタイミング6では0001を除いた値にライトBEを論理ORした値を順次格納する図8のケース5。これは、タイミング4でリードBEが0001で処理が完了しているため、次回のリード動作で1バイト目を除いたデータを有効にするためである。次に、タイミング7では、リード用バイトイネーブル保持回路20は1110となり、3ビット目までが1すなわち1ワードの区切りとなるが、アドレス比較器30は0の条件から、次回のリード動作で出力するリードBEを確保するため、1110をホールドする図5のケース2。タイミング8以降、ライト用バイトイネーブル保持回路10は更新を続け、リード用バイトイネーブル保持回路20とは無関係に動作していく。タイミング10のリード動作では、バイト読出し判定フラグ50の出力1により、リード用バイトイネーブル保持回路20の1110をリードBEとして選択する図14のケース2。リード処理が完了したタイミング11ではいずれの条件にも当てはまらないのでリード用バイトイネーブル保持回路20の1110にホールドする図8のケース1。図19は、最初のリード動作を図18に対して1タイミング遅くしたケースを示している。リード動作が行われるタイミング5までライト用バイトイネーブル保持回路10と、リード用バイトイネーブル保持回路20は同値に更新し、タイミング5のリード動作でリードBE0011を出力し、タイミング7でアドレス比較器30は0の条件から、リード用バイトイネーブル保持回路20の1100をホールドする図8のケース2。次回のリード動作タイミング10でリードBE1100を出力する。図20は、最初のリード動作を図18に対して2クロック遅くしたケースを示している。リード動作が行われるタイミング6までライト用バイトイネーブル保持回路10と、リード用バイトイネーブル保持回路20は同値に更新し、タイミング6のリード動作でリードBE0111を出力し、タイミング7でアドレス比較器30は0の条件から、リード用バイトイネーブル保持回路20の1000をホールドする図8のケース2。次回のリード動作タイミング10でリードBE1000を出力する。図21は、1ワード以上のライト動作が行われる間、一度もリード動作を行わないケースを示している。タイミング7でライト動作は1ワードに達し、ライト用アドレスカウンタ12が1カウント更新する。リード用アドレスカウンタ22は初期値のままであるため、タイミング7でアドレス比較器30の出力は0になる。1ワード未満のリード動作は行っていないため、バイト読出し判定フラグ50は0のままであり、ライト用バイトイネーブル保持回路10と、リード用バイトイネーブル保持回路20は同値に更新していく。タイミング7でアドレス比較器30は0の条件から、リード用バイトイネーブル保持回路20の1111をホールドする図8のケース2。タイミング10で最初のリード動作が行われ、バイト読出し判定フラグ50が0で、アドレス比較器30が0であるため、リードBEとして1ワード有効となる1111を選択する図14のケース4。これは、1ワード未満の残りのバイトデータをリードする条件も無く、ライト用アドレスカウンタ12とリード用アドレスカウンタ22の値に差分があるため、リード動作するアドレスのメモリエリアには1ワード分のデータを格納している理由からである。また、この時、リード用バイトイネーブル保持回路20の1111とセレクタ503が選択した出力1111が同じであるが、リード用バイトイネーブル保持回路20側が1111とならないケースもある図17のタイミング10,11。図22は、5クロック目に1ワード未満の最初のリード動作を行い、リードBE0011を出力する図14のケース3。タイミング8からタイミング9までアドレス比較器30の出力が0なので、リード用バイトイネーブル保持回路20の1100でホールドする図8のケース2。タイミング8で2回目のリード動作を行い、リードBE1100を出力する図14のケース2。タイミング9では1ワードに達する残りのバイトデータのリード動作を完了したので、バイト読出し判定フラグ50を0にリセットする。ここまでは、図18から図19のケースと大差は無い。しかし、タイミング9でセレクタ203は、リード用バイトイネーブル判定回路21が0でリード用バイトイネーブル保持回路20の値が1100のため、アドレス比較器30が1で、ライトREQが1で、リードREQが0であるのでライトBE0100を選択している図8のケース4。10クロック目ではその0100がリード用バイトイネーブル保持回路20に格納されるが、バイトイネーブルとして使用できない無効なデータである。タイミング10で3回目のリード動作を行う。バイト読出し判定フラグ50が0で、アドレス比較器30が1の条件から、ライト用バイトイネーブル保持回路10の値を選択し、リードBE0111を出力する図14のケース3。この時、同時に、セレクタ203は、アドレス比較器30が1で、ライトREQ信号が1で、リードREQ信号が1の条件から、ライトBE1000を選択する図8のケース3。これは、タイミング10で1ワード未満のリード動作が行われたことから、そのバイトイネーブルを除いた新規のライトBEを選択する機能で、前述したバイトイネーブルとして使用できない無効なデータはここで消滅する。そして、デコーダ204が0でリードBE信号の3ビット目以外が1に当てはならないため、アドレス比較器30が1でリードREQが1である条件から、次のタイミング11ではバイト読出し判定フラグ50を1にセットし、リード用バイトイネーブル保持回路20にはライトBE1000を新規に格納する。このライトBE1000は次回のリード動作までホールドする図8のケース2。図22のケースでは、タイミング10の3回目のリード動作の時アドレス比較器30の出力が1であるが、アドレス比較器30の出力が0である場合は、前述の図21のケースのようにリードBE1111の値を出力し、リード動作の最後はこの図22のケースで終了する。以上が各真理値表における全てのケースを網羅した説明である。これらのケースの組合せにより、他のどのような書込み/読出しパターンであっても、各回路の動作は容易に理解できよう。上記の実施形態の一部又は全部は、以下の付記のようにも記載されうるが、以下には限られない。付記1有効バイト位置を示す2値情報バイトイネーブルに応じたライトデータをライト要求に応答してFIFOに書き込み、リード要求に応答してリードデータを前記FIFOから読み出し前記バイトイネーブルを添付するデータ転送装置において、前記FIFOの最新のライトアドレスに書き込まれているデータの前記バイトイネーブルを保持するライト用バイトイネーブル保持回路と、前記FIFOの最新のライトアドレスに書き込まれているデータの前記バイトイネーブル、または該バイトイネーブルと1タイミング前の自保持内容との論理和、または1タイミング前の自保持内容を保持するリード用バイトイネーブル保持回路と、前記リードデータの前記バイトイネーブルを解読して前記FIFOのライトアドレスとリードアドレスが一致する時に1ワード未満のバイトイネーブルで読み出したことを記憶し、1ワード分に達した位置まで読み出したときに消去されるバイト読出し判定フラグと、前記バイト読出し判定フラグがセットされているときは前記リード用バイトイネーブル保持回路が保持する前記バイトイネーブルを選択し、また前記バイト読出し判定フラグがリセットされていて、かつ前記FIFOのライトアドレスとリードアドレスが一致するときは前記ライト用バイトイネーブル保持回路が保持する前記バイトイネーブルを選択し、また前記バイト読出し判定フラグがリセットされていて、かつ前記FIFOのライトアドレスとリードアドレスが一致しないときは全バイト読出しを示す前記バイトイネーブルを選択し、それぞれ前記リードデータの前記バイトイネーブルとするセレクタとを設けたことを特徴とするデータ転送装置。付記2前記ライト用バイトイネーブル保持回路が保持している前記バイトイネーブルにより、前記FIFOが初期状態または前記ライトデータが1ワード分に達したか、否かの判定結果を出力するライト用バイトイネーブル判定回路と、前記ライト要求があり前記FIFOが初期状態または前記ライトデータが1ワード分に達したときは前記ライトデータの前記バイトイネーブルを選択し、また前記ライト要求があり前記ライト用バイトイネーブル判定回路における判定結果が否のときは前記ライト要求がないときは前記ライトデータの前記バイトイネーブルと前記ライト用バイトイネーブル保持回路の保持内容との論理和を選択し、前記ライト用バイトイネーブル保持回路へ出力するセレクタとを有することを特徴とする付記1に記載のデータ転送装置。付記3前記セレクタの出力を解読して前記ライトデータが1ワード分に達することを検出するデコーダと、前記最新のライトアドレスを指定し前記検出によりカウントアップするライト用アドレスカウンタとを有することを特徴とする付記2に記載のデータ転送装置。付記4前記リード用バイトイネーブル保持回路が保持している前記バイトイネーブルにより、前記FIFOが初期状態または前記リードデータが1ワード分に達したか、否かの判定結果を出力するリード用バイトイネーブル判定回路と、前記ライトアドレスと前記リードアドレスが一致しないときは前記リード用バイトイネーブル保持回路が保持している前記バイトイネーブル、一方、前記ライトアドレスと前記リードアドレスが一致し、かつ、前記リード要求があるときまたは前記リード要求がなく、かつ、前記FIFOが初期状態または前記リードデータが1ワード分に達したときは前記ライトデータの前記バイトイネーブル、前記ライトアドレスと前記リードアドレスが一致し、かつ、前記リード要求がなく、かつ、前記リード用バイトイネーブル判定回路における判定結果が否であるときは前記ライトデータの前記バイトイネーブルと前記リード用バイトイネーブル保持回路が保持している前記バイトイネーブルとの論理和を選択するセレクタとを有することを特徴とする付記1に記載のデータ転送装置。付記5前記FIFOから1ワード分のリードデータが読み出されたことを検出するデコーダと、前記リードデータのアドレスを示し前記検出により1更新されるリード用アドレスカウンタとを有することを特徴とする付記4に記載のデータ転送装置。付記6前記ライト用アドレスカウンタの保持内容と前記リード用アドレスカウンタの保持内容を比較するアドレス比較器を有し、前記比較の結果によりアドレスが一致し、かつ前記ライト要求がなくて前記リード要求があるとき、前記FIFOは空であることを示すEMPTY信号を出力するメモリEMPTYフラグを有することを特徴とする付記5に記載のデータ転送装置。"