我正在为以太网MAC编写VHDL测试平台。测试平台由一个包和一个组合的实体+体系结构文件组成。我想读取测试平台将从我从wireshark导出的二进制文件发送到MAC的以太网帧。
我正在用VHDL 2008编写,我正在使用Mentor Graphics Model Technology ModelSim ALTERA vcom 10.0d Compiler。
到目前为止,我在VHDL / modelsim中读取二进制数据的所有解决方案都使用特殊的文件格式,其中bit_vector的1位由文件中的几位表示。我希望VHDL将二进制文件读入8位bit_vectors 我到目前为止最接近的是使用字符类型文件,我可以直接以二进制表示形式写入8位ASCII字符。
答案 0 :(得分:3)
我找到了解决方案。如果我想直接在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;
答案 1 :(得分:1)
我曾经这样做过,但是发现编写一个简短的脚本(用严肃的文本处理语言)从任何输入转换为真正的VHDL文件,并将数据描述为合适数据类型的常量数组更有效率
这比在VHDL IMHO中进行文件解析要容易得多。
答案 2 :(得分: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;