8桁直列受信器 パリティ付き

スタートビットとストップビットとパリティの付いた8桁データを受信します。 通信クロックの周期はチップクロックの8倍とします。


logicname sample

{ -------------------------------------- }
{    手続き譜                            }
{ -------------------------------------- }
procedure spd
input  a;
output q;
bitr   rq[2];

   switch(rq)
      case 0:
         if (a) rq = 1; endif
      case 1:
         if (a)
            rq = rq;
         else
            rq = 2;
         endif
      case 2: rq = 0;
   endswitch

   q = rq.1;
endp

{ -------------------------------------- }
{    実効譜                              }
{ -------------------------------------- }
entity receive
input  res;
input  rs;
output q[8];
output sop;
output eop;
output pe;
bitr   ts[4];
bitr   rc[4];
bitn   rp;
bitr   sc[4];
bitr   d[8];
bitr   pc;
bitr   parity;
bitn   ieop;

{ - - - - - - - - - - - - - - - - - - -  }
{    受信検知                            }
{ - - - - - - - - - - - - - - - - - - -  }
   if (res)
      ts = 0;
   else
      if (rs)
         if (ts.2)
            ts=ts;
         else
            ts=ts+1;
         endif
      else
         if (ts.2)
           ts=ts;
         endif
      endif
   endif

{ - - - - - - - - - - - - - - - - - - -  }
{    受信クロック                        }
{ - - - - - - - - - - - - - - - - - - -  }
   if (ts.2)
      rc = rc + 1;
   endif

{ - - - - - - - - - - - - - - - - - - -  }
{    データ取得起点                      }
{ - - - - - - - - - - - - - - - - - - -  }
   rp = spd(rc.2);

{ - - - - - - - - - - - - - - - - - - -  }
{    取得計数                            }
{ - - - - - - - - - - - - - - - - - - -  }
   if (ts.2)
      if (rp)
         if (sc==10)
            sc = sc;
         else
            sc = sc + 1;
         endif
      else
         sc = sc;
      endif
   endif

   if (sc==10) ieop = 1; endif

{ - - - - - - - - - - - - - - - - - - -  }
{    データ取得                          }
{ - - - - - - - - - - - - - - - - - - -  }
   if (ts.2)
      if (sc>=8)
         d = d;
      else
         if (rp)
            d.7 = rs;
            d.0:6 = d.1:7;
         else
            d = d;
         endif
      endif
   else
      d = 0;
   endif

{ - - - - - - - - - - - - - - - - - - -  }
{    値1の桁を計数                       }
{ - - - - - - - - - - - - - - - - - - -  }
   if (ts.2)
      if (sc>=8)
         pc = pc;
      else
         if (rp)
            if (rs)
               pc = pc + 1;
            else
               pc = pc;
            endif
         else
            pc = pc;
         endif
      endif
   else
      pc = 0;
   endif

{ - - - - - - - - - - - - - - - - - - -  }
{    パリティ取得                        }
{ - - - - - - - - - - - - - - - - - - -  }
   if (ts.2)
      if (sc==8)
         parity = rs;
      else
         parity = parity;
      endif
   endif

{ - - - - - - - - - - - - - - - - - - -  }
{    パリティエラー                      }
{ - - - - - - - - - - - - - - - - - - -  }
   if (ieop)
      if (parity==pc)
         pe = 0;
      else
         pe = 1;
      endif
   endif

{ - - - - - - - - - - - - - - - - - - -  }

   q = d;
   sop = ts.2;
   eop = ieop;
ende

{ -------------------------------------- }
{    機能実行譜                          }
{ -------------------------------------- }
entity sim
output res;
output rs;
output q[8];
output sop,eop;
output pe;
bitr   tc[8];
bitr   b0c[4];
bitr   b1c[4];
bitr   td[8];
bitn   parity;

   part receive(res,rs,q,sop,eop,pe)

   tc=tc+1;

   if ((tc<5)|(tc>120)) res=1; endif

   if (tc>5)
      if (b0c==7)
         b0c=0;
      else
         b0c=b0c+1;
      endif
   endif

   if (tc>5)
      if (b0c==7)
         b1c=b1c+1;
      else
         b1c=b1c;
      endif
   endif

   td=0x55;   {←テストデータ}
   parity=1;  {←テストパリティ: この場合はパリティエラーになります。}

   switch(b1c)
      case 1: rs=1;
      case 2: rs=td.0;
      case 3: rs=td.1;
      case 4: rs=td.2;
      case 5: rs=td.3;
      case 6: rs=td.4;
      case 7: rs=td.5;
      case 8: rs=td.6;
      case 9: rs=td.7;
      case 10: rs=parity;
      case 11: rs=1;
   endswitch

ende

endlogic

PDF