如何从VHDL中的行读取元素?

时间:2017-01-24 22:11:08

标签: file-io vhdl

我尝试使用VHDL从可能具有不同格式的文件中读取。我知道你应该使用以下两行代码一次读取一行,读取该行中的各个元素。

readline(file, aline);
read(aline, element);

但是我的问题是什么会读(aline,element)返回元素?如果线是空的,它会返回什么?如果我使用过它会有什么回报让我说5次,我的行只有4个字符?

我想知道的原因是,如果我正在读取有效数据之间有任意数量空格的文件,我该如何解析这些有效数据?

任何帮助都将不胜感激。

编辑:

由于我所描述的文件格式在问题中并未完全清楚,因此我总结了我在评论中对我在下面收到的一些答案所做的澄清。

该文件包含由任意数量的空格(任意数量的空格,制表符或新行)分隔的ASCII字符。如果该行以#开头,该行是注释,应该被忽略。

在这些注释之外,文件的第一部分包含仅包含可变大小组合的字母或数字的字符。换句话说:

123           ABC   12ABB3 

然而,大多数文件(在一定数量的读取单词之后)将是任意长度的纯数字,由任意数量的空白区分开。换句话说,文件的第二部分是:

255 0       2245   625         430
2222  33        111111

我必须能够分别解析这些数字(并解释它们)。

1 个答案:

答案 0 :(得分:3)

正如评论中所述,readstd.textio中的所有ieee.std_logic_textio程序都会跳过除characterstring版本之外的前导空格(因为空间和任何其他空间一样多。

您可以测试line变量(缓冲区)是否为空:

if L'length > 0 then

其中L是您的line变量。还有一组带有额外状态输出的重载read过程:

procedure read (L    : inout LINE;
                VALUE: out   <type> ;
                GOOD : out   BOOLEAN);

额外输出 - GOOD - 如果读取成功则为true,如果不是false则为std.textio。这些优点如果读取不成功,则模拟不会停止(与常规程序一样)。此外,对于ieee.std_logic_textio中的版本,如果读取不成功,则读取是非破坏性的(即,您尝试读取的任何内容仍保留在缓冲区中)。但是,variable S : string(1 to <some big number>); ... readline(F, L); assert L'length < S'length; -- make sure S is big enough S := (others => ' '); -- make sure that the previous line is overwritten if L'length > 0 then read(L, S(1 to L'length); end if; 中的版本不是这种情况。

如果你真的不知道你想要读什么格式,你可以将整行读成一个字符串,如下所示:

L

S现在位于字符串'value中。然后,您可以编写一些代码来解析它。您可能会发现 type属性 variable I : integer; ... I := integer'value(S(12 to 14)); 很有用。这会将字符串转换为某种类型,例如

I

将整数S设置为字符串if L'length > 0 then -- check that the L isn't empty, otherwise the next line blows up if L.all(1) = '#' then -- the first character of the line is a '#' so the line must be a comment 的元素12到14中包含的值。

下面的user1155120建议的另一种方法是查看缓冲区中的值,例如

HtmlEmailInput