はじめに
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