VHDLにおけるtxtファイルの読み書き

4594 ワード

VHDLコードをModelSimシミュレーションする場合、IPCoreを簡単にテストするなど、比較的簡単な機能をテストすると、
signalName <= x"01"; wait for cam_period*5; 
signalName <= x"10"; wait for cam_period*5;

類似のコードは私たちの要求を満たすことができます.
しかし、大きなcomponentをテストしたり、データのシーケンスをテストしたり、画像をテストしたりすると、ファイルを通じてデータを読み取ることが簡単になります.同時に,試験結果を保存するために,文書を用いることもしばしばある.特にFPGAの画像処理では、ファイルの読み取りが少なくない.まず、正常な画像を1つのtxtファイルに変換し、FPGAの入力として処理した画像データをtxtファイルに保存し、このtxtファイルを画像に変換することで、画像処理の効果を直感的に見ることができる.
では今日はVHDLのtxtファイルの読み込みと書き込みについてお話しします.
file_open(file_status,FILE_OUT,"data_record.txt",write_mode);

上記のコードは、write Modeというドキュメントを開くdata_record.txtという意味で、ファイル全体の読み取りと書き込みシステムの中で最も重要です.
 txtテキストの読み書き方式は全部で3種類あり、それぞれread_modewrite_modeappend_modeである.文字通り、読み取りモード、書き込みモード、拡張モードである.append_modewrite_modeの違いは、write_modeはテキストに元々存在していた内容を消去し、append_modeは消去しないことです.
file_open(file_status,FILE_OUT,"data_record.txt",read_mode);
file_open(file_status,FILE_OUT,"data_record.txt",append_mode);

これは別の2つのモードです.
-- 
stim_process : process(cam_clk)
variable i : integer:= 0;
file TEST_IN  : TEXT;
variable LINE_IN: line;
variable dat_in : std_logic_vector(31 downto 0);
begin
  if(rst_n = '0' and dataIn = '0') then
    file_open(TEST_IN, "image-binary-data.txt", READ_MODE);
    dataIn <= '1';
  elsif(rising_edge(cam_clk)) then
    if((i mod ((512*135) + 300)) < 300) then
      vs_i <= '0';
    else
      vs_i <= '1';
    end if;
    if (((i mod ((512*135) + 300)) < 300) or (((i mod (512*135+300))-300) mod 135) < 7) then
      hs_i <= '0';
      dv_i <= '0';
      da_i <= (others => '0');
    else
      hs_i <= '1';
      dv_i <= '1';
      readline(TEST_IN, LINE_IN);
      read(LINE_IN, dat_in); 
      da_i <= dat_in;
    end if;
    i := i + 1;
  end if;
end process;

  これはimage-binary-data.txtからデータを読み出すプロセスであり、もちろん、特定の時点でのみテキストからデータを読み出す判断プロセスも含まれている.
ここでは、dataInを設定し、その初期値を'0'に設定します.テキストが開いた後、このsignalを'1'に設定し、rst_n = '0'dataIn = '0'の2つの条件が満たされた場合にテキストの開きを行い、その後、テキストを行単位で読み取り、次のcomponentに入力します.
次に、テキストの書き込みについて説明します.
-- 
process(cam_clk)
FILE FILE_OUT : TEXT;
variable file_status:file_open_status;
variable buf:LINE;
begin
   if(rst_n = '0' and dataOut = '0') then
      file_open(file_status,FILE_OUT,"data_record.txt",write_mode);
	  file_close(FILE_OUT);
      file_open(file_status,FILE_OUT,"data_record.txt",append_mode);
	  dataOut <= '1';
   elsif(rising_edge(cam_clk))then
	 if(dv_o='1') then
	   write(buf,da_o);
	   writeline(FILE_OUT,buf);
	 end if;
	 if(sim_end = '1') then
	   file_close(FILE_OUT);
	 end if;
   end if;
end process;

  上記のコードと同様に、ここにもdataOutのフラグsignalがあり、rst_n = '0' and dataOut = '0'この2つの要求が同時に満たされたときにテキストを開きます.しかし、rst_n = '0' and dataOut = '0'という条件の下で4つのことをしたのを見て、テキストを開いて、閉じて、開けて、それからフラグsignalを‘1’に置いて、しかも2回開くモードが違って、1回はwrite_mode、1回はappend_modeで、どうしてこのように処理しますか.この理由をお話しします.
テキストが開いているので、閉じるに違いありません.write_を使うとmodeというモードで開くと、file_close(FILE_OUT)のとき、つまりテキストが閉じるとき、テキストには1行のデータしか残っていません.また,append_modeというパターンに置き換えると,file_close(FILE_OUT)の場合,以前にテキストに書き込まれたデータが残る.では、なぜ先にwrite_modeというモードで開くのでしょうか.私はこのモードで開いてから閉じます.ドキュメント全体の内容がクリアされ、次の操作が空のテキストであることが保証されます.これが先にwrite_modeで開く理由です.
  注意したいのは、書き込みの状態で、テキストを閉じていない場合は、テキストのサイズは常に0 Kですが、開いているかテキストのデータ情報が見えるか、中のデータもコピーできますが、これらのデータはこのテキストには本当に存在しません.このテキストもModelSimに占有され、コピー、切り取りなどの操作はできません.
ここでは、シミュレーションを終了するフラグsignalsim_endが設定され、このデフォルト値も'0'である.2つの使い方があります.1つは、シミュレーションコードにどのような状況が記載されているかというsignal置'1'です.例えば、遅延がどれだけ後になったか、あるフラグビットが変化したかなどです.もう一つの暴力は、ModelSimのsignalのForceを利用して、しばらくシミュレーションしたと思っていたので、その値を「1」に強制し、テキストを閉じてシミュレーションが終わりました.
  write_modeappend_modeの場合、書き込むテキストは自動的に生成され、事前に生成する必要がなく、シミュレーションの場合、出力ドキュメントを時間と命名したり、パラメータの変更に関連するファイル名を複数シミュレーションしてから処理したりするのが便利です.
  注意したいのは、入力されたデータと出力されたデータはすべてバイナリデータなので、MatlabやVisual Studioなどのツールでデータをバイナリデータに変換することです.同様に、出力されたデータも通常のデータに変換してこそ、その特性をよく観察することができる.