【FPGA】库、包和子程序 过程 函数

库和包

  • 一组相关的过程和函数可以汇集在一起,组成一个包;

  • 一个包可以在一些VHDL模型中共享;

  • 一个包可以包含用户定义的数据类型和约束;

  • 库是包的集合; 包和库可视为函数、过程和数据类型的容器;

  • 包的另外一个重要特征是可包含不同用户定义的元件。

 

Library(库)

库是经编译后的数据的集合,包含一个或多个包

库的分类

设计库: STD库 ;Work库

资源库: IEEE库 ;Vital库(面向ASIC的VHDL模型基准库) ;用户自定义库

package(包)

包的主要用途是实现整个设计工程中信息的共享。

包的组成

  包的声明

    类型声明

    子程序声明

  包体

    子程序定义

VHDL 的标准库(std)有两个内嵌包

  标准包

  TEXTIO


(1) IEEE库

VHDL设计中最为常用的库。

  4个程序包:std_logic_1164,std_ logic_ arith, std_ logic_ signed和std_ logic_ unsigned。

std_logic_1164程序包:包含std_logic、std_logic_vector等类型定义及其相关逻辑类运算子程序定义。

std_logic_arith程序包:包含std_logic类型数据的算术运算子程序定义。(如+-*移位比较等)

std_logic_signed程序包:std_logic_vector类型的符号数算术运算子程序定义。

std_logic_unsigned程序包: std_logic_vector类型的无符号数算术运算子程序定义。

使用这4个程序包必须在设计实体前显式表达出来.

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

(2) std库

std库是VHDL语言的标准库.库中定义了standard和textio两个标准程序包.

standard程序包中定义了VHDL的基本的数据类型.

  用户在程序中可以随时调用standard包中的内容,不需要作任何说明.

textio程序包中定义了对文本文件的读和写控制的数据类型和子程序.

  用户在程序中调用textio程序包中的内容时,需要用use语句加以说明.

library std;

use std.textio.all;

(3)work库

work库是现行的作业库,设计者所描述的VHDL语句经过编译后在缺省状态下将全部存放在work库中.

当使用该库时,不需要作任何说明.

但使用该库中的程序包,需要用USE语句进行说明.

自定义程序包

程序包也叫包集合,主要用来存放各个设计都能共享的数据类型、常数、子程序说明和元件说明等部分。

  设计者使用时只要用USE语句进行说明即可。

程序包由两部分组成:

  程序包首和程序包体。

程序包结构中,程序包体并非必须的。程序包首可以独立定义和使用。

一个完整的程序包中,程序包首名和程序包体名是同一个名字.

1.程序包首

格式:

PACKAGE   程序包名 IS
       程序包首说明语句
END [PACKAGE] 程序包名;

程序包首说明部分包括程序包中的数据类型、信号、常量、子程序及元件说明。

这些说明是公用的,可供外部引用。

例5-38:

  PACKAGE pacl IS
    type byte is range 0 to 255subtype nibble is byte  range 0 to 15;
    constant byte_ff: byte:=255;
    signal addend: nibble;
    component  byte_adder is
     port(a,b:in byte;
          c:out byte;
          overflow:out boolean);
       end component;
 function my_function(a: byte)return byte;
    end  pacl;

2.程序包体

程序包体格式如下:

package  body  程序包名   IS
  程序包体说明语句及包体内容
end  [package  body] 程序包名;

程序包体规定子程序的实际功能,存放程序包首中说明的子程序.这些内容是专用的,不能被其他设计单元引用.

如果程序包首中没有子程序的说明,则程序包体可以省去。

程序包体说明部分可以是USE语句,数据类型说明、子类型说明、子程序定义、子程序体及常数说明。

包体

包体用来存储函数和过程的定义或实现。

包体通常和包声明是联系在一起的。

主要包括子程序的实现代码。

 

 

工作库 包含一个名为my_pack的包;

有一个名为 myadd 声明在包中;

包体是可选的. 元件 myadd 在另外一个vhd中实现.

如下图:

Myadd.vhd的实现

一个自定义的库

库名mylib

一般库名设置为库文件夹名或者文件名

包: mypack

库文件需要添加到当前工程,实质库为work库,库名不重要 应用

 

 

 

子程序

类似于其他语言中的子程序

可使代码重复利用,不用重写

每一次调用生成相对于的一个电路

与普通软件中子程序调用的区别:

普通软件子程序调用增加处理时间;

  VHDL中每调用一次子程序,其综合后都将对应一个相应的电路模块。子程序调用次数与综合后的电路规模成正比。

设计中应严格控制子程序调用次数。

子程序的类型:

(1)函数(Function)

(2)过程(Procedure)

类似于其他语言中的子程序

可使代码重复利用,不用重写

每一次调用生成相对于的一个电路

VHDL提供函数和过程

  子程序中的VHDL代码是顺序语句,这意味着在子程序中只允许使用顺序语句,并发语句、进程语句等是不允许出现的。

  在子程序中,只能声明变量,不能声明信号。

  在子程序中,不能使用wait语句。

函数

产生一个返回值

参数只能为in模式

传递的参数在函数内部只能使用不能修改(因为参数为in)

允许的参数数据类型为 constant或signal,默认constant

需要一个RETURN 语句

格式:

函数特征

函数由实参调用

Example:

  rising_edge(enable);

形参和实参必须匹配.

形参为constant,则实参可以是variable、signal、constant或表达式;形参为signal,实参要为signal.

过程

与函数类似

参数可以是 in, out, inout 模式

  输入参数(in)的默认数据类型是constant

  输出参数(out)或者inout参数默认数据类型variable

  参数对象可为 constant, variable and signal

其特征是过程中可以修改参数值(out,inout模式参数)

不需要RETURN语句

过程特征

过程调用参数需要一一对应,形参为constant,实参可以为signal、constant或variable;

形参若为signal或variable,则实参需对应一致的类型

作为独立的语句进行调用

函数和过程

原文地址:https://www.cnblogs.com/Osea/p/13191907.html