2007.5.25 fpgaparkへ移行。ドキュメント追加

MR16概要

 MR16は、Minimum Resource 16bit RISCの略で、偽X1のサブCPUの置き換えとしてVerilogHDLで書き下ろしたRISC IPです。
 アドレスバス、レジスタなどは全て16bit幅で、ARM7TDMIやH8/300H等と、クラシックな8bitCPU(i8051,Z80等)との中間規模のCPUです。
 プリンストン・アーキテクチャ(インストラクション/データバス共通)を採用しており、簡素で汎用的なメモリマッピングが可能です。
 命令セットはH8/300H等に類似した見通しのよい一般的なアーキテクチャを持っています。
 Xilinx FPGAデバイスに最も小さくなるように設計されており、他の互換8bitMCUのIPより小さく実装できます。
 メモリアクセスを伴う命令は2クロック要しますが、それ以外は分岐命令も含めて1クロックで動作します。
 メモリアドレスは1クロック先出しなので、同クロックのFPGA内蔵BlockRAMを直結できます。
 FPGA内蔵BlockRAMだけをメモリにすればSpartan3のエリア最適化でも32MHz超で動作します。

 Xilinx Spartan3にフィットするように専用設計されていますが、標準言語で記述しているので他のFPGAやCPLDでも動作するはずです。
 非同期乗算機とレジスタRAMをネイティブプリミティブで持たないFPGAでは回路規模や速度が低下してMR16のアドバンテージが低下します、そこはSpartan3専用設計なので。

 CPUを作るのは、私にとってはとても面白く有意義な作業でした。
 MUXソースのタップ位置を1つ変更するだけで、FreqMAXが2倍になったりします。
 みなさんも、自分のお気に入りFPGAに特化したCPUを書いてみてはいかがでしょうか?

MR16仕様

※仕様に関するドキュメントは現在準備中で、完成次第、随時更新予定です。
CQ出版社Interface誌2007年6月号p170-178に解説記事が掲載されています。

ブロック図(準備中)
レジスタマップPDFファイルです
命令デコードマップ PDFファイルです
命令セット一覧 PDFファイルです
コンディションコード PDFファイルです
更新履歴(準備中)

開発環境

 寒河江氏が公開されているフリーウェアのマクロアセンブラAASM(Ver.3.71以降)用のマクロを用意してあります。
 デバッガは現在ありません。シリアルポートからダウンロード/実行する為のローダーを準備中です。
 Cコンパイラは現在ありません。どなたか挑戦される方はいらっしゃいませんか?

DOWNLOAD

MR16 CORE Ver.2007.4.4 MR16コアVer.2007.4.4版のVerilogHDLソースコード
MR16 instruction macro for AASM 3.71 Ver.2007.3.30 AASM 3.71対応MR16用アセンブラマクロ
16bit Timer+GPIO Sample タイマ+割り込みコントローラ+GPIOを追加するサンプルモジュールソース
Spartan3StarterKit用開発パッケージ(要望待ち)
IcarusVerilog/IVI(0.4)対応、逆アセンブルトレース付きシミュレーションモデル(要望待ち)

サポート、連絡先

 暫定的にこちらの掲示板でサポートしていますので、使ってみたい方はそちらへ書き込んでください。
 メールでの問い合わせは下記アドレスへお願いします。
support@fpgapark.com


実装事例

偽X1用マルチスレッド、マルチファンクションサブCPU
 −80C49サブCPUエミュレーション
 −MB8877A(FDC)/.d88(イメージファイル)エミュレーション
 −FDDシーク音エミュレーション/PCM再生ドライバ
 −PS/2キーボードドライバ

組み込みシステム開発評価キット用リモートメモリモニタ用制御プロセッサ
 −調歩同期シリアルポート
 −BLANCAシステムバスホストコントローラ

組み込みシステム開発評価キット用インテリジェントPS/2ホストコントローラ
 −PS/2仮想シリアルインターフェース
 −PS/2キーボードホストコントローラ
 −PS/2マウスホストコントローラ
 −BLANCAシステムバスデバイスコントローラ

2005.4.12版 旧バージョンについて

 以下の重大なバグが発覚したため2005.4.12版の公開は終了しました。新バージョンへの切り替えをご検討ください。

・アドレス範囲が 0?ff?h(bit11-bit4が全て1の時)で実行されるJSR命令は正しく機能しません。
・N,Vを扱う条件分岐命令の条件判定が正しくありません。