2007年08月02日
ModelSim TIPS 「ModelSimでバイナリファイルの操作」
以前、バイナリファイルの読み込みと書き込みを紹介したが、その時、「ファイルを最後まで読み出した事が分からず最後の次を読み出そうとした瞬間にFatalエラーとなってしまう。」と書いた。
しかし、EOF(エンドオブファイル)を検出出来る関数があることを知ったので、それを使って以前のサンプルを書き直す事にする。
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」の値を大きくする。
この記事へのコメント
有用な情報の掲載、ありがとうございます。
EDAツールですが、URLからSourceForgeに飛べますので、ご興味がおありならばぜひお試しください。
たーぼです。
コメントして貰えてうれしいです。
また、ブログがお役に立てたようで何よりです。
NOODLYBOXですが、以前から興味があったのですが時間が無くて試せていません。
私はPowerPCやMIPSをFPGAで制御する事が多いので今度勉強させて貰ってシミュレーション効率化が出来ればと思っています。