This question already has answers here:
How to use generic parameters that depend on other generic parameters for entities?
(2个答案)
4年前关闭。
我想创建一个具有一个通用属性的VHDL实体,该实体可以更改另一个通用属性的宽度。
不幸的是,似乎我无法在稍后的泛型列表中引用更早定义的泛型。 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设置为端口。但这应该是通用的,因为在精心设计时该值是恒定的。我知道,如果我将常量应用于端口,它将综合我想要的方式并将常量值优化到模块中,但是我想找到某种方法使其成为通用类型。有什么建议怎么做?
无约束数组是一项强大的功能,可通过隐式控制宽度而不需要专用的通用参数来帮助简化代码。有效使用它们可以减少源中硬编码数组大小的数量,从而可以自然地调整大小。您可以自由地将
(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
参数保持通用,则可以将其指定为不受约束的数组。您还可以根据需要通过将所有引用替换为WIDTH
,POLYNOMIAL'range
或POLYNOMIAL'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