VHDL函数不编译

VHDL函数不编译,vhdl,Vhdl,我试图用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 retu

我试图用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不是一种编程语言,而是一种设计语言。如果您想合成代码,那么您应该注意是否可以合成函数。

问题是您试图定义的东西(子类型和函数)需要在库单元(包或实体)或其他实体内部声明,而不仅仅是在它们自己的内部声明。尝试将声明移动到tester实体(即:在“EntityTester is”行之后):


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

子类型
s和
函数
s通常在
s和
包体
s中声明-如果您尝试按原样编译该代码,则肯定会失败

试试看(只是在我的头顶上打字,所以可能会有语法错误,但它会给你正确的想法):


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

如果我绕过
子类型
的话<代码>函数tst(输入:在位_向量(9向下到0)中)返回位_向量(7向下到0)为
我得到关于函数的类似错误。我正在为一个fpga编写这段代码,所以你说它可能无法工作?我很困惑<代码>错误:tst.vhd(4):接近“函数”:语法错误
您应该避免VHDL中类似函数的一切,因为它与C完全不同。端口声明使用
实体
,行为声明使用
体系结构
。还要注意像
wait
这样的语句,因为它们无法合成。一本很好(最好的IMO)的书:Peter Ashenden的VHDL设计指南。我将用VHDL实现一个加密算法,我需要一些类似函数的东西,否则代码将变得非常混乱。我读过有关组件的文章,但我认为这不是我需要的。合理地将所有元素划分为实体,并将它们与其端口连接到一个完整的系统中。IMO不需要函数。另请看@CharlesSteinkuehler提供的答案。
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;
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;