ワンボードマイコンについて

マイコン回路の手ほどき

マイコン回路の手ほどき(白土義男著日本放送出版協会ISBN4-14-075013-8)に
載っている超ミニマイコンのワンボードマイコンを持っています。
河内研究所(ケイ・ポート)から買いました。
実験していると、RAMの動作マージンが少ないため、気付かず苦労して、
RAMを秋葉原で買い替えた記憶があります。

話は変わりますがTK-80と言うワンボードマイコンは、本になりまして、
「復活! TK-80」(榊 正憲さかきまさのり著アスキー出版局
ISBN4-7561-3401-7)として出版されています。
Windows版TK-80シミュレータ付属です。

CPUの創りかた

CPUの創りかた (渡波郁 著,MYCOM)に出て来るTD4を作成しました。
と、言っても、CPUにはALTERA社のCPLDを用い、
ROMにはUV-EPROM(2716)を用いました。
幸い、上記ケイポートの基板類を改造すると、
UV-EPROMライタ・モニタが作れましたので、2716用に使用しました。
2732用にもEPROMライタを作ろうと思ったのですが、他のbitにも影響が出て、
なぜか上手くいきませんでした。
CPUはパソコン上で、HCシリーズの部品を1つ1つ配置し、
各部品を配線してそれをコンパイル後、ICに焼いて作りました。
本の通りに74HCシリーズのロジックICを用いて、
ROMをスイッチで作成する手間に比べれば楽をしたわけですが、
アドレスの拡張と言う次の手を考えての事ですので、カンベンして。

アドレス拡張版4bitCPUの作成

命令デコーダを改造してアドレス空間を4bitから12bitに拡張しました。
アドレスの読み込み方法は、

ROMアドレス (MSB)ROM:D7〜D0(LSB)
n :AAAA BBBB
n+1:CCCC CCCC

AAAAは命令のオペコードで、JMPとJNCを想定しています。
ジャンプ先のアドレスは、BBBB CCCC CCCCで12bit(MSB:A11〜A0:LSB)です。
・・・次のアドレスとで合計16bit=オペコード4bit+ジャンプ先アドレスA11〜A0の12bit
基本的にImは4bitですが、JMP,JNC命令の時だけアドレス12bitです。
他の命令セットはTD4とほぼ同一です。
命令セット
ADD_A_Im 4'h0
MOV_A_B 4'h1
IN_A 4'h2
MOV_A_Im 4'h3
MOV_B_A 4'h4
ADD_B_Im 4'h5
IN_B 4'h6
MOV_B_Im 4'h7
OUT_B 4'h9
OUT_Im 4'hB
JNC_Im 4'hE
JMP_Im 4'hF

コンパイル、書き込みをした実物にて実世界で動作を確認したと言うのみで、
詳細なバグ出しまではしていません。

ソースは次の通り。
ALU.v
BOARD.v
CPU.v
DECODER.v
MUX.v
PC.v
REGISTER.v
ROM.v
opcode.v
t_pucci.v

シミュレーションの流し方
iverilog t_pucci.v ALU.v DECODER.v MUX.v PC.v CPU.v REGISTER.v ROM.v BOARD.v
%go

ROMいろいろ(ROM.vと名前を変更してverilogでsimulationします。)
チカチカ
6分間タイマ
ジャンプ動作確認用

シミュレーションはフリーのivelilogにてMacOSX上で実行しました。
また、SunOSやHP-UXのverilogでも同様のソースにて可能でした。
ICへの焼き方は、PC上でHCシリーズの部品を1つ1つ配置・配線していく
方法で作成しました。
どうやら、EPM7064SLC44-10は、これ位のゲート数が限界らしく、
コンパイル時、次にやる時はもっとでかいチップを使え
と、エラーを出しまくっていました。
参考:http://park11.wakwak.cXm/~domo/cpld.html verilogソース
CPUにマイナスやAND,OR,EOR等を付けたり、8bit化するためには、
もっと多くのゲート数の入るCPLDが必要であるものと思われます。

見つかっているバグ(バグフィクスの労力がない事及びチップサイズの関係で、
バグはこのままにします)
(1)自分自身へのJMP,JNCは出来ない。OUT_Imなど2回ダミー命令が必要。
(命令デコーダの関係で。TD4ではそんなことありません)
(2)ROMのアドレス0番地にJMP,JNC命令を書かないでください。
ダミー命令を2つ以上入れて、JMP,JNCは3つ目以降からにしてください。
(3)IN_AなどImを必要としない命令のImデータ部分には必ず4'h0を入れて下さい。
そうでないと出力が正しく出ません。
(4)JNCアドレスがXXXX0000YYYYの時AレジスタにYYYYの値が代入されてしまう。
Cフラグが立ってそのまま次のアドレスに行く時で、
JNCでCフラグが立ってスルーする時、アドレスの一部をopcodeと取ってしまう。
対策としてBレジスタに0を入れておき、手動でAレジスタに入れる。

アドレス拡張版4bitCPUをご希望の方がいらっしゃいましたならば、
お一人様1個1,500円にて販売致します。
詳細はメールにて。RXS02316@nifty.com

改変、配付は自由ですが、著作権は放棄しません。
また、必ずしも動作を保証するものではありません。

動画再生

ROM(ロム)をgate(ゲート)に変換してみよう。

PARTHENONで論理合成出来る事を利用して
ROMのデータを論理ゲートに変換してみました。
Rubyとgccの実行出来る環境が必要です。

test.cを作る。
vi test.c
コンパイルする。
gcc test.c -o test.exe -lm
実行する。
./test.exe > rom5.sfl
ruby bar.rbbar5.sfl
ROMのデータがbar5.sflに移りますので、
viエディタでbar5.sflのデータをrom5.sflに移し、
PARTHENONで実行出来る様にいじります。
あとはPARTHENONで論理合成。

ROMのアドレス空間n=5bitは上手く出来たみたいですが、
n=6bitだとPARTHENONがglobal stack fullみたいなエラーを出して
上手くいきませんでした。

4bitCPUのシミュレータを作ろう。

アドレス拡張版4bitCPUの動作のモニタプログラムを作成しました。
実行には、Rubyが必要です。
ROM.datにROMのデータを用意します。
puccimoni.rb内の$INを必要であれば変更します。
(INA,INB命令が不使用な時は$INの変更は不要。)

実行方法
ruby puccimoni.rbdebug.txt

(う〜ん、リナックスザウルスだと上手くいったのに、
他の実行環境だと上手くいかないみたいだなぁ・・・)
Macintosh=>UNIX
tr -s '\r' '\n' < puccim.rb > puccimoni.rb

アドレス拡張版4bitCPUのアセンブラを作ろう。

アドレス拡張版4bitCPUのためのアセンブラを作成しました。
「頭で考えた方が速い」と言う意見もあると思いますが、
気分転換に作ってみました。
ある本からのソースを改造しただけです。
実行すると、アセンブリ言語の横に
EPROMに書き込むための16進数が表示されます。

$gcc asm.c
実行形式a.outを作成します。
$./a.out meirei.txt source.asmoutJNC.txt


トップページへ


メールはこちらまで

NIFTY ID:RXS02316@nifty.com