我在包文件中编写了一个函数,然后在主vhd文件中调用了该函数。在我看来,一切都正确到位。但是Sigasi编辑说“找不到匹配的子程序”。在我调用该函数的那一行。
这是包文件的内容:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.numeric_std.ALL;
PACKAGE pkg IS
TYPE t IS ARRAY (positive RANGE <>) OF std_logic_vector(7 DOWNTO 0);
FUNCTION char2byte (SIGNAL yazi_char: character) RETURN std_logic_vector;
END pkg;
PACKAGE BODY pkg IS
FUNCTION char2byte (SIGNAL yazi_char: character) RETURN std_logic_vector IS
VARIABLE yazi_byte: std_logic_vector;
BEGIN
case yazi_char is
when '0' => yazi_byte:=x"30";
when '1' => yazi_byte:=x"31";
when '2' => yazi_byte:=x"32";
....
when others =>
end case;
RETURN yazi_byte;
END char2byte;
END pkg;
这是主要文件内容:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use WORK.pkg.ALL;
entity rs232 is
port(
clk:in std_logic;
tx_port:out std_logic
);
end rs232;
architecture Behavioral of rs232 is
signal yazi_byte: t;
begin
yazi_byte<=char2byte("y");
process(clk)
begin
....
end process;
end Behavioral;
哪里错了?有趣的是,ISE给出了另一个错误,而不是“未找到匹配的子程序”。
它是:
ERROR:HDLParsers:522 - "D:/UME/FPGA/ise_projeleri/RS232_TEST/pkg.vhd" Line 16. Variable yazi_byte is not constrained.
ERROR:HDLParsers:3304 - "D:/UME/FPGA/ise_projeleri/RS232_TEST/pkg.vhd" Line 16. Can not determine the "others" values in aggregate. (LRM 7.3.2)
感谢您的帮助。
问题是您将std_logic_vector与std_logic_vectort
的数组混淆了。
signal yazi_byte: t;
begin
yazi_byte<=char2byte("y");
...
现在t
是一个不受约束的数组,它使您可以t
在使用包时声明不同大小的。有两种方法可以做到这一点 :
t
并在声明中对其进行初始化:初始化程序(函数调用或数组聚合)定义其大小。适用于信号,但对常量特别有用因此,第一个示例的长度限制为4个字节:
constant deadbeef : t := (X"DE", X"AD", X"BE", X"EF");
第二个示例当前的长度为1个字节:但是,您仍然需要在其中寻址该字节……这实际上就是为什么您会看到晦涩的错误消息的原因。
signal yazi_byte: t(0 downto 0);
begin
yazi_byte(0) <= char2byte("y");
...
VHDL具有运算符和函数重载,因此编译器正在寻找一个“ char2byte”函数,该函数返回一个数组,std_logic_vector
因为这是您要分配的变量的类型。它找不到一个(因此“没有匹配的子程序”),因为您编写的唯一“ char2byte”返回单个std_logic_vector,而不是它们的数组。
因此,寻址该数组的单个元素将使其能够找到您的char2byte-现在错误消息变得十分合理了...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句