目次
前
次
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(1byte)
- Byte Count(2byte)
- Start Address(4byte)
- Recode Type(2byte)
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を使うことにします。
目次
前
次