【VHDL】VHDLのシミュレーションでファイル出力

はじめに

VHDLのシミュレーションでファイルにデータを書き込む方法を簡単に書きます。

シンプルな8ビットカウンタの値をファイルに書き込んで保存します。

ツールとしてザイリンクスのVIVADOを使用しています。




開発環境

  • Windows 10
  • Vivado v2022.1.2



8ビットカウンタのプログラム

以下です。

リセットが解除されるとインクリメントして行きます。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity counter8bits is
Port (
	CLK		:	in		std_logic;
	RESET	:	in		std_logic;
	DOUT	: out		std_logic_vector(7 downto 0)
);
end counter8bits;

architecture Behavioral of counter8bits is
signal data : std_logic_vector(7 downto 0);
begin

	process (CLK, RESET) begin
		if (RESET='1') then
			data <= X"00";
		elsif (CLK'event and CLK='1') then
			data <= data + '1';
		end if;
	end process;

	DOUT <= data;

end Behavioral;





8ビットカウンタのテストベンチ

以下です。

クロックとリセットを入力しています。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_textio.all; -- ⓵
use std.textio.all; -- ⓶

entity tb_counter8bits is
end tb_counter8bits;

architecture Behavioral of tb_counter8bits is

component counter8bits is
Port (
	CLK		:	in		std_logic;
	RESET	:	in		std_logic;
	DOUT	: out		std_logic_vector(7 downto 0)
);
end component;

signal	CLK		: std_logic;
signal	RESET	:	std_logic;
signal	DOUT	: std_logic_vector(7 downto 0);
file		logf	: text open write_mode is "./log.txt"; -- ⓷

begin

counter8bits_inst : counter8bits
Port map (
	CLK		=> CLK,
	RESET	=> RESET,
	DOUT	=> DOUT
);

process begin
	CLK <= '0';
	wait for 5ns;
	CLK <= '1';
	wait for 5ns;
end process;

lp: process
variable	WR_LINE		: line; -- ⓸
variable	logdata		: std_logic_vector(7 downto 0);
begin
	RESET <= '1';
	--CLK <= '0';
	wait until CLK'event and CLK='1';
	wait until CLK'event and CLK='1';
	RESET <= '0';
	for i in 0 to 255 loop
		wait until CLK'event and CLK='1';
		logdata := DOUT;
		hwrite (WR_LINE, logdata); -- ⓹
		write (WR_LINE, 'h'); -- ⓺
		writeline (logf, WR_LINE); -- ⓻
	end loop;
	wait;
end process;

end Behavioral;

⓵、⓶ ファイルを生成データ書き込みに必要となります。

⓷ ファイルの変数名、書き込みファイル、保存先のディレクトリです。

⓸ 1行ずつ書き込むデータの変数です。

⓹ データをWR_LINEに入れます。hwriteはhex値として入れます。

⓺ 文字'h'を追加して入れます。

⓻ writelineでWR_LINEの値をファイルに書き込みます。



出力ファイル

生成されたlog.txtの抜粋を以下に示します。

00h
01h
02h
03h
04h
05h
06h
07h
08h
09h
0Ah
0Bh
0Ch
0Dh
0Eh
0Fh
10h
11h
12h
13h
14h
15h
16h
17h
18h
19h
1Ah
1Bh
1Ch
1Dh
1Eh
1Fh
20h

© 2024 サニーサイド