我有一个代码清单,其中包含如下代码,但代码更大。
if (m = '00000') then
done <= '1';
else
done <= '0';
end if;
有没有办法让它像#define这样的函数,这样我就不必在整个地方编写相同的代码了?
答案 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,必须与之保持同步手工实际代码。