|
命令デコーダを改造してアドレス空間を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
改変、配付は自由ですが、著作権は放棄しません。
また、必ずしも動作を保証するものではありません。
動画再生
|