このページでは,FPGA上に作成するMCS-4の仕様を記します.本物のMCS-4は電源がVdd=-15[V],Vss=0[V],2相のクロックで動作,最高動作周波数740[kHz]となっていますが,これから作ろうとしているものはこのような制限に従う必要がありません.行えることを同等につつ,FPGAに最適な仕様にしていきましょう.


1:全体仕様

全体的な仕様を下に示します.

  1. 最高動作周波数は定義しません.
  2. データバスから送られてくるデータが取り込むトリガを立ち下がりエッジ,変化させるトリガを立ち上がりエッジとすることで,クロックを1個にします.
  3. 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にインストラクションが取り込まれます.その後,SW17を下(Low)にして次のインストラクション入力に備えます.なお,インストラクションを入力するときマークシートを使うにはSW21(スライドスイッチ)を下に,SW1~16のトグルスイッチを使うには上にしてください.

入力されたインストラクションは,ドットマトリクスディスプレイに左から順に表示されます.1列が16ビットですので,1列で2インストラクション,全体で32列ありますので,合計64インストラクションが表示することができます.この64インストラクションを1ページということにします.ページ数は7セグメントLEDで表示されるものとします.このため,インストラクションを入力する最初には「0000」と表示します.64個のインストラクション以降,つまり2ページ目以降は,7セグメントLEDの数字が1増えた上でもう一度ドットマトリクスディスプレイの左端から表示されます.下の図はドットマトリクスディスプレイにインストラクションが表示されている様子を示しています.左上8行1列が1番目のインストラクション,その下にある8行1列が2番目のインストラクション,次に右隣の列に3番目,以下同じように64番目までのインストラクションが表示されます.

DMDForInstruction

リセットスイッチを押すと,これまで記憶されていたインストラクションをすべて消去します.

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の空いている端子を繋いでください.ドットマトリクスディスプレイのインタフェースはこちらに書かれていますので確認してください.

4004Display

リセットスイッチを押すとプログラムカウンタが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を表示するようにします.表示位置は下図をご覧ください.赤色で示した箇所にはメインメモリ文字が,水色で示した箇所には状態文字が表示されます.灰色で示した箇所には何も表示しません.

 DMDDebug

ページを送るには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 - 表示内容を切り替えるスイッチ(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の仕様についてはこちらのページで確認してください.