CRC32

CCITT X.25 で定義されているそうです。
G(X)=X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X+1
イーサネットの32ビットCRCはこれです。


logicname sample

{ -------------------------------------- }
{    実効譜                              }
{ -------------------------------------- }
entity crc32
input  res,ld;
input  d[32];
input  sin;
output q[32];
bitr   rq[32];

   if (res)
      rq = 0;
   else
      if (ld)
         rq = d;
      else
         rq.0  = rq.31 ^ sin;
         rq.1  = rq.0  ^ (rq.31 ^ sin);
         rq.2  = rq.1  ^ (rq.31 ^ sin);
         rq.4  = rq.3  ^ (rq.31 ^ sin);
         rq.5  = rq.4  ^ (rq.31 ^ sin);
         rq.7  = rq.6  ^ (rq.31 ^ sin);
         rq.8  = rq.7  ^ (rq.31 ^ sin);
         rq.10 = rq.9  ^ (rq.31 ^ sin);
         rq.11 = rq.10 ^ (rq.31 ^ sin);
         rq.12 = rq.11 ^ (rq.31 ^ sin);
         rq.16 = rq.15 ^ (rq.31 ^ sin);
         rq.22 = rq.21 ^ (rq.31 ^ sin);
         rq.23 = rq.22 ^ (rq.31 ^ sin);
         rq.26 = rq.25 ^ (rq.31 ^ sin);

         rq.3 = rq.2;
         rq.6 = rq.5;
         rq.9 = rq.8;
         rq.13:15 = rq.12:14;
         rq.17:21 = rq.16:20;
         rq.24:25 = rq.23:24;
         rq.27:31 = rq.26:30;
      endif
   endif

   q = rq;
ende

{ -------------------------------------- }
{    機能実行譜                          }
{ -------------------------------------- }
entity sim
output res,ld;
output d[32];
output sin;
output q[32];
bitr   tc[8];
bitr   td[32];

   part crc32(res,ld,d,sin,q)

   tc=tc+1;

   if (tc<4)
      d.24:31=0b00000100;   {←初期値データ}
      d.16:23=0b11000001;
      d.8:15 =0b00011101;
      d.0:7  =0b10110111;
   endif

   if (tc<4)
      td.24:31=0b00000100;  {←テストデータ}
      td.16:23=0b11000001;
      td.8:15 =0b00011101;
      td.0:7  =0b10110111;
   else
      td.1:31=td.0:30;
   endif

   if (tc==3) ld=1; endif   {←初期値導入}

   sin=td.31;   {←テストデータ入力}
ende

endlogic

多項式から得られる初期値を q に与えてから同値を sin に入力して 0 になれば多項式の論理になってい ます。