2007年07月22日

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

今回は、バイナリファイルの書き込みをテストした。

以下のソースコードはバイナリファイルを読み込み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
        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に貼り付けたときに抜けてしまっていたようだ。)


投稿時刻(01:40)│コメント(2)ModelSim 

この記事へのコメント

1. Posted by marsee   2007年07月22日 06:12
そうか、それで前のVHDLファイルを実行しても表示が出なかったのですね。それでわかりました。もう一度やり直してみます。私のやり方が悪いのかと思い、そのままにしていました。
¥nがないと、バッファされていて出力されない仕様なんですね。。。
2. Posted by たーぼ   2007年07月22日 22:58
そうなんです。blogにソースファイルからコピー&ペーストしたときに¥はエスケープコードと判断されてしまうようです。
ご迷惑をおかけしてすいませんでした。

この記事にコメントする

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