Vhdl 在Vivado中阅读文本长度

Vhdl 在Vivado中阅读文本长度,vhdl,vivado,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); wri

我需要在模拟过程中获得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

我可以读取文本的索引,但长度是非意义值。有人告诉我如何获得任何文本文件的长度。

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

readline(my_input, input_line);
此行尝试从行中读取一个整数(破坏性):

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

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

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


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

VHDL目前无法连接到主机操作系统来确定文件长度

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

  • 规范性引用文件

  • 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;
    
    使用std.textio.all;
    实体长度(以字节为单位)为
    终端实体;
    长度为_(以_字节为单位)的体系结构foo为
    不纯函数文件长度(文件名称:字符串)返回整数为
    类型char_file是字符文件;
    文件名:字符文件打开读取模式为文件名;
    变量字符缓冲区:字符;
    变量长度:整数:=0;
    开始
    而不是ENDFILE(file_in)循环
    读取(文件输入,字符缓冲区);
    长度:=长度+1;
    端环;
    文件关闭(文件进入);
    --报告文件\u name&“length=“&integer”图像(长度);
    返回长度;
    末端功能;
    信号文件长度:自然;
    开始
    
    我不理解文件长度的含义。你能分享一些关于“长度”的链接吗attribute@Sukru我在回答中增加了“破坏性阅读”的定义。通过谷歌搜索“VHDL长度属性”可以找到大量关于VHDL属性的链接。非常感谢。请原谅我那些愚蠢的问题,我只是一个新手,在搜索复制品时会注意到所有这些。您不能简单地将输入线的长度相加。IEEE标准1076-2008 16.4包文本“线路表示不包含线路末端表示。”“该语言不定义线条末端的表示形式。实现应允许将所有可能的字符和字符串类型的值写入文件。但是,由于允许实现使用字符和字符串类型的某些值作为行分隔符,因此可能无法从文本文件中读取这些值?(至少包括MD5.dat的一行显示问题。尝试在上构造显示您正在读取的输入_行不包含可识别为表示整数的文本字符串。.dat听起来甚至可能是二进制文件(即,您必须在十六进制编辑器中打开它)?你能展示一下MD5.dat的样本内容吗?我感觉我们这里有一个X-Y问题。你为什么需要文件的大小?我写Verilog已经很多年了,从来都不需要它。这是一个重复的问题。请参阅也被怀疑是X-Y问题,这是公认的答案。这回答了你的问题吗?
    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;