Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/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
Generics 在文件之间共享(包括?)VHDL中的泛型?_Generics_Include_Share_Vhdl - Fatal编程技术网

Generics 在文件之间共享(包括?)VHDL中的泛型?

Generics 在文件之间共享(包括?)VHDL中的泛型?,generics,include,share,vhdl,Generics,Include,Share,Vhdl,假设我有一个带有泛型的简单内核,如generatest.vhd: -------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; -- use IEEE.STD_LOGIC_ARITH.ALL; -- use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.NUMERIC_STD.A

假设我有一个带有泛型的简单内核,如
generatest.vhd

--------------------------------------------------------------------------
library IEEE;
  use IEEE.STD_LOGIC_1164.ALL;
  -- use IEEE.STD_LOGIC_ARITH.ALL;
  -- use IEEE.STD_LOGIC_UNSIGNED.ALL;
  use IEEE.NUMERIC_STD.ALL;


ENTITY genertest IS
  GENERIC(
    numbits : natural := 8
  );
  PORT
  (
    clk   :  IN STD_LOGIC;
    d_OUT : OUT STD_LOGIC_VECTOR(numbits-1 downto 0);
    d_IN  :  IN STD_LOGIC_VECTOR(numbits-1 downto 0)
  );
END genertest;


ARCHITECTURE structure OF genertest IS
BEGIN

  main_proc: PROCESS(clk)
  BEGIN
    IF rising_edge(clk) THEN -- posedge
      d_OUT <= not(d_IN);
    END IF;
  END PROCESS main_proc;

END structure;
----------------------------------------------------------------------------------

library IEEE;
  use IEEE.STD_LOGIC_1164.ALL;
  -- use IEEE.STD_LOGIC_ARITH.ALL;
  -- use IEEE.STD_LOGIC_UNSIGNED.ALL;
  use IEEE.NUMERIC_STD.ALL;

ENTITY genertest_twb IS
END genertest_twb;

ARCHITECTURE testbench_arch OF genertest_twb IS

  COMPONENT genertest
    PORT(
      clk   :  IN STD_LOGIC;
      d_OUT : OUT STD_LOGIC_VECTOR(numbits-1 downto 0);
      d_IN  :  IN STD_LOGIC_VECTOR(numbits-1 downto 0)
    );
  END COMPONENT;

  SIGNAL wtCLK : std_logic := '0';
  SIGNAL wCntReg : STD_LOGIC_VECTOR(numbits-1 DOWNTO 0) := (others => 'Z');
  SIGNAL tmp_cnt : natural := 0 ;

  -- clock parameters
  constant PERIODN : natural := 20; -- can be real := 20.0;
  constant PERIOD : time := PERIODN * 1 ns;
  constant DUTY_CYCLE : real := 0.5;
  constant OFFSET : time := 100 ns;

BEGIN

  UUT : genertest -- VHDL
  PORT MAP(
    clk => wtCLK,
    d_IN => wCntReg,
    d_OUT => OPEN
  );

  -- clock process for generating CLK
  -- (here, left as unnamed)
  PROCESS
  BEGIN

    WAIT for OFFSET;

    CLOCK_LOOP : LOOP
      wtCLK <= '0';
      -- tmp_na - natural problems with bit width?
      -- wCntReg <= std_logic_vector(to_unsigned(natural'pos(tmp_na), wCntReg'length));
      WAIT FOR (PERIOD - (PERIOD * DUTY_CYCLE));
      wtCLK <= '1';
      WAIT FOR (PERIOD * DUTY_CYCLE);
    END LOOP CLOCK_LOOP;
  END PROCESS;


  count_proc: PROCESS(wtCLK)
  BEGIN
    IF rising_edge(wtCLK) THEN -- posedge
      tmp_cnt <= tmp_cnt + 1;
      wCntReg <= std_logic_vector(to_unsigned(natural'pos(tmp_cnt), wCntReg'length));
    END IF;
  END PROCESS count_proc;


END testbench_arch;
现在,我假设通过引用
generatest
组件,工作台将自动了解
numbits
generic,但不幸的是,事实并非如此;ISE网页包中上述工作台的行为模拟失败,原因是:

ERROR:HDLCompiler:69 - "/genertest_tbw.vhd" Line 17: <numbits> is not declared.
ERROR:HDLCompiler:69 - "/genertest_tbw.vhd" Line 18: <numbits> is not declared.
ERROR:HDLCompiler:69 - "/genertest_tbw.vhd" Line 23: <numbits> is not declared.
。。。将修复组件本地的泛型引用-不幸的是,
信号wCntReg
声明中对泛型的引用仍将失败

最后,在
generatest\u tbw.vhd
中添加通用部分,如下所示:

  COMPONENT genertest
    GENERIC(
      numbits : natural := 8
    );
    PORT(
      ...
ENTITY genertest_twb IS
  GENERIC(
    numbits : natural := 8
  );
END genertest_twb;
。。。使泛型可用于整个工作台文件

然而,这仍然意味着我必须手动复制/粘贴工作台文件中的
numbits:natural:=8
语句;这意味着它将有两个位置,如果我想更改通用值,我必须同时更改这两个位置:(

所以我的问题是-有没有一种方法可以共享/包含泛型,这样它们就只在一个文件中编写/定义-而其他文件可以引用这些特定的值

提前感谢您的回答,

干杯!

您错过了泛型的要点。您没有通过层次结构向上传递泛型值,而是向下传递它们

在测试台中定义numbits(可能是更有意义的东西,比如RAM_WIDTH),并使用它来实例化具有适当位数的genertest。在genertest实体中为numbits定义的默认值用于未显式定义泛型值的代码(为了可读性,或者为了保持一个函数的向后兼容性,该函数过去总是占用8位,但现在可以配置为任意宽度)

因此,在您的测试台中,您需要以下内容:

constant RAM_WIDTH : integer := 8;
...
UUT : genertest 
  GENERIC MAP (
    numbits => RAM_WIDTH
  );
  PORT MAP
  (
    clk   => wtCLK,
...
如果您想要“共享常量”,您需要一个
,其中包含一些常量


然后使用这些常量映射到实例化项的泛型上。

Hi@Charles Steinkuehler,谢谢你的回答-现在我意识到我没有抓住泛型的要点:)!我必须仔细思考一下“你不是通过层次结构向上传递泛型值,而是向下传递它们。”;但它开始有意义了。再次感谢-干杯!再次大家好,只是自我提醒一下:我想现在,我会把
generatest.vhd
中的“generic”语句理解为“如果组件实例化没有指定它,那么
numbits
的默认值”;而您答案中的“generic”语句是“用
numbits
这个特定值实例化
generatest
组件”希望这种理解接近正确的东西..干杯!谢谢@Martin Thompson-我记得我在某个地方读到过关于它的内容,但当时我不确定我是否正确理解了它…希望我能再次找到该链接:)干杯!在中找到了链接,我想:,以及单个文件示例,它引用了一个称为的东西(不过是“”)干杯!总放在一边-不要混合
std_-logic\u unsigned
numeric\u-std
-只使用
numeric\u-std
,从长远来看一切都会好得多。;)谢谢你的留言,@AaronD.Marasco-我已经学到了更多,还没有意识到这篇文章中有它!现在我已经对它发表了评论(留作参考,所以我记得:)…干杯!