VHDL:如何声明可变宽度泛型
我想创建一个VHDL实体,其中一个泛型更改另一个泛型的宽度VHDL:如何声明可变宽度泛型,vhdl,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" ); 不幸的是,我似乎无法在泛型列表的后面引用先前定义的泛型。活动H
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"
);
不幸的是,我似乎无法在泛型列表的后面引用先前定义的泛型。活动HDL会出现以下错误:
错误:COMP96_0300:modules/m3_test_load/lfsr_n.vhd:(26,45):在接口列表完成之前无法引用“宽度”
错误:COMP96\u 0077:modules/m3\u test\u load/lfsr\u n.vhd:(26,66):未定义表达式类型。应为“标准逻辑向量”类型
一种解决方法是将多项式作为端口。但它应该是通用的,因为值在精化时是恒定的。我知道,如果我将常量应用于端口,它将以我想要的方式合成并优化常量值到模块中,但我希望找到某种方法使其成为通用的。有什么建议吗?在任何通用和端口声明之后都有一个实体声明部分:
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_向量的文本不适应宽度的变化。我原以为这些“1”代表分接位置,你可能会认为它们会从一个LFSR长度变为另一个长度
可以用多项式常数表示“宽度”:
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;
或:
如果希望
多项式
参数保持泛型,可以将其指定为无约束数组。您还可以根据需要将所有引用替换为多项式的范围
,多项式的长度-1到0
,或多项式的长度
,从而省去宽度
参数
实体lfsr\n是
一般的(
多项式:标准逻辑向量:=X“FFAA55BB”
);
港口(
--具有复制范围的向量(默认为从0升序)
状态:输出标准逻辑向量(多项式范围);
--带强制下降范围的向量
状态2:输出标准逻辑向量(多项式长度-1到0)
);
终端实体;
无约束数组是一个强大的功能,它通过隐式控制宽度而不需要专用的泛型参数来帮助简化代码。有效使用时,它们会减少源中硬编码数组大小的数量,从而实现逻辑的自然调整。您可以自由地将多项式
泛型更改为另一个具有不同长度的值,并且您的其余逻辑应该能够适应,而无需任何额外的努力
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);