このページでは,FPGA上に作成するMCS-4の仕様を記します.本物のMCS-4は電源がVdd=-15[V],Vss=0[V],2相のクロックで動作,最高動作周波数740[kHz]となっていますが,これから作ろうとしているものはこのような制限に従う必要がありません.行えることを同等につつ,FPGAに最適な仕様にしていきましょう.
1:全体仕様
全体的な仕様を下に示します.
- 最高動作周波数は定義しません.
- データバスから送られてくるデータが取り込むトリガを立ち下がりエッジ,変化させるトリガを立ち上がりエッジとすることで,クロックを1個にします.
- Highを3.3[V],Lowを0[V]とするLVCMOSレベルとします.
1については,今回の教材に備わる水晶発信器が27[MHz]であるため,特別なことをしなければこの周波数が最速です.しかしPLLを用いれば更なる高速化が図れます.このため特に定めないものとします.なお,1命令ごとの動作を確認できるようにするため,手動のクロックを発生させるトグルスイッチからもクロックを供給できるようにします.
2については,2相クロックをやめて1個のクロックのエッジでデータの取り込みと変化を実現します.なお,SYNC信号はオリジナルと同じく使用しますが,実際にこの信号が回路の動作には影響を及ぼさないものとします.
3については,FPGAの周辺回路が3.3[V]で動作させているため,それにあわせています.また,レベルを3.3[V]のLVCMOSにすることとします.LVCMOSレベルであるため,スレッショールドはHighが2.97~3.3[V]Lowが0~0.33[V]となります.この制約は論理レベルではあまり考慮する必要はないものと思われます.
2:モードとスイッチ
CPUボードには,インストラクションの集まり,つまりプログラムをROMに記憶する入力モードと,プログラムの実行モード,さらに実行しているプログラムの状態を確認するためのデバッグモードがあります.これらのモードをSW18とSW16で切り替えられます.下に示す表はスイッチとモードの関係を示したものです.SW18を下(Low)にすると入力モードになり,SW18を上(High)にした状態でSW16を下(Low)にすると実行モード,下(Low)にするとデバッグモードになります.
入力モード | 実行モード | デバッグモード | |
SW16 | ※ | Low | High |
SW18 | Low | High | High |
※LowでもHighでもどちらでもよいことを示します.
2-1:入力モード
入力モードではSW1~8を使って1個のインストラクションを入れることができます.まずはSW17が下(Low)になっていることを確認したのち,トグルスイッチを切り替えて入力したいインストラクションにしたらSW17を上(High)します.これでFPGAにインストラクションが取り込まれます.
入力されたインストラクションは,ドットマトリクスディスプレイに右から順に表示されます.1列が8ビットですので,1列で1インストラクション,全体で32列ありますので,合計32インストラクションが表示することができます.下の図は入力されたインストラクションの模式図です.SW1が最下段,SW8が最上段になります.右上から1番目のインストラクション,以降は左の列に続きます.また,上側が上位ビット,下側が下位ビットを表します.加えて,図では青っぽい網掛けをしてある箇所がオペコード(OPR),緑っぽい網掛けをしてある箇所がオペランド(OPA)になります.このような32個のインストラクションを1ページと定義します.ページ数は7セグメントLEDで表示されるものとします.このため,インストラクションを入力する最初には「0000」と表示します.32個のインストラクション以降,つまり2ページ目以降は,7セグメントLEDの数字が1増えた上でもう一度ドットマトリクスディスプレイの右端から表示されます.下の図はドットマトリクスディスプレイにインストラクションが表示されている様子を示しています.右端8行1列が1番目のインストラクション,次に左隣の列に2番目,以下同じように32番目までのインストラクションが表示されます.
リセットスイッチを押すと,これまで記憶されていたインストラクションをすべて消去します.
2-2:実行モード
実行モードでは,SW1~12を使って4002に備わる入力端子に信号を送ります.また,SW13は4004に備わるTEST端子と接続しておきます.実行するときのクロックはSW15で手動クロック(Low)と自動クロック(High)が選べるようになっています.手動クロックの場合,SW17の信号がクロックとして使用され,自動クロックの場合には10[Hz]で動作するようにします.7セグメントLEDおよびLEDにはインストラクションにもとづく表示がなされ,ドットマトリクスディスプレイには4004の状態を表示します.下記の図をご覧ください.4004内部の状態をドットマトリクスディスプレイの左側半分を使って表示しています.黒色の箇所は未使用領域を表しております.サイクルの箇所には,8種類のサイクルを示せるようになっており,必ずどれか1個だけが点灯することになることに注意してください.
右12列にはユーザが表示したい内容を表示できるようにしてあります.もし出力をMCS-4で行う場合,4001もしくは4002の空いている端子を繋いでください.ドットマトリクスディスプレイのインタフェースはこちらに書かれていますので確認してください.
リセットスイッチを押すとプログラムカウンタが0になり,最初からプログラムを実行することができます.
2-3:デバッグモード
デバッグモードはプログラムをいったん停止し,4001および4002の状態を確認するときに使われます.SW13と14は表示内容を決定するために使用されます.下表は表示内容とスイッチに対応を示したものです.SW13がLowのときには4001,SW13がHighのときには4002の状態が表示されます.SW14は後述のページ切り替えのために使用されます.また,SW15は4002を表示ではメインメモリ文字とステータス文字の切り替えのために用いられます.
Low | High | |
SW13 | 4001 | 4002 |
SW14 | ページをダウン | ページをアップ |
SW15 | メインメモリ文字 | ステータス文字 |
4001や4002の内容をドットマトリクスディスプレイに表示する場合,一度にすべてを表示することができませんので,ある単位で区切って表示します.この単位をページと呼びます.1ページに表示できる内容は,ドットマトリクスディスプレイにある256個のLEDに対し,4001では1インストラクション8[bit]のため全部で32個となります.表示方法は,入力モードと同じく左上を1番目,右下を32番目となるようにします.4002では1[word]が4[bit]のため,最大で64[word]となります.しかし1個の4002には80[word]であるため表示が足りません.このため,メインメモリ文字とステータス文字を分けて表示します.この切り替えに使うのがSW15です.SW15がLowのときにはメインメモリ文字,Highのときにはステータス文字を表示します.下の図はメインメモリ文字を表示している様子を表しています.4002に備わる4個のレジスタを各ドットマトリクスディスプレイに配置しています.左側からレジスタ0,1,2,3と配しています.また,各ドットマトリクスディスプレイには左上4[bit]を0,その下4[bit]を1というようにメインメモリ文字を配置しています.
下の図はステータス文字を表示した様子を表します.左端からレジスタ0,1,2,3の順にステータス文字があります.1つの4002には64[bit]のステータス文字がある一方,1ページには256個のLEDがあります.このため,下の図では灰色になっているLED192個は未使用です.
ページを送るにはSW14で方向を設定し,SW17で変更を行います.ページをダウンさせるにはSW14をLow,アップさせるにはHighにした後,SW17より立ち上がりエッジを送ります.そしてページ番号は7セグメントLEDに表示されます.16個の4001には32768[bit]の記憶容量がありますので,ページ数は128(=32768/256)となります.従いまして,4001の内容を表示するときには0~127までのページが表示されることになります.同様に,4002の内容を表示するときには0~15までのページが表示されます.
最後に,モードと入出力装置の関係を表にまとめて示します.
入力モード | 実行モード | デバッグモード | |
SW1 | インストラクション1のビット7 | 4001#0-IO3 | - |
SW2 | インストラクション1のビット6 | 4001#0-IO2 | - |
SW3 | インストラクション1のビット5 | 4001#0-IO1 | - |
SW4 | インストラクション1のビット4 | 4001#0-IO0 | - |
SW5 | インストラクション1のビット3 | 4001#1-IO3 | - |
SW6 | インストラクション1のビット2 | 4001#1-IO2 | - |
SW7 | インストラクション1のビット1 | 4001#1-IO1 | - |
SW8 | インストラクション1のビット0 | 4001#1-IO0 | - |
SW9 | - | 4001#2-IO3 | - |
SW10 | - | 4001#2-IO2 | - |
SW11 | - | 4001#2-IO1 | - |
SW12 | - | 4001#2-IO0 | - |
SW13 | - | 4004に備わるTEST端子 | 表示内容を切り替えるスイッチ(Low⇒4001, High⇒4002) |
SW14 | - | - | 表示ページをダウン(Low)したりアップ(High)したりするスイッチ |
SW15 | - | 手動クロック(Low)と自動クロック(High)を切り替えるためのスイッチ | メインメモリ文字(Low)とステータス文字(High)を切り替えるスイッチ※4001の表示時には未使用 |
SW16 | - | 実行モード(Low)とデバッグモード(High)を切り替えるためのスイッチ | |
SW17 | インストラクションを入力するためのスイッチ(立ち上がり) | 手動クロック | 表示ページを変更するスイッチ |
SW18 | 入力モード(Low)と実行モード・デバッグ(High)を切り替えるためのスイッチ | ||
S1 | アドレス0から再度入力するためのスイッチ | プログラムカウンタを0にし,RAMをクリアするスイッチ | - |
7セグ | ページ番号を表示 | 実行結果を表示 | ページ番号を表示 |
DMD | インストラクション | 4004の内容 | 4001,4002の内容 |