1

我正在尝试编译我的子程序包,但出现此错误:

** 错误:C:/Users/kmgrytte/Downloads/subprog_pck.vhd(16): (vcom-1295) 函数“parity”已在该区域中定义。** =====>“奇偶校验”的先前声明位于 C:/Users/kmgrytte/Downloads/subprog_pck.vhd(12)。** 错误:C:/Users/kmgrytte/Downloads/subprog_pck.vhd(20):VHDL 编译器正在退出

像这样的超载在我的主程序中起作用,我在网上找不到任何关于子程序中超载的好例子。

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;
4

2 回答 2

1

仅当您具有相同的函数名但参数列表不同时,才会发生函数重载。使用 impure 不会重载另一个函数。因此,您有两个版本的奇偶校验,不接受输入并输出 std_logic。因此编译错误。

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

于 2018-10-09T13:57:46.610 回答
0

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

IEEE 标准 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 修订版。)

于 2018-10-09T22:01:33.113 回答