MYマイコンを作る(10) 
    詳細設計 全体の設計


 MYマイコンComet2eの詳細設計ができました。これは出来立てのホヤホヤなので誤りやデバッグ用にコードを変更している所もありますのでご了解ください。
 コードと解説を纏めてここに置きます。
 ・Comet2eのVerilogHDLコード
   Comet2e_Top.v  AluGr.v  CtrlSr.v  MMem.v  PRg.v
 ・Comet2eのプログラムSoft11_Ld1go1 とダウンロードファイル IntelHex.hex
 ・構成(詳細設計用)
 ・ブロック機能(詳細設計用)
 ・命令_制御信号表(詳細設計用)
 ・シミュレーションの実行

 詳細設計ではシーケンサのコーディングで手こずりました。
 処理速度を速くしようとしてシーケンサカウンタを更新したら垂流し的にデコードしようとしたのですが、ラッチが出来たのです。1つの always文のなかにカウンタとデコーダを書いたのが原因です。カウンタとデコードを別々の文に分けることで解決できました。 1つの always文のなかにカウンタとデコーダを書くとデコードの数が少なくなるのではと期待したのです。

●VerilogHDL使用歴
 私がVerilogHDLを使い始めたのは今世紀に入ってからです。
 私のディジタル回路設計は、74xxの標準ロジックを使って回路図を書くことでした。デバッグは、アナログシンクロを使いました。ディジタルシンクロはまだ無くロジックスコープが出始めの頃です。プログラムロジックは、PALを言語設計でなく回路図での設計です。PALの遅延時間が標準ロジックの半分程度なので高価だったが沢山使った記憶があります。 其のうち設計から遠のき仕様作成や顧客対応が主な業務になった為、言語設計に携われなかったのです。
 今世紀に入って身軽になったのを機会に経験出来なかった言語設計にチャレンジです。初めはFPGAを回路で設計していたのですが、「何を考えているのですか、今の時代は言語設計です」と知人の天の声が聞こえたので、AlteraのFPGAをVerilogHDLで使うことになりました。
 VerilogHDL使いを本職にしてるでもなく、組織に属してるでもないのでそんなにVerilogHDLを使う機会はありません。自分で考える要求は甘いものです。モータを回していても身に付く技が少ないので「MYマイコンComet2e」を作り始めました。
 ですのでVerilogHDLの使い方にモタモタしています。「ここでは、己の気の趣くままに失敗を恐れず、己の無知 無能 を省みずエレキの実験を行う」とトップページで宣言した様な状況になってきましたので見苦しい点がありますがご容赦願います。


全体の詳細設計

VerilogHDL階層構造

次のComet2eのVerilogHDL階層構造に示すように、Comet2eは5つのVerilogHDLモジュールで構成します。
●Comet2e_Top.vは、最上位のモジュールで外部と内部、内部同士の接続をします。
●AluGr.vは、演算回路と8個の汎用レジストを記述したモジュールです。
●CtrlSr.vは、プログラムレジスタや命令レジスタ等のシステムレジスタと制御回路を記述した
 モジュールです。このモジュールは下位にMMem.vモジュールを接続しています。
●MMem.vは、メインメモリを記述したモジュールです。
  このモジュールは、QuartusUのMegaWizardでシングルポートメモリを設計しています。
●PRg.vは、入出力レジスタ回路を記述したモジュールです。




AluGr.v の構成(詳細設計用)
下図「Comet2eのAluGr.vの構成(詳細設計用)」にコードの内容を図示しています。

●汎用レジスタは、次の様に記述しています。

 ・8つのレジスタは、レジスタファイルで記述しています。
 ・汎用レジスタのAluAIn用データ出力は、SelA信号によって8つのレジスタの一つか
   0を選択します。
 ・汎用レジスタのAluBIn用データ出力は、SelB信号によって8つのレジスタの一つか0又は
   他モジュール出力のAluBInSrかAluBInPrを選択します。
 ・汎用レジスタのデータ入力は、WrtGrEn信号によってWrtGrNum信号で8つのレジスタの
   一つに書き込みます。

●演算回路は、次の様に記述しています。

 ・演算回路は、加算回路、論理演算回路、シフト回路とオーバフロー検出回路の
  4つ部分で構成します。
 ・演算回路では、フラグ検出のため16ビット+1ビットの17ビットで演算します。
 ・加算回路は、全加算器と排他的論理和で構成します。
  減算用の2の補数は、排他的論理和で1の補数を取り、加算器のC入力に1を加えて作ります。
 ・論理演算回路は、論理積、論理和、排他的論理和とB入力をそのまま通過回路で構成します。
 ・シフト回路は、最上位ビットを選択する回路と左1ビットシフト回路、
  右1ビットシフト回路で構成します。
 ・オーバフロー検出回路は、加減算とシフトでのオーバフローを検出します。
 ・加算回路、論理演算回路、シフト回路の出力は、SelF信号によって指定の演算を回路を
  選び16ビットをAluOutとして出力します。



CtrlSr.v の構成(詳細設計用)
下図「Comet2eのCtrlSr.vの構成(詳細設計用)」にコードの内容を図示しています。

●システムレジスタは、次の様に記述しています。

 ・5つのシステムレジスタの内容は、Sb[2:0]信号で選択してAluBInSr信号としてAluに
  送り演算します。
 ・フラグレジスタ(Fr)は、演算結果のオバーフロー、符号、零のフラグを格納します。
 ・プログラムレジスタ(Pr)は、SprW信号によって「Pr + 1」か「ALU出力」を格納します。
 ・スタックポインタ(Sp)は、SspW信号とSidrW信号によって「Sp + 1」か「Sp - 1」か
  「Mar出力」を格納します。
 ・メモリアドレス/一時レジスタ(Mar)は、SmaW信号によって「Mar - 1」か
  「ALU出力」を格納します。
 ・メモリデータ/第2命令レジスタ(Mdr)は、SmdW信号によって「MDout」か
  「ALU出力」を格納します。
 ・命令レジスタ(Ir)は、SirW信号によって「MDout」か「ALU出力」を格納します。

●制御信号デコーダーは、演算回路のA入力とB入力のデータ選択信号、演算制御信号、
 汎用レジスタ書込み信号、プログラムレジスタ書込み信号をデコードする回路で
 次の様に記述しています。

 ・演算回路のA入力(SelA)とB入力(SelB)のデータ選択信号、演算制御信号(SelF)は、
  always文と case文でデコードします。
  デコード条件は、別紙「AluAIn選択ブロックの動作概要」、「AluBIn選択ブロックの
  動作概要」、 「ALUブロックの動作概要」を参照して下さい。
 ・汎用レジスタの書込み信号(WrtGr)は、SgrW信号によってalways文でデコードします。
 ・プログラムレジスタの書込み信号(WrtPRg)は、SidrW信号とMar信号によって
  always文でデコードします。
    
●メインメモリインタフェースは、MMem.vモジュールを接続します。
   接続は、「名前による接続」です。。
  
●シーケンサは、Comet2e制御信号を発生する中核部で、次の部位で構成しています。

 ・SeqCtrは、7ビットのカウンタでシーケンサのステイトを記憶します。
 ・シーケンスフロー制御は、SeqCtrの内容と制御条件に従ってシーケンスの流れを制御します。
 ・シーケンス制御信号デコーダーは、制御信号をデコーダーする部位で別紙「命令_制御信号表
  (詳細設計用)」に示す信号を発生します。
 ・命令デコーダーは、命令レジスタの内容によってシーケンサの流れを変えるために使用します。
  デコード内容は別紙「I分岐コード作成パターン」を参照下さい。
  



PRg.v の構成(詳細設計用)
下図「Comet2eのPRg.vの構成(詳細設計用)」にコードの内容を図示しています。

●周辺レジスタバス出力回路は、次の様に記述しています。

 ・周辺レジスタバス出力は、SelB信号によって4つのレジスタの一つか0を選択します。
 
●入力レジスタ(PIN30h、PIN31h)は、次の様に記述しています。

 ・クロック立ち上がり毎に外部状態を入力します。
 
●出力レジスタ(POUT52h、POUT53h)は、次の様に記述しています。

 ・出力レジスタは、WrtPRg信号によってAluOutの内容を取り込みます。



 
●シミュレーションの実行

 MYマイコンComet2eをModelSimでシミュレーションした波形をここに置きます
 シミュレーションした波形は、A3サイズなのでPDFを利用してください。 
 シミュレーション波形は、NOP,ロード、演算命令を組合わせた簡単なプログラムSoft11_Ld1go1をリセット、スタート、ストップ、スタート、ストップ、スタートさせている波形です。


ホームへ戻る