図2は、実施形態による通信システムの構成例を示す図である。通信システムは、送信装置及び受信装置を有する。送信装置は、MAC層201、CRC付加部202、符号化・変調部203、デジタル/アナログ変換部204、RF(Radio Frequency)部205及びアンテナ206を有する。MAC層201は、送信データを出力する。CRC付加部202は、送信データに対してCRC演算を行い、誤り検出符号(剰余)を付加した送信データを出力する。CRC付加部202の詳細は、後に図3を参照しながら説明する。符号化・変調部203は、CRC付加部202の出力データに対して誤り訂正の符号化又はインターリーブ処理、及びOFDM方式又はCDMA方式等の変調を行い、出力する。デジタル/アナログ変換部204は、符号化・変調部203の出力データをデジタルからアナログに変換して出力する。RF部205は、デジタル/アナログ変換部204の出力データを低周波数信号(ベースバンド周波数信号)から所定の高周波数信号に変換し、アンテナ206を介して、無線送信する。
受信装置は、アンテナ216、RF部215、アナログ/デジタル変換部214、復調・復号部213、CRC確認部212及びMAC層211を有する。RF部215は、アンテナ216を介して受信データを無線受信し、受信データを高周波数信号から低周波数信号(ベースバンド周波数信号)に変換して出力する。アナログ/デジタル変換部214は、RF部215の出力データをアナログからデジタルに変換して出力する。復調・復号部213は、アナログ/デジタル変換部214の出力データに対してOFDM方式又はCDMA方式等の復調、及び逆インターリーブ処理又は誤り訂正処理の復号を行い、出力する。CRC確認部212は、誤り検出部であり、復調・復号部213の出力データに対してCRC演算を行い、受信データに誤りがないか否かを検出する。MAC層211は、誤りの有無に応じて受信データの処理を行う。
図3は、図2のCRC付加部202の構成例を示す図である。CRC付加部202は、送信データを先頭から1ビットずつ入力データrとして入力する。排他的論理和回路301は、入力データrとレジスタd4の出力データとの排他的論理和データを出力する。レジスタd0は、排他的論理和回路301の出力データを記憶する。排他的論理和回路302は、レジスタd0の出力データとレジスタd4の出力データとの排他的論理和データを出力する。レジスタd1は、排他的論理和回路302の出力データを記憶する。レジスタd2は、レジスタd1の出力データを記憶する。排他的論理和回路303は、レジスタd2の出力データとレジスタd4の出力データとの排他的論理和データを出力する。レジスタd3は、排他的論理和回路303の出力データを記憶する。レジスタd4は、レジスタd3の出力データを記憶する。レジスタd0〜d4は、シフトレジスタを構成し、入力データrのビット入力毎にデータをシフトして記憶する。
CRC付加部202は、CRC演算を行う。具体的には、CRC付加部202は、入力データrに対して所定の生成多項式Gでモジュロー2の除算を行い、剰余RSを入力データrの後ろに付加することにより送信データを生成し、出力する。図3の場合、生成多項式Gは、G=1+x+x3+x5である。ここで、xの演算はモジュロー2である。すなわち、CRC演算は、r÷G=Q・・・RSの演算を行う。ここで、Qは商である。書き換えると、r=G×Q+RSで表される。入力データrの全ビットの入力が終了した時点において、5個のレジスタd0〜d4に記憶されている5ビットのデータが剰余RSである。CRC付加部202は、剰余RSを入力データrの後ろに付加することにより送信データを生成する。送信データは、r+RSのビット列である。
次に、図2のCRC確認部212について説明する。CRC確認部212は、図3のCRC付加部202と同じ構成を有する。すなわち、CRC確認部212は、CRC付加部202と同じCRC演算を行う。CRC確認部212は、上記のように、CRC付加部202が生成したr+RSの送信データを入力する。その入力データは、シリアルデータのビット列である。CRC確認部212は、CRC付加部202と同様のCRC演算を行う。具体的には、CRC確認部212は、入力データrに対して所定の生成多項式Gでモジュロー2の除算を行う。この生成多項式Gは、CRC付加部202で用いた生成多項式Gと同じである。入力データrに誤りがなければ、CRC演算の剰余RSは、送信データRSと同じである。CRC確認部212は、入力データrを先頭から1ビットずつ入力し、入力データrの全ビットの入力が終わった時点でレジスタd0〜d4に記憶されている5ビットの剰余が送信データRSと同じであれば誤りなしの結果を出力し、同じでなければ誤りありの結果を出力する。
図1は、実施形態によるデジタルシグナルプロセッサ(DSP)の構成例を示すブロック図である。デジタルシグナルプロセッサ101は、図2のCRC付加部202及びCRC確認部212に用いることができる。デジタルプロセッサ101は、プログラムカウンタ104、デコーダ105、レジスタファイル106、ロード・ストアユニット107、専用命令回路108及び算術論理演算ユニット(ALU)109を有し、命令RAM102及びデータRAM103に接続され、CRC演算を行うことができる。命令RAM102は、CRC演算命令及びパラメータ設定命令等を記憶する。プログラムカウンタ104は、現在の実行命令アドレスを示すプログラムカウンタ値を記憶する。デジタルシグナルプロセッサ101は、プログラムカウンタ104のプログラムカウンタ値が示すアドレスの命令を命令RAM102から読み出す。デコーダ105は、命令RAM102から読み出された命令をデコードし、レジスタファイル106内のレジスタにパラメータ等を記憶させる。例えば、デコーダ105は、パラメータ設定命令をデコードすることにより、CRC演算の生成多項式等のパラメータをレジスタファイル106に記憶させる。また、デコーダ105は、CRC演算命令をデコードすることにより、CRC演算開始を指示するためのフラグをレジスタファイル106に記憶させる。ロード・ストアユニット107は、データRAM103からパラメータ等のデータをロードしてレジスタファイル106に記憶させる。また、ロード・ストアユニット107は、レジスタファイル106からCRC演算結果等のデータを読み出してデータRAM103にストアする。専用命令回路(CRC演算回路)108は、レジスタファイル106内のパラメータを入力し、レジスタファイル106内のフラグに応じてCRC演算を開始し、CRC演算結果をレジスタファイル106に書き込む。算術論理演算ユニット109は、レジスタファイル106内のパラメータ等のデータに対して算術論理演算を行い、その演算結果をレジスタファイル106に書き込む。
無線通信で使用する規格として、LTE(Long Term Evolution)やWCDMA(Wideband Code Division Multiple Access)等のように様々な規格が提案され、使用されている。各規格に対応したシステムLSIは、設計時に対応する規格を決めるため、他の規格へ対応することは難しい。この問題に対応するために、図1のデジタルシグナルプロセッサのソフトウェアを用いて無線通信処理を行うSDRの方式が有利である。SDRでは、各種の無線通信処理をソフトウェアにて行うため、様々な規格に対応することができる。加えて、設計上において発生した問題に対しても、ソフトウェアの更新によって問題を解決することが可能になる。
以上のように、SDRはその柔軟性でハードウェアによる無線通信処理に対して優位性がある。しかし、無線通信処理では非常に多くの演算処理を要求するものが多く、汎用のデジタルシグナルプロセッサを用いたSDRでは、規格で要求されている処理を満たすことが難しい。そのため、無線通信の規格で頻繁に使用されている処理等においては、図1のようにデジタルシグナルプロセッサに専用命令回路108を持たせることにより高速化を実現することができる。
図4は、図1の専用命令回路(CRC演算回路)108の構成例を示す図である。専用命令回路108は、データs0及びs1を設定することにより、種々の生成多項式Gを用いたCRC演算を行うことができる。レジスタd0〜d31は、32ビットレジスタの各ビットデータを示し、図3のレジスタd0〜d4に対応し、初期値は例えば0である。入力データrは、図3の入力データrに対応する。複数の排他的論理和回路405は、図3の排他的論理和回路301〜303に対応する。
図5は、図4のデータs1の生成方法を説明するための図である。例として、図3のCRC演算回路を構成するためのデータs1の生成方法を説明する。図3のCRC演算回路の生成多項式Gは、G=1+x+x3+x5である。データs1は、生成多項式Gを表すデータである。生成多項式Gは、x、x3及びx5を含み、x2、x4、x6〜x30を含まない。含む項を「1」で表し、含まない項を「0」で表すと、31ビットデータs1は、「x、x2、x3、x4、x5、x6、・・・、x30」=「1、0、1、0、1、0、・・・、0」で表される。なお、x0=1の項は、必ず存在するので、データs1からは削除する。図5の回路に対応させると、排他的論理和回路302,303及びレジスタd4のフィードバック出力部に対応する位置は、データs1上で「1」になる。
図6は、図4のデータs0の生成方法を説明するための図である。例として、図3のCRC演算回路を構成するためのデータs0の生成方法を説明する。図3のCRC演算回路の生成多項式Gは、G=1+x+x3+x5である。データs0は、生成多項式Gの最大次数を表すデータである。生成多項式Gの最大次数は、例えばx5である。したがって、データs0は、最大次数であるx5のビットのみが「1」になり、それ以外のビットが0になる。なお、x0=1の項は、必ず存在するので、データs0からは削除する。すると、32ビットデータs0は、「x、x2、x3、x4、x5、x6、・・・、x31」=「0、0、0、0、1、0、・・・、0」で表される。図6の回路に対応させると、最後段のレジスタd4のフィードバック出力部に対応する位置は、データs0上で「1」になる。なお、データs0は、データs1を基に生成してもよい。
図7は、図4の入力データrの構成例を示す図である。入力データrは、32ビットレジスタr0〜r31に記憶される。レジスタr0〜r31は、それぞれ32個のシリアルビットデータを示す。レジスタr31が先頭のビットデータであり、レジスタr0が最後のビットデータである。図5及び図6のCRC演算回路では、レジスタr31のビットデータが先頭データとして入力される。レジスタd0〜d31の32ビットデータは、レジスタd31のデータを先頭として、シリアルに入力される。レジスタr31のデータは1回目のCRC演算で使用する入力データであり、レジスタr30のデータは2回目のCRC演算で使用する入力データであり、レジスタr0のデータは32回目のCRC演算で使用する入力データである。
図4において、32個の論理積(AND)回路401は、それぞれ、32ビットレジスタd0〜d31のデータと32ビットデータs0との論理積データを出力する。例えば、32ビットデータs0は、図6の場合、「0、0、0、0、1、0、・・・、0」である。したがって、レジスタd4のデータを入力した論積回路401のみがレジスタd4のデータを出力し、その他の論理積回路401は「0」を出力する。複数の論理和(OR)回路402は、32個の論理積回路401の出力データの論理和を演算し、最終段の論理和回路402は32個の論理積回路401の出力データの論理和データ406を出力する。その結果、最終段の論理和回路402は、例えば図3の最後段のレジスタd4のフィードバック出力部に対応し、例えばレジスタd4のデータを出力する。
排他的論理和回路403は、例えば図3の排他的論理和回路301に対応し、1ビット入力データrと論理和データ406との排他的論理和データをレジスタd0に出力する。レジスタd0は、そのデータを記憶する。
31個の論理積回路404は、それぞれ、31ビットデータs1と論理和データ406との論理積データを出力する。例えば、31ビットデータs1は、図5の場合、「1、0、1、0、1、0、・・・、0」である。その場合、左から1番目、3番目及び5番目の論理積回路404のみが論理和データ406を出力し、その他の論理積回路404は「0」を出力する。
31個の排他的論理和回路405は、それぞれ、31個の論理積回路404の出力データと31ビットのレジスタd0〜d30のデータとの排他的論理和データを出力する。例えば、左から1番目、3番目及び5番目の論理積回路404のみが論理和データ406を出力するので、左から1番目、3番目及び5番目の排他的論理和回路404のみが論理和データ406とレジスタd0、d2、d4との排他的論理和データをレジスタd1、d3、d5に出力し、その他の排他的論理和回路404はレジスタd1、d3、d5〜d30のデータをそのままレジスタd2、d4、d6〜d31に出力する。
以上の処理により、1回目のCRC演算を行うことができる。図4の最上部のレジスタd0〜d31と最下部のレジスタd0〜d31は同じレジスタである。2回目のCRC演算を行う場合には、最下部のレジスタd0〜d31のデータが最上部のレジスタd0〜d31のデータになり、入力データrとしてレジスタr30のデータが入力される。この処理を入力データrのビット数分繰り返すことにより、CRC演算が完了する。以上のように、データs0及びs1を設定することにより、種々の生成多項式GのCRC演算を行うことができる。
図8は、図1の専用命令回路(CRC演算回路)108の他の構成例を示す図であり、入力データレジスタr16〜r31のデータに対してCRC演算を行う例を示す。複数個のCRC演算ユニット801は、直列に接続される。各CRC演算ユニット801は、図4の構成を有する。ただし、レジスタd0〜d31は、各CRC演算ユニット801内には設けられず、初段のCRC演算ユニット801の入力端子にデータを出力し、セレクタ802の出力データを入力する。複数個のCRC演算ユニット801は、レジスタd0〜d31を介さずに配線により接続され、直接データの伝達を行う。
例えば、入力データレジスタr16〜r31を使用する場合を例に説明する。16個のCRC演算ユニット801は、それぞれ、16個のレジスタr16〜r31のデータを入力し、CRC演算を行う。CRC演算回数レジスタ803は、CRC演算を行う回数を記憶する。CRC演算回数は、入力データrのビット数に対応する。32個のセレクタ802は、CRC演算回数レジスタ803に記憶されているCRC演算回数に応じて、16個のCRC演算ユニット801の出力データのうちの1個のCRC演算ユニット801の出力データを選択し、32個のレジスタd0〜d31に出力する。例えば、CRC演算回数が8回の場合には、上から8個目のCRC演算ユニット801の出力データをCRC演算結果として選択して出力する。
以上説明したように、SDR用デジタルシグナルプロセッサ101の命令で処理するCRC演算において、その生成多項式Gを表すデータs1及び生成多項式Gの最大次数を表すデータs0を設定することにより、様々な生成多項式GのCRC演算に対応することができる。
CRC演算用の専用命令を設けることにより、対応する無線通信処理を効率化することが可能である。しかし、高い周波数で動作するプロセッサ速度においては、CRC演算回路によってはクリティカルパスにおけるタイミングエラーが発生する可能性が大きくなり、問題になることがある。
ここで、図4の回路の処理段数を計算する。論理積回路401は1段分の処理段数、論理和回路402は32個のデータの論理和演算をするために5段分の処理段数、論理積回路404は1段分の処理段数、排他的論理和回路405は1段分の処理段数が必要である。したがって、図4の回路は、1+5+1+1=8段分の処理段数が必要である。
次に、図8の回路の処理段数を計算する。1個のCRC演算ユニット801は、図4の回路と同じく8段分の処理段数が必要である。したがって、16個のCRC演算ユニット801は、8段×16個=128段分の処理段数が必要である。また、セレクタ802は、16個のデータの中から1個のデータを選択するため8段分の処理段数が必要になる。したがって、図8の回路は、128+8=136段分の処理段数が必要になる。
以下、処理段数がより少ないCRC演算回路の実施形態を説明する。処理段数を少なくすることにより、CRC演算を高速化することができる。また、クリティカルパスの段数を減らすことができるので、タイミング余裕時間が長くなり、高速なプロセッサの使用が可能になる。
図9は、実施形態による図1の専用命令回路(CRC演算回路)108の構成例を示す図である。専用命令回路108は、状態レジスタd0〜d31、入力データレジスタ904、事前処理部901、CRC演算ユニット902及び事後処理部903を有するCRC演算回路である。入力データレジスタ904は、図7の32ビットレジスタr0〜r31に対応し、例えばレジスタr31である。事前処理部901は、図10のシフト量演算回路、図11の第1の入力シフト回路、図12の第2の入力シフト回路、及び図13の第3の入力シフト回路を有する。CRC演算ユニット902は、図14の回路構成を有する。事後処理部903は、図15の出力シフト回路を有する。
図10は、図9の事前処理部901内のシフト量演算回路の構成例を示す図である。32個の論理積回路1001は、それぞれ、32ビットデータs0と定数「0」〜「31」との論理積データを出力する。例えば、32ビットデータs0は、図6に示した通り、「0、0、0、0、1、0、・・・、0」である。したがって、左から5番目の論理積回路1001は定数「27」を出力し、その他の論理積回路1001は「0」を出力する。論理和回路1002は、32個の論理積回路1001の出力データの論理和を演算する。最終段の論理和回路1002は、32個の論理積回路1001の出力データの論理和データをシフト量レジスタ1003に出力する。例えば、32ビットデータs0が「0、0、0、0、1、0、・・・、0」の場合、シフト量レジスタ1003には定数「27」が記憶される。32ビットデータs0が「0、0、0、0、1、0、・・・、0」の場合、「1」のビット位置は左から5番目なので、32−5=27より、シフト量が「27」になる。すなわち、図10のシフト量演算回路は、生成多項式Gの最大次数のビット位置を表すデータs0を基にシフト量を演算し、シフト量レジスタ1003に書き込む。
図11は、図9の事前処理部901内の第1の入力シフト回路の構成例を示す図である。5段バレルシフタ1101は、シフト量レジスタ1003に記憶されているシフト量に応じて、32ビットデータs1を右にビットシフトする。ビットシフトされた32ビットデータのうち、下位31ビットが第1のデータs1’になる。例えば、シフト量レジスタ1003のシフト量が「27」の場合、5段バレルシフタ1101は、32ビットデータs1の「1、0、1、0、1、0、・・・、0」を27ビット右にシフトし、データ「0、・・・、1、0、1、0、1」を出力する。出力データ「0、・・・、1、0、1、0、1」のうち、最上位ビットは必ず1になるので、下位31ビットのデータ「0、・・・、1、0、1、0」を第1のデータs1’とする。すなわち、図11の第1の入力シフト回路は、生成多項式Gの最大次数が最上位ビットになるように生成多項式Gを表すデータs1をシフトすることにより複数ビットの第1のデータs1’を生成する。第1のデータs1’は、生成多項式Gの最大次数が最上位ビットになるように配置され、生成多項式Gを表すデータである。
図12は、図9の事前処理部901内の第2の入力シフト回路の構成例を示す図である。5段バレルシフタ1202は、シフト量レジスタ1003に記憶されているシフト量に応じて、32ビット規定値1201を右にビットシフトする。ビットシフトされた32ビットデータが第2のデータs0’になる。32ビット規定値1201は、最下位ビットのみが「1」のデータ「1、0、0、・・・、0、0」である。例えば、シフト量レジスタ1003のシフト量が「27」の場合、5段バレルシフタ1202は、32ビット規定値1201の「1、0、0、・・・、0、0」を27ビット右にシフトし、データ「0、0、・・・、0、1、0、0、0、0」を出力する。その出力データのうちの下位31ビットデータ「0、・・・、0、1、0、0、0、0」が、第2のデータs0’となる。すなわち、図12の第2の入力シフト回路は、シフト量レジスタ1003に記憶されているシフト量を基に規定値1201をシフトすることにより複数ビットの第2のデータs0’を生成する。第2のデータs0’は、生成多項式Gの開始ビット位置を示すデータである。
図13は、図9の事前処理部901内の第3の入力シフト回路の構成例を示す図である。5段バレルシフタ1301は、シフト量レジスタ1003に記憶されているシフト量に応じて、32ビット状態レジスタd0〜d31のデータを右にビットシフトする。ビットシフトされた32ビットデータが第3のデータd0’〜d31’になる。例えば、シフト量レジスタ1003のシフト量が「27」の場合、5段バレルシフタ1301は、32ビット状態レジスタd0〜d31のデータ「d0、d1、d2、・・・、d29、d30、d31」を27ビット右にシフトし、データ「0、0、・・・、0、d0、d1、d2、d3、d4」を出力する。出力データ「0、0、・・・、0、d0、d1、d2、d3、d4」は、第3のデータ「d0’、d1’、・・・、d26’、d27’、d28’、d29’、d30’d31’」となる。すなわち、図13の第3の入力シフト回路は、CRC演算の状態を表すレジスタd0〜d31のデータをシフトすることにより複数ビットの第3のデータd0’〜d31’を生成する。
図14は、図9のCRC演算ユニット902の構成例を示す図である。CRC演算ユニット902は、第1のデータs1’と、第2のデータs0’と、第3のデータd0’〜d31’とを入力し、第4のデータrに対してCRC演算する。第4のデータrは、入力データレジスタr0〜r31のデータであり、例えばレジスタr31のデータである。
第1の排他的論理和回路1403は、32ビットの第3のデータd0’〜d31’のうちの最上位ビットのデータd31’と、第4のデータrとの排他的論理和を演算して出力する。例えば、第1の排他的論理和回路1403は図3の排他的論理和回路301に対応し、最上位ビットデータd31’は図3の最後段のレジスタd4の出力フィードバックデータに対応し、第4のデータrは図3の入力データrに対応する。
31個の第1の論理積回路1401は、それぞれ、32ビットの第3のデータd0’〜d31’のうちの最上位ビットのデータd31’と、31ビットの第1のデータs1’との論理積を演算して出力する。例えば、図11の回路の場合、第1のデータs1’は、「0、・・・、1、0、1、0」である。その場合、右から2番目及び4番目の第1の論理積回路1401はそれぞれ第3のデータd31’を出力し、その他の第1の論理積回路1401は「0」を出力する。これにより、図3の場合、排他的論理和回路302及び303のみに、レジスタd4のデータを入力させることができる。
31個の第2の排他的論理和回路1402は、それぞれ、31個の第1の論理積回路1401の出力データと、32ビットの第3のデータd0’〜d31’のうちの最上位ビット以外の31ビットのデータd0’〜d30’との排他的論理和を演算して出力する。例えば、図11の回路の場合、第1のデータs1’は、「0、・・・、1、0、1、0」である。その場合、右から2番目の第2の排他的論理和回路1402は第3のデータd31’と第3のデータd29’との排他的論理和データを出力し、右から4番目の第2の排他的論理和回路1402は第3のデータd31’と第3のデータd27’との排他的論理和データを出力し、その他の第2の排他的論理和回路1402は第3のデータd0’〜d26’、d28’、d30’をそのまま出力する。右から2番目の第2の排他的論理和回路1402は図3の排他的論理和回路303に対応し、右から4番目の第2の排他的論理和回路1402は図3の排他的論理和回路302に対応する。
31個の第2の論理積回路1404は、それぞれ、第1の排他的論理和回路1403の出力データと、31ビットの第2のデータs0’との論理積を演算して出力する。例えば、図12の回路の場合、第2のデータs0’は、「0、・・・、0、1、0、0、0、0」である。その場合、右から5番目の第2の論理積回路1404は第1の排他的論理和回路1403の出力データを出力し、その他の第2の論理積回路1404は「0」を出力する。
30個の論理和回路1405は、それぞれ、31個の第2の排他的論理和回路1402のうちの左側の30個の第2の排他的論理和回路1402の出力データと、31個の第2の論理積回路1404のうちの右側の30個の第2の論積回路1404の出力データとの論理和を演算して出力する。
新たな第3のデータd0’は、31個の第2の論理積回路1404のうちの最左端の第2の論理積回路1404の出力データである。また、新たな第3のデータd1’〜d30’は、30個の論理和回路1405の出力データである。また、新たな第3のデータd31’は、31個の第2の排他的論理和回路1402のうちの最右端の第2の排他的論理和回路1402の出力データである。新たな第3のデータd0’〜d31’は、1回分のCRC演算の演算結果データを右にシフトしたデータに相当する。
図15は、図9の事後処理部903内の出力シフト回路の構成例を示す図である。5段バレルシフタ1501は、シフト量レジスタ1003に記憶されているシフト量に応じて、図14のCRC演算ユニット902が出力する新たな第3のデータd0’〜d31’を左にビットシフトする。例えば、シフト量レジスタ1003のシフト量が「27」の場合、5段バレルシフタ1501は、新たな第3のデータd0’〜d31’を27ビット左にシフトし、データ「d27’、d28’、d29’、d30’、d31’、0、・・・、0」を出力する。32ビット出力データ「d27’、d28’、d29’、d30’、d31’、0、・・・、0」は、32ビットCRC演算結果データとしてレジスタd0〜d31に出力される。すなわち、図15の出力シフト回路は、図14の30個の論理和回路1405の出力データ、31個の第2の論理積回路1404のうちの最左端の第2の論理積回路1404の出力データ、及び31個の第2の排他的論理和回路1402のうちの最右端の第2の排他的論理和回路1402の出力データを、図11の第1の入力シフト回路、図12の第2の入力シフト回路及び図13の第3の入力シフト回路に対して逆方向にシフトすることによりレジスタd0〜d31のCRC演算結果データを生成する。
以上のように、図9において、事前処理部901内の第1の入力シフト回路(図11)、第2の入力シフト回路(図12)及び第3の入力シフト回路(図13)は、右へのビットシフト処理を行う。CRC演算ユニット902は、事前処理部901により右にビットシフトされたデータを用いてCRC演算を行う。事後処理部903内の出力シフト回路(図15)は、CRC演算ユニット902の出力演算結果データに対して、事前処理部901のビットシフト方向とは逆に、左にビットすることにより、元のビット位置に戻す。これにより、正常なビット位置のレジスタd0〜d31のCRC演算結果データを得ることができる。
図14のCRC演算ユニット902の処理段数を計算する。第1の排他的論理和回路1403及び第1の論理積回路1401は処理段数が1段分、第2の排他的論理和回路1402及び第2の論理積回路1404は処理段数が1段分、論理和回路1405は処理段数が1段分である。したがって、図14のCRC演算ユニット902の処理段数の合計は、1+1+1=3段分である。図14のCRC演算ユニット902は処理段数が3段分であるので、図4のCRC演算回路(8段分の処理段数)よりも少なくなり、CRC演算に必要な処理段数を低減することができる。
図16は、他の実施形態による図1の専用命令回路(CRC演算回路)108の構成例を示す図であり、入力データレジスタr16〜r31のデータに対してCRC演算を行う例を示す。複数個のCRC演算ユニット902は、直列に接続される。各CRC演算ユニット902は、図14の構成を有する。事前処理部901、複数個のCRC演算ユニット902、セレクタ1601及び事後処理部903のそれぞれの間は、レジスタを介さずに配線により接続され、直接データの伝達を行う。
例えば、入力データレジスタr16〜r31を使用する場合を例に説明する。事前処理部901は、図11の第1の入力シフト回路、図12の第2の入力シフト回路及び図13の第3の入力シフト回路を有し、シフト量に応じてデータを右ビットシフトを行う。図16のCRC演算回路は、CRC演算ユニット902を複数接続し、複数のCRC演算ユニット902にレジスタr16〜r31の複数ビットの第4のデータをそれぞれ1ビットずつ入力する。16個のCRC演算ユニット902は、それぞれ、事前処理部901の出力データを基に、16個のレジスタr16〜r31のデータを入力し、CRC演算を行う。CRC演算回数レジスタ1602は、CRC演算を行う回数を記憶する。CRC演算回数は、入力データrのビット数に対応する。32個のセレクタ1601は、CRC演算回数レジスタ1602に記憶されているCRC演算回数に応じて、16個のCRC演算ユニット902の出力データのうちの1個のCRC演算ユニット902の出力データを選択し、事後処理部903に出力する。例えば、CRC演算回数が8回の場合には、上から8個目のCRC演算ユニット902の出力データをCRC演算結果として選択して出力する。事後処理部903は、上記の図15の構成を有し、シフト量に応じて、32個のセレクタ1601が出力するデータd0’〜d31’を左ビットシフトすることにより、CRC演算結果データをレジスタd0〜d31に出力する。
以上のように、事前処理部901がCRC演算に使用する生成多項式Gを表すデータs1の最大次数が最上位ビットに位置するようにシフトしてから、CRC演算ユニット902がCRC演算を行う。生成多項式Gの最大次数を最上位ビット位置に固定することにより、フィードバックされるデータのビット位置を固定することができるので、図16のように、1度に複数回のCRC演算を行う場合において、処理段数を少なくし、演算時間を短くすることができる。
次に、図16のCRC演算回路の処理段数を計算する。事前処理部901内のシフト量演算回路は、図10に示すように、論理積回路1001の1段分、32個のデータの論理和を演算する論理和回路1002の5段分を必要とする。シフト量演算回路の処理段数の合計は、6段分である。また、事前処理部901内の第3の入力シフト回路は、図13に示すように、5段バレルシフタ1301が10段分の処理段数を必要とする。また、CRC演算ユニット902は、図14を参照しながら上記で説明したように、3段分の処理段数を必要とする。したがって、16個のCRC演算ユニット902は、3段×16個=48段分の処理段数を必要とする。また、セレクタ1601は、16個のデータの中から1個のデータを選択するので8段分の処理段数を必要とする。また、事後処理部903は、図15に示すように、5段バレルシフタ1501が10段分の処理段数を必要とする。したがって、図16のCRC演算回路の処理段数の合計は、6+10+48+8+10=82段分である。
図16のCRC演算回路は、処理段数が82段分であるので、処理段数が136段分である図8のCRC演算回路よりも、処理段数が少なく、CRC演算時間を短くすることができる。また、タイミング余裕時間が長くなるので、高速なプロセッサの使用が可能になる。
なお、上記実施形態は、何れも本発明を実施するにあたっての具体化の例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその技術思想、又はその主要な特徴から逸脱することなく、様々な形で実施することができる。