Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VHDL:如何声明可变宽度泛型_Vhdl - Fatal编程技术网

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

我想创建一个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"
);
不幸的是,我似乎无法在泛型列表的后面引用先前定义的泛型。活动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);