避免在VHDL中复制代码

时间:2013-04-22 09:51:59

标签: vhdl

我有一个代码清单,其中包含如下代码,但代码更大。

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

有没有办法让它像#define这样的函数,这样我就不必在整个地方编写相同的代码了?

1 个答案:

答案 0 :(得分: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;

(因为它使用“range”属性)将使用不同大小的“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”,它已经在每个VHDL文件中由隐式library work;声明)。然后,您可以选择在代码中显示包中的所有内容:

use work.my_tools.all;

或只显示一个功能:

use work.my_tools.test_zero;

或者让那些阅读代码的人明白“test_zero”函数来源:

done <= my_tools.test_zero(m);

如果您使用过C ++命名空间,则会识别出这些不同的策略。

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