Код вопрос открытие и закрытие файла каждый раз, когда clk128_tb есть событие и был установлен равным «1».
A Minimal, Complete, and Verifiable example с процессом на вопрос по адресу, это ядро:
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;
Изменения включают в себя только открыть файл один раз и не закрывая его в явном виде. Файл будет закрыт неявно, когда симуляция закончится или процесс может быть передан сигнал, чтобы закрыть файл явно, если он снабжен списком чувствительности. Сигнал может быть обеспечен транзакцией, если теперь = TIME'HIGH, например.
Также не имея процедуры с именем print, она была заменена на строку с постоянным заголовком, которая записывается в буфер строки и строку записи. Обратите внимание, что это происходит только один раз, когда файл открывается.
Использование функции growth_edge является силой привычки. Без MCVe код вырастал органично.
Как сказал А. Киффер в качестве ответа integer'image, плюс некоторые добавленные пространства форматирования. Строка - это доступ (указатель) к строке, вы записываете строки в строку.
И при запуске выше дает консольный вывод:
ghdl -r color_out
color_out.vhdl: 45: 13: @ 30 нс (Докладная записка): Color_out
color_out.vhdl: 50: 13: @ 30ns: (примечание отчета): строка записи
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_ou т.vhdl: 50: 13: @ 70ns: (примечание к отчету): строка записи
color_out.vhdl: 45: 13: @ 90ns: (примечание к отчету): Color_out
color_out.vhdl: 50: 13: @ 90ns: (отчет примечание): линия записи
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
Набор значений пикселей для каждого события восходящего_сигнала, когда color_out_v = '1'. И с локально статическим индексом 0 они всегда одного и того же пикселя.
Таким образом, проблема заключалась в том, чтобы открывать и закрывать файл повторно каждый раз, когда процесс пробуждается.
File_open после закрытия файла имеет эффект очистки содержимого файла, и у вас не будет никаких результатов.
См IEEE Std 1076-2008 5.5.2 Файловые операции в пункте 2 (выдержки):
- Если значение значения параметра Open_Kind является WRITE_MODE, режим доступа к объекту файла только для записи , Кроме того, внешний файл создается изначально пустым. Значения, записанные в файл-объект, помещаются во внешний файл в том порядке, в котором они записаны.
Добро пожаловать в СО. Это поможет, если вы предоставили некоторый код, который [минимально воспроизвел вашу проблему] (http://stackoverflow.com/help/mcve); вместо этого мне пришлось добавить довольно много кода и немного отвлечься, просто чтобы скомпилировать и запустить ваш код. Сделав [это] (http://www.edaplayground.com/x/2fwc), я не вижу проблемы - он записывает файл, в котором есть содержимое, которое я ожидал. Так почему я получаю некоторый контент в моем файле? Одной из строк, которые я должен был прокомментировать, было 'if (color_out_v = '1') then'; очевидное предположение заключается в том, что 'color_out_v' никогда не является' 1'. Если бы вы предоставили MCVE, я бы мог проверить это. –
BTW: квалификация в этом 'integer '(to_integer' является избыточной:' to_integer' возвращает 'integer', компилятор знает, что, поэтому никакой квалификации не требуется. –
@Matthew Taylor: Я отметил комментарий на будущее. Мне кажется, что отчет «строка записи» не будет происходить, если это не так. Если он работает для вас, я мог бы использовать его как можно более понятный для чтения. color_out_v системная проблема, о которой я не знаю. – FlyinGazebo