在Vivado中读取文本长度

时间:2018-07-04 11:44:23

标签: vhdl vivado

在仿真过程中,我需要获取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 :(得分:0)

此行从文件中读取一行:

readline(my_input, input_line);

此行尝试(破坏性地)从该行读取一个整数:

read(input_line, length);

它不返回文件(或行)的长度。您没有提供您要读取的文件(这样做会更好-请参见this),但是我的猜测是它不包含整数,因此不包含错误消息。 / p>

如果要获取任何文本文件的长度,则需要读取文件中的每一行,找到每行的长度并添加它们。很容易找到每行的长度,因为类型line确实具有'length属性,所以每行的长度为:

input_line'length

顺便说一句,此行不会显示您刚刚阅读的内容,因为读取(如果成功)是破坏性的:

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

(“破坏性读取”是一种既删除数据又读取数据的读取。)

答案 1 :(得分:0)

VHDL目前无法与主机操作系统接口以确定文件长度。

字节和VHDL类型字符之间是等效的(请参阅IEEE Std 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使文件处于未锁定状态以备将来使用,并且从打开文件开始依次读取打开的文件。