是否可以检查输入文本文件的长度?

时间:2015-05-23 08:42:33

标签: vhdl

在我的 VHDL 项目中,我的输入将从包含n位1和0的文本文件中提取。我试图让它尽可能一般。我熟悉如何使用test-bench读取和写入文本文件,但我不知道如何检查它的长度。

我的代码通常需要64位作为输入,将它们传递给所有块并生成输出。如果剩余的比特长度小于64,则它通过特定的块。

假设文本文件包含1000位。 15 x 64 = 960. 960位将通过所有块,其余40将通过特定块。这看起来很直接,但为了让我做这样的操作,我需要知道文本文件的长度。如果有人能提供帮助那将是非常有益的。

1 个答案:

答案 0 :(得分:3)

应考虑VHDL数据结构长度,而不是文件长度,因为它是特定于实现的,而不是指定的VHDL。

如果这些位在一个长字符串中,并且要用剩余部分切割成64位片段,则整个字符串可以读入VHDL line类型,并从该行读取到std_logic_vector类型可以依赖于行中的剩余位(字符)。

下面是一个代码示例:

library ieee;
use std.textio.all;
use ieee.std_logic_textio.all;  -- Synopsys package; required for VHDL-2002 only

architecture syn of tb is
begin
  process is
    variable myl_v : line;
    file txt_file : text;
    variable slv_v : std_logic_vector(63 downto 0);
  begin
    file_open(txt_file, "input.txt", read_mode);
    readline(txt_file, myl_v);
    while myl_v'length > 0 loop
      if myl_v'length >= slv_v'length then  -- Full slv_v
        report "Full...: " & myl_v.all(1 to slv_v'length);
        read(myl_v, slv_v);
      else  -- Reduced slv_v
        report "Reduced: " & myl_v.all(1 to myl_v'length);
        read(myl_v, slv_v(myl_v'length - 1 downto 0));  -- Place reduced at LSBs
      end if;
    end loop;
    file_close(txt_file);
    wait;
  end process;
end architecture;

顺便说一下,为了回答"输入文本文件的长度"的问题,可以通过从文件中读取尽可能多的字符来确定字符长度,例如使用以下代码: / p>

impure function file_length_in_characters(filename : string) return natural is
  type char_file_t is file of character;
  file char_file : char_file_t;
  variable char_v : character;
  variable res_v : natural;
begin
  res_v := 0;
  file_open(char_file, filename, read_mode);
  while not endfile(char_file) loop
    read(char_file, char_v);
    res_v := res_v + 1;
  end loop;
  file_close(char_file);
  return res_v;
end function;