このページでは,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については,今回の教材に備わる水晶発信器が40[MHz]であるため実際にはこれが最速ですが,特に定めないものとします.ただし,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:入力モード
入力モードではPI1~PI16(SW1~16)を使って2個のインストラクションを入れることができます.まずはSW17が下(Low)になっていることを確認したのち,インストラクションが描かれたマークシートを挿入するか,トグルスイッチを切り替えて入力したいインストラクションにしたらSW17を上(High)します.これでFPGAにインストラクションが取り込まれます.なお,インストラクションを入力するときマークシートを使うにはSW21(スライドスイッチ)を下に,SW1~16のトグルスイッチを使うには上にしてください.
入力されたインストラクションは,ドットマトリクスディスプレイに左から順に表示されます.1列が16ビットですので,1列で2インストラクション,全体で32列ありますので,合計64インストラクションが表示することができます.下の図は入力されたインストラクションの模式図です.SW1が最上段,SW16が最下段になります.左上から1番目のインストラクション,続いて左下が2番目のインストラクションとなり,以降は左の列に続きます.また,上側が上位ビット,下側が下位ビットを表します.加えて,図では青っぽい網掛けをしてある箇所がオペコード(OPR),緑っぽい網掛けをしてある箇所がオペランド(OPA)になります.このような64個のインストラクションを1ページということにします.ページ数は7セグメントLEDで表示されるものとします.このため,インストラクションを入力する最初には「0000」と表示します.64個のインストラクション以降,つまり2ページ目以降は,7セグメントLEDの数字が1増えた上でもう一度ドットマトリクスディスプレイの左端から表示されます.下の図はドットマトリクスディスプレイにインストラクションが表示されている様子を示しています.左上8行1列が1番目のインストラクション,その下にある8行1列が2番目のインストラクション,次に右隣の列に3番目,以下同じように64番目までのインストラクションが表示されます.
リセットスイッチを押すと,これまで記憶されていたインストラクションをすべて消去します.
2-2:実行モード
実行モードでは,SW1~12(PI1~12)を使ってMCS-4に信号を入力します.実行するときのクロックはSW15で手動クロック(Low)と自動クロック(High)が選べるようになっています.手動クロックの場合,SW17の信号がクロックとして使用され,自動クロックの場合にはFPGAにつながっている40[MHz]の発振器をクロックとします.7セグメントLEDおよびLEDにはインストラクションに基づく表示がなされ,ドットマトリクスディスプレイには4004の状態を表示します.下記の図をご覧ください.4004内部の状態をドットマトリクスディスプレイの左側半分を使って表示しています.黒色の箇所は未使用領域を表しております.サイクルの箇所には,8種類のサイクルを示せるようになっており,必ずどれか1個だけが点灯することになることに注意してください.
右半分にはユーザが表示したい内容を表示できるようにしてあります.もし出力をMCS-4で行う場合,4001もしくは4002の空いている端子を繋いでください.ドットマトリクスディスプレイのインタフェースはこちらに書かれていますので確認してください.
リセットスイッチを押すとプログラムカウンタが0になり,最初からプログラムを実行することができます.
2-3:デバッグモード
デバッグモードはプログラムをいったん停止し,4001および4002の状態を確認するときに使われます.SW13~14は表示内容を決定するために使用されます.下表は表示内容とスイッチに対応を示したものです.SW13がLowのときには4001,SW13がHighのときには4002の状態が表示されます.
4001 | 4002 | |
SW13 | Low | High |
4001や4002をドットマトリクスディスプレイに表示する場合に一度にすべてを表示することができませんので,ある単位で区切って表示します.この単位をページと呼びます.1ページに表示できる内容は,ドットマトリクスディスプレイにある512個のLEDに4001では1インストラクション8[bit]のため全部で64個となります.表示方法は,入力モードと同じく左上を1番目,右下を64番目となるようにします.4002では1[word]が4[bit]のため,最大で128[word]となりますが,1個の4002には80[word]であるため,少し余白ができますが,1ページに1個の4002を表示するようにします.表示位置は下図をご覧ください.赤色で示した箇所にはメインメモリ文字が,水色で示した箇所には状態文字が表示されます.灰色で示した箇所には何も表示しません.
ページを送るにはSW14で方向を設定し,SW17で変更を行います.ページをダウンさせるにはSW14をLow,アップさせるにはHighにした後,SW17より立ち上がりエッジを送ります.そしてページ番号は7セグメントLEDに表示されます.16個の4001には32768[bit]の記憶容量がありますので,ページ数は64(=32768/512)となります.従いまして,0~63までのページが表示されることになります.同様に,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 | インストラクション2のビット7 | 4001#2-IO3 | - |
SW10 | インストラクション2のビット6 | 4001#2-IO2 | - |
SW11 | インストラクション2のビット5 | 4001#2-IO1 | - |
SW12 | インストラクション2のビット4 | 4001#2-IO0 | - |
SW13 | インストラクション2のビット3 | 4004に備わるTEST端子 | 表示内容を切り替えるスイッチ(Low⇒4001, High⇒4002) |
SW14 | インストラクション2のビット2 | - | 表示ページをダウン(Low)したりアップ(High)したりするスイッチ |
SW15 | インストラクション2のビット1 | 手動クロック(Low)と自動クロック(High)を切り替えるためのスイッチ | - |
SW16 | インストラクション2のビット0 | 実行モード(Low)とデバッグモード(High)を切り替えるためのスイッチ | |
SW17 | インストラクションを入力するためのスイッチ(立ち上がり) | 手動クロック | 表示ページを変更するスイッチ |
SW18 | 入力モード(Low)と実行モード・デバッグ(High)を切り替えるためのスイッチ | ||
SW22 | アドレス0から再度入力するためのスイッチ | プログラムカウンタを0にし,RAMをクリアするスイッチ | |
7セグ | ページ番号を表示 | 実行結果を表示 | ページ番号を表示 |
DMD | インストラクション | 4004の内容 | 4001,4002の内容 |
3:4001の仕様
本来4001は,インテルに依頼してプログラムを記憶してもらいます.しかし今回は,入力モードにしてからプログラムをフォトインタラプタもしくはトグルスイッチを使って記憶させます.教材に使用しているFPGAには,576[kB]のRAMが備わっていますので,その一部をROMとして使用してもまだまだ余裕の容量があります.念のため再度書いておきますが,4001は1個で2048[bit]=256[B]ですので,16個接続した場合には32768[bit]=4[kB]です.
次に,入出力端子についてです.4001を標準的な16個セットを利用した場合,入出力端子は16×4=64個もあり,この内12個をトグルスイッチを下表のように割り当てることにします.
4001 | I/O | 入力/出力の別 | ||
トグルスイッチ | SW1(PI1) | #0 | 3 | 入力 |
SW2(PI2) | 2 | 入力 | ||
SW3(PI3) | 1 | 入力 | ||
SW4(PI4) | 0 | 入力 | ||
SW5(PI5) | #1 | 3 | 入力 | |
SW6(PI6) | 2 | 入力 | ||
SW7(PI7) | 1 | 入力 | ||
SW8(PI8) | 0 | 入力 | ||
SW9(PI9) | #2 | 3 | 入力 | |
SW10(PI10) | 2 | 入力 | ||
SW11(PI11) | 1 | 入力 | ||
SW12(PI12) | 0 | 入力 |
4:4002の仕様
オリジナルの4002は1個で320[bit]のダイナミックRAMですが,今回はFPGA上にあるSRAMを使いますので,ダイナミックRAM特有のリフレッシュをする必要がありません.従いまして,4002のブロック図にあるリフレッシュカウンタは不要となります.次に出力端子についてです.4002にある出力端子は,各4個の出力端子(入力はできません)があります.この内6個を利用して4桁の7セグメントLEDと2個のLEDを制御します.
4002 | I/O | 入力/出力の別 | 備考 | ||
7セグメントLED | DP1のビット0 |
CM-RAM0 #0 |
0 | 出力 | |
DP1のビット1 | 1 | 出力 | |||
DP1のビット2 | 2 | 出力 | |||
DP1のビット3 | 3 | 出力 | |||
DP2のビット0 |
CM-RAM0 #1 |
0 | 出力 | ||
DP2のビット1 | 1 | 出力 | |||
DP2のビット2 | 2 | 出力 | |||
DP2のビット3 | 3 | 出力 | |||
DP3のビット0 |
CM-RAM0 #2 |
0 | 出力 | ||
DP3のビット1 | 1 | 出力 | |||
DP3のビット2 | 2 | 出力 | |||
DP3のビット3 | 3 | 出力 | |||
DP4のビット0 |
CM-RAM0 #3 |
0 | 出力 | ||
DP4のビット1 | 1 | 出力 | |||
DP4のビット2 | 2 | 出力 | |||
DP4のビット3 | 3 | 出力 | |||
DP1のデシマルポイント |
CM-RAM1 #0 |
0 | 出力 | 1で点灯,0で消灯 | |
DP2のデシマルポイント | 1 | 出力 | 1で点灯,0で消灯 | ||
DP3のデシマルポイント | 2 | 出力 | 1で点灯,0で消灯 | ||
DP4のデシマルポイント | 3 | 出力 | 1で点灯,0で消灯 | ||
点灯/消灯切換 |
CM-RAM1 #1 |
0 | 出力 | 1で点灯,0で消灯 | |
LD1 | 1 | 出力 | 0で点灯,1で消灯 | ||
LD2 | 2 | 出力 | 0で点灯,1で消灯 | ||
3 | 出力(未使用) |
5:4004の仕様
4004についてはなるべくオリジナルと同じように作成することとします.4004の仕様についてはこちらのページで確認してください.