我想创建一个 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):在接口列表完成之前无法引用“WIDTH”。
错误:COMP96_0077:modules/m3_test_load/lfsr_n.vhd:(26, 66):未定义的表达式类型。预期类型为“STD_LOGIC_VECTOR”。
一种解决方法是将 POLYNOMIAL 设置为端口。但它应该是一个通用的,因为该值在阐述时是恒定的。我知道,如果我将常量应用于端口,它将按照我想要的方式合成并将常量值优化到模块中,但我想找到某种方法使其成为通用的。有什么建议如何做到这一点?
如果你想要POLYNOMIAL
要保持通用参数,您可以将其指定为无约束数组。您也可以省去WIDTH
参数,将所有引用替换为POLYNOMIAL'range
, POLYNOMIAL'length-1 downto 0
, or 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
通用到具有不同长度的另一个值,并且您的逻辑的其余部分应该无需任何额外的努力即可适应。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)