目次

ワンホットコーディング

 ワンホットコーディングとは、フラグを見て、セットされた
 ときに、該当する処理を実行するようなプログラムです。

 LSI内部では、複数のブロックが同時並行で動作しているので
 指定フラグがセットされているときだけ、回路を動かす仕組み
 が欲しいときに使います。

 フラグは1ビット単位で処理するので、ステートマシンを使う
 プログラムでは、次のようなコードを使います。

    /* sequencer */
    if ( eflag.F1 == ON ) {
      /* run */
      plc(1);
      plc(2);
      plc(4);
      plc(8);
      /* exit */
      eflag.F1 = OFF ;
    }

 変数をひとつのシフトレジスタと見なして、各々のビットを
 フラグで使います。

 呼ばれた関数は、次コードで、指定動作を実行。

void plc(UBYTE x)
{
  /* judge */
  if ( x > 8 ) return ;
  /* default */
  xf = XCNTMAX ;
  /* clear 74HC139 control bits */
  GPIO = GPIO & 0xfc ;
  /* turn on LED_3 */
  if ( x.F0 == ON ) { GPIO = GPIO | 3 ; }
  /* turn on LED_2 */
  if ( x.F1 == ON ) { GPIO = GPIO | 2 ; }
  /* enable LED_1 */
  if ( x.F2 == ON ) { GPIO = GPIO | 1 ; }
  /* judge */
  if ( x.F3 == ON ) { xf = YCNTMAX ; }
  /* calculate */
  TMR1L = xf & 0xff ;
  TMR1H = xf / 256 ;
  /* enable decoder */
  XENA = OFF ;
  /* send sound 500ms */
  T1CON.TMR1ON = ON ;
  delay_ms(500);
  T1CON.TMR1ON = OFF ;
  /* disable decoder */
  XENA = ON ;
  /* delay */
  delay_ms(250);
}

 変数中の0、1、2、3ビット目をフラグと見なして
 該当フラグがセットされていたときに、何をするのか
 記述すれば、状態遷移図に示された動作を実行可能に。

 ワンホットコーディングを適用すると、switch case を
 利用する多方向分岐の処理を、if文だけで記述できます。

 プログラムで変数は8ビット、16ビット、32ビットと
 ビット数を指定できるので、最大で利用するフラグ数
 を考えてコーディングすると、ループ処理や多方向の
 分岐を書きやすくなります。

目次

inserted by FC2 system