2007年08月02日

ModelSim TIPS 「ModelSimでバイナリファイルの操作」

以前、バイナリファイルの読み込みと書き込みを紹介したが、その時、「ファイルを最後まで読み出した事が分からず最後の次を読み出そうとした瞬間にFatalエラーとなってしまう。」と書いた。
しかし、EOF(エンドオブファイル)を検出出来る関数があることを知ったので、それを使って以前のサンプルを書き直す事にする。

以下のソースコードはバイナリファイルを読み込みSTD_LOGIC_VECTORに変換してからバイナリファイルに書き込みを行う。要はファイルのコピーを行う。
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

entity bin_rw is
end bin_rw;

architecture behavior of bin_rw is

    type    BIN is file of character;
    file    FILEIN      :   BIN open READ_MODE  is "binary_in.bin";
    file    FILEOUT     :   BIN open WRITE_MODE is "binary_out.bin";

    signal  BYTEDATA     :   std_logic_vector(7 downto 0);

begin

    process
        variable    FREAD_CHAR   :   character;
        variable    FWRITE_CHAR  :   character;
    begin
        -- ファイルの終わりを検出するまでループ
        while ( endfile( FILEIN ) = FALSE ) loop
            -- ファイルリード
            read( FILEIN, FREAD_CHAR );

            -- std_logic_vectorに変換(今回は変換する意味は無いが、参考のため)
            BYTEDATA <= conv_std_logic_vector( character'pos(FREAD_CHAR), 8 );

            -- デルタ遅延を入れてBYTEDATAを更新
            wait for 0 ns;

            -- characterに変換(今回は変換する意味は無いが、参考のため)
            FWRITE_CHAR := character'val( conv_integer(BYTEDATA) );

            -- ファイルライト
            write( FILEOUT, FREAD_CHAR );
        end loop;
        wait;
    end process;

end behavior;



今回は、whileでEOFを検出するまで無限ループしているのでFatalエラーとなることはない。ただし、ループ中にデルタ遅延を入れているので大きなファイルの場合、Modelsimのリミットでストップされてしまうかもしれない。この場合は、ウエイトの値に1以上を入れるかModelsimのメニューから「Simulate」→「Runtime Option」→Defaultsタブの「Iteration Limit」の値を大きくする。



投稿時刻(19:23)│コメント(2)ModelSim 

この記事へのコメント

1. Posted by molelord   2009年12月12日 12:53
5 自作のEDAツールで参考にさせていただきました(名前つきパイプからバイナリを取り出すために使いました)。
有用な情報の掲載、ありがとうございます。
EDAツールですが、URLからSourceForgeに飛べますので、ご興味がおありならばぜひお試しください。
2. Posted by たーぼ   2009年12月14日 20:29
molelordさん、こんにちわ。
たーぼです。
コメントして貰えてうれしいです。
また、ブログがお役に立てたようで何よりです。

NOODLYBOXですが、以前から興味があったのですが時間が無くて試せていません。
私はPowerPCやMIPSをFPGAで制御する事が多いので今度勉強させて貰ってシミュレーション効率化が出来ればと思っています。

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
最新コメント
カテゴリ別表示
月別表示