1を数える

その1

非記憶型の論理です。4ビット中の1を数える論理を2個 使って、それぞれの計数値を足して8ビット中の1の数を 求めます。

file: sample10
topic08a.jpg(20814 byte)

論理譜

logicname yahoo11

entity main
input  a[8];
output q[4];

bitn   noa[3];
bitn   nob[3];
bitn   no[4];

   switch(a.0:3)
      case 0b0000: noa=0;
      case 0b0001: noa=1;
      case 0b0010: noa=1;
      case 0b0011: noa=2;
      case 0b0100: noa=1;
      case 0b0101: noa=2;
      case 0b0110: noa=2;
      case 0b0111: noa=3;
      case 0b1000: noa=1;
      case 0b1001: noa=2;
      case 0b1010: noa=2;
      case 0b1011: noa=3;
      case 0b1100: noa=2;
      case 0b1101: noa=3;
      case 0b1110: noa=3;
      case 0b1111: noa=4;
   endswitch

   switch(a.4:7)
      case 0b0000: nob=0;
      case 0b0001: nob=1;
      case 0b0010: nob=1;
      case 0b0011: nob=2;
      case 0b0100: nob=1;
      case 0b0101: nob=2;
      case 0b0110: nob=2;
      case 0b0111: nob=3;
      case 0b1000: nob=1;
      case 0b1001: nob=2;
      case 0b1010: nob=2;
      case 0b1011: nob=3;
      case 0b1100: nob=2;
      case 0b1101: nob=3;
      case 0b1110: nob=3;
      case 0b1111: nob=4;
   endswitch

   no=noa+nob;

   q=no;

ende

entity sim
output a[8];
output q[4];

bitr   tc[9];

   part main(a,q)

   tc=tc+1;

   a.0:7=tc.0:7;

ende

endlogic

その2

記憶型の論理で8ビット中の1を数えます。 データをシフトレジスタに置いて下位から上位にビット をひとつずつ送っていきます。 最上位のビットが1ならビットの計数をひとつ増やします。 これを8回行うと8ビット中の1の数が計数値に求まります。

file: sample11
topic08b.jpg(65471 byte)

論理譜

logicname yahoo12

entity main
input  reset;
input  a[8];
output q[4];
output eon;

bitr   shift[8];
bitr   count[4];
bitr   no[4];
bitr   point[4];
bitn   point9p;

output T0P[8]; T0P=shift;
output T1P[4]; T1P=count;

   if (reset)
      shift=0;
   else
      if (point==0)
         shift=a;
      else
         shift.1:7=shift.0:6;
      endif
   endif

   if (reset)
      count=0;
   else
      if (point==0)
         count=0;
      else
         if (shift==0)
            count=count;
         else
            if (shift.7)
               count=count+1;
            else
               count=count;
            endif
         endif
      endif
   endif

   if (reset)
      no=0;
   else
      if (point9p)
         no=count;
      else
         no=no;
      endif
   endif

   if (reset)
      point=0;
   else
      if (point9p)
         point=0;
      else
         point=point+1;
      endif
   endif

   if (point==9) point9p=1; endif

   q=no;
   eon=point9p;

ende

entity sim
output reset;
output a[8];
output q[4];
output eon;

bitr   tc[9];
bitr   tca[8];
bitn   node_reset;
bitn   node_eon;

   reset=node_reset;
   eon=node_eon;

   part main(node_reset,a,q,node_eon)

   tc=tc+1;

   if (tc<5) node_reset=1; endif

   if (node_reset)
      tca=0;
   else
      if (node_eon)
         tca=tca+1;
      else
         tca=tca;
      endif
   endif

   a.0:7=tca.0:7;

ende

endlogic