[[ASAP Top]]

data2mem はビットファイルに含まれたBlockRAMの情報を編集して、
論理合成配置配線のプロセスなしにRAM/ROMの値を書き換えてくれる偉いコマンド。

しかしその実行プロセスが複雑なので、ここに使い方を示したい。

-メモリの書き方

とりあえず何でもよし。
例えば僕は次の感じで書きました。
#ref(memory.v)

-必要なファイル

1.bitfile~
2.*.ll~
3.*.syr~
4.*.ucf~
5.*.bmm~
6.*.mem~

 1.まずビットファイルを生成する。これはいうことないよね。

 2.3.4. *.llにはBlockRAMがどこに配置されたかの情報が示されているため、これを参照する。
 例えば
Bit  2235597 0x04000024   2285 Block=RAMB16_X1Y3 Latch=DOA6 Net=memOut<6> ~
Bit  2235611 0x04000024   2299 Block=RAMB16_X1Y3 Latch=DOA5 Net=memOut<5> ~
Bit  2235625 0x04000024   2313 Block=RAMB16_X1Y3 Latch=DOA4 Net=memOut<4> ~
Bit  2235653 0x04000024   2341 Block=RAMB16_X1Y3 Latch=DOA3 Net=memOut<3> ~
Bit  2235667 0x04000024   2355 Block=RAMB16_X1Y3 Latch=DOA2 Net=memOut<2> ~
Bit  2235681 0x04000024   2369 Block=RAMB16_X1Y3 Latch=DOA1 Net=memOut<1> ~
Bit  2235695 0x04000024   2383 Block=RAMB16_X1Y3 Latch=DOA0 Net=memOut<0> ~
 っとあれば、あぁこれは X1Y3にBRAMが配置されたんだとわかる。
 ここで、該当RAMがいかなる名前に推論されたかは、.syrレポートを読めばわかる。
 例えば、
Synthesizing (advanced) Unit <memory>.~
INFO:Xst - The ROM <Mrom__varindex0000> will be implemented as a read-only BLOCK RAM, absorbing the register: <OUT>.~
INFO:Xst - The RAM <Mrom__varindex0000> will be implemented as BLOCK RAM~
-----------------------------------------------------------------------~
| ram_type           | Block                               |          |~
-----------------------------------------------------------------------~
| Port A                                                              |~
|     aspect ratio   | 1024-word x 18-bit                  |          |~
|     mode           | write-first                         |          |~
|     clkA           | connected to signal <CLK>           | rise     |~
|     weA            | connected to internal node          | high     |~
|     diA            | connected to internal node          |          |~
|     doA            | connected to signal <OUT>           |          |~
-----------------------------------------------------------------------~
| optimization       | speed                               |          |~
-----------------------------------------------------------------------~
Unit <memory> synthesized (advanced).~
 とあれば、これはROMの名前がMrom_varindex0000なので、*.ucfファイルには
INST "MEM/Mrom__varindex0000" LOC = "RAMB16_X1Y3" 
 と記述する。

 5. bmm ファイルは例えば以下のように書ける。
ADDRESS_SPACE MEM RAMB16 INDEX_ADDRESSING [0x00000000:0x000003ff]~
   BUS_BLOCK~
      MEM/Mrom__varindex0000 [15:0] LOC = X1Y3;~
   END_BUS_BLOCK;~
END_ADDRESS_SPACE;~
 ADDRESS_SPACE の次の MEM は何を書いても構わない。
 続いてRAMB16 は他に RAMB18, RAMB32, RAMB36などインスタンシエートされたものを書く。
 INDEX_ADDRESSINGはおまじない。(誰か教えてください)
 その次の空間にはアドレスの開始位置から終了位置までを書く。
 今回の場合は0〜1023番地までのメモリなので 0 〜 3ff までとした。

 6. mem ファイルは
 @00000000
 から書き始め、その後、値を16進数で書いていく。
 今回の場合は
 00001
 00002
 00004
 .....
 のように書いてよい。んですべてを記述しなくても何も記述がない場合は0が推論されるのだそうだ。
 
 最後に

 $ data2mem -bm hoge.bm -bd hoge.mem -p <デバイス名スピードグレードパッケージ> -bt hoge.bit

 具体的には

 $ data2mem -bm ledTop.bm -bd ledTop.mem -p xc5vsx50t-1-ff1136 -bt ledTop.bit

 このコマンドによってledTop_rp.bit が生成されて目出度し。
 Xilinxによると作業効率が100倍以上向上する手法らしいので是非お試しを。

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS