FC2カウンター FPGAの部屋 openMSP430のシミュレーション2(ISimでシミュレーションを試みる1)
FC2ブログ

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

FPGAの部屋

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

openMSP430のシミュレーション2(ISimでシミュレーションを試みる1)

openMSP430のシミュレーション1”ではopenMSP430のシミュレーションスクリプトを試してみたが、動作させることが出来なかった。今回はISimでのシミュレーションを試みる。

VerilogでXSTにBlock RAMを推論させる”で最後に試したバイト・イネーブル付きのRAMを実装することにした。そのrom_16x2k.v を下に示す。(注:Spartan-3ではバイト・イネーブル付きRAMはSLICEMに実装されるのでだめでした。バイト・イネーブル無しRAMに後で変更します)(”VerilogでXSTにBlock RAMを推論させる”のもう一度追記参照)

//
//  16ビット幀048ワードRAM
//

module  rom_16x2k  (clk, we,  en, addr,  din,  dout);
   parameter DATA_WIDTH = 16;
   parameter ADDR_WIDTH = 11;

   input    wire [DATA_WIDTH-1:0] din;
   input    wire [ADDR_WIDTH-1:0] addr;
   input    wire [1:0] we;
   input    wire clk;
    input wire en;
   output    reg [DATA_WIDTH-1:0] dout;

   (* RAM_STYLE="BLOCK" *) reg [DATA_WIDTH-1:0] ram [2**ADDR_WIDTH-1:0];
   reg [(DATA_WIDTH/2)-1:0] di0, di1;

   //  The following code is only necessary if you wish to initialize the RAM 
   //  contents via an external file (use $readmemb for binary data)
   initial
      $readmemh("rom_16x2k.data", ram, 0, 2047);

   always @(we, din) begin
      if (we[0])
         di0 = din[(DATA_WIDTH/2)-1:0];
      else
         di0 = ram[addr][(DATA_WIDTH/2)-1:0];
      if (we[1])
         di1 = din[DATA_WIDTH-1:DATA_WIDTH/2];
      else
         di1 = ram[addr][DATA_WIDTH-1:DATA_WIDTH/2];
   end

   always @(posedge clk)
      if (en) begin
         dout  <= {di1,di0};
         ram[addr] <= {di1,di0};
      end
endmodule


さて、これにelfファイルのソフトウェアを初期値として入力する方法を考える。

Spartan3 Stater KitのMSP430は、どうやってシミュレーションをしようとしているかを見ていこう。
シミュレーション用のスクリプトの”xilinx_diligent_s3board\sim\rtl_sim\bin\msp430sim"は、make で作成したelfファイルを、

msp430-objcopy -O ihex pmem.elf pmem.ihex


で、Intel Hex形式に直している。その後、ihex2mem.tclで、memファイルに変換している。

../bin/ihex2mem.tcl -ihex pmem.ihex -out pmem.mem -mem_size $pmemsize


この、pmem.memの代わりに、rom_16x2k.dataとして、出力するようにihex2mem.tclを修正し、ihex2data.tclとした。ihex2data.tclで変更した部分を下に示す。141行目からを以下のように変更した。

# Writing memory array to file
for {set i 0} {$i <= ($num_word-1)} {incr i} { 
    puts -nonewline $f_out "[format "%02s" $mem_arr($i) ]\n"
}

puts  $f_out "\n"
close $f_out

exit 0


修正したihex2data.tcl で以下のようにCygwin上でコマンドを実行してrom_16x2k.data を作成した。

./ihex2data.tcl -ihex pmem.ihex -out rom_16x2k.data -mem_size 4098


すると、rom_16x2k.data が作成された。rom_16x2k.data の一部を下に示す。

4031
0300
40B2
5A80
0120
403F
0000
930F
2405
832F


  1. 2011年06月22日 05:34 |
  2. FPGA内蔵マイクロコントローラ
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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