1

我有一个代码清单,其中充满了如下代码,但代码块更大。

if (m = '00000') then 
  done <= '1';
else
  done <= '0';
end if;

有没有办法让它像#define 这样的ac 函数,这样我就不必到处写相同的代码了?

4

1 回答 1

4

这段代码首先不是 VHDL,所以你还有其他事情要担心。(编辑后更像VHDL)

谢天谢地,VHDL 与 C 的#define 完全不同。相反,它具有用于适当抽象的工具,例如包(非常粗略地,C++ 命名空间,但做得正确)、函数和过程。

这允许你写

done <= test_zero(m);

假设done是一个信号(或者done := test_zero(m);如果它是一个变量)

test_zero 然后是一个函数,类似于

function test_zero ( word : in std_logic_vector) return std_logic is
begin
   if word = (word'range => '0') then
      return '1';
   else 
      return '0';
   end if;
end test_zero;

其中(因为它使用“范围”属性)将适用于不同大小的“m”。

您最终将获得一组有用的功能:将它们保存在一个包中并在整个项目中使用它们。

一个包通常表现为两部分:包规范(有点像正确完成的 C 头文件)

package my_tools is

   function test_zero ( word : in std_logic_vector) return std_logic;

end my_tools;

和一个包含实现的包体

package body my_tools is

   function test_zero ( word : in std_logic_vector) return std_logic is
      ...
   end test_zero;

end my_tools;

为了使用它,它被编译成一个库(我们将使用默认库“work”,它已经由library work;每个 VHDL 文件中的隐式声明)。然后,您可以选择使包中的所有内容在您的代码中可见:

use work.my_tools.all;

或者只显示一个功能:

use work.my_tools.test_zero;

或者让任何阅读神秘“test_zero”函数来自的代码的人都清楚:

done <= my_tools.test_zero(m);

如果您使用过 C++ 命名空间,您将认识到这些不同的策略。

使 VHDL 等效的“命名空间正确”的原因在于,VHDL 编译器使用这些声明来自动跟踪依赖关系并编译正确的位,而不需要额外的#includes 和必须与实际代码保持同步的 makefile 等外部工具手。

于 2013-04-22T10:30:01.817 回答