2007年07月20日

ModelSim TIPS 「ModelSimでバイナリファイルの読み込み」

以前、ModelSim TIPS 「ModelSimでビットマップ操作」を書いたが、これはModelSimのFLI機能を使っていた。
今回は、FLIを使用せずVHDLだけでバイナリファイルを操作する方法を紹介する。

以下のソースコードはバイナリファイルを読み込みSTD_LOGIC_VECTORに変換してTranscriptウィンドウに表示する動作を行う。


library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

library c;
use c.stdio_h.all;

entity test_bread is
end test_bread;

architecture behavior of test_bread is

    type    BIN is file of character;
    file    FILEPOINT   :   BIN open READ_MODE is "binary.bin";

    signal  PRINTD      :   std_logic_vector(7 downto 0);

begin

    process
        variable    FREAD_CHAR  :   character;
    begin
        for i in 0 to 255 loop
            read( FILEPOINT, FREAD_CHAR );
            PRINTD <= conv_std_logic_vector(character'pos(FREAD_CHAR), 8 );
            wait for 0 ns;
            printf( "0x%02x ", PRINTD );
        end loop;
        wait;
    end process;

end behavior;


表示するために「for」を使ったり「library c;」の「printf」を使用しているがバイナリファイルの読み込みには一切関係ない。
重要な部分は、
   type    BIN is file of character;
    file    FILEPOINT   :   BIN open READ_MODE is "binary.bin";
これだけだ。
(動作させるには読み出す対象の"binary.bin"ファイルも必要)

FLIを使用していないのでもしかするとModelSimXEでも動作するかもしれない。この要望は結構多いので後で実験してみようと思う。
2007/07/20 - ModelSimXE Starterでの動作が確認できた。

ただ、これはModelSimでの動作を確認しただけで保証されている訳ではなく、他のシミュレータでは動作しない可能性がある。
また、ファイルを最後まで読み出した事が分からず最後の次を読み出そうとした瞬間にFatalエラーとなってしまう。これを回避するにはファイル中にそれが分かる情報を入れるか事前に読み出すサイズを決めるなどの方法が考えられる。
2007/08/02 - EOFを検出する方法を発見 ModelSim TIPS 「ModelSimでバイナリファイルの操作」を参照。

近いうちに、この機能を使ってビットマップのリードライトが出来るモジュールを作って公開しようと思う。



投稿時刻(13:27)│コメント(2)ModelSim 

この記事へのコメント

1. Posted by marsee   2007年07月20日 16:51
動作を確認しました。(ModelSim SEです)
今までテキストファイルしか読んだことがなかったので、勉強になりました。
ありがとうございました。
2. Posted by たーぼ   2007年07月20日 20:12
いえいえ、こちらこそ試していただいてありがとうございます。
私は「FPGAの部屋」で数え切れないほど勉強させてもらっています。これからもよろしくお願いします。

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
最新コメント
ブログ内検索
カテゴリ別表示
月別表示
問い合わせ・連絡先
ta_bo__@livedoor.com

本サイトは以下のアクセス解析を使用しております。
基礎化粧品