首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VHDL:如何声明宽度可变的泛型

VHDL:如何声明宽度可变的泛型
EN

Stack Overflow用户
提问于 2015-02-14 09:36:38
回答 2查看 11.3K关注 0票数 5

我想创建一个VHDL实体,其中一个泛型可以改变另一个泛型的宽度。

代码语言:javascript
复制
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‘。

一种解决方法是将多项式作为端口。但它应该是通用的,因为它的值在精化时是恒定的。我知道如果我将一个常量应用到端口,它会按照我想要的方式合成,并将常量值优化到模块中,但我想找到一些方法来使它成为泛型。有什么建议要怎么做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-14 15:14:51

如果希望POLYNOMIAL参数保持泛型,可以将其指定为无约束数组。您还可以根据需要将所有引用替换为POLYNOMIAL'rangePOLYNOMIAL'length-1 downto 0POLYNOMIAL'length,从而省去WIDTH参数。

代码语言:javascript
复制
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泛型更改为具有不同长度的另一个值,并且您的逻辑的其余部分应该不需要任何额外的努力就可以适应。

票数 8
EN

Stack Overflow用户

发布于 2015-02-14 10:26:30

在任何泛型和端口声明之后都有一个实体声明部分:

代码语言:javascript
复制
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的文字不适应宽度的变化。我会认为这些‘1’代表分流位置,你会期望这些可能会改变从一个LFSR长度到另一个。

你可以用多项式常量来表示“宽度”:

代码语言:javascript
复制
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;

或者:

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28511496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档