目次

ALU設計開発

 ALUは、フルアダーとしておき、8入力5出力の
 デコーダとして実現します。



 ROMのアドレスに2ニブルを与え、データから加算結果と
 キャリーを出力します。

 2つの4ビット入力をA0からA3、A4からA7に分けて処理すれば
 よいので、次のような処理でアドレスとデータの対応関係を
 作れば実現できそうです。

  for ( b = 0 ; b < 16 ; b++ ) {
    for ( a = 0 ; a < 16 ; a++ ) {
      sum = a + b ;
      # show sum ;
    }
  }

 Tcl/Tkでフルアダーを実現するROMの内容を生成します。

#! /usr/bin/tcl

for {set b 0} {$b < 16} {incr b} {
  set tmp ""
  for {set a 0} {$a < 16} {incr a} {
    set sum [expr $a+$b]
    set result [format "%02X" $sum]
    set tmp "$tmp$result"
    # show
    if { [expr $a % 8] == 7 } {
      puts $tmp
      set tmp ""
    }
  }
}

 テキストファイルに保存すると、以下。

0001020304050607
08090A0B0C0D0E0F
0102030405060708
090A0B0C0D0E0F10
0203040506070809
0A0B0C0D0E0F1011
030405060708090A
0B0C0D0E0F101112
0405060708090A0B
0C0D0E0F10111213
05060708090A0B0C
0D0E0F1011121314
060708090A0B0C0D
0E0F101112131415
0708090A0B0C0D0E
0F10111213141516
08090A0B0C0D0E0F
1011121314151617
090A0B0C0D0E0F10
1112131415161718
0A0B0C0D0E0F1011
1213141516171819
0B0C0D0E0F101112
131415161718191A
0C0D0E0F10111213
1415161718191A1B
0D0E0F1011121314
15161718191A1B1C
0E0F101112131415
161718191A1B1C1D
0F10111213141516
1718191A1B1C1D1E

 ROMライターは、HEXファイル形式かSレコード形式で
 なければ、受け付けないので、HEXファイル形式に
 します。

 HEXファイル形式にするため、ヘッダーとフッターを
 各行に付加します。

 ヘッダー

  ヘッダーには、次の4項目があります。

  Start Codeは、':'で固定。
  Byte Countは、ヘッダーに含まれないデータ数を指定。
  Start Addressは、行データをどこから格納し始めるか指定。
  Recode Typeは、データ行であれば、"00"で固定。

  Byte Count、Start Addressは、1行のデータ数が
  固定であれば、計算が楽になります。

  上のデータであれば、Byte Countは、16進数で08
  Start Addressは8の倍数になるので、0000、0008
  0010と変化させれば充分です。

 フッター

  フッターは、チェックサムになります。

  チェックサムは、Start Codeを除いたByte Count
  からデータの最後まで16進数2けたで加算します。
  総計を16進数にして、下2けたを2の補数にして
  チェックサムとします。

  ヘッダーとフッターを付加するAWKスクリプトを
  作成してみました。

#
function s2v(x) {
  #default
  result = 0
  #
  if ( x == "1" ) { result = 1 }
  if ( x == "2" ) { result = 2 }
  if ( x == "3" ) { result = 3 }
  if ( x == "4" ) { result = 4 }
  if ( x == "5" ) { result = 5 }
  if ( x == "6" ) { result = 6 }
  if ( x == "7" ) { result = 7 }
  if ( x == "8" ) { result = 8 }
  if ( x == "9" ) { result = 9 }
  if ( x == "A" ) { result = 10 }
  if ( x == "B" ) { result = 11 }
  if ( x == "C" ) { result = 12 }
  if ( x == "D" ) { result = 13 }
  if ( x == "E" ) { result = 14 }
  if ( x == "F" ) { result = 15 }

  return result
}

# 
function s2d(x) {
  # default
  result = 0
  # upper
  dh = s2v(substr(x,1,1))
  # lower
  dl = s2v(substr(x,2,1))
  # judge
  result = dh * 16 + dl

  return result
}

# bit inverse
function xinverse(x) {
  # default
  result = 0 
  # judge
  if ( x == 0 ) { result = 1 }

  return result
}

# 1's compliment
function bnot(x) {
  # copy
  tmpx = x
  # separate
  x0 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x1 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x2 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x3 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x4 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x5 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x6 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x7 = int( tmpx % 2 ) ;
  # inverse
  x0 = xinverse(x0) ; x1 = xinverse(x1)
  x2 = xinverse(x2) ; x3 = xinverse(x3)
  x4 = xinverse(x4) ; x5 = xinverse(x5)
  x6 = xinverse(x6) ; x7 = xinverse(x7)
  # calculate
  result = 0 ;
  result = result * 2 + x7 ; result = result * 2 + x6
  result = result * 2 + x5 ; result = result * 2 + x4
  result = result * 2 + x3 ; result = result * 2 + x2
  result = result * 2 + x1 ; result = result * 2 + x0

  return result
}

{
  # get 8 bytes data
  dats = $1
  # calculate data
  sum = 0 
  for ( i = 0 ; i < 8 ; i++ ) {
    stmp = substr(dats,2*i+1,2)
    sum += s2d( stmp )
  }
  # generate entry address
  xadr = 8 * (NR-1)
  xadrh = xadr / 256
  xadrl = xadr % 256
  # data count
  sum += 8
  # address high
  sum += xadrh
  # address low
  sum += xadrl
  # get 8 bits
  sum %= 256
  # 2's complement
  sum = bnot(sum)+1
  # get 8 bits
  sum %= 256
  # show
  printf(":08%04x00%s%02X\n",xadr,dats,sum)
}
END {
  printf(":00000001FF\n")
}

 このスクリプトで、HEXファイルを生成します。

  gawk -f mkalu.awk alu.txt > alu.hex

 HEXファイルの内容は、以下。

:080000000001020304050607DC
:0800080008090A0B0C0D0E0F94
:080010000102030405060708C4
:08001800090A0B0C0D0E0F107C
:080020000203040506070809AC
:080028000A0B0C0D0E0F101164
:08003000030405060708090A94
:080038000B0C0D0E0F1011124C
:080040000405060708090A0B7C
:080048000C0D0E0F1011121334
:0800500005060708090A0B0C64
:080058000D0E0F10111213141C
:08006000060708090A0B0C0D4C
:080068000E0F10111213141504
:080070000708090A0B0C0D0E34
:080078000F10111213141516EC
:0800800008090A0B0C0D0E0F1C
:080088001011121314151617D4
:08009000090A0B0C0D0E0F1004
:080098001112131415161718BC
:0800a0000A0B0C0D0E0F1011EC
:0800a8001213141516171819A4
:0800b0000B0C0D0E0F101112D4
:0800b800131415161718191A8C
:0800c0000C0D0E0F10111213BC
:0800c8001415161718191A1B74
:0800d0000D0E0F1011121314A4
:0800d80015161718191A1B1C5C
:0800e0000E0F1011121314158C
:0800e800161718191A1B1C1D44
:0800f0000F1011121314151674
:0800f8001718191A1B1C1D1E2C
:00000001FF

 最後の「:00000001FF」は、テキストエディタを
 利用して追加します。

 ROMのためのHEXファイルを作成しようと思って
 いたところ、部品箱から74LS181が出てきました。



 このALUを使うことにします。




目次

inserted by FC2 system