This question already has answers here:
How to use generic parameters that depend on other generic parameters for entities?

(2个答案)


4年前关闭。




我想创建一个具有一个通用属性的VHDL实体,该实体可以更改另一个通用属性的宽度。
entity lfsr_n is
generic (
    WIDTH           : integer := 32; -- counter width
    POLYNOMIAL      : std_logic_vector (WIDTH-1 downto 0) := "1000_0000_0000_0000_0000_0000_0110_0010"
);

不幸的是,似乎我无法在稍后的泛型列表中引用更早定义的泛型。 Active-HDL出现以下错误:

错误:COMP96_0300:modules/m3_test_load/lfsr_n.vhd:(26,45):在接口(interface)列表完成之前,无法引用“WIDTH”。

错误:COMP96_0077:modules/m3_test_load/lfsr_n.vhd:(26,66):未定义的表达式类型。预期类型为“STD_LOGIC_VECTOR”。

一种解决方法是将POLYNOMIAL设置为端口。但这应该是通用的,因为在精心设计时该值是恒定的。我知道,如果我将常量应用于端口,它将综合我想要的方式并将常量值优化到模块中,但是我想找到某种方法使其成为通用类型。有什么建议怎么做?

最佳答案

如果希望POLYNOMIAL参数保持通用,则可以将其指定为不受约束的数组。您还可以根据需要通过将所有引用替换为WIDTHPOLYNOMIAL'rangePOLYNOMIAL'length-1 downto 0来免除POLYNOMIAL'length参数。

entity lfsr_n is
  generic (
    POLYNOMIAL : std_logic_vector := X"FFAA55BB"
  );
  port (
    -- Vector with copied range (defaults to ascending from 0)
    state  : out std_logic_vector(POLYNOMIAL'range);

    -- Vector with forced descending range
    state2 : out std_logic_vector(POLYNOMIAL'length-1 downto 0)
  );
end entity;

无约束数组是一项强大的功能,可通过隐式控制宽度而不需要专用的通用参数来帮助简化代码。有效使用它们可以减少源中硬编码数组大小的数量,从而可以自然地调整大小。您可以自由地将POLYNOMIAL泛型更改为具有不同长度的另一个值,并且其余逻辑应进行调整,而无需进行任何其他工作。

关于VHDL:如何声明可变宽度的泛型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28511496/

10-10 05:20