八桁の除算器

記憶型の論理です。 主な要素は 桁移動 比較 減算 です。


logicname sample

{ -------------------------------------- }
{    実効譜                              }
{ -------------------------------------- }
entity div8
input  reset;   {初期化}
input  a[8];    {被除数}
input  b[8];    {除数}
output q[8];    {}
output p[8];    {余り}
bitr   rah[8];  {a 移動上8桁}
bitr   ral[8];  {a 移動下8桁}
bitr   rq[8];   {商 記憶}
bitr   pseq[4]; {計算手順}

   if (reset)   {←初期化}
      rah=0;
      ral=a;
      rq=0;
      pseq=0;
   else         {↓計算}
      if (pseq<=8)   {↓計算手順が8未満なら計算}
         pseq=pseq+1;   {←計算手順を進めます。}

         rah.0=ral.7;      {←aを上位に桁移動}
         ral.1:7=ral.0:6;

         if (rah>=b)  {←a 移動上8桁とbが同じかaが大きい場合は} 
            rah=(rah-b)>>1;   {bを減算して桁移動します。}
         else  {←a 移動上8桁よりbが大きい場合は桁移動だけします。}
            rah.1:7=rah.0:6;
         endif

         if (rah>=b)  {←a 移動上8桁とbが同じかaが大きい場合は}
            rq.0=1;  {←商の最下位の桁を1にします。}
         endif

         rq.1:7=rq.0:6;{←商を上位に桁移動}

      else   {↓計算手順が8以上なら停止}
         pseq=pseq;
         rah=rah;
         ral=ral;
         rq=rq;
      endif
   endif

   q=rq;           {商の代入}
   p.0:6=rah.1:7;  {余りの代入}
   p.7=0;
ende

{ -------------------------------------- }
{    機能実行譜                          }
{ -------------------------------------- }
entity sim
output reset;
output a[8],b[8];
output q[8];
output p[8];
bitr   tc[4];
bitr   tca[8];
bitr   tcb[8];

   part div8(reset,a,b,q,p)

   tc=tc+1;

   if (tc==15) tca=tca+1; else tca=tca; endif

   if ((tc==15)&(tca==255))
      tcb=tcb+1;
   else
      if ((tc==15)&(tcb==0))
         tcb=5;
      else
         tcb=tcb;
      endif
   endif

   reset=(tc==15);
   a=tca;
   b=tcb;
ende

endlogic

初期化から 100 ÷ 10 = 10 を 10 クロックで計算を 完了しています。