6

一些背景:

我正在为以太网 MAC 编写 VHDL 测试台。测试台由一个包和一个组合的实体+架构文件组成。我想从我从wireshark导出的二进制文件中读取测试台将发送到MAC的以太网帧。
我正在使用 VHDL 2008 编写,并且正在使用 Mentor 图形模型技术 ModelSim ALTERA vcom 10.0d 编译器。

问题:

到目前为止,我发现的所有在 VHDL/modelsim 中读取二进制数据的解决方案都使用特殊的文件格式,其中 bit_vector 的 1 位由文件中的几个位表示。我希望 VHDL 将二进制文件读入 8 位 bit_vectors。
到目前为止,我最接近的是使用字符类型文件,我可以在其中直接以二进制表示形式编写 8 位 ASCII 字符。

4

3 回答 3

4

我找到了解决方案。如果我想直接以 8 位部分解释数据,我需要使用字符类型的文件并使用'POS属性将它们转换为整数。然后我可以将这些整数转换为位向量。我是这样做的:

LIBRARY ieee;
  USE ieee.std_logic_1164.ALL;
  USE ieee.numeric_bit.ALL;

LIBRARY std;
  USE std.textio.all;

...

TYPE t_char_file IF FILE OF character;
TYPE t_byte_arr IS ARRAY (natural RANGE <>) OF bit_vector(7 DOWNTO 0);

SIGNAL read_arr_byte : t_byte_arr(0 to 199);

...

read_file: PROCESS (start) IS
  FILE file_in : t_char_file OPEN read_mode IS "./38478.bin";  -- open the frame file for reading
  VARIABLE char_buffer : character;
BEGIN
  IF start'EVENT AND start = '1' THEN
    FOR i IN read_arr_byte'RANGE LOOP
      read(file_in, char_buffer);
      read_arr_byte(i) <= bit_vector(to_unsigned(character'POS(char_buffer), 8));
    END LOOP;  -- i
    file_close(file_in);
  END IF;
END PROCESS read_file;
于 2013-01-08T12:59:38.080 回答
1

我曾经这样做,但发现编写一个简短的脚本(用一种严肃的文本处理语言)将任何输入转换为一个真实的 VHDL 文件,其中的数据被描述为一个合适数据类型的常量数组,效率更高。

这比在 VHDL 恕我直言中进行文件解析要容易得多。

于 2013-01-08T14:10:15.640 回答
1

根据@youR.Fate 先前的回答,我能够将示例进一步简化为:

process is
  type char_file_t is file of character;
  file char_file : char_file_t;
  variable char_v : character;
  subtype byte_t is natural range 0 to 255;
  variable byte_v : byte_t;
begin
  file_open(char_file, "test.bin");
  while not endfile(char_file) loop
    read(char_file, char_v);
    byte_v := character'pos(char_v);
    report "Char: " & " #" & integer'image(byte_v);
  end loop;
  file_close(char_file);
  wait;
end process;
于 2017-03-03T14:48:15.980 回答