CRC16

16ビットのCRCはCRC16とCRC-CCITTの2種類があるよう です。 ITU-T V.41 で定義された16ビットの CRC-CCITT の生 成多項式は G(X)=X^16+X^12+X^5+1 です。
CRC16の生成多項式は G(X)=X^16+X^15+X^2+1 です。 USBの16ビットのCRCはこれです。 本頁のCRCはCRC-CCITTです。


logicname sample

{ -------------------------------------- }
{    実効譜                              }
{ -------------------------------------- }
entity crc16
input  res;
input  sin;
output q[16];
bitr   rq[16];

   if (res)
      rq = 0;
   else
      rq.0  = rq.15 ^ sin;
      rq.5  = rq.4  ^ (rq.15 ^ sin);
      rq.12 = rq.11 ^ (rq.15 ^ sin);

      rq.1:4   = rq.0:3;
      rq.6:11  = rq.5:10;
      rq.13:15 = rq.12:14;
   endif

   q = rq;
ende

{ -------------------------------------- }
{    機能実行譜                          }
{ -------------------------------------- }
entity sim
output res;
output sin;
output q[16];
output t1p;
bitr   tc[8];
bitr   td[28];
bitr   cd[16];

   part crc16(res,sin,q)

   tc=tc+1;

   if (tc>3)
      td.1:27=td.0:26;
   else   {↓テストデータ}
      td.0:27=0b0111010110111100110100010101;
   endif

   if (tc>=34)
      cd.1:15=cd.0:14;
   else   {↓テストCRC}
      cd=0b0100011001011011;
   endif

   if (tc==34) t1p=1; endif   {←テストデータ入力終了}

   if (tc>=34)
      sin=cd.15;   {←CRC入力}
   else
      sin=td.27;   {←テストデータ入力}
   endif

ende

endlogic

t1p が 1 のときがテストデータの最後のビットが入 ってテストデータの CRC が確定しています。
t1pの1のときからの入力にこの CRC を入れると q は 0 になります。