在vhdl中读取二进制文件

时间:2018-02-23 17:19:13

标签: vhdl fpga

我想从ENVI logiciel访问二进制文件内容图像像素:大小(100 * 100)像素编码vhdl中16位的每个像素。

 library IEEE;
    USE ieee.std_logic_1164.ALL;
    Use ieee.numeric_bit.ALL;

    library std;
    use std.textio.all;

    entity image_bin is
    end entity;

    architecture behavioral of image_bin is
    type image is array(0 to 99,0 to 99) of std_logic_vector(15 downto 0);
    signal image(i,j):bit_vector(15 downto 0);

    begin
      process
      type t_file is file of bit_vector;
      file infile: text is in "C:\Users\hp\Desktop\file\T4.bin";
      variable pixel_image:bit_vector(15 downto 0);
         begin
         IF start'EVENT AND start = '1' THEN
         for i in to 99 loop
         for j in to 99 loop
         read(infile,pixel_image);
         image(i,j)<=pixel_image;
         end loop;
         end loop;
         file_close (infile);
         end if;
         end process;

2 个答案:

答案 0 :(得分:0)

问题太过不明确,但这里有几点指示。

二进制文件I / O在VHDL中工作,但只保证与自身兼容,即您可以读取模拟最初编写的文件。除此之外,您可能需要进行实验。

我已经阅读了Modelsim中的第三方文件,几乎没有惊喜,(可能是意外的结束,我记不清了),我希望GHDL也能正常运行。

然而,Xilinx ISIM(在ISE10.1时代)坚持在每个文件上看到一个特定的二进制头文件,即使明确询问,Xilinx也拒绝记录其格式。

我从ISIM写了一个文件,检查了它的内容,并将该文件的标题破解到我需要阅读的图像文件上,并使用Linux head和{{1}将其剥离了任何其他输出文件}命令,所以我可以与世界其他地方交换二进制文件。 ISIM对此非常满意,但这很痛苦。

编辑现在我们有一些代码......

首先,与Python相比,在VHDL中执行此操作没有任何问题;将会有更多的打字(在打字的两种意义上),但无论你使用哪种语言,你都必须明白你在写什么。

你将不得不完成代码(其中一些缺失)并修复琐碎的错误(你有一个类型和一个同名的信号......任何语言的草率练习)和其他琐碎的语法错误。

所以下一步是完成它,编译它,并修复这些错误。如果在双重检查VHDL教科书的错误行之后您不理解错误,请发布错误消息并询问它意味着什么以及如何处理 - 至少,这将是一个实际问题。

您还使用VHDL-1987文件声明并声明文本类型的文件;你必须升级到VHDL-1993文件处理。通过常用方法找到“VHDL-1993二进制文件I / O”的示例应该不难 - 尝试一下。

答案 1 :(得分:0)

在开始为FPGA编写VHDL代码之前,尤其是复杂算法,您应该做两件事:

  • 学习基本的VHDL
  • 了解FPGA的功能

您可以在VHDL中使用文件I / O来初始化FPGA存储器(RAM / ROM)或模拟结构。但不是在实时数据处理应用程序中。正如我在评论中所说:普通FPGA在硬连线块中没有文件I / O功能。如果您需要这样的东西,最好使用微控制器/ CPU或我们的SOC FPGA,它有一个硬连线的ARM内核,并在软件中执行。但是当你在那里时,为什么要使用FPGA呢?

代码中的错误

您的代码中存在多个编程错误,如果您遵循某些教程,可能很容易被阻止。

第一个错误,我在质疑你是否有任何编程经验。您定义了一个类型,然后您可能希望定义该新类型的对象。但是你输入了一些非法代码:

signal image(i,j) : bit_vector(15 downto 0);

解析器如何知道ij是什么?在代码的声明部分之前,您不会定义它们。其次,为什么在你之前使用bit_vector时突然使用std_logic_vector

应该如何:

type [type name] is [type details];
signal [object name] : [type name] := [optional initialization details];

下一个错误:该过程没有敏感列表。 process语句是顺序处理块的开始。没有任何敏感列表,会自动启动。这是一个问题:没有什么阻止这个,因此进程将尝试在无限时间内无限循环。这当然会引起问题。解决方案:使用敏感度列表。

[label:] process ([trigger signal names])
begin
end process;

在内部,该过程实际上有一个触发条件:start'event and start='1' ...这个start来自何处?可能错过了实体上的输入端口?但是这个start应该是你的过程的触发器。

那怎么样?

可以做什么,读取文件并初始化数组。 (请注意,合成中不支持多维数组,因为没有多维RAM这样的东西,所以你必须展平你的数组并执行一些索引算法)。对于下一个例子,我创建了一个文件“test.bin”并用字符串“12345678”填充它= 8个字符= 8 * 8位= 256位= 2 * 2 * 16位 - &gt;适合2比2阵列。

然后您应该意识到textio包只能读取文本!所以最简单的方法是将每8位读取一个字符,然后连接两个以形成一个16位的值。

示例代码:

entity read_bin is end entity;

library ieee;

architecture behavioral of read_bin is
    use ieee.std_logic_1164.all;
    subtype data_type is std_logic_vector(15 downto 0);
    type two_dim_array_type is array(0 to 1, 0 to 1) of data_type;

    impure function init_two_dim_array return two_dim_array_type is
        use std.textio.all;
        type character_file is file of character;
        file file_pointer : character_file;
        variable upper : character;
        variable lower : character;
        variable output : two_dim_array_type;
        use ieee.numeric_std.all;
    begin
        file_open(file_pointer, "test.bin", READ_MODE);
        for i in 0 to 1 loop
            for j in 0 to 1 loop
                read(file_pointer, upper); -- first 8 bits
                read(file_pointer, lower); -- second 8 bits
                output(i, j) := 
                    std_logic_vector(to_unsigned(character'pos(upper),8))&
                    std_logic_vector(to_unsigned(character'pos(lower),8));
            end loop;
        end loop;
        file_close(file_pointer);
        return output;
    end function;

    signal two_dim_array : two_dim_array_type := init_two_dim_array;
begin
end architecture;

瞧:

Modelsim output

最大的问题

对我来说最大的问题是:当你犯这些编程错误时,你怎么会在电信和嵌入式系统中获得博士学位?或者缺乏对FPGA功能的了解。我自己是电气工程博士候选人,这是我们教一年级学士学位的东西。当我想要我的博士学位时,我经历了几轮评估,我的知识经过了广泛的测试。这些职位竞争很激烈。

我的建议:请获得一些本地支持以实现这一目标。你不想花费你未来3年的博士学习将VHDL学到足够的水平,然后发现你只有1年的时间做一些实际的研究才能发表结果......