TEL:086-227-0113
info@gopher-tec.jp
TOP page 製品情報 FPGAソース CRC-16-USB Gen & Chk
CRC-16-USB Generator & Checker

USB2.0/1.1のトークンパケットで使用されるCRC-16-USBを、パラレルデータから生成・チェックする
サンプルコードです。
CRC-5-USBを生成・チェックするサンプルコードの続編的モジュールです。

USBにおけるCRC16の計算対象はデータパケットのデータフィールド全体で、データ長も計算方法も
CRC-5-USBとは異なります。このCRCに関する生成多項式等の情報は次の通りで、本来であれば、
これに従ってシリアルビット列からLFSR を作ればほぼ完成ですが、本サンプルではシリアルデータから
ではなく、8ビットパラレルデータ毎にLFSRとCRCを更新する構成としています。
CRC-16-USB
Parameter  Description 
生成多項式 G(X)=X16+X15+X2+1
LFSR初期値 0xFFFF
入出力順序 入力はLSBファーストで、D[7:0]のD[0]から入力
(つまり出力もLFSRをビットリバースする)
LFSRインバート インバートする。
CRC正常時のLFSR値 0x800D

簡単に使い方の分かるSIMトップファイルをオマケとして付けていますので、合わせて参照して下さい。


CRC16_USB_Gen モジュール:
Port I/O  Description 
CLK in クロック入力です。本モジュールはこの信号の立ち上がりエッジで動作します。
本サンプルコードにおけるCRCの生成とチェックは、パラレルデータに対して行うため、
本クロックは必ずしもUSBのビットクロックである必要はありません。
RST in 非同期リセット入力です。パワーオン時、またはシステムリセット時にアサートして
下さい。
INIT_LFSR in LFSRを初期値に戻すためのコントロール信号です。
フレーム開始の都度、1クロックだけアサートし、LFSRを初期化して下さい。
CALC_CRC in CRCを計算するためのコントロール信号です。
PDIN[7:0]にCRC計算対象が揃った時点で、1バイトにつき1クロックだけ
アサートして下さい。データが複数バイトから成る場合は、データが揃う都度、
繰り返しアサートして下さい。その次のクロックでLFSRとCRCが更新されます。
PDIN[7:0] in CRCの計算対象となるパラレルデータです。
CRC[15:0] out CRC出力です。シリアライズする際、CRC[0]から送出して下さい。
CRC16_USB_Chk モジュール:
Port I/O  Description 
CLK in CRC16_USB_Genモジュールと同様です。
RST in CRC16_USB_Genモジュールと同様です。
INIT_LFSR in CRC16_USB_Genモジュールと同様です。
CALC_CRC in LFSR(CRC)を再計算するためのコントロール信号です。
PDIN[7:0]にCRC計算対象が揃った時点で、1バイトにつき1クロックだけ
アサートして下さい。データが複数バイトから成る場合は、データが揃う都度、
繰り返しアサートして下さい。その次のクロックでLFSRが確定します。
PDIN[7:0] in LFSR(CRC)の再計算対象となるパラレルデータです。
受信される順、すなわちデータNバイトに続いてCRC[7:0]、CRC[15:8]
の順にPDIN[7:0]に入力して下さい。
CRC_CHK_TIM in 現在のLFSR 値でCRC の正誤判定をするためのストローブ信号です。
最終バイト(=CRC[15:8])に対するCALC_CRCのアサート以後、INIT_LFSR
またはCALC_CRCをアサートするまでの任意のタイミングでアサート可能です。
CRCが正しければ、その次のクロックでCRC_OKがアサートされます。
CRC_OK out CRC_CHK_TIMをアサートした次のクロックで、本信号がアサートされればCRC正常、
ネゲートされればCRC異常と分かります。
※特に注記のない限り、信号は全て正論理です。
本ソースコードはVerilog版のみとなっております。
詳細は下記の資料ダウンロードをクリックください。
ソースコード自体は当社WEBストアにて販売しております。

CRC-16-USB Gen & Chk
資料ダウンロード