目次
前
次
ROMチェッカー
手元に8kバイトのROMがあるので、カウンタをシーケンサに使い
内部データを1ワード=16ビットでチェックするツールを作成。
回路図は、以下。
16ワード(=32バイト)の内容をシーケンサを利用して、ROMから出力。
各ICの役割を説明します。
4017
シーケンサとして使っています。
0から9ステートの役割は、以下。
- state 0 dummy
- state 1 send senor trigger (latch external informations)
- state 2 send reset signal (reset RS latch)
- state 3 send lower data latch trigger
- state 4 send reset signal (set RS latch)
- state 5 send upper data latch trigger
- state 6 send trigger to external circuit
- state 7 dummy
- state 8 dummy
- state 9 reset counter
4017は、0から9をカウントしていますが
ステートごとに論理値の'1'を出力。
タイミングチャートでは、以下となります。
74LS374(left hand)
16ビット分のデータを保持しておくために、外部から
ワード用アドレスを与えます。
ワード用アドレスを記憶しておくため、74LS374を使います。
4013
ROMには、A0からA8のアドレスを与えていきます。
A1からA8はワード用の0から255です。
A0はワードのうちの下位と上位を切り替えるため
RSラッチから、0か1を出力。
0出力か1出力かは、シーケンサ用カウンタの4017からの
制御信号で指定します。
片方のDタイプフリップフロップは、システムクロックの
DUTY比を50%にするために利用。
74LS374(right hand)
各レジスタは、1バイトのデータを記憶。
データ記憶のためのトリガーは、4017から与えられます。
半田付けすると、以下。
独立して動かせるように、4584による発振回路を入れました。
ROMチェッカーの回路を発展させると、コンピュータの
命令を引き出す instruction fetch 回路になります。
8ビットで命令が賄えない場合、16ビットまでに
拡張して利用できます。
16ビット出力のROMがあれば、32ビットまでに拡張できます。
ROMにパターンを入れるため、インテルのHEXファイルを利用します。
どういうパターンを入れるのかは、テキストファイルで
次のように指定します。
0 0 1 0
0 1 3 2
0 2 5 4
0 3 7 6
0 4 9 8
0 5 11 10
0 6 13 12
0 7 15 14
0 8 17 16
0 9 19 18
0 10 21 20
0 11 23 22
0 12 25 24
0 13 27 26
0 14 29 28
0 15 31 30
1 0 10 11
1 1 12 13
1 2 14 15
1 3 16 17
1 4 18 19
1 5 21 20
1 6 23 22
1 7 25 24
1 8 27 26
1 9 29 28
1 10 30 31
1 11 32 33
1 12 34 35
1 13 36 37
1 14 38 39
1 15 40 41
1行に上位、下位のアドレスを4ビットずつに並べ
続けて、データを2個並べます。
アドレスは9ビットなので、512バイト分のデータを
テキストファイルに用意して、それをHEXファイルへと
変換できるようにしておきます。
テキストファイルから、インテルHEXファイルへと変換する
ために、AWKのスクリプトを利用します。
スクリプトの内容は、以下。
# 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
}
BEGIN {
res = 0
}
{
adr = ($1 * 16 + $2) * 2
ln = NR - 1
r = ln % 8
# show address
if ( r == 0 ) {
# data size
res = res + 16
# address
res = res + (adr / 256) + (adr % 256)
# 2 data
res = res + $3 + $4
# show
printf(":10%04X00%02X%02X",adr,$3,$4)
}
# add check sum
if ( r == 7 ) {
# add
res = res + $3 + $4
# calculate check sum
result = bnot(res % 256) + 1
# show
printf("%02X%02X%02X\n",$3,$4,result)
# prepare next
res = 0
}
# others
if ( r != 0 && r != 7 ) {
# add
res = res + $3 + $4
# show
printf("%02X%02X",$3,$4)
}
}
END {
printf(":00000001FF\n")
}
8行ごとに16個のデータをまとめています。
AWKでは、NR(Number of Recode)でいくつ目のデータを
処理するのかを指定できるので、0から7の範囲に限定
して、動作を記述しました。
8行ごとに処理するので、8の倍数の行数でまとめた
パターンをHEXファイルへと変換できます。
次のようにI/Oリダイレクトを利用して生成。
生成したHEXファイルの内容は、以下。
:10000000010003020504070609080B0A0D0C0F0E78
:10001000111013121514171619181B1A1D1C1F1E68
:100020000A0B0C0D0E0F10111213151417161918B8
:100030001B1A1D1C1E1F20212223242526272829A8
:00000001FF
出来上がったHEXファイルは、ROMライターに渡せば
指定パターンを格納したROMが出来上がります。
目次
前
次