VHDL - 测试台 - 通用参数

3
我一直在努力制作一个解码器,只需更改输入/输出向量的通用值即可在多个实例中使用。该解码器将根据输入的整数转换,将单个位移动若干位置。解码器本身运行良好。问题出现在我编写测试台并编译时。结果如下所示:

错误(10482):VHDL 错误于 DECODER.vhd(41):对象“n”已被使用但未声明

以下是我的模型和测试台。
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;

ENTITY DECODER IS
    --GENERIC (delay : delay_length := 0 ns);
    GENERIC (n      : POSITIVE := 2);
    PORT (a :   IN      std_logic_vector(n-1 DOWNTO 0);
            x   :   OUT std_logic_vector(2**n-1 DOWNTO 0));
END ENTITY DECODER;

ARCHITECTURE dflow OF DECODER IS
     CONSTANT x_out :   BIT_VECTOR (2**n-1 DOWNTO 0) :=
                            ( 0 => '1', OTHERS => '0');
BEGIN
    x <= to_stdlogicvector(x_out sll to_integer(unsigned(a)));
END ARCHITECTURE dflow;

--test bench----------------------------------------
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;

ENTITY TN2 IS
END ENTITY TN2;

ARCHITECTURE IO_TN2 OF TN2 IS
    COMPONENT DECODER IS
        --GENERIC (delay : delay_length := 0 ns);
        GENERIC (n      : POSITIVE := 2);
    PORT (a :   IN      std_logic_vector(n-1 DOWNTO 0);
            x   :   OUT std_logic_vector(2**n-1 DOWNTO 0));
END COMPONENT DECODER;
SIGNAL a        :   std_logic_vector (n-1 DOWNTO 0); --<-- USED BUT NOT    DECLARED
 SIGNAL x   :  std_logic_vector (2**n-1 DOWNTO 0);
 BEGIN
G1  :   DECODER
    GENERIC MAP (n => 2)
    PORT MAP (a,x);

    a <= "00", "01" AFTER 1 NS, "10" AFTER 2 NS, "11" AFTER 3 NS,
          "00" AFTER 4 NS, "0Z" AFTER 5 NS;
 END ARCHITECTURE IO_TN2;

CONFIGURATION CFG_DECODER   OF TN2 IS
    FOR IO_TN2
        FOR G1  :   DECODER 
                    USE ENTITY work.DECODER(dflow)
                    GENERIC MAP (n => 2)
                    PORT MAP (a,x);
        END FOR;
    END FOR;
END CONFIGURATION CFG_DECODER;

编译器告诉我我没有声明n,但我认为我在组件声明中声明了。我应该在哪里声明它? 第二个问题是如何声明多个泛型,例如 1个泛型用于delay_length 1个泛型用于n 我试过在模型实体中放置2个泛型语句,但编译器认为那不是正确的做法。
感谢您的帮助。 D
2个回答

6
您的组件声明表明有一个名为 decoder 的组件,其中(与此组件的其他属性一起)有一个名为 n 的泛型,默认值为 2。在文件分析的这个阶段,您还没有说明要分配给 n 的实际值。
我的方法是在声明组件之前定义一个常量:
constant DECODER_WIDTH : integer := 2;

你可以使用这个来声明你的信号:

然后你可以使用这个来声明你的信号:

SIGNAL a : std_logic_vector (DECODER_WIDTH-1 downto 0);

当您实例化decoder时,您还将n通用绑定到此常量:
G1  :   DECODER
GENERIC MAP (n => DECODER_WIDTH)
PORT MAP (a,x);

如果您确实需要配置更改n的值,则必须在包内声明DECODER_WIDTH常量,然后该文件会use该包,这应该在TN2实体声明之前和配置语句之前完成。如果您不需要配置更改解码器大小,则可以省略配置语句中的generic map

2

感谢您的评论,我已经根据您的建议更新了下面的代码,并且它运行良好。

--test bench for 2/4 decoder----------------------------------------
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;

ENTITY TN2 IS
END ENTITY TN2;

ARCHITECTURE IO_TN2 OF TN2 IS
COMPONENT DECODER IS
    --GENERIC (delay : delay_length := 0 ns);
    GENERIC (n      : POSITIVE := 2);
    PORT (a :   IN      std_logic_vector(n-1 DOWNTO 0);
            x   :   OUT std_logic_vector(2**n-1 DOWNTO 0));
END COMPONENT DECODER;
CONSTANT DECODER_WIDTH : integer := 2; ---<-- ADDED constant changing this    value will alter decoder vector size
SIGNAL a : std_logic_vector (DECODER_WIDTH-1 downto 0); --< changed n to decoder_width
SIGNAL x    :  std_logic_vector (2**DECODER_WIDTH-1 DOWNTO 0); --< changed n to decoder_width
BEGIN
G1  :   DECODER
    GENERIC MAP (n => DECODER_WIDTH) --< pass decoder_width to n
    PORT MAP (a,x); 
    a <= "00", "01" AFTER 1 NS, "10" AFTER 2 NS, "11" AFTER 3 NS,
          "00" AFTER 4 NS, "0Z" AFTER 5 NS;
END ARCHITECTURE IO_TN2;

CONFIGURATION CFG_DECODER   OF TN2 IS
FOR IO_TN2
    FOR G1  :   DECODER 
                    USE ENTITY work.DECODER(dflow)
                    GENERIC MAP (n => decoder_width)
                    PORT MAP (a,x);
    END FOR;
END FOR;
END CONFIGURATION CFG_DECODER;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接