FC2カウンター FPGAの部屋 DATA2MEMの使い方
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

DATA2MEMの使い方

プロジェクトをISEでインプリメントし、Generate Programming Filesで.bitファイル(iMPACTでFPGAへダウンロードするためのファイル)を作成する。FPGA内にプロセッサを組み込むとき、またはFPGA内に外部プロセッサのブートコードなどを格納する場合がある。その場合にコアジェネレータで生成したRAMへプログラムをCOEファイルなどで記述するかBRAMプリミティブのINITでプログラムを書くことが出来る。この場合にはシミュレーションで実際のRAMの値を入れたシミュレーションが出来てとても便利である。しかしながら、値を変更すると論理合成からやり直しとなり、プロジェクトの全工程が数時間かかるプロジェクトではプログラムを修正するたびに数時間かかることになる。(もちろんインクリメンタルシンセシスなどを設定していれば別だと思う)
そこでシミュレーションが必要ない状況では、DATA2MEMを使用して出来上がった.bitファイルにプログラムをロードすると時間が相当短縮できる。
そのためには、まずはGCCかなにかでELFファイルを生成する。これは専門でないので生成の仕方は良く知らないがROMイメージにしなければいけないだろう。.bitファイルにあるFPGA内部のブロックRAMの初期化コードにELFファイルのプログラムをロードし、新たな.bitファイルにする。
私の場合は4ビット幅のブロックRAMプリミティブのRAMB16_S4を16個並べて64bit幅にしている。
UCFにそのブロックRAMプリミティブのインスタンスをどこのRAMBにアサインするかを指定する。

INST "rami/IntRami/INTRAMCORE_GEN.0.IntRamCorei/IntRamCore0" LOC = "RAMB16_X9Y14";
INST "rami/IntRami/INTRAMCORE_GEN.0.IntRamCorei/IntRamCore1" LOC = "RAMB16_X10Y14";
INST "rami/IntRami/INTRAMCORE_GEN.1.IntRamCorei/IntRamCore0" LOC = "RAMB16_X10Y18";
INST "rami/IntRami/INTRAMCORE_GEN.1.IntRamCorei/IntRamCore1" LOC = "RAMB16_X10Y15";
INST "rami/IntRami/INTRAMCORE_GEN.2.IntRamCorei/IntRamCore0" LOC = "RAMB16_X9Y16";
INST "rami/IntRami/INTRAMCORE_GEN.2.IntRamCorei/IntRamCore1" LOC = "RAMB16_X8Y16";
INST "rami/IntRami/INTRAMCORE_GEN.3.IntRamCorei/IntRamCore0" LOC = "RAMB16_X8Y18";
INST "rami/IntRami/INTRAMCORE_GEN.3.IntRamCorei/IntRamCore1" LOC = "RAMB16_X8Y17";
INST "rami/IntRami/INTRAMCORE_GEN.4.IntRamCorei/IntRamCore0" LOC = "RAMB16_X9Y15";
INST "rami/IntRami/INTRAMCORE_GEN.4.IntRamCorei/IntRamCore1" LOC = "RAMB16_X11Y15";
INST "rami/IntRami/INTRAMCORE_GEN.5.IntRamCorei/IntRamCore0" LOC = "RAMB16_X8Y15";
INST "rami/IntRami/INTRAMCORE_GEN.5.IntRamCorei/IntRamCore1" LOC = "RAMB16_X11Y16";
INST "rami/IntRami/INTRAMCORE_GEN.6.IntRamCorei/IntRamCore0" LOC = "RAMB16_X10Y16";
INST "rami/IntRami/INTRAMCORE_GEN.6.IntRamCorei/IntRamCore1" LOC = "RAMB16_X11Y17";
INST "rami/IntRami/INTRAMCORE_GEN.7.IntRamCorei/IntRamCore0" LOC = "RAMB16_X10Y17";
INST "rami/IntRami/INTRAMCORE_GEN.7.IntRamCorei/IntRamCore1" LOC = "RAMB16_X9Y17";


このインスタンスはSynplify Proの例である。
この制約を付加したUCFでインプリメントした後にDATA2MEMで.bitファイルを書き換えるわけだが、その前にBMMファイルを作成しなければならない。下に例を示すが、RAMエリアの大きさ、RAMがFPGA内のどのブロックRAMにアサインされているかを書く。大体UCFと同様だ。ただし[0:3]の様にビットの位置を書くのを忘れずに。

ADDRESS_BLOCK dram_controller RAMB16 [0x00000000:0x00007FFF]
// Define the block map for the lower 32k, CPU address 0x00000000 - 0x00007FFF
BUS_BLOCK
rami/IntRami/INTRAMCORE_GEN.0.IntRamCorei/IntRamCore0 [0:3] LOC = X9Y14;
rami/IntRami/INTRAMCORE_GEN.0.IntRamCorei/IntRamCore1 [4:7] LOC = X10Y14;
rami/IntRami/INTRAMCORE_GEN.1.IntRamCorei/IntRamCore0 [8:11] LOC = X10Y18;
rami/IntRami/INTRAMCORE_GEN.1.IntRamCorei/IntRamCore1 [12:15] LOC = X10Y15;
rami/IntRami/INTRAMCORE_GEN.2.IntRamCorei/IntRamCore0 [16:19] LOC = X9Y16;
rami/IntRami/INTRAMCORE_GEN.2.IntRamCorei/IntRamCore1 [20:23] LOC = X8Y16;
rami/IntRami/INTRAMCORE_GEN.3.IntRamCorei/IntRamCore0 [24:27] LOC = X8Y18;
rami/IntRami/INTRAMCORE_GEN.3.IntRamCorei/IntRamCore1 [28:31] LOC = X8Y17;
rami/IntRami/INTRAMCORE_GEN.4.IntRamCorei/IntRamCore0 [32:35] LOC = X9Y15;
rami/IntRami/INTRAMCORE_GEN.4.IntRamCorei/IntRamCore1 [36:39] LOC = X11Y15;
rami/IntRami/INTRAMCORE_GEN.5.IntRamCorei/IntRamCore0 [40:43] LOC = X8Y15;
rami/IntRami/INTRAMCORE_GEN.5.IntRamCorei/IntRamCore1 [44:47] LOC = X11Y16;
rami/IntRami/INTRAMCORE_GEN.6.IntRamCorei/IntRamCore0 [48:51] LOC = X10Y16;
rami/IntRami/INTRAMCORE_GEN.6.IntRamCorei/IntRamCore1 [52:55] LOC = X11Y17;
rami/IntRami/INTRAMCORE_GEN.7.IntRamCorei/IntRamCore0 [56:59] LOC = X10Y17;
rami/IntRami/INTRAMCORE_GEN.7.IntRamCorei/IntRamCore1 [60:63] LOC = X9Y17;

END_BUS_BLOCK;
END_ADDRESS_BLOCK;


これで.bitファイルと.bmmファイルが出来たのでDATA2MEMをコマンドラインから使用してみよう。コマンドラインから以下のコマンドを入力する。
(ISEインストールフォルダ)\bin\nt\data2mem -bm test.bmm -bd test.elf -p (FPGAの型番) -bt test.bit
そうするとtest_rp.bitという.bitファイルが出来ると思う。
今回はコマンドラインから行ったが、ISEに.bmmファイルと.elfファイルを入れておくと自動的にやってくれると思う。(いつのバージョンだったか、実際に入れて試したことがあったがうまく行かなかったために、今でもコマンドラインからdata2memを実行している。ISE8.2iでは大丈夫かもしれない。未確認)
  1. 2006年11月13日 22:29 |
  2. その他のXilinxのツールについて
  3. | トラックバック:0
  4. | コメント:5

コメント

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます
  1. 2006/11/15(水) 09:22:07 |
  2. |
  3. #
  4. [ 編集 ]

SECRETになっているので返事をしても良いのか迷いましたが、秘密にするようなことでもないので返事をします。
Verilogはよく知りません。今勉強しながらテストベンチを書いているところですので、FPGAのBBSなどで聞いてみてはいかがでしょうか?
  1. 2006/11/15(水) 17:38:48 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

了解致しました。早速FPGA BBSで聞いてみております。現在までに自分で探してみた結果、icarusというフリーのコンパイラ、シュミレータが存在するみたいですのでちょっと見てみようと考えております。
お手数をおかけ致しました。失礼します。
  1. 2006/11/21(火) 14:57:27 |
  2. URL |
  3. #-
  4. [ 編集 ]

icarusというと、こういうのですか?http://ivi.sourceforge.net/project_plan.html
SystemVerilog私も興味があります。ET2000で聞いてきたところModelSim SEもアサーションだっけかな?はできないとのこと、新しいModelSim(名前忘れました)で出来るそうです。
  1. 2006/11/21(火) 22:51:48 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

IVIのプラグインのひとつらしいです。icarusのURLを示します。http://icarus.com/eda/verilog/
ダウンロードして使えるのかどうか調査を始めてるところです。
XilinxのISEとかに統合して使えたらいいなと思っているのですが。
  1. 2006/11/22(水) 13:22:37 |
  2. URL |
  3. #-
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/349-b4e6ee54
この記事にトラックバックする(FC2ブログユーザー)