包集合体中函数调用

eeleader-mcu   2010-10-25 09:26 楼主
在文件名 为uart_serial.vhd中定义了如下包集合:
library ieee;
use ieee.std_logic_1164.all;
package uart_serial is
        function get_parity(get_parity_type :std_logic;
                                                get_parity_data :std_logic_vector(7 downto 0))
                                        return std_logic ;
end uart_serial;
package body uart_serial is
        function get_patity(get_parity_type :std_logic;
                                                get_parity_data :std_logic_vector(7 downto 0))
                        return std_logic is
                        variable tmp: std_logic :='1';
                        variable return_value :std_logic;
        begin
                略。。。               
                if(get_parity_type ='1')then
                        return_value :=tmp;
                else
                        return_value := not tmp;
                end if;
                return return_value;
        end get_patity;
end uart_serial;

而在文件名为my_uart_Tx.vhd中调用了包集合中的函数get_patity,
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use work.uart_serial.all;
Entity my_uart_Tx is
        Port(。。。略。。。
               );
end my_uart_Tx;

Architecture my_uart_Tx_behavior of my_uart_Tx is

begin
  。。。略
tx <=get_parity(parity_type,data_mid);
                                                
end my_uart_Tx_behavior;

编译后出现:
VHDL Subprogram Declaration error at uart_serial.vhd(4): declaration of function or procedure "get_parity" must have corresponding Subprogram Body

请问该怎么办?是不是还需做什么动作呀?

回复评论 (2)

 

程序包
VHDL引入程序包的结构,使一些通用的对象、数据类型及子程序能被其他程序的实体共同使用
一个程序包由两大部分组成:程序包说明和程序包体。程序包体是一个可选项一般情况,程序包说明列出所有项的名称,而程序包体给出各项的细节。

程序包说明
通常的常量、信号数据类型及子类型的数据范围、函数和过程等说明的集合,称程序包说明。
下述内容中只要是通用的全局量,都可以在程序包中加以说明。
对象(常量、变量、信号)的数据类型说明
对象(常量、变量、信号)子类型的数值范围说明
函数与过程说明
元件语句说明
信号连接说明
延时常量说明
文件说明
设计者自定义的属性说明

程序包说明格式如下:
package 程序包名 is
         说明语句;
end    程序包名;
程序包名:设计者自定义便于记忆的标识符
说明语句:包括各种类型的说明语句

程序包体
描述函数和过程功能的函数体与过程等的集合称程序包体
程序包说明中,定义了数据类型和子程序中的函数、过程说明,而程序包体中才具体地描述该函数、过程功能的语句和数据的赋值。
程序包体格式:
package body 程序包名 is
              顺序语句;
end 程序包名;

程序包名:与程序包说明中的程序包名相同
顺序语句:描述函数、过程及其他功能的程序流

子程序——过程
VHDL中,所谓子程序指主程序调用它后能将处理结果返回主程序的程序模块。
VHDL语言中,子程序有两种类型,过程(procedure)和函数(function)。
他们的区别:
1、过程可具有多个返回值,而函数只能有一个
2、过程通常用来定义一个算法,而函数往往用来产生一个特定的值
3、过程中的参数可具有3种端口模式:in、out、inout,而函数中的参数只能具有一直端口模式:in
 
过程的书写结构
对于VHDL子程序来说,它通常包括子程序说明部分和子程序定义部分。
其中,子程序说明部分定义了其他设计调用子程序的接口;子程序定义部分则描述该子程序具体功能的实现。
因此,通常将子程序说明部分和子程序定义部分的书写结构分别介绍

在VHDL中,过程说明部分的书写结构:
procedure:过程名
(对象类型1 参数名1: 端口模式1 数据类型1;
    对象类型2 参数名2: 端口模式2 数据类型2;......);

过程说明部分以保留字“procedure”开始,紧跟着的是过程名;然后是过程的参数列表。参数列表中的每个参数包括它的对象类型、参数名、端口模式及数据类型,其中对象类型、端口模式是可选项。

在VHDL语言中,过程定义部分
procedure 过程名
(对象类型1 参数名1: 端口模式1 数据类型1;
    对象类型2 参数名2: 端口模式2 数据类型2;......)is
   过程说明部分;
begin
  过程顺序语句部分;
end 过程名;

可以看出,过程定义部分仍以保留字“procedure”开始,紧跟其后的是过程名;接下来是过程参数列表;然后以保留字“is”开始过程的说明部分,它主要是对过程中要用到的变量、常量和数据类型进行说明,并且说明只对该过程可见;接下来是以保留字“begin”开始的顺序语句部分,用来描述过程的具体功能;最后以“end”结尾。

参数列表中:每个参数包括它的对象类型、参数名、端口模式以及数据类型
参数的对象类型包括:常量、信号、变量
参数名是用来表示参数的唯一标识
端口模式:包括in、out、inout
若过程中没有指明参数的对象类型,那么参数的对象类型将默认为一个变量

过程定义在程序包中的定义规则为:过程说明部分书写在程序包的说明部分,过程定义部分书写在程序包体部分

过程定义在结构体中:即将过程定义部分书写在结构体的说明部分,然后在结构体进程语句里调用

函数

函数包括:函数说明部分和函数定义部分
函数说明部分定义了主程序调用函数的接口
函数定义部分描述了该函数具体逻辑功能的实现
函数的书写结构
function 函数名
(对象类型1 参数名1; in 数据类型1;
   对象类型2  参数名2;  in 数据类型2;......) return 数据类型;

其中对象类型和端口模式in是可选项

函数定义部分书写结构
function 函数名
(对象类型1 参数名1; in 数据类型1;
   对象类型2  参数名2;  in 数据类型2;......) return 数据类型 is
     函数说明部分:
begin 
        函数顺序语句部分;
return(参数值);
end 函数名;

函数参数的对象类型只能包括常量和信号:参数的端口模式只能是in,因此参数端口模式可以省略。
函数的返回值只能有一个。

函数定义在程序包中:函数说明部分书写在程序包说明部分,函数定义部分书写在程序包体部分。如果需要使用程序包中定义的函数,那么只需要通过use语句使其对设计实体可见。

函数定义在结构体中:只需将函数定义部分书写在结构体说明部分即可。然后在结构体中调用这个函数。
一个为理想不懈前进的人,一个永不言败人! http://shop57496282.taobao.com/ 欢迎光临网上店铺!
点赞  2010-10-25 14:46
看起来结构应该可以,还是格式有错误吧.
BODY里“return std_logic is”是否多余...去掉试试
一个为理想不懈前进的人,一个永不言败人! http://shop57496282.taobao.com/ 欢迎光临网上店铺!
点赞  2010-10-25 14:47
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复