Function 为什么我会得到一个“a”;找不到匹配的子程序。”;错误?
我在包文件中编写了一个函数,并在主vhd文件中调用它。在我看来,一切都是正确的。但是Sigasi编辑器在我调用函数的那一行说“没有找到匹配的子程序” 这是程序包文件内容: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
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 ;