【问题标题】:Reading text length in Vivado在 Vivado 中读取文本长度
【发布时间】:2018-07-04 11:44:23
【问题描述】:

我需要在仿真期间获取 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

我可以阅读文本的索引,但长度是无意义的值。有人指导我如何获取任何文本文件的长度。

【问题讨论】:

标签: vhdl vivado


【解决方案1】:

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

字节和 VHDL 类型字符之间存在等效性(参见 IEEE Std 1076-2008)。

  1. 规范性参考文献

...
ISO/IEC 8859-1:1998,信息技术——8 位单字节编码图形字符集——第 1 部分:拉丁字母 No. 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 使文件保持解锁状态以供进一步使用,打开文件的读取是从文件打开顺序开始的。

【讨论】:

    【解决方案2】:

    这一行从文件中读取一行:

    readline(my_input, input_line);
    

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

    read(input_line, length);
    

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

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

    input_line'length
    

    (虽然请注意'length 属性不包含行尾字符。)顺便说一句,此行不会显示您刚刚阅读的内容,因为读取(如果成功)是 破坏性:

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

    (“破坏性读取”是在读取数据的同时删除数据的读取。)

    【讨论】:

    • 我不明白破坏性的意思。你能分享一些关于'length属性的链接吗
    • @Sukru 我在我的答案中添加了“破坏性读取”的定义。通过谷歌搜索“VHDL 长度属性”可以找到大量关于 VHDL 属性的链接。
    • 非常感谢。请原谅我的愚蠢问题,我只是所有这些的新手
    • 在搜索重复项时注意到。您不能简单地添加 input_line.all 的长度。 IEEE Std 1076-2008 16.4 包 TEXTIO “行的表示不包含行尾的表示。” “语言没有定义行尾的表示。实现应允许将 CHARACTER 和 STRING 类型的所有可能值写入文件。但是,作为实现,允许使用 CHARACTER 和 STRING 类型的某些值作为行分隔符,可能无法从 TEXT 文件中读取这些值。"
    猜你喜欢
    • 2015-04-20
    • 1970-01-01
    • 2018-06-04
    • 2018-01-25
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 2022-06-10
    相关资源
    最近更新 更多