Код вопроса открывает и закрывает файл каждый раз, когда clk128_tb имеет событие и оказывается равным «1».
Минимальный, полный и проверяемый пример, в основе которого лежит процесс ответа на вопрос:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.textio.all;
entity color_out is
end entity;
architecture foo of color_out is
signal clk128_tb: std_logic := '0';
signal color_out_v: std_logic := '0';
type pixel is record
R: unsigned (7 downto 0);
G: unsigned (7 downto 0);
B: unsigned (7 downto 0);
end record;
type scan is array (0 to 3) of pixel;
signal color_out: scan := ( (X"FF", X"A0", X"FF"),
(X"7F", X"7F", X"7F"),
(X"00", X"FF", X"00"),
(X"C0", X"C0", X"C0") );
begin
Verify_data_process :
process
variable my_line: line;
file l_file: TEXT; -- open write_mode is "color_out.txt";
constant header: string := " R G B";
variable file_is_open: boolean;
begin -- process
if not file_is_open then
file_open (l_file, "color_out.txt", write_mode);
file_is_open := true;
-- print(l_file, "R G B" );
write(my_line, header);
writeline(l_file, my_line);
end if;
wait until rising_edge(clk128_tb ); -- wait until clk128_tb = '1';
-- print(l_file, "R G B" );
if color_out_v = '1' then
report "Color_out";
write(my_line, integer'image(to_integer(color_out(0).R)) & " ");
write(my_line, integer'image(to_integer(color_out(0).G)) & " ");
write(my_line, integer'image(to_integer(color_out(0).B)));
writeline(l_file, my_line);
report "write line";
end if;
-- file_close(l_file);
end process;
CLOCK:
process
begin
wait for 10 ns;
clk128_tb <= not clk128_tb;
if now > 100 ns then
wait;
end if;
end process;
STIMULIS:
process
begin
wait for 20 ns;
color_out_v <= '1';
wait;
end process;
end architecture;
Изменения включают в себя открытие файла только один раз, а не закрытие его явным образом. Файл будет закрыт неявно, когда симуляция завершится, или процессу может быть передан сигнал для явного закрытия файла, если предоставлен список чувствительности. Сигнал может быть предоставлен с транзакцией, когда, например, now = TIME'HIGH.
Также не имея процедуры с именем print, она была заменена постоянной строкой заголовка, записью в буфер строки и строкой записи. Обратите внимание, что это происходит только один раз при открытии файла.
Использование функцииrising_edge является силой привычки. Без MCVe код рос органично.
Как прокомментировал А. Киффер, в качестве ответа используется целочисленное изображение плюс некоторые добавленные пробелы форматирования. Строка — это доступ (указатель) к строке, вы записываете строки в строку.
И при запуске вышеприведенное дает консольный вывод:
ghdl -r color_out
color_out.vhdl:45:13:@30ns:(примечание к отчету): Color_out
color_out.vhdl:50:13:@30ns:(примечание к отчету): write line
color_out. vhdl:45:13:@50ns:(примечание к отчету): Color_out
color_out.vhdl:50:13:@50ns:(примечание к отчету): write line
color_out.vhdl:45:13:@70ns: (примечание к отчету): Color_out
color_out.vhdl:50:13:@70ns:(примечание к отчету): write line
color_out.vhdl:45:13:@90ns:(примечание к отчету): Color_out
color_out.vhdl:50:13:@90ns:(примечание к отчету): write line
color_out.vhdl:45:13:@110ns:(примечание к отчету): Color_out
color_out.vhdl:50:13:@ 110ns:(примечание к отчету): написать строку
А файл color_out.txt содержит:
R G B
255 160 255
255 160 255
255 160 255
255 160 255
255 160 255
Набор значений пикселей для каждого событияrising_edge, когда color_out_v = '1'. И с локально статическим индексом 0 они всегда являются одним и тем же пикселем.
Таким образом, проблема заключалась в многократном открытии и закрытии файла каждый раз, когда процесс просыпался.
File_open после закрытия файла приводит к очистке содержимого файла, и у вас не будет никаких результатов.
См. IEEE Std 1076-2008 5.5.2 Операции с файлами, параграф 2 (выдержка):
— Если для параметра Open_Kind указано значение WRITE_MODE, режим доступа к файловому объекту — только для записи. Кроме того, внешний файл изначально делается пустым. Значения, записываемые в файловый объект, помещаются во внешний файл в том порядке, в котором они были записаны.
person
Community
schedule
13.05.2016
if(color_out_v = '1') then
; очевидное предположение состоит в том, чтоcolor_out_v
никогда не бывает1
. Если бы вы предоставили MCVE, я мог бы это проверить. - person Matthew Taylor   schedule 13.05.2016integer'(to_integer
избыточна:to_integer
возвращаетinteger
; компилятор знает это, поэтому квалификация не требуется. - person Matthew Taylor   schedule 13.05.2016