与实体相比,函数显然不那么冗长。但这意味着许多缺点,包括:
似乎可以递归调用函数。可能不是实体的情况吗?如果是这样,除了审美目的之外,还有什么理由使用函数吗?
答案 0 :(得分:7)
函数不能直接创建硬件 - 它们必须存在于体系结构中才能这样做。没有什么可以阻止您将所有功能放入function
(或procedure
),然后只是在process
内调用它。
关于你的其他一些观点:
使用 的程序可以有多个inout
或out
参数。
实体可以递归...考虑:
entity recurse is
generic (
depth : integer := 1;
param : integer := 3);
port (
a : in integer;
b : out integer);
end entity recurse;
architecture a1 of recurse is
signal c : integer;
begin
c <= a + 1;
bottom: if depth = param generate
b <= a + 1;
end generate bottom;
mid:if depth /= param generate
recurse_1: entity work.recurse
generic map (
param => param,
depth => depth+1)
port map (
a => c,
b => b);
end generate mid;
end architecture a1;
不是很有用,但它合成和模拟就好了。
答案 1 :(得分:5)
vhdl中的函数使代码易于维护和读取。通常架构非常大,而在调试时如果某些东西不起作用,您可以轻松找到有问题的功能并更正它,而无需分析整个架构体。
如果是小代码,它就没用了,但是在更大的机器中,如果你认为它的功能明智,它会让你更好地理解。
没有这方面的规则,所以欢迎所有评论。
简而言之:功能的优点是
答案 2 :(得分:5)
我可以看到为什么你感到困惑,另一个好问题是为什么还有 procedure 和 function 。 (VHDL有时看起来很不优雅!)
话虽这么说,我一直使用程序和函数,尽管大多数都在测试平台中。例如,对于防火墙系统的测试平台,我做了一段时间我编写了一个名为pd_tb_send_udp_packet()
的过程,我在主过程中反复使用,例如,
pd_tb_send_udp_packet("10.10.10.2", 1234, false);
pd_tb_send_udp_packet("10.10.10.1", 1234, true);
pd_tb_send_udp_packet("10.10.10.1", 1235, false);
pd_tb_send_udp_packet("ff02:100::1", 1234, false);
pd_tb_send_udp_packet("ff02:101::1", 1234, true);
此过程生成带有给定addr / port的随机UDP数据包,并将其发送到防火墙系统,然后根据最终的布尔参数测试是否转发。以下是它的第一行,我使用库中的函数:
if f_atvtb_is_ipv6_addr(dest_ip_addr) then
v_ipv6 := true;
v_ipv6_addr := f_atvtb_ipv6_addr(dest_ip_addr);
else
v_ipv6 := false;
v_ipv4_addr := f_atvtb_ip_addr(dest_ip_addr);
end if;
后两个分别从字符串输入返回128和32位std_logic_vectors。
虽然我可以在某种程度上不使用程序和函数来完成所有这些操作,但它肯定会更加混乱。