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

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

Код компилируется и тестбенч запускается, я вижу все отчеты, которые я вставил, чтобы проверить, не останавливается ли он где-нибудь, но файл с результатами остается пустым. Ни print, ни writeline ничего не делают. Файл существует и добавлен в проект в 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;

person FlyinGazebo    schedule 13.05.2016    source источник
comment
Добро пожаловать в СО. Было бы полезно, если бы вы предоставили некоторый код, который минимально воспроизводит вашу проблему; вместо этого мне пришлось добавить довольно много кода и убрать довольно много, просто чтобы ваш код скомпилировался и запустился. Сделав это, я не вижу проблемы - он пишет в файл, содержимое которого я ожидал. Так зачем мне получать какой-то контент в моем файле? Одна из строк, которую мне пришлось закомментировать, была if(color_out_v = '1') then; очевидное предположение состоит в том, что color_out_v никогда не бывает 1. Если бы вы предоставили MCVE, я мог бы это проверить.   -  person Matthew Taylor    schedule 13.05.2016
comment
Кстати: квалификация в этом integer'(to_integer избыточна: to_integer возвращает integer; компилятор знает это, поэтому квалификация не требуется.   -  person Matthew Taylor    schedule 13.05.2016
comment
@ Мэтью Тейлор: я отметил комментарий на будущее. Я всегда чувствовал, что должен вставлять как можно меньше кода для удобочитаемости. color_out_v становится '1' совершенно нормально, я считаю, что строка записи отчета не произошла бы, если бы это было не так. Если это сработает для вас, у меня может быть системная проблема, о которой я не знаю.   -  person FlyinGazebo    schedule 13.05.2016
comment
Вводить как можно меньше кода для удобочитаемости — это очень хорошо, но вместо того, чтобы удалять то, что позволяет коду компилироваться, было бы лучше убрать то, что не имеет ничего общего с проблемой. Таким образом, другие могут просто запустить ваш код и без особых усилий воспроизвести вашу проблему. Есть и еще одно преимущество: сокращение вашего кода до этой MCVE может позволить вам найти проблему самостоятельно. Во всяком случае, в данном случае, я думаю, это было бы хорошей идеей: вы можете решить проблему самостоятельно; если нет, то как насчет того, чтобы опубликовать полученный код? ...   -  person Matthew Taylor    schedule 13.05.2016
comment
... так что проблема была со строкой кода, которую я закомментировал, чтобы ее скомпилировать.   -  person Matthew Taylor    schedule 13.05.2016
comment
На самом деле оказалось, что моя проблема заключалась в неправильном завершении симуляции. Vhdl записывает в файл только тогда, когда симуляция заканчивается, но я смотрел на нее, когда симуляция все еще выполнялась.   -  person FlyinGazebo    schedule 18.05.2016


Ответы (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;

Изменения включают в себя открытие файла только один раз, а не закрытие его явным образом. Файл будет закрыт неявно, когда симуляция завершится, или процессу может быть передан сигнал для явного закрытия файла, если предоставлен список чувствительности. Сигнал может быть предоставлен с транзакцией, когда, например, 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

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

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

FUNCTION to_string (value : integer) RETURN string IS

BEGIN

RETURN integer'image(value);

END FUNCTION to_string;
person A. Kieffer    schedule 13.05.2016