2011年12月3日土曜日

独自のCPUを創ってみる(8) - DMMファイル


独自のCPUを創ってみる(7)の続き


Xilinx の data2memというコマンドを使うと、bitファイルをリコンパイルすることなく、
その中のblock RAMの初期化データだけを入れ替えることができる。

ISEの中からも使えるような記述があるが、うまく使えないようだ。
(ネットの書き込みによれば、プロジェクトファイルを作りなおせばいいらしいが)

コマンドベースで一応、うまく行ったのでメモっておく。

(1) ISEでbitファイルを生成する。

(2) FPGA Editor を起動し、書き換えたいblock RAMのインスタンス名とロケーションを確認する。

それには、Place&Routeの中の"View/Edit Routed Design" をダブルクリック。
FPGA Editorの右上のName filterのところに*myram* のように分かっている名前の一部を入力。
見つかったらそのインスタンスを選択して、F2を押す。
プロパティ画面のName欄がインスタンス名、Locationが配置されたロケーションだ。

(3) UCF ファイルに制約を追加する。(ロケーションが勝手に変わると不便なため)
先ほど確認したものを、以下のように入力する。
INST "bus/ram1/Mram_ram" LOC = "RAMB16_X1Y7";

(4) BMMファイルを作成する。
以下のように書く。UCFに書いたものと微妙に書式が違う。
コード: 
// comment...ADDRESS_SPACE ram1 RAMB16 [0x00000000:0x000007FF]BUS_BLOCKbus/ram1/Mram_ram [31:0] LOC = X1Y7;END_BUS_BLOCK;END_ADDRESS_SPACE;
最初のram1は、アドレススペース名。使わないので何でもいい。
RAMB16は使用しているブロックRAMの種類。
パリティも使うときはRAMB18を指定する。

[0x00000000:0x000007FF] は全体のメモリサイズ。
ワード幅に関係なく、バイト単位のサイズを指定する。
[31:0]の部分が、ワード幅を示している。今回は32bit * 512ワードの構成。
[7:0] と書けば、8bit * 2048 ワードと解釈される。

試してないが、もし2個使って32bit * 1024ワードにするなら以下のようになるはず。

コード: 
// comment...ADDRESS_SPACE ram1 RAMB16 [0x00000000:0x00000FFF]BUS_BLOCKbus/ram1/Mram_ram [31:0] LOC = X1Y7;END_BUS_BLOCK;BUS_BLOCKbus/ram2/Mram_ram [31:0] LOC = X1Y8;END_BUS_BLOCK;END_ADDRESS_SPACE;
BUS_BLOCK で囲まれた範囲は、一度に同時にアクセスするRAMを示している。
例えば同じサイズでも、並列にアクセスすることで64bit * 512 ワードにしたいときは
以下のようにする。これをハードウェアの構成と合わせないと、読み込まれる
データの配置と合わなくなる。

コード: 
// comment...ADDRESS_SPACE ram1 RAMB16 [0x00000000:0x00000FFF]BUS_BLOCKbus/ram1/Mram_ram [63:32] LOC = X1Y7;bus/ram2/Mram_ram [31:0] LOC = X1Y8;END_BUS_BLOCK;END_ADDRESS_SPACE;
なお、BMMファイルの拡張子は .BMM にすること。

(5) 入れ替えるMEMファイルを用意する。
以下のような形式の単純なテキストファイル。

@00000000
01234567
89ABCDEF
....

拡張子は必ず .MEM とすること。

一行目はアドレス指定。常に「@00000000」で良い。
二行目からは設定したいデータワード。
BMMファイルの最初の例では32bitワードなので、
8桁の16進数で一行ずつ並べる。
全部で513行になる。

(6) 以下のコマンドで bit ファイルを書き換える。


data2mem -bm ram1.bmm -bd test.mem -bt top.bit -p xc3s500e

ram1.bmm はBMMファイル、test.mem はMEMファイル、top.bitはISEで作成したbitファイル。
xc3s500e はFPGAチップの種類。以下のコマンドで名前の一覧が表示される。 

data2mem -h  sup

正常終了すると、top_rp.bit ができる。

0 件のコメント:

コメントを投稿