Vhdl 在Vivado中阅读文本长度
我需要在模拟过程中获得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
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);
它不返回文件(或行)的长度。您没有提供您试图读取的文件(如果这样做会更好-请参阅),但我猜它不包含整数,因此您会收到错误消息
如果要获取任何文本文件的长度,需要读取文件中的每一行,找到每一行的长度并添加它们。很容易找到每行的长度,因为typeline
具有'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;