首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >子程序中的重载函数,但是它已经“被定义”了。

子程序中的重载函数,但是它已经“被定义”了。
EN

Stack Overflow用户
提问于 2018-10-09 13:41:16
回答 2查看 1K关注 0票数 2

我试图编译我的子程序包,我得到了以下错误:

**错误: C:/Users/kmgrytte/Downloads/subprog_pck.vhd(16):(vcom-1295)函数“奇偶校验”已在此区域定义。** C:/Users/kmgrytte/Downloads/subprog_pck.vhd(12).在=====>之前宣布“平价”**错误: C:/Users/kmgrytte/Downloads/subprog_pck.vhd(20):VHDL编译器退出

像这样的光速在我的主程序中起了作用,我在网上的子程序中找不到重载的好例子。

代码语言:javascript
复制
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;

package subprog_pck is
    procedure parity;
    procedure parity(
    in1 : in std_logic_vector(15 downto 0);
    in2 : in std_logic_vector(15 downto 0);
    par : out std_logic);

    function parity return std_logic;
    function parity(
    indata : in std_logic_vector(15 downto 0)) return std_logic;

    impure function parity return std_logic;
    impure function parity(
    indata : in unsigned(15 downto 0)) return std_logic;

end package subprog_pck;

package body subprog_pck is

procedure parity(
    in1 : in std_logic_vector(15 downto 0);
    in2 : in std_logic_vector(15 downto 0);
    par : out std_logic) is
    begin
    variable parity1, parity2 : std_logic:=0;
    if (rst_n = '0') then       
      parity1 := '0';
      parity2 := '0';
      par <= '0';
    elsif rising_edge(mclk) then
      parity1 := '0';
      for i in in1'range loop
        if in1(i) = '1' then
          parity1 := not parity1;
        end if;        
      end loop;      
      parity2 := '0';
      for j in in2'range loop
        parity2 := parity2 xor in2(j); 
      end loop;
      par <= parity1 xor parity2;
    end if;
    end parity;

function parity(indata : in std_logic_vector(15 downto 0))  return std_logic     is
    variable parity_var : std_logic := '0';
    begin
        for i in indata'range loop
            if (indata(i) = '1') then
                parity_var := not parity_var;
            end if;
        end loop;
    return parity_var;
end function parity;

function parity(indata : in unsigned(15 downto 0))
    return std_logic is
    variable parity_var : std_logic := '0';
    begin
        for j in indata'range loop  
            parity_var := parity_var xor indata(j);
        end loop;
    return parity_var;
end function parity;


end package body subprog_pck;
EN

回答 2

Stack Overflow用户

发布于 2018-10-09 13:57:46

函数重载只有在具有不同参数列表的相同函数名时才会发生。使用不纯不会使另一项功能过载。因此,您有两个版本的奇偶校验,它不需要输入并输出一个std_logic。因此产生了编译错误。

您也没有在包主体中提供此版本的奇偶校验。

票数 1
EN

Stack Overflow用户

发布于 2018-10-09 22:01:33

包中还有其他错误,在上下文子句中缺少一个库子句(library ieee;)。过程paritybegin之后有一个变量声明,parity1和parity2的初始值为0(一个数字文字),没有rst_nmclk的声明,par <= ...中的par不是信号,也没有没有参数的过程parity或函数parity的主体。

IEEE Std 1076-2008

12.3能见度

除了组件实例化所隐含的块的声明区域或等效于包实例或子程序实例的泛型映射包或子程序的声明区域之外,在同一声明区域内立即发生的两个声明,不应是同音字,除非其中之一恰好是预定义操作的隐式声明或这种隐式声明的隐别名。

(这里没有隐式声明,也没有预定义的操作,重点添加了。)

也在12.3

..。两个声明中的每一个都被认为是另一个声明的同音字当且仅当两个声明都有相同的指示符,它们表示不同的命名实体,或者最多允许两个声明中的一个重载,或者两个声明都允许重载,并且它们具有相同的参数和结果类型配置文件(见4.5.1)。

4.5子程序重载

4.5.1

两个形式的参数列表被称为具有相同的参数类型配置文件当且仅当它们有相同的参数数,如果在每个参数位置对应的参数具有相同的基类型。两个子程序被认为具有相同的参数和结果类型配置文件当且仅当两者都具有相同的参数类型配置文件,如果两者都是具有相同结果基类型的函数,或者两者都不是函数。

你有不止一个这些错误。vcom在第一次退出后退出。错误发现的顺序留给应用语义规则的VHDL工具实现的变幻莫测(其他工具可能首先发现其他错误,解释如何发现上面第一段中的错误)。

Modelsim有一个verror工具,提供了更多的解释:

vcom消息# 1295: 在同一声明性区域内立即发生的两个声明不能是同义词,除非其中之一正是预定义操作的声明。如果两个声明都具有相同的标识符、运算符符号或字符文字,并且最多允许重载这两个声明中的一个,则两个声明中的每个声明都是另一个声明的同音字。如果这两个声明都允许重载,那么如果它们具有相同的标识符、运算符符号或字符文字,以及相同的参数和结果类型配置文件(请参见3.1.1),则这两个声明都是另一个声明的同义词。重载仅为子程序(包括其指示符为运算符符号的子程序)和枚举文本(包括字符文本)定义。 DOC: IEEE Std 1076-1993 VHDL LRM - 10.3能见度

(这些参考资料来自于1993年修订的标准。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52722547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档