AZPRを動かしてみる
先日本屋で、技術評論社の「CPU自作入門」というタイトルの単行本を見かけ、おもしろそうなので、早速 関連情報をダウンロードしてみました。
技術評論社のダウンロードサイトはこちら

プログラムを用意して、FPGA基板で確認
ダウンロードできるアセンブラでは使いにくいので、もうすこしましなのを作成


ダウンロードできる、ソースコード( AZPR_RTL.zip )は、いくつかのフォルダ群になっていますが、XilinxのISEのプロジェクトファイルの構成そのものではないので、インクルードファイルなどは、1つのフォルダにまとめたほうがいいでしょう。

CPUを動作させるには、プログラムを用意しなければなりませんが、とりあえずソースコードを使って、実際のFPGA用にインプリメントを試みましたが、いきなりエラーが出てきました。それは、ソースの中で、RAM( x_s3e_dpram.v )、が This RAM cannot be implemented using distributed resources. と ISEが警告してきました。
これらのモジュールは、ダウンロードして解凍した AZPR_RTL\top\lib フォルダに、疑似モデルとして収録されていますが、これはシミュレーション用と思われ、実機にインプリメントするには、reg 宣言のRAM( x_s3e_dpram.v )では、MAPでエラーになってしまいます。すくなくともRAMはブロックRAMで構成しないといけません。そこで、RAMも、ROMもブロックRAMに置き換えました。また、実機の水晶が96MHzなので、以下のように変更しました。
● クロックモジュール、clk_gen.v の変更は以下。



● rom.v でインスタンシエートしている、x_s3e_sprom module を作成。つまり、AZPRの命令が入るところのようです。ROMの中身はなにも設定していないので、CPUは動作しません。


● spm.v でインスタンシエートしている、x_s3e_dpram module を作成。つまり、AZPRの作業メモリのようです。デュアルポートなので、ブロックRAMもデュアルポートRAMモジュールを使います。

以上を追加し、インクルードファイルのすべてを、AZPR_RTL フォルダ以下に include フォルダを追加して、各フォルダに分散している、xxxx.h をすべてコピーして置きました。無論、プログラムメモリはすべて0なので、NOPとなり、動作しているのか否か、外部から ( chip_top.v ) は判別できません。

プログラムを用意して、FPGA基板で確認
ダウンロードしたファイルには、 chip_top_test.v という、テストベンチが用意されていますが、これは使わず、サンプルプログラムで用意されている、3_3_シリアル通信 フォルダにある、serial.asm を、使うことにします。というのは、シリアルで何か出力できるようにしておくと、FPGAにインプリメントしたとき、実機確認がパソコンで簡単にできるからです。コマンドラインで動作する、クロスアセンブラ、azprasm.exe ( こちらもダウンロードできます 技術評論社のダウンロードサイトはこちら )を使って、命令コードを作れますが、バイナリのみのようで、いわゆる、リストとか、ヘキサデータのファイルは作れないようです。その後の調査で、リストファイルが作れることがわかりました。 使い方は、azprasm -p foo.lst -o foo.bin foo.asm で、ソースを foo.asm とすると、ヘキサ命令、兼リストファイル foo.lst を作ることができます。バイナリオブジェクトは、foo.bin になります。
serial.asm をアセンブルしたバイナリオブジェクトではFPGAのRTLで扱いにくいので、ヘキサに変換すると、以下のようになります。

これを使うとテストベンチの、$readmemh() 関数で使えるようになりますが、ここでは、実機動作を目的にしているので、XilinxのブロックRAMを使うため、ブロックRAMの初期化データのフォーマットで作成します。ここでは複数個を並列にして使ってるので、簡単に変換できないため、カスタム設計の MicroBlaze  で公開しているツール HEX utils 最新版はこちら。v0.14を使います。
この、HEX utils を起動し、アセンブラで作成したバイナリオブジェクト、serial.bin を読み込んで、ブロックRAMの初期化データ、defparam 群を作成しているところの、スクリーンショットです。

入力ファイル名の設定、ファイルの種別( binary )、横個数(これは参照されない)、Big endian ( チェックON)、Verilog Header ( チェックOFF )、fill ( 00 でチェックON )を設定して、Read ボタンを押すと、最大アドレス欄に、0x00000124 が表示されます。その後、出力ファイル形式( defparam )、出力ファイル名のパス( prog.v )、ブロックRAMの1個あたりのビット幅 ( 8bit(1) )、を指定して、変換ボタンを押すと、defparam のデータが作成され、表示ボタンで、確認できます。保存ボタンで、指定ファイル名で、ファイルを作成します。
出来上がった、prog.v は以下です。

この設定データを、rom.v でインスタンシエートしている、x_s3e_sprom module に追加すると、命令用のROMが serial.asm で初期化されて、シリアルポートに、"Hello,world." と表示されるはずです。アセンブラのソースを読むと、そのように書かれています。
rom.v でインスタンシエートしている、x_s3e_sprom module を、sprom.v とすると、その中身は以下です。

手持ちのFPGA基板で、これらをインプリメントして、テラタームで確認した、スクリーンショットです。


シリアルで、"Hello,world." を出せたプロジェクトファイルは、市販のFPGA基板ではないので、市販のFPGA基板で動作させた ISE 13.4 のプロジェクトファイル一式が こちらの、azprs500e.lzh です。
使用した基板は、Digilent社の、Spartan-3E Sterter Kit で、DDRメモリを、FPGAで操作してみる で解説している基板と同じです。
この基板には、XC3S500E が搭載され、DDRメモリなどがありますが、AZPR のみ実装して、RS232Cのコネクタでシリアル送信してパソコンで受信します。水晶は50MHzなので、DCMで 1/2 の25MHzにして、ボーレート設定は、25MHzで115200ボーになるように設定しています。

AZPR のCPUアーキテクチャーや、使い勝手の感想
  1. 一応CPUとしてまとまっている。
  2. 簡単な32ビットRISCマシンだが、バイトアクセスができない。メモリのリードライトは、すべて32ビットアクセスになる。
  3. データポインタや、分岐命令などのアドレス値は32ビットあるが、外部にはMSB29ビットだけ出力され、LSB2ビットは出ない。
  4. キャリーフラグが無い。
  5. キャリー付きローテート命令が無いので、多倍長演算がやりにくい。
  6. オリジナルCPUのため、コンパイラが使えない。アセンブラのみでは、ツールとして使い勝手が悪い。

クロスアセンブラ asazpr.exe

技術評論社のダウンロードサイトにある、azprasm.exe と、できるだけ同じ仕様になるようにしましたが、ラベルに使う文字列を、数字で始まるようにはできませんでした。通常、アセンブラで数字で始まるラベルが使えるのは、azprasm.exe が実際初めてです。このアセンブラのコードを見てみると、どうやら perl で記述されているようですが、数字で始まるラベルが使える仕様には、いささか驚きました。便利かもしれませんが、ちょっと邪道かと思います。そこで、作成したクロスアセンブラ、asazpr.exe は、この機能を外したので、7セグメントLEDの表示データの設定では、7SEG_DATA_0 ---> SEG_DATA_0 としてアセンブルできるようにしました。
なぜわざわざクロスアセンブラを作ったのかというと、バイトアクセスができる命令を追加しようという意図があって、そのための準備です。また、アセンブラソースレベルで互換な命令コードに変更できるかもしれないという意図があります。というのは、バイナリレベルでのコード体系があまりよくないと思われるからです。

ダウンロードした、サンプルソフトの、kitchen.asm の、数字で始まるラベルを変更してアセンブルしてリストを出力したものが以下です。バイナリオブジェクトはオプションで追加できますが、基本でははヘキサファイルを出力します。リストファイルもオプションになっています。

使用できるオプションは、以下のものがあり、上記のリストは、asazpr -p ketchen で作成したものです。ソースファイルの拡張子、.asm は省略しないとエラーになります。

Usage:asazpr (-option) sourcefile(without .asm)
option: -p (-P) make listfile
option: -4 make 32bit hex object
option: -b (-B) make binary object file
option: -n (-N) add line No:
option: -s (-S) add sorted symbles

asazpr -p kitchen でアセンブルすると、以下のようなメッセージが出され、バイナリオブジェクトのサイズが、604 ( 0x604 の意味) であることを報告しています。ソース総ライン数が582行、使用総ラベル数が76個です。このアセンブラでは、使ってるラベル文字列の合計が、1Mバイトまでという制約がありますが、チェックはしていないので、超えると、Windowsでシステムエラーが出るでしょう。しかし、azpr で使うラベル文字列の合計が1Mバイトを超えることは現実的には無いと思います。オブジェクトサイズも1Mバイトまでですが、こちらはチェックして、1Mバイト以上ならそれ以上作成できないようになっています。
クロスアセンブラはこちら→ asazpr.exe 解凍してコマンドラインで使用します。

C:\>asazpr -p kitchen
AZPR CROSS ASSEMBLER VER. 1.0
PASS 1 END NEXT PC=20000604 LENGTH=604 SUM=26a2
PASS 3 END NEXT PC=20000604 LENGTH=604 SUM=31ed
now sorting labeles h=76
Now making .sym file
582 lines 76 labels
NO ERROR assembly complete

ヘキサオブジェクトでは以下のような、モトローラ形式のSレコードフォーマットです。ヘキサオブジェクトは、指定しなくても出力されます。その他、使用したシンボルの値をリストアップします。


準備中



ホームに戻る



inserted by FC2 system