6

我正在尝试为基于 SPI 的 IO 扩展器创建通用驱动程序。这个想法是在实例化中传递与请求的 IO 设置相匹配的初始化值。

我目前的尝试如下所示:

entity max7301_simple is
   generic ( 
        IO_cfg : array (1 to 7) OF integer range 0 to 255 := (16#55#, 16#55#, 16#55#, 16#55#, 16#55#, 16#55#, 16#55#)
           );
     port  (
        -- Application interface :
        clk_i       :   in std_logic;        -- input clock, xx MHz.
        rst_i       :   in std_logic;        -- sync reset.
        en_i        :   in std_logic;        -- enable, forces re-init of pins on MAX7301.
        output_i    :   in std_logic_vector(27 downto 0);   --data to write to output pins on MAX7301
        irq_o       :   out std_logic;       -- IRQ, TODO: what triggers, change on inputs ?
        input_o     :   out std_logic_vector(27 downto 0);  --data read from input pins on MAX7301
        -- MAX7301 SPI interface
        sclk        :   out std_logic;        -- SPI clock
        din         :   in std_logic;        -- SPI data input
        dout        :   out std_logic;       -- SPI read data
        cs          :   out std_logic        -- SPI chip select
    );
end max7301_simple;

问题出在 IO_cfg 数组上,我尝试了各种尝试 w/wo 初始化值等。似乎无法弄清楚如何指定数组。

我相信已经读到您可以将数组作为泛型传递,但仍然没有太多运气。Xilinx ISE 只是告诉我“'array' 附近的语法错误”,这不足以让我前进。

任何帮助,将不胜感激

实例化此模块时,我总是需要 7 个值。

4

3 回答 3

7

您可以将数组用作泛型参数,但是您不能在其中将其声明为动态的匿名类型。

您必须首先在一个单独的包中声明您的整数数组类型(可以在同一个文件中或在单独的文件中),然后use在您的实体中以及在实例化它时声明该包。

这是一个如何做到这一点的例子:

-- package declaration
package mytypes_pkg is

     type my_array_t is array (1 to 7) of integer range 0 to 255;

end package mytypes_pkg;

-- entity "uses" the package   
use work.mytypes_pkg.all;

entity max7301_simple is
   generic ( 
        IO_cfg : my_array_t := (16#55#, 16#55#, 16#55#, 16#55#, 16#55#, 16#55#, 16#55#)
           );
   -- ports [...]
end max7301_simple;

还要注意use体系结构中实例化您的实体的包。


(选读)

为什么像你这样写它真的是一个语法错误?

查看VHDL (2002) 标准中的 VHDL 语法,每个通用参数的声明都是 ainterface_constant_declaration并且您具有以下语法规则:

[§ 4.3.2]
interface_constant_declaration ::=  
            [ constant ] identifier_list : [ in ] subtype_indication [ := static_expression ]

[§ 4.2]
subtype_indication ::= 
            [ resolution_function_name ] type_mark [ constraint ]

类型引用只能是现有类型的名称 ( type_mark) 或现有类型的限制。

于 2012-08-03T08:43:32.953 回答
5

我通过使用2008 VHDL标准和预定义属性提出了一种更通用的方法- 这允许传递任意长度的数组。在你的包中定义你的类型,如下所示:

package data_types is
    type array_of_integers is array(natural range <>) of integer;
end package;

现在在您的代码中传递通用数组,如下所示:

generic(
    COEFFICIENTS : array_of_integers := (-1, 0, 1)
);

现在软件将使用默认索引方案。可以通过预定的“左属性”来考虑它 (参考可以在:http ://www.csee.umbc.edu/portal/help/VHDL/attribute.html 找到):

-- First coefficient
    ... <= COEFFICIENTS(COEFFICIENTS'left);
-- Second coefficient
    ... <= COEFFICIENTS(COEFFICIENTS'left + 1);

通常,您应该在某种循环生成语句中使用此数组:

GENERATE_STATEMENT: for entry in 0 to COEFFICIENTS'length-1 generate
    out(entry) <= std_logic_vector(to_signed(COEFFICIENTS(COEFFICIENTS'left + entry), out(entry)'length));
end generate;

作为对Quartus II用户的一点补充说明 - 也可以在.bdf原理图文件中使用通用数组。将参数类型设置为Auto并以此格式重写参数值 - A(D"-1", D"0", D"1"),其中D代表十进制数据类型(有用链接:http://quartushelp.altera .com/14.0/mergedProjects/assign/asd/asd_tab_param.htm

于 2016-08-29T11:06:56.227 回答
2

如果您不介意约束较少的泛型,您可以执行以下操作:

generic (IO_cfg : integer_vector);

只要你有 VHDL-2008 编译器。

于 2012-08-06T15:42:31.497 回答