【问题标题】:VHDL function does not compileVHDL 函数无法编译
【发布时间】:2018-08-04 03:50:32
【问题描述】:

我正在尝试在 VHDL 中定义一个函数,但我得到了

错误:tst.vhd(4):靠近“子类型”:语法错误

这里是代码

subtype word10 is bit_vector(9 downto 0);
subtype word8 is bit_vector(7 downto 0);

function tst (input : in word10) return word10 is
    variable tmp : word10;
    -- code here
    begin

    return tmp;
end tst;

entity tester is
end;

architecture tst of tester is
begin
end;

这是我第一次用 VHDL 编码,我不知道是什么错误。

有什么想法吗?

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    问题是您试图定义的东西(子类型和函数)需要在库单元(包或实体)或其他一些主体中声明,而不仅仅是单独使用。尝试将声明移动到测试器实体(即:在“实体测试器是”行之后):

    entity tester is
        subtype word10 is bit_vector(9 downto 0);
        subtype word8 is bit_vector(7 downto 0);
    
        function tst (input : in word10) return word10 is
            variable tmp : word10;
            -- code here
            begin
    
            return tmp;
        end tst;
    end tester;
    

    您声明子类型和函数的确切位置取决于您需要它们可见的范围。如果您需要在整个设计中访问它们,通常会将它们收集在一起并在一个包中声明。

    【讨论】:

      【解决方案2】:

      问题是,您必须在 de 定义和 begin 之间定义函数的 SUBTYPE inside

      但是,我不确定您是否意识到 VHDL 不是一种编程语言,而是一种设计语言。如果你想合成你的代码,那么你应该注意你的情况是否可以合成函数。

      【讨论】:

      • 如果我绕过subtype 的事情。 function tst (input : in bit_vector(9 downto 0)) return bit_vector(7 downto 0) is 我收到关于函数的类似错误。我正在为 fpga 编写此代码,所以您说它可能不起作用?我很困惑。 Error: tst.vhd(4): near "function": syntax error
      • 您应该避免使用 VHDL 中的所有函数,因为它与 C 完全不同。使用 entities 进行端口声明,使用 architecture 进行行为声明,仅此而已。并注意像wait 这样的语句,因为这些语句无法合成。一本好(最好的 IMO)书:Peter Ashenden 的 VHDL 设计指南。
      • 我将在 vhdl 中实现一个加密算法,我需要类似函数的东西,否则代码会变得非常混乱。我阅读了有关组件的信息,但我认为这不是我需要的。
      • 合理地将所有元素划分为实体,并将它们与它们的端口连接到一个完整的系统。 IMO不需要功能。另请查看@CharlesSteinkuehler 提供的答案。
      【解决方案3】:

      subtypes 和 functions 通常在 packages 和 package bodys 中声明 - 如果您尝试按原样编译该代码,那么,是的,它将失败。

      试试(只是在我脑海中打出来的,所以可能有语法错别字,但它应该给你正确的想法):

      package mypkg is
          subtype word10 is bit_vector(9 downto 0);
          subtype word8 is bit_vector(7 downto 0);
          function tst (input : in word10) return word10;
      end package;
      package body mypkg is      
          function tst (input : in word10) return word10 is
              variable tmp : word10;
          begin
              -- code here
              return tmp;
          end function;
      end package body;
      

      为了“运行”任何代码(这对于旨在描述硬件的代码有点用词不当),您还需要一个 entity 在模拟器中“详细说明”,然后调用您的tst 函数。实体更多地用作 VHDL 构建块,过程用于捕获块内的行为 - 功能和过程通常在实体和过程中用于捕获经常使用的功能,就像在软件世界中一样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-20
        • 2014-11-29
        相关资源
        最近更新 更多