Function 为什么我会得到一个“a”;找不到匹配的子程序。”;错误?

Function 为什么我会得到一个“a”;找不到匹配的子程序。”;错误?,function,vhdl,packages,fpga,Function,Vhdl,Packages,Fpga,我在包文件中编写了一个函数,并在主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); FUN

我在包文件中编写了一个函数,并在主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;

感谢您的帮助。

如错误消息所示,变量
yazi_byte
需要显式约束。看起来它的范围是8位,所以:

VARIABLE yazi_byte: std_logic_vector(7 downto 0);

将起作用。

问题是您将标准逻辑向量与标准逻辑向量数组
t
混淆

signal yazi_byte: t;
begin
yazi_byte<=char2byte("y");
...
您的第二个示例当前为1字节长:但是您仍然需要在其中寻址该字节。。。这就是为什么您会收到外观模糊的错误消息

signal yazi_byte: t(0 downto 0);
begin
yazi_byte(0) <= char2byte("y");
...
signal yazi_字节:t(0到0);
开始

yazi_byte(0)你有很多细微的错误。其中一些人已经注意到了,其他人没有。让我们从类型开始。“y”是单个元素字符串(字符串(1到1))。char2byte需要一个字符,例如“y”。正如@Brian指出的,char2byte返回std_logic_vector,而不是类型t(std_logic_vector的数组)

在char2byte上,您已将字符输入声明为信号。这意味着您需要将信号映射到它,而不是像“y”这样的文字。您可能希望将其声明为常量(或者干脆不使用该类)。在下面的代码中,请注意对yazi_字节的修复(也由@Andy注释)

注:Char2Byte的一个聪明的解决方案可能使用std_logic_vector(7到0)数组,该数组按类型字符进行索引(可能是另一天的项目)。有关想法,请参见@David的帖子:。为数组编制索引的工作方式类似于子程序调用

如果您只有char2byte,那么您的测试台需要接收一个std_logic_向量值(另请参阅@Brian's fix):


您的代码不是。
信号yazi_字节:t类型t是标准逻辑向量(7到0)的无约束数组。您需要在yazi_字节子类型声明中给出一个约束,或者使用std_逻辑_向量(7到0)而不是t。如果你最终使用FIFO,我会想到前者。第二个错误是当其他=>时,
缺少分号
constant deadbeef : t := (X"DE", X"AD", X"BE", X"EF");
signal yazi_byte: t(0 downto 0);
begin
yazi_byte(0) <= char2byte("y");
...
FUNCTION char2byte (CONSTANT yazi_char: character) RETURN std_logic_vector IS
VARIABLE yazi_byte: std_logic_vector(7 downto 0) ;

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;
architecture Behavioral of rs232 is
signal slv_byte: std_logic_vector(7 downoto 0) ;
begin

slv_byte<=char2byte('y');
FUNCTION string2slv (yazi_str : string) RETURN t is
  variable result : t (yazi_str'range) ; 
begin 
   . . . 

end FUNCTION string2slv ;