VHDL:如何声明变量宽度泛型

Bar*_*oss 4 vhdl

我想创建一个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"
);
Run Code Online (Sandbox Code Playgroud)

不幸的是,似乎我不能在通用列表中稍后引用先前定义的通用.Active-HDL出现以下错误:

错误:COMP96_0300:modules/m3_test_load/lfsr_n.vhd :( 26,45):在接口列表完成之前,不能引用"WIDTH".

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

一个解决方法是使POLYNOMIAL成为一个端口.但它恰当地应该是通用的,因为值在精化时是恒定的.我知道如果我将一个常量应用到端口,它将合成我想要的方式并将常量值优化到模块中,但我想找到一些使其成为通用的.有什么建议怎么做?

Kev*_*eau 6

如果希望POLYNOMIAL参数保持通用,则可以将其指定为无约束数组.您还可以分配WIDTH参数通过更换所有的引用POLYNOMIAL'range,POLYNOMIAL'length-1 downto 0POLYNOMIAL'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;
Run Code Online (Sandbox Code Playgroud)

无约束数组是一个强大的功能,它通过隐式控制宽度来帮助简化代码,而不需要专用的通用参数.如果有效使用,它们会减少源中硬编码数组大小的数量,从而产生自然可调整大小的逻辑.您可以POLYNOMIAL使用不同的长度自由地将泛型更改为另一个值,其余的逻辑应该无需任何额外的努力即可适应.