VHDL:如何声明可变宽度泛型
VHDL: How to declare a variable width generic
我想创建一个 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 设为端口。但它应该是一个通用的,因为在详细说明时该值是恒定的。我知道如果我将一个常量应用于端口,它将以我想要的方式进行综合并将常量值优化到模块中,但我想找到某种方式使其成为通用的。有什么建议如何做到这一点?
在任何通用和任何端口声明之后都有一个实体声明部分:
library ieee;
use ieee.std_logic_1164.all;
entity lfsr_n is
generic (
WIDTH: integer := 32 -- counter width
);
port (
foo: integer
);
constant POLYNOMIAL: std_logic_vector (WIDTH-1 downto 0)
:= B"1000_0000_0000_0000_0000_0000_0110_0010";
end entity;
architecture foo of lfsr_n is
begin
end architecture;
这分析和阐述表明泛型被正确使用。
您可能还注意到,您分配给 std_logic_vector 的文字不适应不断变化的 WIDTH。我原以为这些“1”代表分接位置,您会期望这些可能会从一种 LFSR 长度变为另一种。
你可以在多项式常数中表达'WIDTH':
library ieee;
use ieee.std_logic_1164.all;
entity lfsr_n is
generic (
-- WIDTH: integer := 32; -- counter width
POLYNOMIAL: std_logic_vector :=
B"1000_0000_0000_0000_0000_0000_0110_0010"
);
port (
foo: integer
);
-- constant POLYNOMIAL: std_logic_vector (WIDTH-1 downto 0)
-- := B"1000_0000_0000_0000_0000_0000_0110_0010";
end entity;
architecture foo of lfsr_n is
signal shft_register: std_logic_vector (0 to POLYNOMIAL'LENGTH-1);
begin
end architecture;
或者:
architecture foo of lfsr_n is
-- signal shft_register: std_logic_vector (0 to POLYNOMIAL'LENGTH-1);
-- or
signal shift_register: std_logic_vector(POLYNOMIAL'RANGE);
如果您希望 POLYNOMIAL
参数保持通用,您可以将其指定为不受约束的数组。您还可以根据需要将所有引用替换为 POLYNOMIAL'range
、POLYNOMIAL'length-1 downto 0
或 POLYNOMIAL'length
,从而省去 WIDTH
参数。
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 实体,其中一个泛型改变另一个泛型的宽度。
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 设为端口。但它应该是一个通用的,因为在详细说明时该值是恒定的。我知道如果我将一个常量应用于端口,它将以我想要的方式进行综合并将常量值优化到模块中,但我想找到某种方式使其成为通用的。有什么建议如何做到这一点?
在任何通用和任何端口声明之后都有一个实体声明部分:
library ieee;
use ieee.std_logic_1164.all;
entity lfsr_n is
generic (
WIDTH: integer := 32 -- counter width
);
port (
foo: integer
);
constant POLYNOMIAL: std_logic_vector (WIDTH-1 downto 0)
:= B"1000_0000_0000_0000_0000_0000_0110_0010";
end entity;
architecture foo of lfsr_n is
begin
end architecture;
这分析和阐述表明泛型被正确使用。
您可能还注意到,您分配给 std_logic_vector 的文字不适应不断变化的 WIDTH。我原以为这些“1”代表分接位置,您会期望这些可能会从一种 LFSR 长度变为另一种。
你可以在多项式常数中表达'WIDTH':
library ieee;
use ieee.std_logic_1164.all;
entity lfsr_n is
generic (
-- WIDTH: integer := 32; -- counter width
POLYNOMIAL: std_logic_vector :=
B"1000_0000_0000_0000_0000_0000_0110_0010"
);
port (
foo: integer
);
-- constant POLYNOMIAL: std_logic_vector (WIDTH-1 downto 0)
-- := B"1000_0000_0000_0000_0000_0000_0110_0010";
end entity;
architecture foo of lfsr_n is
signal shft_register: std_logic_vector (0 to POLYNOMIAL'LENGTH-1);
begin
end architecture;
或者:
architecture foo of lfsr_n is
-- signal shft_register: std_logic_vector (0 to POLYNOMIAL'LENGTH-1);
-- or
signal shift_register: std_logic_vector(POLYNOMIAL'RANGE);
如果您希望 POLYNOMIAL
参数保持通用,您可以将其指定为不受约束的数组。您还可以根据需要将所有引用替换为 POLYNOMIAL'range
、POLYNOMIAL'length-1 downto 0
或 POLYNOMIAL'length
,从而省去 WIDTH
参数。
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
泛型更改为具有不同长度的另一个值,您的逻辑的其余部分应该无需任何额外努力即可适应。