以下、添付する図面を参照して本発明の実施例について説明する。まず、並列データに対するCRC符号の演算方法について説明する。図1は、並列データに対するCRC符号の演算方法の説明図である。CRC符号生成回路800は、演算部801と、セレクタ802と、フリップフロップ803〜808を備える。
フリップフロップ803〜808は、前段から入力される信号をクロックエッジにて新たに保持し、次のクロックエッジが到来するまで後段へ出力し続ける状態論理要素である。以下に説明される他の実施例において使用されるフリップフロップについても同様である。
演算部801は、フリップフロップ803から順次出力される一連のmビットの並列データに対する、xビットのCRC符号を算出する。演算部801は、フリップフロップ803から順次出力される一連のmビットの並列データを入力Dとして受信し、セレクタ802から出力されるCRC符号を入力Cとして受信する。演算部801は、入力Cと入力Dの間で所定の論理演算を行いxビットのCRC符号を算出する。演算部801は、算出されたCRC符号をフリップフロップ806へ出力する。
例として、並列データの桁数が4ビットであり(m=4)、生成多項式が「1+X2+X5」である場合のCRC符号を演算する論理式を以下に示す。
CRC(0) = d(3) xor d(0) xor c(1) xor c(4)
CRC(1) = d(1) xor c(2)
CRC(2) = d(3) xor d(2) xor d(0) xor c(1) xor c(3) xor c(4)
CRC(3) = d(3) xor d(1) xor c(2) xor c(4)
CRC(4) = d(2) xor c(0) xor c(3)
上式において、CRC(0)〜CRC(4)は、演算結果のCRC符号の下位第1ビット〜第5ビットの値を示す。また、d(0)〜d(3)は、入力Dの下位第1ビット〜第4ビットの値を示す。c(0)〜c(4)は、入力Cの下位第1ビット〜第5ビットの値を示す。
セレクタ802は、一連の並列データの先頭データの入力タイミングを示すスタートパルスSPの値に従って、初期値及びフリップフロップ806の出力のいずれかを入力Cとして演算部801に入力する。フリップフロップ806の出力は、前回のクロックサイクルにおける演算部801の演算結果、すなわち、今回のクロックサイクルに先行して、前回のクロックサイクルまでに入力された一連の並列データに対して演算されたCRC符号である。
セレクタ802のシンボルの表記法について説明する。入力線「SEL」にはセレクト信号が入力される。セレクト信号の値が「1」であるとき(又は、セレクト信号がアサートされているとき)、入力線「1」への入力値が出力810として出力される。セレクト信号の値が「0」であるとき(又は、セレクト信号がアサートされていないとき)、入力線「0」への入力値が出力810として出力される。以下の説明において参照される他の図面上のセレクタのシンボルについても、上述の表記法が使用される。
本例では、スタートパルスSPの値が「1」(先頭データの入力タイミングを示す値)であるとき、セレクタ802は、入力線「1」への入力値である初期値を出力する。一方で、セレクタ802は、スタートパルスSPの値が「0」(先頭データの入力タイミング以外の期間を示す値)であるとき、入力線「0」への入力値であるフリップフロップ806の出力を出力する。
したがって、先頭データが入力されたクロックサイクルでは、演算部801は、初期値と先頭データとの間で論理演算を行うことによりCRC符号を算出する。それ以降のクロックサイクルでは、演算部801は、前回のクロックサイクルまでに入力された一連の並列データに対するCRC符号と、今回のクロックサイクルで入力された並列データとの間で論理演算を行うことによりCRC符号を算出する。
フリップフロップ807及び808は、並列データへCRC符号を挿入するタイミングを示すエンドパルスEPに対して遅延を与え、エンドパルスEPと、データ及びCRC符号とを同期させる。
次に、CRC符号生成回路の実施例を説明する。図2は、CRC符号生成回路における第1実施例の構成図である。CRC符号生成回路1は、順次出力される一連の128ビットの並列データに対する32ビットのCRC符号を算出する。なお本明細書の説明において使用する並列データ及びCRC符号の桁数はあくまで例示であって、実施例の形態を制限するものではない。CRC符号生成回路1は、CRC演算部2と、補正部3と、シフトレジスタ4と、セレクタ5と、フリップフロップ10〜15を備える。
CRC演算部2は、各クロックサイクルで順次入力される並列データについて、CRC符号を演算する。図3は、図2に示すCRC演算部2の構成例を示す図である。CRC演算部2は、64bit部分演算部200及び201と、フリップフロップ250〜255を備える。
64bit部分演算部200は、128ビットの並列データのうち上位64ビットに対するCRC符号の演算を行い、64bit部分演算部201は、128ビットの並列データのうち下位64ビットに対するCRC符号の演算を行う。以下の説明において、並列データの上位64ビットを「上位データ」と表記することがある。また、並列データの下位64ビットを「下位データ」と表記することがある。
同じクロックサイクルで入力された上位データ及び下位データと、この上位データに対して算出されたCRC符号は、フリップフロップ250、252及び251に保持される。64bit部分演算部201は、次のクロックサイクルで、フリップフロップ252に保持された下位データと、フリップフロップ251に保持されたCRC符号に基づいて、下位データに対するCRC符号を計算する。
すなわち、64bit部分演算部200及び201は、128ビットの並列データに対するCRC符号を演算する論理演算を並列データの桁方向に分割した部分演算を、異なるパイプライン段において実行する。フリップフロップ250〜252は、パイプライン段の間を区切るパイプラインレジスタとして動作する。
CRC符号を演算する論理演算を複数の部分演算に分割することにより、各部分演算を行う論理演算回路が行う論理演算の段数が、分割前の論理演算の段数よりも小さくなる。このため、論理演算回路が1クロックサイクルで行う論理演算の段数が低減され、1クロックサイクル内で行われる論理演算の演算時間が短くなる。これにより、CRC符号演算回路において、フリップフロップなどの状態論理要素から入力信号を読み出してから演算結果を状態論理要素に格納するまでの期間に与える、タイミングマージンを確保しやすくなる。
しかし、上述のようなパイプライン処理でCRC符号を演算する場合、複数のクロックサイクルに亘って1つの並列データに対するCRC符号の演算が行われる。このため、先行して演算されたCRC符号を用いて後続するCRC符号の演算を開始することができない。
そこで、本実施では、CRC演算部2は、初期値と並列データに基づいてCRC符号を演算する。このため、64bit部分演算部200は、入力される128ビットの並列データのうち上位データと、初期値に基づいてCRC符号を演算する。そして補正部3は、CRC演算部2から出力されたCRC符号を、このCRC符号に先行して演算されたCRC符号と初期値とに基づいて補正する。
セレクタ5は、スタートパルスSPに従って、補正されていないCRC符号、すなわちCRC演算部2の最終パイプライン段の64bit部分演算部201から出力されるCRC符号と、補正部3により補正されたCRC符号のうち一方を選択する。セレクタ5は、選択されたCRC符号をフリップフロップ12に出力する。
並列データの先頭データに対して演算されたCRC符号は補正の必要がないので、セレクタ5は、並列データの先頭データに対して演算されたCRC符号として、64bit部分演算部201から出力されるCRC符号を選択する。セレクタ5は、先頭データ以外のデータに対して演算されたCRC符号として、補正部3から出力される補正後のCRC符号を選択する。
図4は、図2に示す補正部3の構成例を示す図である。補正部3は、128bit部分演算部300及び301と、XOR回路302及び303を備える。補正部3は、CRC演算部2の最終パイプライン段の64bit部分演算部201から出力され、フリップフロップ255に保持されたCRC符号を、補正対象のCRC符号として入力する。
128bit部分演算部300及び301は、入力線「C」に入力されたCRC符号又は初期値に基づいて、全てのビットの値が「0」である128bitの並列データに対するCRC符号を演算する。128bit部分演算部300の入力線「C」には初期値が入力され、128bit部分演算部301の入力線「C」には、フリップフロップ12から出力されるCRC符号が入力される。フリップフロップ12から出力されるCRC符号は、補正対象のCRC符号に対して1クロックサイクル先行して演算されたCRC符号である。
XOR回路302は、128bit部分演算部300及び301の出力同士の排他的論理和を出力することにより、補正対象のCRC符号に対する補正値を算出する。XOR回路303は、この補正値と補正対象のCRC符号との排他的論理和を出力する。すなわち、XOR回路303は、上記補正値によって補正対象のCRC符号を補正し、補正されたCRC符号を算出する。XOR回路303の出力はセレクタ5の入力線「0」へ入力される。
以下、補正部3による補正処理について説明する。説明の簡単のため、並列データの桁数が4ビットであり、生成多項式が「1+X2+X5」である場合のCRC符号を補正する場合を例示する。補正対象のCRC符号に対して1クロックサイクル先行して演算されたCRC符号(以下、単に「先行CRC符号」と表記することがある)に代えて、初期値を使ってCRC符号を演算した場合の誤差DIFFは、以下の通りである。
DIFF(0) = (d(3) xor d(0) xor c1(1) xor c1(4))
xor (d(3) xor d(0) xor c2(1) xor c2(4))
DIFF(1) = (d(1) xor c1(2))
xor (d(1) xor c2(2))
DIFF(2) = (d(3) xor d(2) xor d(0) xor c1(1) xor c1(3) xor c1(4))
xor (d(3) xor d(2) xor d(0) xor c2(1) xor c2(3) xor c2(4))
DIFF(3) = (d(3) xor d(1) xor c1(2) xor c1(4))
xor (d(3) xor d(1) xor c2(2) xor c2(4))
DIFF(4) = (d(2) xor c1(0) xor c1(3))
xor (d(2) xor c2(0) xor c2(3))
上式において、DIFF(0)〜DIFF(4)は、誤差DIFFの下位第1ビット〜第5ビットの値を示す。また、d(0)〜d(3)は、並列データの下位第1ビット〜第4ビットの値を示す。c1(0)〜c1(4)は、初期値の下位第1ビット〜第5ビットの値を示す。c2(0)〜c2(4)は、先行CRC符号の下位第1ビット〜第5ビットの値を示す。
並列データに関する項d(0)〜d(3)を省略することにより、誤差DIFF(0)〜DIFF(4)は、以下の通り表すことができる。
DIFF(0) = (c1(1) xor c1(4)) xor (c2(1) xor c2(4))
DIFF(1) = (c1(2)) xor (c2(2))
DIFF(2) = (c1(1) xor c1(3) xor c1(4)) xor (c2(1) xor c2(3) xor c2(4))
DIFF(3) = (c1(2) xor c1(4)) xor (c2(2) xor c2(4))
DIFF(4) = (c1(0) xor c1(3)) xor (c2(0) xor c2(3))
128bit部分演算部300は、誤差DIFFを演算する論理式のうち、初期値に含まれるビット同士の排他的論理和により形成される項を演算する。128bit部分演算部301は、誤差DIFFを演算する論理式のうち、先行CRC符号に含まれるビット同士の排他的論理和により形成される項を演算する。XOR回路302は、これら2つの排他的論理和同士の排他的論理和を、誤差DIFFすなわち補正値として演算する。
誤差DIFFに関する上記の演算式は並列データに関する項を含まないため、補正部3の論理段数は並列データの値に依存しない。また、補正部3の論理段数は、生成多項式の項数の2倍を超えることはない。このため、補正部3にて使用される論理演算回路においても、状態論理要素から入力信号を読み出してから演算結果を状態論理要素に格納するまでの期間に与える、タイミングマージンが確保し易くなる。なお、初期値として固定値を使用すれば、128bit部分演算部300による論理演算は不要になるため、論理段数を更に低減させ、回路規模を小さくすることができる。
図2を参照する。シフトレジスタ4は、フリップフロップ400〜403を備える。シフトレジスタ4は、CRC演算部2にて演算されるCRC符号や、CRC演算部2の内部で遅延する並列データに対して、スタートパルスSP及びエンドパルスEPを同期させる。
図2に示すCRC符号生成回路1は、図5に示すデータフォーマットを有する並列データに使用される。図5は、データフォーマットの第1例のタイミングチャートである。図5の第1段は、クロックのタイミングエッジの発生タイミングを示し、第2段は、スタ−トパルスSPを示し、第3段はエンドパルスEPを示す。
図5の第4段は、並列データを示す。データ中の「ヘッダ」は並列データの先頭に付加されたヘッダ情報を意味し、データ中の「CRC32」はCRC符号を意味する。このフォーマットの例では、ヘッダは上位データに挿入される。また、CRC符号は並列データの下位データに挿入される。例えば、クロックサイクル900において、ある並列データの入力が開始すると、クロックサイクル900においてスタートパルスSPがアサートされる。クロックサイクル900における上位データにはヘッダが挿入される。
クロックサイクル901においてエンドパルスEPがアサートされることにより、クロックサイクル901の並列データの下位データにはCRC符号が挿入されることが示される。
本実施例によれば、CRC符号生成回路1に使用される論理演算回路が1クロックサイクルで行う論理演算の段数が低減される。これにより、CRC符号演算回路1において、フリップフロップなどの状態論理要素から入力信号を読み出してから演算結果を状態論理要素に格納するまでの期間に与える、タイミングマージンを確保しやすくなる。
また、以下に説明するように、CRC符号の論理演算の分割数は「2」に限定されない。CRC演算部2は、CRC符号の論理演算を3個以上の部分演算に分割してもよい。CRC符号の論理演算の分割数を増やすと、フリッププロップなどの状態論理要素の数の増加などに起因して回路規模が大きくなる。しかし、この分割数は、設計条件に応じて容易に最適化することができる。
続いて、他のCRC符号生成回路の実施例について説明する。図2に示すCRC符号生成回路1は、128ビットの並列データを、半分ずつ分割してパイプライン処理を行ったが、並列データの分割数は3以上でもよい。また、各パイプライン段において、異なる桁数の並列データについてCRC符号が演算されてもよい。
図6は、CRC符号生成回路における第2実施例の構成図である。別途説明する場合を除き、図2に示す構成要素と同様の構成要素には図2で使用した参照符号と同じ参照符号を付する。
CRC演算部2は、128ビットの並列データに対するCRC符号の演算を、3つの部分演算に分割する。1つの部分演算は、並列データの第1〜第43ビット(計43ビット)に対するCRC符号の演算である。他のもう1つの部分演算は、並列データの第44〜第86ビット(計43ビット)に対するCRC符号の演算である。残りの部分演算は、並列データの第87〜第128ビット(計42ビット)に対するCRC符号の演算である。以下の説明において、並列データの第87〜第128ビットを「第1部分データ」と記載することがある。また並列データの第44〜第86ビットを「第2部分データ」と記載することがある。また並列データの第1〜第43ビットを「第3部分データ」と記載することがある。
シフトレジスタ4は、フリップフロップ400〜405を備える。シフトレジスタ4は、CRC演算部2にて演算されるCRC符号や、CRC演算部2の内部で遅延する並列データに対して、スタートパルスSP及びエンドパルスEPを同期させる。
図7は、図6に示すCRC演算部2の構成例を示す図である。CRC演算部2は、42bit部分演算部202と、43bit部分演算部203及び204と、フリップフロップ260〜271を備える。42bit部分演算部202は、第1部分データに対するCRC符号の演算を行う。43bit部分演算部203は、第2部分データに対するCRC符号の演算を行う。43bit部分演算部204は、第3部分データに対するCRC符号の演算を行う。
同じクロックサイクルで入力された第1部分データ、第2部分データ及び第3部分データ、及びこの第1部分データに対して算出されたCRC符号は、それぞれフリップフロップ260、262、263及び261に保持される。43bit部分演算部203は、次のクロックサイクルで、フリップフロップ262に保持された第2部分データと、フリップフロップ261に保持されたCRC符号に基づいて、第2部分データに対するCRC符号を計算する。
また、フリップフロップ264、265、267及び266には、同じクロックサイクルで入力された第1部分データ、第2部分データ及び第3部分データ、及びこの第2部分データに対して算出されたCRC符号が保持される。43bit部分演算部204は、次のクロックサイクルで、フリップフロップ267に保持された第3部分データと、フリップフロップ266に保持されたCRC符号に基づいて、第3部分データに対するCRC符号を計算する。
すなわち、42bit部分演算部202、並びに43bit部分演算部203及び204は、128ビットの並列データに対するCRC符号を演算する論理演算を並列データの桁方向に分割した部分演算を、異なるパイプライン段において実行する。フリップフロップ260〜267は、パイプライン段の間を区切るパイプラインレジスタとして動作する。
本実施例によれば、CRC符号の論理演算を3個以上に分割して、パイプライン処理によってCRC符号を演算することが可能となる。論理演算の分割数を増やすことによって、論理演算に使用される論理演算回路が1クロックサイクルで行う論理演算の段数がさらに低減される。
続いて、他のCRC符号生成回路の実施例について説明する。図8は、データフォーマットの第2例の説明図である。図8の第1段は、クロックのタイミングエッジの発生タイミングを示し、第2段は、第1スタ−トパルスSP1を示し、第3段は、第2スタ−トパルスSP2を示す。図8の第4段は、第1エンドパルスEP1を示し、第5段は、第2エンドパルスEP2を示す。
図8の第6段は、並列データを示す。データ中の「ヘッダ」は並列データの先頭に付加されたヘッダ情報を意味し、データ中の「CRC32」はCRC符号を意味する。このフォーマットの例では、上位データ及び下位データのどちらにもヘッダ及びCRC符号が挿入される場合がある。
第1スタ−トパルスSP1は、上位データが並列データの先頭を含むクロックサイクルにてアサートされる。第2スタ−トパルスSP2は、下位データが並列データの先頭を含むクロックサイクルにてアサートされる。第1エンドパルスEP1は、上位データへCRC符号を挿入するクロックサイクルにてアサートされる。第2エンドパルスEP2は、下位データへCRC符号を挿入するクロックサイクルにてアサートされる。
例えば、クロックサイクル910において、上位データが並列データの先頭を含むと、クロックサイクル910において第1スタートパルスSP1がアサートされる。クロックサイクル910における上位データにヘッダが挿入される。クロックサイクル911において第2エンドパルスEP2がアサートされることにより、クロックサイクル911の並列データの下位データにはCRC符号が挿入されることが示される。
また例えば、クロックサイクル912において、下位データが並列データの先頭を含むと、クロックサイクル912において第2スタートパルスSP2がアサートされる。クロックサイクル912における下位データにはヘッダが挿入される。クロックサイクル913において第1エンドパルスEP1がアサートされることにより、クロックサイクル913の上位データにはCRC符号が挿入されることが示される。
図9は、図8に示すフォーマットのデータについてCRC符号を演算するCRC符号生成回路の実施例の構成図である。別途説明する場合を除き、図2に示す構成要素と同様の構成要素には図2で使用した参照符号と同じ参照符号を付する。CRC符号生成回路1は、CRC演算部2と、補正部3と、シフトレジスタ4と、セレクタ50及び51と、セレクト信号生成部6と、フリップフロップ10〜19を備える。
シフトレジスタ4は、フリップフロップ410〜417を備える。シフトレジスタ4は、CRC演算部2にて演算されるCRC符号や、CRC演算部2の内部で遅延する並列データに対して、第1スタートパルスSP1、第2スタートパルスSP2、第1エンドパルスEP1及び第2エンドパルスEP2を同期させる。
CRC演算部2は、上位データへの挿入用に生成される第1CRC符号を、補正部3及びセレクタ51へ出力する。またCRC演算部2は、下位データへの挿入用に生成される第2CRC符号を、補正部3及びセレクタ50へ出力する。
図10は、図9に示すCRC演算部2の構成例を示す図である。図3に示す構成要素と同様の構成要素には図3で使用した参照符号と同じ参照符号を付する。CRC演算部2は、64bit部分演算部200及び201と、フリップフロップ250〜256と、セレクタ210を備える。
64bit部分演算部200によって演算されるCRC符号が、フリップフロップ251及び256に順々に保持されたあと、第1CRC符号として出力される。また、64bit部分演算部201によって演算されるCRC符号が、フリップフロップ255に保持されたあと、第2CRC符号として出力される。
セレクタ210は、フリップフロップ412によって遅延された第2スタートパルスSP2をセレクト信号として受信する。フリップフロップ412は、フリップフロップ250〜252がデータ及び64bit部分演算部200の演算結果に与えた遅延と同じ遅延を、第2スタートパルスSP2に与える。セレクタ210は、第2スタートパルスSP2の値に従って、初期値及び64bit部分演算部200の演算結果のいずれかを選択して、64bit部分演算部201へ入力する。セレクタ210は、特許請求の範囲に記載の第2セレクタの一例として挙げられる。
このため、第2スタートパルスSP2がアサートされていないときは、CRC演算部2は、図3に示すCRC演算部2と同様に動作する。第2スタートパルスSP2がアサートされると、64bit部分演算部201は、64bit部分演算部200が初期値と上位データを使用してCRC符号を演算するのと同じ様に、初期値と下位データを使用してCRC符号を演算する。このため、下位データが並列データの先頭を含んでいても、CRC演算部2は、CRC符号の演算を開始することが可能になる。
図9を参照する。第1CRC符号及び第2CRC符号は補正部3によって補正され、それぞれセレクタ51及び50へ入力される。セレクタ51は、第1スタートパルスSP1に従って、補正されていない第1CRC符号、すなわち64bit部分演算部200から出力される第1CRC符号と、補正部3により補正された第1CRC符号のうち一方を選択する。
並列データの先頭を含む上位データに第1CRCを挿入する場合には、第1CRC符号を補正しなくてよい。したがって、セレクタ51は、第1スタートパルスSP1がアサートされたとき、補正されていない第1CRC符号を選択する。セレクタ51は、第1スタートパルスSP1がアサートされていないとき、補正された第1CRC符号を選択する。セレクタ51は、選択された第1CRC符号をフリップフロップ13へ出力する。
一方で、上位データ及び下位データのどちらかが並列データの先頭を含むクロックサイクルの下位データに挿入される第2CRC符号は補正しなくてよい。このため、セレクト信号生成回路6は、第1スタートパルスSP1及び第2スタートパルスSP2の論理和を、セレクタ50に対するセレクト信号として演算するOR回路600を備える。
セレクタ50は、セレクト信号がアサートされたとき、補正されていない第2CRC符号を選択する。セレクタ50は、第1スタートパルスSP1がアサートされていないとき、補正された第2CRC符号を選択する。セレクタ50は、選択された第2CRC符号をフリップフロップ12へ出力する。
図11は、図9に示す補正部3の構成例を示す図である。図4に示す構成要素と同様の構成要素には図4で使用した参照符号と同じ参照符号を付する。補正部3は、128bit部分演算部300及び301と、XOR回路302及び303を備える。また、補正部3は、64bit部分演算部310及び311と、XOR回路312及び313を備える。
補正部3は、CRC演算部2の64bit部分演算部200から出力され、フリップフロップ256に保持されたCRC符号を、補正対象の第1CRC符号として入力する。補正部3は、CRC演算部2の最終パイプライン段の64bit部分演算部201から出力され、フリップフロップ255に保持されたCRC符号を、補正対象の第2CRC符号として入力する。
128bit部分演算部300及び301と、XOR回路302及び303は、補正対象の第2CRC符号を補正し、補正された第2CRC符号を算出する。XOR回路303の出力はセレクタ50の入力線「0」へ入力される。128bit部分演算部300及び301と、XOR回路302及び303は、特許請求の範囲に記載の第2補正部の一例として挙げられる。
64bit部分演算部310及び311の機能は、CRC符号が演算される並列データのビット数が64である点を除き、128bit部分演算部300の機能と同様である。64bit部分演算部310の入力線「C」には初期値が入力され、64bit部分演算部311の入力線「C」にはフリップフロップ12から出力される第2CRC符号が入力される。フリップフロップ12から出力される第2CRC符号は、補正対象の第1CRC符号に対して1クロックサイクル先行して演算された第2CRC符号である。
XOR回路312は、64bit部分演算部310及び311の出力同士の排他的論理和を出力することにより、補正対象の第1CRC符号に対する補正値を算出する。XOR回路313は、この補正値と補正対象の第1CRC符号との排他的論理和を出力する。すなわち、XOR回路313は、上記補正値によって補正対象の第1CRC符号を補正し、補正された第1CRC符号を算出する。XOR回路313の出力はセレクタ51の入力線「0」へ入力される。64bit部分演算部310及び311と、XOR回路312及び313は、特許請求の範囲に記載の第1補正部の一例として挙げられる。
本実施例によれば、ヘッダ及びCRC符号が、上位データ及び下位データのいずれにも挿入されることがあるデータフォーマットに対しても、CRC符号を生成することができる。
続いて、他のCRC符号生成回路の実施例について説明する。図12は、CRC符号生成回路における第4実施例の構成図である。図9に示すCRC符号生成回路1の場合、128ビットの並列データが半分ずつ分割され、パイプライン処理が実行されたが、並列データの分割数は3以上でもよい。また、各パイプライン段において、異なる桁数の並列データについてCRC符号が演算されてもよい。また分割されたデータのいずれの部分に、並列データの先頭やCRC符号を挿入してもよい。
別途説明する場合を除き、図9に示す構成要素と同様の構成要素には図9で使用した参照符号と同じ参照符号を付する。CRC符号生成回路1は、CRC演算部2と、補正部3と、シフトレジスタ4と、セレクタ50〜53と、セレクト信号生成部6と、フリップフロップ10〜23を備える。
CRC演算部2は、128ビットの並列データに対するCRC符号の演算を、3つの部分演算に分割する。各部分演算は、第1部分データ〜第3部分データに対するCRC符号の演算を行う。
図13は、図12に示すシフトレジスタ4の構成例を示す図である。シフトレジスタ4は、フリップフロップ420〜437を備える。シフトレジスタ4は、CRC演算部2にて演算されるCRC符号や、CRC演算部2の内部で遅延する並列データに対して、第1スタートパルスSP1、第2スタートパルスSP2、第3スタートパルスSP3、第1エンドパルスEP1、第2エンドパルスEP2及び第3エンドパルスEP3を同期させる。
第1スタ−トパルスSP1は、第1部分データが並列データの先頭が含むクロックサイクルにてアサートされる。第2スタ−トパルスSP2は、第2部分データが並列データの先頭を含むクロックサイクルにてアサートされる。第3スタ−トパルスSP3は、第3部分データが並列データの先頭を含むクロックサイクルにてアサートされる。
第1エンドパルスEP1は、第1部分データへCRC符号を挿入するクロックサイクルにてアサートされる。第2エンドパルスEP2は、第2部分データへCRC符号を挿入するクロックサイクルにてアサートされる。第3エンドパルスEP3は、第3部分データへCRC符号を挿入するクロックサイクルにてアサートされる。
CRC演算部2は、第1部分データへの挿入用に生成される第1CRC符号を、補正部3及びセレクタ52へ出力する。またCRC演算部2は、第2部分データへの挿入用に生成される第2CRC符号を、補正部3及びセレクタ51へ出力する。またCRC演算部2は、第3部分データへの挿入用に生成される第3CRC符号を、補正部3及びセレクタ50へ出力する。
図14は、図12に示すCRC演算部2の構成例を示す図である。図7に示す構成要素と同様の構成要素には図7で使用した参照符号と同じ参照符号を付する。CRC演算部2は、42bit部分演算部202と、43bit部分演算部203及び204と、フリップフロップ260〜274と、セレクタ211及び212を備える。
42bit部分演算部202によって演算されるCRC符号が、フリップフロップ261、272及び273に順々に保持されたあと、第1CRC符号として出力される。また、43bit部分演算部203によって演算されるCRC符号が、フリップフロップ266及び274に順々に保持されたあと、第2CRC符号として出力される。また、43bit部分演算部204によって演算されるCRC符号が、フリップフロップ271に保持されたあと、第3CRC符号として出力される。
セレクタ211は、図13のフリップフロップ423によって遅延された第2スタートパルスSP2をセレクト信号として受信する。フリップフロップ423は、フリップフロップ260〜263がデータ及び42bit部分演算部202の演算結果に与えた遅延と同じ遅延を、第2スタートパルスSP2に与える。セレクタ211は、第2スタートパルスSP2の値に従って、初期値及び42bit部分演算部202の演算結果のいずれかを選択して、43bit部分演算部203へ入力する。
セレクタ212は、図13のフリップフロップ427から出力される第3スタートパルスSP3をセレクト信号として受信する。フリップフロップ427から出力される第3スタートパルスSP3には、フリップフロップ260〜267によってデータ及び43bit部分演算部203の演算結果に与えられた遅延と同じ遅延が与えられる。セレクタ212は、第3スタートパルスSP3の値に従って、初期値及び43bit部分演算部203の演算結果のいずれかを選択して、43bit部分演算部204へ入力する。
このため、第2スタートパルスSP2及び第3スタートパルスSP3がアサートされていないときは、CRC演算部2は、図7に示すCRC演算部2と同様に動作する。第2スタートパルスSP2がアサートされると、43bit部分演算部203は、42bit部分演算部202が初期値と第1部分データを使用してCRC符号を演算するのと同じ様に、初期値と第2部分データを使用してCRC符号を演算する。このため、第2部分データが並列データの先頭データを含んでいても、CRC演算部2は、CRC符号の演算を開始することが可能になる。
また、第3スタートパルスSP3がアサートされると、43bit部分演算部204は、初期値と第3部分データを使用してCRC符号を演算する。このため、第3部分データが並列データの先頭データを含んでいても、CRC演算部2は、CRC符号の演算を開始することが可能になる。
図12を参照する。第1〜3CRC符号は補正部3によって補正され、それぞれセレクタ52〜50へ入力される。セレクタ52は、第1スタートパルスSP1に従って、補正されていない第1CRC符号、すなわち42bit部分演算部202から出力される第1CRC符号と、補正部3により補正された第1CRC符号のうち一方を選択する。セレクタ52は、第1スタートパルスSP1がアサートされたとき、補正されていない第1CRC符号を選択する。セレクタ52は、第1スタートパルスSP1がアサートされていないとき、補正された第1CRC符号を選択する。セレクタ52は、選択された第1CRC符号をフリップフロップ14に出力する。
また、セレクタ51は、セレクト信号生成部6により生成されたセレクト信号に従って、補正されていない第2CRC符号、すなわち43bit部分演算部203から出力される第2CRC符号と、補正部3により補正された第2CRC符号のうち一方を選択する。セレクタ51は、セレクト信号がアサートされたとき、補正されていない第2CRC符号を選択する。セレクタ51は、セレクト信号がアサートされていないとき、補正された第2CRC符号を選択する。セレクタ51は、選択された第2CRC符号をフリップフロップ13に出力する。
また、セレクタ50は、セレクト信号生成部6により生成されたセレクト信号に従って、補正されていない第3CRC符号、すなわち43bit部分演算部204から出力される第3CRC符号と、補正部3により補正された第3CRC符号のうち一方を選択する。セレクタ50は、セレクト信号がアサートされたとき、補正されていない第3CRC符号を選択する。セレクタ50は、セレクト信号がアサートされていないとき、補正された第3CRC符号を選択する。セレクタ50は、選択された第3CRC符号をフリップフロップ12に出力する。
図15は、図12に示すセレクト信号生成部6の構成例を示す図である。第1部分データ及び第2部分データのどちらかが並列データの先頭を含むクロックサイクルの第2部分データに挿入される第2CRC符号は、補正しなくてよい。このため、セレクト信号生成回路6は、第1スタートパルスSP1及び第2スタートパルスSP2の論理和を、セレクタ51に対するセレクト信号として演算するOR回路62を備える。
また、第1部分データ〜第3部分データのどれかが並列データの先頭を含むクロックサイクルの第3部分データに挿入される第3CRC符号は、補正しなくてよい。このため、セレクト信号生成回路6は、第1スタートパルスSP1、第2スタートパルスSP2及び第3スタートパルスSP3の論理和を、セレクタ50に対するセレクト信号として演算するOR回路61を備える。
図16は、図12に示す補正部3の構成例を示す図である。図4に示す構成要素と同様の構成要素には図4で使用した参照符号と同じ参照符号を付する。補正部3は、128bit部分演算部300及び301と、XOR回路302及び303を備える。また、補正部3は、42bit部分演算部320及び321と、XOR回路322及び323を備える。また、補正部3は、85bit部分演算部330及び331と、XOR回路332及び333を備える。
補正部3は、CRC演算部2の42bit部分演算部202から出力され、フリップフロップ273に保持されたCRC符号を、補正対象の第1CRC符号として入力する。補正部3は、43bit部分演算部203から出力され、フリップフロップ274に保持されたCRC符号を、補正対象の第2CRC符号として入力する。補正部3は、CRC演算部2の最終パイプライン段の43bit部分演算部204から出力され、フリップフロップ271に保持されたCRC符号を、補正対象の第3CRC符号として入力する。
128bit部分演算部300及び301と、XOR回路302及び303は、補正対象の第3CRC符号を補正し、補正された第3CRC符号を算出する。XOR回路303の出力はセレクタ50の入力線「0」へ入力される。
42bit部分演算部320及び321の機能は、CRC符号が演算される並列データのビット数が42である点を除き、128bit部分演算部300の機能と同様である。また、85bit部分演算部330及び331の機能は、CRC符号が演算される並列データのビット数が85である点を除き、128bit部分演算部300の機能と同様である。
42bit部分演算部320の入力線「C」には初期値が入力され、42bit部分演算部321の入力線「C」にはフリップフロップ12から出力される第3CRC符号が入力される。フリップフロップ12から出力される第3CRC符号は、補正対象の第1CRC符号に対して1クロックサイクル先行して演算された第3CRC符号である。
85bit部分演算部330の入力線「C」には初期値が入力され、85bit部分演算部331の入力線「C」にはフリップフロップ12から出力される第3CRC符号が入力される。
XOR回路322は、42bit部分演算部320及び321の出力同士の排他的論理和を出力することにより、補正対象の第1CRC符号に対する補正値を算出する。XOR回路323は、この補正値と補正対象の第1CRC符号との排他的論理和を出力する。すなわち、XOR回路323は、上記補正値によって補正対象の第1CRC符号を補正し、補正された第1CRC符号を算出する。XOR回路323の出力はセレクタ52の入力線「0」へ入力される。
XOR回路332は、85bit部分演算部330及び331の出力同士の排他的論理和を出力することにより、補正対象の第2CRC符号に対する補正値を算出する。XOR回路333は、この補正値と補正対象の第2CRC符号との排他的論理和を出力する。すなわち、XOR回路333は、上記補正値によって補正対象の第2CRC符号を補正し、補正された第2CRC符号を算出する。XOR回路333の出力はセレクタ51の入力線「0」へ入力される。
本実施例によれば、ヘッダ及びCRC符号が、第1〜第3部分データのいずれにも挿入されることがあるデータフォーマットに対しても、CRC符号を生成することができる。
続いて、他のCRC符号生成回路の実施例について説明する。図17は、データフォーマットの第3例のタイミングチャートである。図17の第1段は、クロックのタイミングエッジの発生タイミングを示し、第2段は、第1スタ−トパルスSP1を示し、第3段は、第2スタ−トパルスSP2を示す。図17の第4段は、第1エンドパルスEP1を示し、第5段は、第2エンドパルスEP2を示す。
図17の第6段は、並列データを示す。データ中の「ヘッダ」は並列データの先頭に付加されたヘッダ情報を意味し、データ中の「CRC32」はCRC符号を意味する。このフォーマットの例では、上位データと下位データとが独立しており、それぞれのデータの先頭にヘッダが挿入され、末尾にCRC符号が挿入される。
第1スタ−トパルスSP1は、上位データの先頭が存在するクロックサイクルにてアサートされる。第2スタ−トパルスSP2は、下位データの先頭が存在するクロックサイクルにてアサートされる。第1エンドパルスEP1は、上位データへCRC符号を挿入するクロックサイクルにてアサートされる。第2エンドパルスEP2は、下位データへCRC符号を挿入するクロックサイクルにてアサートされる。
例えば、クロックサイクル920において上位データの先頭が存在すると、クロックサイクル920において第1スタートパルスSP1がアサートされる。クロックサイクル920における上位データにはヘッダが挿入される。クロックサイクル921において第1エンドパルスEP1がアサートされることにより、クロックサイクル921の上位データにはCRC符号が挿入されることが示される。
また例えば、クロックサイクル922において下位データの先頭が存在すると、クロックサイクル922において第2スタートパルスSP2がアサートされる。クロックサイクル922における下位データにはヘッダが挿入される。クロックサイクル923において第2エンドパルスEP2がアサートされることにより、クロックサイクル923の下位データにはCRC符号が挿入されることが示される。
図18は、図17に示すフォーマットのデータについてCRC符号を演算するCRC符号生成回路の実施例の構成図である。別途説明する場合を除き、図9に示す構成要素と同様の構成要素には図9で使用した参照符号と同じ参照符号を付する。CRC符号生成回路1は、CRC演算部2と、補正部3と、シフトレジスタ4と、セレクタ50及び51と、セレクト信号生成部6と、フリップフロップ10〜19を備える。シフトレジスタ4は、フリップフロップ410〜417を備える。
CRC符号生成回路1は、モード設定信号を受信する。モード設定信号がアサートされていないとき、CRC符号生成回路1は、図9に示すCRC符号生成回路1と同様に動作する。モード設定信号がアサートされるとき、CRC符号生成回路1は、図17に示すフォーマットのデータの上位データ及び下位データにそれぞれ挿入するCRC符号を生成するように動作する。以下の説明において、モード設定信号がアサートされていない場合における動作モードを「第1モード」と表記することがある。モード設定信号がアサートされている場合における動作モードを「第2モード」と表記することがある。
第1モードでは、上位データ及び下位データのどちらかが並列データの先頭を含むクロックサイクルの下位データに挿入される第2CRC符号は補正しなくてよい。これに対し第2モードでは、並列データの先頭を含む下位データに挿入される第2CRC符号のみ、補正しなくてよい。このため、セレクト信号生成回路6は、モード設定信号がアサートされている場合には、OR回路600への第1スタートパルスSP1の入力を阻止するAND回路601とインバータ602を備える。
図19は、図18に示すCRC演算部2の構成例を示す図である。図10に示す構成要素と同様の構成要素には図10で使用した参照符号と同じ参照符号を付する。CRC演算部2は、64bit部分演算部200及び201と、フリップフロップ250〜256と、セレクタ210と、OR回路220を備える。
第2モードでは、64bit部分演算部201は、上位データに対して64bit部分演算部200により演算されたCRC符号と独立して、下位データに対するCRC符号を演算する。このためOR回路220は、モード設定信号と、フリップフロップ412によって遅延された第2スタートパルスSP2との論理和を、セレクタ210のセレクト信号として生成する。これによって第2モードでは、第2スタートパルスSP2の値に関わらず、64bit部分演算部201には初期値が入力される。
図20は、図18に示す補正部3の構成例を示す図である。図11に示す構成要素と同様の構成要素には図11で使用した参照符号と同じ参照符号を付する。補正部3は、128bit部分演算部300及び301と、XOR回路302及び303を備える。また、補正部3は、64bit部分演算部310及び311と、XOR回路312及び313を備える。
さらに、補正部3は、64bit部分演算部340及び341と、XOR回路342を備える。64bit部分演算部340及び341の機能は、64bit部分演算部310と同様である。また、補正部3は、セレクタ350及び351を備える。
第1モードでは、64bit部分演算部310及び311と、XOR回路312は、初期値と、1クロックサイクル先行して演算された第2CRC符号とに基づいて、第1CRC符号に対する補正値を演算する。一方で第2モードでは、64bit部分演算部310及び311と、XOR回路312は、初期値と、1クロックサイクル先行して演算された第1CRC符号とに基づいて、第1CRC符号に対する補正値を演算する。
セレクタ350は、モード設定信号に基づいて、64bit部分演算部311の入力線「C」へ入力する信号として、フリップフロップ13及び12からそれぞれ出力される第1CRC符号及び第2CRC符号のいずれか一方を選択する。セレクタ350は、特許請求の範囲に記載の第3セレクタの一例として挙げられる。
64bit部分演算部340及び341と、XOR回路342は、第2モードにおいて下位データに挿入されるCRC符号に対する補正値を演算する。64bit部分演算部340の入力線「C」には初期値が入力され、64bit部分演算部341の入力線「C」にはフリップフロップ12から出力される第2CRC符号が入力される。XOR回路342は、64bit部分演算部340及び341の出力同士の排他的論理和を出力することにより、第2モードにおける第2CRC符号に対する補正値を算出する。セレクタ351は、モード設定信号に基づいて、第2CRC符号に対する補正値として、XOR回路302及び342のどちらかから出力される補正値を選択する。
本実施例によれば、本実施例によれば、上位データと下位データとが独立しているデータフォーマットに対しても、CRC符号を生成することができる。
続いて、他のCRC符号生成回路の実施例について説明する。図21は、CRC符号生成回路における第6実施例の構成図である。図18に示すCRC符号生成回路1の場合、128ビットの並列データが半分ずつ分割され、上位データと下位データとが独立しているデータフォーマットに対してCRC符号を生成した。しかし、並列データは3個以上の部分データに分割され、各部分データが独立していてもよい。いずれかの部分データの桁数は、他の部分データの桁数と異なっていてもよい。
別途説明する場合を除き、図12に示す構成要素と同様の構成要素には図12で使用した参照符号と同じ参照符号を付する。CRC符号生成回路1は、CRC演算部2と、補正部3と、シフトレジスタ4と、セレクタ50〜52と、セレクト信号生成部6と、フリップフロップ10〜23を備える。図22は、図21に示すシフトレジスタ4の構成例を示す図である。図13に示す構成要素と同様の構成要素には図13で使用した参照符号と同じ参照符号を付する。シフトレジスタ4は、フリップフロップ420〜437を備える。
図18に示すCRC符号生成回路1と同様に、CRC符号生成回路1は、モード設定信号を受信する。モード設定信号がアサートされていないとき、CRC符号生成回路1は、図12に示すCRC符号生成回路1と同様に動作する。モード設定信号がアサートされるとき、CRC符号生成回路1は、第1部分データ〜第3部分データが独立しているデータフォーマットに対して、それぞれの部分データに挿入するCRC符号を生成するように動作する。
図23は、図21に示すセレクト信号生成部6の構成例を示す図である。図15に示す構成要素と同様の構成要素には図15で使用した参照符号と同じ参照符号を付する。第2モードでは、並列データの先頭を含む第2部分データに挿入される第2CRC符号のみ、補正しなくてよい。また第2モードでは、並列データの先頭を含む第3部分データに挿入される第3CRC符号のみ、補正しなくてよい。
このため、セレクト信号生成回路6は、モード設定信号がアサートされている場合には、OR回路61及び62への第1スタートパルスSP1の入力を阻止するAND回路63とインバータ64を備える。また、セレクト信号生成回路6は、モード設定信号がアサートされている場合には、OR回路61への第2スタートパルスSP2の入力を阻止するAND回路65とインバータ66を備える。
図24は、図21に示すCRC演算部2の構成例を示す図である。図14に示す構成要素と同様の構成要素には図14で使用した参照符号と同じ参照符号を付する。CRC演算部2は、42bit部分演算部202と、43bit部分演算部203及び204と、フリップフロップ260〜274と、セレクタ211及び212と、OR回路221及び222を備える。
第2モードでは、43bit部分演算部203は、第1部分データに対して42bit部分演算部202により演算されたCRC符号と独立して、第2部分データに対するCRC符号を演算する。このためOR回路221は、モード設定信号と、フリップフロップ423によって遅延された第2スタートパルスSP2との論理和を、セレクタ211のセレクト信号として生成する。これによって第2モードでは、第2スタートパルスSP2の値に関わらず、43bit部分演算部203には初期値が入力される。
また第2モードでは、43bit部分演算部204は、第2部分データに対して43bit部分演算部203により演算されたCRC符号と独立して、第3部分データに対するCRC符号を演算する。このためOR回路222は、モード設定信号と、フリップフロップ427から出力される第3スタートパルスSP3との論理和を、セレクタ212のセレクト信号として生成する。これによって第2モードでは、第3スタートパルスSP3の値に関わらず、43bit部分演算部204には初期値が入力される。
図25は、図21に示す補正部3の構成例を示す図である。図16に示す構成要素と同様の構成要素には図16で使用した参照符号と同じ参照符号を付する。補正部3は、128bit部分演算部300及び301と、XOR回路302及び303を備える。また、補正部3は、42bit部分演算部320及び321と、XOR回路322及び323を備える。また、補正部3は、85bit部分演算部330及び331と、XOR回路332及び333を備える。
さらに補正部3は、43bit部分演算部360及び361と、XOR回路362を備える。また補正部3は、43bit部分演算部370及び371と、XOR回路372を備える。また、補正部3は、セレクタ352〜354を備える。43bit部分演算部360、361、370及び371の機能は、CRC符号が演算される並列データのビット数が43である点を除き、128bit部分演算部300の機能と同様である。
第1モードでは、42bit部分演算部320及び321と、XOR回路322は、初期値と、1クロックサイクル先行して演算された第3CRC符号とに基づいて、第1CRC符号に対する補正値を演算する。一方で第2モードでは、42bit部分演算部320及び321と、XOR回路322は、初期値と、1クロックサイクル先行して演算された第1CRC符号とに基づいて、第1CRC符号に対する補正値を演算する。
セレクタ352は、モード設定信号に基づいて、42bit部分演算部321の入力線「C」へ入力する信号として、フリップフロップ14及び12からそれぞれ出力される第1CRC符号及び第3CRC符号のいずれか一方を選択する。
43bit部分演算部370及び371と、XOR回路372は、第2モードにおいて第2部分データに挿入されるCRC符号に対する補正値を演算する。43bit部分演算部370の入力線「C」には初期値が入力され、43bit部分演算部371の入力線「C」にはフリップフロップ13から出力される第2CRC符号が入力される。XOR回路372は、43bit部分演算部370及び371の出力同士の排他的論理和を出力することにより、第2モードにおける第2CRC符号に対する補正値を算出する。セレクタ354は、モード設定信号に基づいて、第2CRC符号に対する補正値として、XOR回路332及び372のどちらかから出力される補正値を選択する。
43bit部分演算部360及び361と、XOR回路362は、第2モードにおいて第3部分データに挿入されるCRC符号に対する補正値を演算する。43bit部分演算部360の入力線「C」には初期値が入力され、43bit部分演算部361の入力線「C」にはフリップフロップ12から出力される第3CRC符号が入力される。XOR回路362は、43bit部分演算部360及び361の出力同士の排他的論理和を出力することにより、第2モードにおける第3CRC符号に対する補正値を算出する。セレクタ353は、モード設定信号に基づいて、第3CRC符号に対する補正値として、XOR回路302及び362のどちらかから出力される補正値を選択する。
本実施例によれば、本実施例によれば、独立した第1部分データ〜第3部分データを含むデータフォーマットに対しても、CRC符号を生成することができる。
以上の実施例を含む実施形態に関し、更に以下の付記を開示する。
(付記1)
1個以上の並列データを逐次入力し、各前記並列データについて、該並列データと、初期値又は先行して演算された巡回冗長検査符号と、に基づいて巡回冗長検査符号を算出する所定演算を反復することにより、前記1個以上の並列データに対する巡回冗長検査符号を生成する巡回冗長検査符号生成回路であって、
前記所定演算を前記並列データの桁方向に分割した部分演算のそれぞれを、異なるパイプライン段において、前記初期値と前記並列データとに基づいて実行する複数の部分演算部と、
前記初期値と前記先行して演算された巡回冗長検査符号とに基づいて、前記部分演算部によって演算された巡回冗長検査符号を補正する補正部と、
を備える巡回冗長検査符号生成回路。
(付記2)
入力される前記並列データが前記1個以上の並列データの先頭データであるか否かに応じて、前記補正部による補正前後の巡回冗長検査符号のいずれか一方を選択する第1セレクタを備える付記1に記載の巡回冗長検査符号生成回路。
(付記3)
複数の前記パイプライン段の2段目以降のいずれかのパイプライン段の前記部分演算部に、前記初期値及び前記いずれかのパイプライン段の前段の前記部分演算部から出力される巡回冗長検査符号のいずれか一方を選択して入力する第2セレクタを備え、
前記補正部は、前記いずれかのパイプライン段の前段の前記部分演算部から出力される巡回冗長検査符号を補正する第1補正部と、最終段のパイプライン段の前記部分演算部から出力される巡回冗長検査符号を補正する第2補正部と、を少なくとも備える付記1又は2に記載の巡回冗長検査符号生成回路。
(付記4)
前記先行して演算された巡回冗長検査符号として、前記第1補正部により補正された巡回冗長検査符号及び前記第2補正部により補正された巡回冗長検査符号のいずれか一方を選択して、前記第1補正部へ入力する第3セレクタを備える付記3に記載の巡回冗長検査符号生成回路。
(付記5)
複数の前記パイプライン段の2段目以降のいずれかのパイプライン段の前記部分演算部に、前記初期値及び前記いずれかのパイプライン段の前段の前記部分演算部から出力される巡回冗長検査符号のいずれか一方を選択して入力する第4セレクタを備え、
前記補正部は、
前記いずれかのパイプライン段の前記部分演算部がその前段の前記部分演算部から出力される巡回冗長検査符号及び前記並列データに基づいて演算した巡回冗長検査符号を補正する第3補正部と、
前記いずれかのパイプライン段の前記部分演算部が前記初期値及び前記並列データに基づいて演算した巡回冗長検査符号を補正する第4補正部と、
前記第3補正部により補正された巡回冗長検査符号及び前記第4補正部により補正された巡回冗長検査符号のいずれか一方を選択して第5セレクタと、
を備える付記1又は2に記載の巡回冗長検査符号生成回路。
(付記6)
前記部分演算部のうちのいずれかの部分演算部に入力される並列データの桁数が、前記部分演算部のうちの他の部分演算部に入力される並列データの桁数と異なる付記1〜5のいずれか一項に記載の巡回冗長検査符号生成回路。
(付記7)
1個以上の並列データを逐次受信し、各前記並列データについて、該並列データと、初期値又は先行して演算された巡回冗長検査符号と、に基づいて巡回冗長検査符号を算出する所定演算を反復することにより、前記1個以上の並列データに対する巡回冗長検査符号を生成する巡回冗長検査符号生成方法であって、
前記所定演算を前記並列データの桁方向に分割した部分演算のそれぞれを、異なるパイプライン段において、前記初期値と前記並列データとに基づいて実行し、
前記初期値と前記先行して演算された巡回冗長検査符号とに基づいて、前記部分演算によって演算された巡回冗長検査符号を補正する、巡回冗長検査符号生成方法。