2016-05-13 2 views
0

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

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

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

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; 
+1

Добро пожаловать в СО. Это поможет, если вы предоставили некоторый код, который [минимально воспроизвел вашу проблему] (http://stackoverflow.com/help/mcve); вместо этого мне пришлось добавить довольно много кода и немного отвлечься, просто чтобы скомпилировать и запустить ваш код. Сделав [это] (http://www.edaplayground.com/x/2fwc), я не вижу проблемы - он записывает файл, в котором есть содержимое, которое я ожидал. Так почему я получаю некоторый контент в моем файле? Одной из строк, которые я должен был прокомментировать, было 'if (color_out_v = '1') then'; очевидное предположение заключается в том, что 'color_out_v' никогда не является' 1'. Если бы вы предоставили MCVE, я бы мог проверить это. –

+0

BTW: квалификация в этом 'integer '(to_integer' является избыточной:' to_integer' возвращает 'integer', компилятор знает, что, поэтому никакой квалификации не требуется. –

+0

@Matthew Taylor: Я отметил комментарий на будущее. Мне кажется, что отчет «строка записи» не будет происходить, если это не так. Если он работает для вас, я мог бы использовать его как можно более понятный для чтения. color_out_v системная проблема, о которой я не знаю. – FlyinGazebo

ответ

0

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

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

FUNCTION to_string (value : integer) RETURN string IS 

BEGIN 

RETURN integer'image(value); 

END FUNCTION to_string; 
1

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