PicoBlazeを動かす (3)

前回まででとりあえず必要な開発環境は入手出来たが、具体的にPicoBlazeを動作させるにはどうすれば良いのか良くわからんのでマニュアル読んでみたりGoogle先生に聞いてみたりしてみた。
一応、動かすことは出来たので忘れない様に書いておこう。

ちなみにアセンブラはダウンロードしたIDE(pBlazeIDE)は使わずにコマンドラインのKCPSM3の方を使った。それからHDLは、Verilogを使った。


ではまずはアセンブラ、というかPicoBlaze用のソフトをどうやってアセンブルするかというところ。アセンブラ本体はダウンロードしたKCPSM3.zipを解凍するとできるAssemblerフォルダの中にあるKCPSM3.exe。こいつはコマンドラインで使うのでパスを通しておく。普通に環境変数のPathに追加ね。そしたらプログラムを書いてアセンブルする為のフォルダを用意する。適当にフォルダを作ったら、そこに上記Assemberフォルダの中から

  • ROM_form.coe
  • ROM_form.v
  • ROM_form.vhd

の3つをコピーする。これはKCPSM3のマニュアルに書いてある通りだ。まあ、マニュアルではKCPSM3.exeもパスを通すんじゃなくてコピーするって書いてあるんだけど何となくパスを通すことにした。まあ小さい(89KB)からプロジェクト毎にコピーしても全然いいんだけどさ。

そしたらプログラム自体を書くファイルもここに作る。このファイルは、「xxxxx.psm」というファイル名で作成。今回は、led.psmという名前にして以下の様な内容にした。
まずは単純にLEDを点灯させるのみ。Spartan-3E Starter Kitで使うので基板上の8個のLEDをA6(10100110)っていうパターンで点けてみる。

LOAD s0, a6
OUTPUT s0, 00
loop:
JUMP loop

こんだけ。まずはCPUとして動作させられるかどうかだから単純にね。そしたらこのled.psmを保存して、コマンドプロンプトでこのファイルがあるフォルダへ移動してから
KCPSM3 led.psm
とするとアセンブルしてくれる。
色々と表示されるけど最後に

KCPSM3 successful.
KCPSM3 complete

って出てくればOK。駄目な場合は

ERROR - xxxxx(エラー内容)
Please correct ant try again.
KCPSM3 complete.

みたいに出てくるから、修正してsuccessfulになるまで頑張る。
成功するとたくさんファイルが出来るけど、とりあえず動かすのに必要なのは「LED.V」ってやつだけ。今回Verilog使うからね。VHDLの人はLED.VHDって方を使うことになる。
ちなみにこのLED.V とか LED.VHDっていうのはCPU(PicoBlaze)を動かす為のプログラムが入ったRAMを作ってくれる様になっている。
だから、このLED.VとCPU本体(KCPSM3.V)のインスタンスを作ってそれらを接続すればCPUがRAMからプログラムを読みだして動くって訳だ。


ここまでで、プログラムを書いてアセンブルするとこまでは一応できたから、次はISEで実際にFPGAへ書きこむものを作る。
まずは、ISE(Project Navigator)を起動。
メニューから「File -> New Project」を選んで新しいプロジェクトを作る。


最初の「Create New Project」の画面では名前とかフォルダを適当に決める。Top-level source typeのとこはHDL。


次の「Project Settings」では、Spartan-3E Starter Kitで使う様に設定する。FamilyとかDeviceを選ぼうと思ったら、一番上に「Evaluation Development Board」ってのがある。もしかして、と思い選択肢を見てみると「Spartan-3E Starter Board」ってのがあるよ!こいつを選べばOK。
あとは別にいじらない。良く解らんからいじれないっていうのもある。。。


最後に「Project Summary」の画面で一応設定内容が間違っていないことを確認したら「Finish」とすると空っぽのプロジェクトができる。

まずはトップレベルのモジュールが無いといけないからデバイス名のとこを右クリックして「Verilog Module」をつくる。名前はtop.vとしといた。もちろん Add to projectのチェックは付けたままにしておく。
「Define Module」の画面では使用するポートを設定できるがここはとりあえず何もしないでおく。そして空っぽのtop.vができる。


次に必要なモジュールを追加しておこう。
CPU本体とプログラムのRAMだね。デバイス名のとこを右クリックして「Add Source」を選んだらKCPSM3.zipを解凍したフォルダにあるVerilogフォルダの中にあるkcpsm3.vを選んでプロジェクトに追加する。上でアセンブルしたRAM(LED.V)も同じように「Add Source」してプロジェクトに追加する。


そしたらtop.vでCPUとRAMを接続しよう。
一応動いたからこんな感じで大丈夫だと思う。。。

module top(
IN_CLK,
OUT_LED,
);

input IN_CLK;
output [7:0] OUT_LED;

reg [7:0] led;

assign OUT_LED = led;

wire [9:0] ADDRESS;
wire [17:0] INSTRUCTIONS;
wire [7:0] PORT_ID;
wire WRITE_STROBE;
wire READ_STROBE;
wire [7:0] OUT_PORT;
wire [7:0] IN_PORT;
reg INTERRUPT = 1'b0;
wire INTERRUPT_ACK;
reg RESET = 1'b0;


kcpsm3 cpu(
.address(ADDRESS),
.instruction(INSTRUCTIONS),
.port_id(PORT_ID),
.write_strobe(WRITE_STROBE),
.out_port(OUT_PORT),
.read_strobe(READ_STROBE),
.in_port(IN_PORT),
.interrupt(INTERRUPT),
.interrupt_ack(INTERRUPT_ACK),
.reset(RESET),
.clk(IN_CLK)
);

led rom(
.address(ADDRESS),
.instruction(INSTRUCTIONS),
.clk(IN_CLK)
);

always@(posedge IN_CLK) begin
    if (WRITE_STROBE) begin
        led <= OUT_PORT;
    end
end
endmodule

後は、外部との接続を定義するucfだ。またデバイス名のとこを右クリックして「Add Source」。で、Implementation Constraints Fileを選択してファイル名はtopと入力。そうするとtop.vにぶら下がる様にtop.ucfってのが出来る。
こいつの編集方法は色々あるみたいなんだけどとりあえずテキストで編集する。top.ucfっていうのを選択すると下側にEdit Constraints(Text)っていうのが出るからこれをダブルクリック。空っぽのファイルが開くからここに接続の定義を書いていく。今回はクロックとLEDだけつながれば良いから下の様にした。

//========== CLOCK ==========
NET "IN_CLK" LOC="C9" | IOSTANDARD=LVCMOS33;

//========== LED ==========
NET "OUT_LED<7>" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "OUT_LED<6>" LOC = "E9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "OUT_LED<5>" LOC = "D11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "OUT_LED<4>" LOC = "C11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "OUT_LED<3>" LOC = "F11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "OUT_LED<2>" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "OUT_LED<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
NET "OUT_LED<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

Spartan-3E Starter Kitのマニュアルに書いてあるUCFロケーション制約をそのままコピった。

これで一応必要なことを全部入力したことになるので、top.vを選択して下側に出るGenerate Programming Fileを実行してみる。
接続とか色々といい加減な為か大量のWARNINGが出力されるが一応書き込み用ファイルの生成に成功した。

そしたらConfigure Target Deviceを実行してImpactを起動する。後は書きこむとLEDが点灯するって訳だ。
とりあえず動いたよー。やったー。全然わかってないけど。。。
まあとりあえず動かしてぐちゃぐちゃいじりながら困ったところで細かいとこを理解してくのがいつもの俺のやり方だ。これだとトラブった時に悲惨なことになりかねないんだけどね。。
今のところ趣味だからOKとしよう。
そんな訳でPicoBlazeを動かすシリーズは完了とする。