チャタリング回避

チャタリングを回避する論理です。 スイッチを入力するシフトレジスタの全ビットが1か0 のとき計数を増やします、そうでないときは計数を0 にします。 計数が10に達したときスイッチの入力を確定させます。 この論理はチップCLKとは別に低周波のCLKを入力して 駆動させます。内部で分周したものでも構いません。

file: sample12
topic09a.jpg(19840 byte)

論理譜

logicname yahoo13

entity main
input  reset;
input  f100hz;
input  psw;

output q;

bitr   shift[2];
bitr   pulse10ms[2];
bitr   count[4];
bitr   pswreg;

output T0P[2]; T0P=shift;
output T1P[2]; T1P=pulse10ms;
output T2P[4]; T2P=count;

   if (reset)
      pulse10ms=0;
   else
      switch(pulse10ms)
         case 0:
            if (f100hz) pulse10ms=1; endif
         case 1:
             pulse10ms=2;
         case 2:
            if (f100hz)
               pulse10ms=pulse10ms;
            else
               pulse10ms=0;
            endif
      endswitch
   endif

   if (reset)
      shift=0;
   else
      if (pulse10ms.0)
         shift.0=psw;
         shift.1=shift.0;
      else
         shift=shift;
      endif
   endif

   if (reset)
      count=0;
   else
      if (pulse10ms.0)
         if ((shift==0)|(shift==3))
            if (count==10)
               count=count;
            else
               count=count+1;
            endif
         else
            count=0;
         endif
      else
         count=count;
      endif
   endif

   if (count==10)
      switch(shift)
         case 0: pswreg=0;
         case 1: pswreg=pswreg;
         case 2: pswreg=pswreg;
         case 3: pswreg=1;
      endswitch
   else
      pswreg=pswreg;
   endif

   q=pswreg;
ende

entity sim
output reset;
output f100hz;
output psw;
output q;

bitr   tc[8];

   part main(reset,f100hz,psw,q)

   tc=tc+1;

   if (tc<5) reset=1; endif

   f100hz=tc.1;

   if ((tc>10)&(tc<50))   psw=tc.2; endif
   if ((tc>50)&(tc<110))  psw=1; endif
   if ((tc>110)&(tc<150)) psw=tc.2; endif


ende

endlogic