如何在VHDL中读取文件时消除空格

时间:2017-03-03 13:57:57

标签: io vhdl

我在输入文件中有以下数据要读取:

10101100 11010100 10101100 11010100

11111110 10111001 11111110 10111001

我需要读取每个半字节并将它们写入数组。但由于空格,线的长度不同,这会影响while len > 0循环。如何在readline之后和read之前消除行中的空格,以便在len变量中获得适当的长度?

我使用以下代码:

while not endfile(f) loop
    readline(f, L);
    len := L'length;
    while len > 0 loop
        read(L, b);
        mem(i) <= b;
        i := i + 1;
        len := len - b'length;
    end loop;
end loop;

声明:

constant filename:  string := "C:\Users\ChowdaryS\Downloads\topo.bin";
file f:       text open read_mode is filename;
variable L:   line;
variable i:   integer:= 0;
variable b:   std_logic_vector(3 downto 0);  
variable len: integer;

1 个答案:

答案 0 :(得分:0)

我花了一些时间测试尾随空间的边界条件,这需要更改嵌套循环:

        while not endfile(f) loop
            readline(f, L);
            -- len := L'length;
            -- while len >= b'length loop
            while L.all'length >= b'length loop
                read(L, b);
                -- len := L'length;
                mem(i) <= to_stdlogicvector(b);
                i := i + 1;
                -- len := len - b'length;
            end loop;
        end loop;

可以消除len变量。读数L将包含剩余部分,可以直接检查。

更改是通过将输入文件内容从您的问题复制并粘贴到文件来支持不显示的尾随空白字符。

我想你会看到线上的尾随空格,以及输入文件的写入方式。

上述更改是针对1,2或3个尾随空格的防弹。

对于四个或更多个尾随空格或一个或多个空格,非阻塞空格或跟踪最后一个有效b值的水平制表符的情况,修复需要扫描任何这些空白字符,您可以计算只是琐碎的拒绝。

如果您假设任何非空白字符代表b值的某些部分,您可以简单地将错误的b值归咎于文件的写入方式。

这允许您只测试剩余的只有空格的字符。

增加了一项功能:

package body io is
    function iswhitespace (inpstr:  in  string) return boolean is
        constant NBSP: character  := character'val(128); 
    begin
        for i in inpstr'range loop
            if inpstr(i) /= ' ' and inpstr(i) /= NBSP and inpstr(i) /= HT then
                exit;
            elsif i = inpstr'RIGHT then
                return TRUE;
            end if;
        end loop;
        return FALSE;
    end function;

(请记住包装中的声明)

textio嵌套循环条件如下:

        -- while L.all'length >= b'length loop
        while L.all'length >= b'length and not iswhitespace(L.all) loop

使文件读取免于线上任何长度的尾随空格。