VHDL запись в файл ничего не делает

Я написал фрагмент изображения VHDL-кода. Для тестирования я создал файл значений пикселей с помощью Matlab и относительно простого тестового стенда (он просто заполняет значения из файла на вход). Я хотел записать результаты в новый файл, чтобы я мог обработать их и увидеть полученное изображение.

Код компилируется и запускается testbench, я вижу все отчеты, которые я вставил, чтобы проверить, останавливается ли он где-нибудь, но файл с результатами остается пустым. Кажется, ни печать, ни писание ничего не делают. Файл существует и добавляется в проект в Vivado, поэтому мне не нужно писать весь путь. Нет предупреждений или ошибок в выходных данных симулятора.

Я получил код записи в файл отсюда и здесь и немного расширил его, чтобы записывать в файл каждые часы и добавлять заголовок сверху.

color_out (0) является частью вывода. color_out_v выводится правильно.

Есть идеи? Что мне не хватает?

Verify_data_process : process
variable my_line : line; 
file l_file      : TEXT;        -- open write_mode is "color_out.txt";   
begin -- process
file_open(l_file, "C:\Users\vevo\branches\Vivado_IP\repo\testing_data\color_out.txt", write_mode);
  wait until clk128_tb = '1';
    print(l_file, "R G B" );

    if(color_out_v = '1') then
    report "Color_out";
        write(my_line, integer'(to_integer(color_out(0).R)));
        write(my_line, integer'(to_integer(color_out(0).G)));
        write(my_line, integer'(to_integer(color_out(0).B)));
        writeline(l_file, my_line);
    report "write line";
    end if;
    file_close(l_file);
end process;

2 ответа

Код вопроса открывает и закрывает файл каждый раз, когда 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;

Изменения включают в себя только открытие файла один раз и не закрытие его явно. Файл будет закрыт неявно, когда симуляция закончится, или процессу может быть передан сигнал, чтобы явно закрыть файл, если предоставляется список чувствительности. Сигнал может быть обеспечен транзакцией, например, сейчас = TIME'HIGH.

Также не имеющая процедуры с именем print, она была заменена постоянной строкой заголовка, записью в буфер строки и строкой записи. Обратите внимание, что это происходит только один раз, когда файл открыт.

Использование функции ising_edge - это сила привычки. Без MCVe код рос органично.

Как прокомментировал А. Киффер в качестве ответа, используется целочисленное изображение плюс некоторые дополнительные пробелы форматирования. Строка - это доступ (указатель) к строке, вы записываете строки в строку.

И при запуске выше дает консольный вывод:

ghdl -r color_out
color_out.vhdl: 45: 13: @ 30ns: (примечание к отчету): Color_out
color_out.vhdl: 50: 13: @ 30ns: (примечание к отчету): написать строку
color_out.vhdl:45:13:@50ns:(примечание к отчету): Color_out
color_out.vhdl: 50: 13: @ 50ns: (примечание к отчету): написать строку
color_out.vhdl:45:13:@70ns:(примечание к отчету): Color_out
color_out.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

Набор значений пикселей для каждого события ising_edge, когда color_out_v = '1'. И с локально статическим индексом 0 они всегда один и тот же пиксель.

Таким образом, проблема заключалась в том, чтобы открывать и закрывать файл несколько раз при каждом пробуждении процесса.

File_open после закрытия файла приводит к очистке содержимого файла, и у вас не будет никаких результатов.

См. IEEE Std 1076-2008 5.5.2 Файловые операции, пункт 2 (выдержка):

- Если значение, предоставленное параметру Open_Kind, равно WRITE_MODE, режим доступа для файлового объекта доступен только для записи. Кроме того, внешний файл изначально пуст. Значения, записанные в объект файла, помещаются во внешний файл в том порядке, в котором они записаны.

Я не могу комментировать, поэтому я публикую это как ответ. Как и Мэтью, я не вижу никаких "проблем с кодированием". Хотя вы пишете целые числа на вашей строке. Попробуйте преобразовать их в строку, это может быть проблемой.

Вы можете использовать эту функцию, например:

FUNCTION to_string (value : integer) RETURN string IS

BEGIN

RETURN integer'image(value);

END FUNCTION to_string;
Другие вопросы по тегам