我有一个代码清单,其中充满了如下代码,但代码块更大。
if (m = '00000') then
done <= '1';
else
done <= '0';
end if;
有没有办法让它像#define 这样的ac 函数,这样我就不必到处写相同的代码了?
我有一个代码清单,其中充满了如下代码,但代码块更大。
if (m = '00000') then
done <= '1';
else
done <= '0';
end if;
有没有办法让它像#define 这样的ac 函数,这样我就不必到处写相同的代码了?
这段代码首先不是 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 等外部工具手。