Чтение длины текста в Vivado - PullRequest
0 голосов
/ 04 июля 2018

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

file my_input : TEXT open READ_MODE is "/home/sukru/MD5.dat";
variable my_line : LINE;
variable input_line : LINE;
variable length : integer;

readline(my_input, input_line);
read(input_line, length);
writeline(output, input_line);  -- optional, write to std out
write(input_line, integer'(length));
writeline(output, input_line);

Сообщение об ошибке следующее.

Error: TEXTIO function READ: read a non-integer, an integer is expected
a
-2147483648

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

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

VHDL в настоящее время не может взаимодействовать с операционной системой хоста для определения длины файла.

Существует эквивалентность между байтами и символом типа VHDL (см. Стандарт IEEE 1076-2008).

  1. Нормативные ссылки

...
ISO / IEC 8859-1: 1998, Информационные технологии. 8-битные однобайтовые наборы кодированных графических символов. Часть 1. Латинский алфавит № 1.

Также см. 16.3 Стандарт пакета, тип символа, в который включены все 256 значений перечисления для однобайтового символа.

Это означает, что мы можем считать символы в файле:

use std.textio.all;

entity length_in_bytes is
end entity;

architecture foo of length_in_bytes is
    impure function file_length (file_name: string) return integer is
        type char_file is file of character;
        file file_in: char_file open read_mode is file_name;
        variable char_buffer:   character;
        variable length:        integer := 0;
    begin
        while not ENDFILE(file_in) loop
            read(file_in, char_buffer);
            length := length + 1;
        end loop;
        file_close(file_in);
        -- report file_name & " length = " & integer'image(length);
        return length;
    end function;
        signal filelength:  natural;
begin
    filelength <= file_length("md5.dat");

    process
    begin
        wait for 0 ns; -- skip default signal value;
        report "file md5.dat length = " & integer'image(filelength);
        wait;
    end process;
end architecture;

Длина, возвращаемая вызовом функции, будет соответствовать длине, которую предоставляет операционная система хоста.

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

0 голосов
/ 04 июля 2018

Эта строка читает строку из файла:

readline(my_input, input_line);

Эта строка пытается прочитать (целое) целое число из строки:

read(input_line, length);

Не возвращает длину файла (или строки). Вы не предоставляете файл, который пытаетесь прочитать (было бы лучше, если бы вы это сделали - см. this ), но я предполагаю, что он не содержит целое число и, следовательно, ваше сообщение об ошибке .

Если вы хотите получить длину любого текстового файла, вам нужно прочитать каждую строку в файле, найти длину каждой и добавить их. Легко найти длину каждой строки, потому что тип line имеет атрибут 'length, поэтому длина каждой строки будет:

input_line'length

Кстати, эта строка не будет отображать то, что вы только что прочитали, потому что чтение (в случае успеха) является разрушительным :

writeline(output, input_line);  -- optional, write to std out

(«Деструктивное чтение» - это чтение, которое удаляет и считывает данные.)

...