代码之家  ›  专栏  ›  技术社区  ›  elmakhloufi assaad

用vhdl读取二进制文件

  •  0
  • elmakhloufi assaad  · 技术社区  · 8 年前

    我想从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 回复  |  直到 8 年前
        1
  •  0
  •   JHBonarius    8 年前

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

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

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


    代码中的错误

    您的代码中有几个编程错误,如果您遵循一些教程,就可以很容易地避免这些错误。

    关于第一个错误,我想问你是否有编程经验。您定义了一个类型,接下来可能需要定义一个新类型的对象。但您键入了一些非法代码:

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

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

    应如何进行的示例:

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

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

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

    在内部,流程实际上有一个触发条件: start'event and start='1' ... 这个在哪里 start 来自哪里?实体上可能缺少输入端口?但是这个 开始 应该是流程的触发器。


    那怎么办?

    你怎么了 可以 是读取文件并初始化数组。(请注意,合成中不支持多维数组,因为没有多维RAM,所以您必须展平数组并执行一些索引算法)。对于下一个示例,我创建了一个文件“test.bin”,并用字符串“12345678”=8个字符=8*8位=256位=2*2*16位->适用于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年的时间来做一些实际的研究,以便能够发布结果。。。

        2
  •  0
  •   user_1818839    8 年前

    这个问题太不具体了,但这里有几个要点。

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

    我读过Modelsim中的第三方文件,几乎没有什么惊喜(可能是意外的端点,我记不起来了),我希望GHDL也能很好地工作。

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

    我从ISIM写了一个文件,检查了它的内容,并将该文件的头黑客攻击到我需要读取的图像文件上,然后使用Linux将其从任何进一步的输出文件中剥离出来 head tail 命令,以便我可以与世界其他地方交换二进制文件。ISIM对此非常满意,但这是一种痛苦。


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

    首先,与Python相反,在VHDL中这样做没有什么错;会有更多的打字(在两种意义上的打字),但无论你使用哪种语言,你都必须理解你在写什么。

    您必须完成代码(其中一些代码缺失),并修复一些小错误(您有一个类型和一个同名的信号……在任何语言中都是草率的做法)和其他小语法错误。

    因此,下一步是完成它,编译它,并修复这些错误。如果您在根据VHDL教科书仔细检查错误行后,不理解错误,请发布错误消息,并询问它的含义以及如何处理-至少,这是一个实际问题。

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