为什么我们在VHDL中使用函数

时间:2013-01-21 17:22:07

标签: vhdl

与实体相比,函数显然不那么冗长。但这意味着许多缺点,包括:

  • 没有通用关键字等效项
  • 只能输出一个

似乎可以递归调用函数。可能不是实体的情况吗?如果是这样,除了审美目的之外,还有什么理由使用函数吗?

3 个答案:

答案 0 :(得分:7)

函数不能直接创建硬件 - 它们必须存在于体系结构中才能这样做。没有什么可以阻止您将所有功能放入function(或procedure),然后只是在process内调用它。

关于你的其他一些观点:

  • 使用 的程序可以有多个inoutout参数。

  • 实体可以递归...考虑:

    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;
    

不是很有用,但它合成和模拟就好了。

  • 最后,当然你只是将功能用于审美目的(假设你将可维护性和可读性包含在美学的定义中,大多数编程类型都根据我的经验进行)。您只使用枚举类型,实体,记录和许多其他语言功能来实现“审美目的”。甚至装配助记符也很美观!也许应该回到切换DIP开关:)

答案 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。

虽然我可以在某种程度上不使用程序和函数来完成所有这些操作,但它肯定会更加混乱。