2007年07月22日
ModelSim TIPS 「ModelSimでバイナリファイルの書き込み」
今回は、バイナリファイルの書き込みをテストした。
以下のソースコードはバイナリファイルを読み込みSTD_LOGIC_VECTORに変換してからバイナリファイルに書き込みを行う。要はファイルのコピーを行う。
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
for i in 0 to 255 loop
read( FILEIN, FREAD_CHAR );
BYTEDATA <= conv_std_logic_vector( character'pos(FREAD_CHAR), 8 );
wait for 0 ns;
FWRITE_CHAR := character'val( conv_integer(BYTEDATA) );
write( FILEOUT, FREAD_CHAR );
end loop;
wait;
end process;
end behavior;
これを実行すると「binary_in.bin」と同じ内容の「binary_out.bin」ファイルが生成される。(ソースコードと「binary_in.bin」を置いておく)
ただ前回同様に、これはModelSimでの動作を確認しただけで保証されている訳ではなく、他のシミュレータでは動作しない可能性がある。
また、ファイルを最後まで読み出した事が分からず最後の次を読み出そうとした瞬間にFatalエラーとなってしまう。これを回避するにはファイル中にそれが分かる情報を入れるか事前に読み出すサイズを決めるなどの方法が考えられる。
2007/08/02 - EOFを検出する方法を発見 ModelSim TIPS 「ModelSimでバイナリファイルの操作」を参照。
(今まで「printf」を使ったソースコードを紹介していたが文字列パラメータの最後に¥nが入っていなかった。これが入っていないと表示が出てこない。どうやらBlogに貼り付けたときに抜けてしまっていたようだ。)
この記事へのコメント
¥nがないと、バッファされていて出力されない仕様なんですね。。。
ご迷惑をおかけしてすいませんでした。