目次

4ビットフィードバックタイプROMシーケンサ

 手持ちの部品を利用して、ROMシーケンサを再設計してみました。



 他のページで紹介している内容と異なる分だけを説明します。

 カウンタを4ビットのレジスタとして利用。
 nLOADにトリガーを入力すると、入力の4ピンから
 内部の4フリップフロップにデータを記憶します。

 ROMシーケンサは、アドレスのゼロから信号を出力し
 指定されたアドレスに分岐して、次の信号を出力と
 いうサイクルを繰り返します。

 電源を入れたときに、レジスタの出力をすべてゼロに
 しておきます。これでアドレスのゼロから、動作開始
 を保証できました。

 ひとつのROMに1サイクルの動作では、使い勝手が悪い
 ので、16処理を選択できるようにします。

 ROMのアドレスA4からA7にDIPスイッチを接続し
 16パターンのうちの1パターンを選択できる
 仕様にしました。

 基板上に部品を半田付けすると、以下。




 ゼロプレッシャソケットをつけて、ROMのピンが
 抜き差しのときにストレスを受けないようにして
 おきます。

 外部信号を利用し、シーケンサの動作を変える
 こともできます。
 回路は、以下。



 回路でみると簡単なので、ワイヤーを直接接続して
 処理すればOK。

 DIPスイッチのある部分に、外部信号を与えると
 その信号の組み合せで、シーケンスの内容を変化
 させられます。

 外部信号を接続したときの動作は、Cプログラムで
 エミュレートして試験しておきました。

 Cプログラムは、以下。

#include <stdio.h>

#define OFF 0
#define ON  OFF+1

typedef unsigned char  byte ;
typedef unsigned short word ;

void rs_putchar(char x);
void rs_puts(char *xptr);
void crlf();
byte get_hex(char x);
char get_asc(byte x);
void init_array();
void show_array();
void binary_display(byte x);
void execute();

byte gflag ;
byte rpat[32];

void main()
{
  init_array();
  show_array(); rs_putchar('\n');
  gflag = OFF ; execute(); crlf();
  gflag = ON  ; execute(); crlf();
}

void rs_putchar(char x)
{
  putchar(x);
}

void rs_puts(char *xptr)
{
  while ( *xptr ) {
    rs_putchar( *xptr );
    xptr++ ;
  }
}

void crlf()
{
  rs_putchar('\r');
  rs_putchar('\n');
}

byte get_hex(char x)
{
  byte result ;
  /* default */
  result = 0 ;
  /* convert */
  if ( '0' <= x && x <= '9' ) { result = x - '0'; }
  if ( 'A' <= x && x <= 'F' ) { result = x - 'A' + 10 ; }
  if ( 'a' <= x && x <= 'f' ) { result = x - 'a' + 10 ; }

  return result ;
}

char get_asc(byte x)
{
  char result ;
  if ( x > 9 ) { result = 'A' + x - 10 ; }
  else         { result = '0' + x ; }

  return result ;
}

void init_array()
{
  byte ii ;
  byte dh ;
  byte dl ;
  for ( ii = 0 ; ii < 32 ; ii++ ) {
    /* separate */
    dh = (ii % 16) << 4 ;
    dl = 15 - (ii % 16);
    if ( ii < 16 ) { dl = 0 ; }
    /* concatenate */
    *(rpat+ii) = dh | dl ;
  }
  *(rpat+0x10) = 0x11 ;
  *(rpat+0x11) = 0x20 ;
  *(rpat+0x12) = 0x32 ;
  *(rpat+0x13) = 0x00 ;
}

void show_array()
{
  byte ii ;
  for ( ii = 0 ; ii < 32 ; ii++ ) {
    /* printf("%02X ",*(rpat+ii)); */
    binary_display(*(rpat+ii));
    rs_putchar(' ');
    if ( (ii & 7) == 7 ) { rs_putchar('\n'); }
  }
}

void binary_display(byte x)
{
  int ii ;
  for ( ii = 7 ; ii > -1 ; ii-- ) {
    rs_putchar(((x >> ii) & 1)+'0');
    if ( ii == 4 ) { rs_putchar('_'); }
  }
}

void execute()
{
  byte ii   ;
  byte tmp  ;
  byte xadr ;
  /* initial address */
  xadr = (gflag << 4);
  /* counter */
  ii = 0 ;
  while ( ii < 32 ) {
    /* get ROM data */
    tmp = *(rpat+xadr);
    /* show counter */
    printf("%02d ",ii);
    /* show ROM data with binary image */
    binary_display( tmp ) ;
    /* add space */
    rs_putchar(' ');
    /* show data */
    printf("%X\n",tmp & 15);
    /* calcuate next address */
    xadr = ((tmp >> 4) & 15) + (gflag << 4);
    /* update counter */
    ii++ ;
  }
}

 このROMシーケンサは、踏切りの警報機でランプが点滅
 することをエミュレートしています。

 実行結果は、I/Oリダイレクトでファイルに格納して
 確認できます。

 最初の4行は、32バイトに格納してあるデータ。
 次の32行は、外部信号で閉塞区間に電車がいない場合
 の点滅に使う情報を出力。最後の32行は、閉塞区間に
 電車がいる場合のランプの点滅を示しています。

0000_0000 0001_0000 0010_0000 0011_0000 0100_0000 0101_0000 0110_0000 0111_0000 
1000_0000 1001_0000 1010_0000 1011_0000 1100_0000 1101_0000 1110_0000 1111_0000 
0001_0001 0010_0000 0011_0010 0000_0000 0100_1011 0101_1010 0110_1001 0111_1000 
1000_0111 1001_0110 1010_0101 1011_0100 1100_0011 1101_0010 1110_0001 1111_0000 

00 0000_0000 0
01 0000_0000 0
02 0000_0000 0
03 0000_0000 0
04 0000_0000 0
05 0000_0000 0
06 0000_0000 0
07 0000_0000 0
08 0000_0000 0
09 0000_0000 0
10 0000_0000 0
11 0000_0000 0
12 0000_0000 0
13 0000_0000 0
14 0000_0000 0
15 0000_0000 0
16 0000_0000 0
17 0000_0000 0
18 0000_0000 0
19 0000_0000 0
20 0000_0000 0
21 0000_0000 0
22 0000_0000 0
23 0000_0000 0
24 0000_0000 0
25 0000_0000 0
26 0000_0000 0
27 0000_0000 0
28 0000_0000 0
29 0000_0000 0
30 0000_0000 0
31 0000_0000 0

00 0001_0001 1
01 0010_0000 0
02 0011_0010 2
03 0000_0000 0
04 0001_0001 1
05 0010_0000 0
06 0011_0010 2
07 0000_0000 0
08 0001_0001 1
09 0010_0000 0
10 0011_0010 2
11 0000_0000 0
12 0001_0001 1
13 0010_0000 0
14 0011_0010 2
15 0000_0000 0
16 0001_0001 1
17 0010_0000 0
18 0011_0010 2
19 0000_0000 0
20 0001_0001 1
21 0010_0000 0
22 0011_0010 2
23 0000_0000 0
24 0001_0001 1
25 0010_0000 0
26 0011_0010 2
27 0000_0000 0
28 0001_0001 1
29 0010_0000 0
30 0011_0010 2
31 0000_0000 0

 動作をエミュレートできたなら、ROMに格納する
 情報を取り出して、ROMに転送するだけ。


目次

inserted by FC2 system