一种VHDL语言代码重用的方法
2016-09-29
骆传慧
【摘要】代码重用是提高软件设计效率和质量的重要手段,VHDL的库文件能够实现高效代码分割、代码共享及代码重用。本文介绍了库的基本结构,及其的基本构件单元元件、函数、过程的建立和调用的语法结构,从而实现结构化设计及代码重用。
【关键词】代码重用;VHDL;软件设计
0引言
随着可编程逻辑器件技术的发展,芯片的性能越来越强、规模越来越大、开发的周期越来越长,使得器件应用正面临一系列新的问题:设计质量难以控制,设计成本也越来越高。IP(Intelligence Property)技术解决了当今芯片设计业所面临的难题。设计者可以重复使用已经设计并经过验证的IP核,将精力集中于系统顶层及关键功能模块的设计上,从而提高产品整体性能和个性化特性,加快了设计效率。
如何才能提高IP核的重复使用率,使设计资源更好地集中起来加以利用,是可编程逻辑器件应用面临的另一个问题。在VHDL(VHSIC Hardware Description Language)语言中,库(LIBRARY)文件很好地解决了这个问题。库文件是专门用于存放预先编译好的程序包(PACKAGE)和数据集合体,这些设计单元可用作其他VHDL描述的资源。用户编写的设计单元既可以访问多个设计库,又可以加入到设计库中,被其他单元所访问。此外,库的使用能够实现层次化设计和功能模块化设计方法,有利于使复杂设计具有更清晰的结构。
1库组成
在VHDL中,常用的库有IEEE、STD、WORK、用户库等。库文件常用的语句为元件(COMPONENT)和子程序(过程和函数),为了使程序包能够被编译,元件和子程序必须被添加到被称为包集合的程序包中。用户库是用户定义库的简称,是由用户自己创建并定义的库。设计者可以把自己开发的非标准包集合和实体等汇集成在一起定义成一个库,作为对VHDL标准库的补充。用户将需要重复使用的代码以元件和子程序的形式放到包集合中,编译到目标库中,生成用户库,供其它设计单元调用。在设计中要使用某个程序包中的内容时,用USE语句即可打开该程序包。
2库构件说明
2.1包集合
在用户库中,包集合放置的是用户自己定义的元件、函数、过程。包集合包括包头和包体两部分。包头用来声明包中的类型、元件和子程序;而包体则用来存放说明中的元件源代码和子程序。程序包声明单元的语法格式为:
PACKAGE 程序包名 IS
说明语句
END [程序包名];
其中说明语句为:USE语句、类型定义、常量定义、元件声明、子程序声明及信号声明等。程序包体单元的的语法格式为:
PACKAGE BODY程序包名 IS
说明语句
END [程序包名];
2.2元件
用户库通过元件定义的方式,将一些设计好的电路单元纳入,其他设计体则通过元件实例化的方法调用这些元件,使得元件与其他设计实体中的端口相连接,从而为当前设计实体引入低一级的设计层次设计。
2.2.1元件定义
元件定义语句放在包集合的包头中,指出包集合所包含的具体元件,元件源代码可以独立编译,不需要纳入包集合中。元器件定义语句的语法格式为:
COMPONENT元件名IS
GENERIC(常量、参数列表);
PORT(元件端口列表);
END COMPONET;
其中,常量、参数列表与元件源代码实体中的GENERIC部分相同;元件端口列表,与元件源代码实体中的PORT部分相同。
2.2.2元件调用
元件调用称为元件实例化,在元件实例化过程中有位置映射和名称映射两种方法可以实现。
位置映射中参数、端口信号名称在顺序、端口状态和数据类型上必须和元件源代码保持一致,各个参数、端口意义取决于它的位置。位置映射元件实例化语句的语法格式为:
COMPONENT元件名(
GENERIC MAP (常量、参数列表)
PORT MAP(元件端口列表));
名称映射用符号“=>”连接元件参数、端口和结构体之间的参数、端口。名称映射元件实例化语句的语法格式为:
COMPONENT元件名(
GENERIC MAP(元件源程序常量列表=>常量值)
元件源程序参数列表=>参数量值)
PORT MAP(元件端口列表=>信号名称));
其中,左边列出元件源代码中参数、端口名称,右边列出调用代码中对应的参数值、端口信号名称。左右两边的数值、信号名称可以不相同,语句中位置顺序可以任意。
2.3子程序
VHDL中的子程序有过程(PROCEDURE)及函数(FUNCTION)两类,主程序和子程序之间通过端口参数列表位置关联方式进行数据传送,子程序可以被多次调用完成重复性的任务。子程序包含子程序声明和主体两部分,子程序声明必须要在包头中,子程序主体则放在包体中。
2.3.1函数
函数通常用来实现数据类型转换、逻辑运算、算术运算类型的代码共享和重用,即输入若干参数,通过函数运算求值,最后直接返回一个值。函数应用分为建立和调用两个过程。
1)函数建立
函数分为函数声明和函数主体体,函数声明是包集合与函数的接口界面,放在包集合的包头部分,而函数主体应放在包集合的包体内。函数声明首语句的语法格式为:
FUNCTION 函数名 (参数列表) RETURN 数据类型;
其中,参数列表中为参数名、参数类别及数据类型,函数的参数为信号或常数,默认情况为常数。
函数体语句的语法格式为:
FUNCTION 函数名 (参数列表) RETURN 数据类型 IS
[子程序声明部分;]
BEGIN
顺序语句;
END 函数名;
其中,在RETURN后面的数据类型为函数返回值的类型;子程序声明项用来说明函数体内引用的对象和过程;顺序语句就是函数体,用来定义函数的功能。
2)函数的调用
函数可以单独构成表达式,或者作为表达式的一部分调用。函数调用语句的语法格式为:
函数名 (参数列表);
2.3.2过程
过程的作用是传递信息,即通过参数进行调用代码和过程代码的信息传递。其中参数需说明类别、类型及传递方向。
1)过程建立
过程分为声明和过程主体,声明应放在包集合的包头部分,过程定义的主体代码应放在包集合的包体内。
过程声明的语法格式为:
PROCEDURE 过程名 (参数列表) ;
其中,参数声列表指明了输入、输出端口的数目和类型。
参数声明的语法格式为:
[数据类型 参数名:模式]
其中,参数可以有任意多个;参数模式有in、out、inout、buffer形式;参数类型,可以是常数、信号、变量,“in” 默认为常数,“out”和“inout”默认为“变量”,若需要将“out”和“inout”作为信号使用,则在过程参数定义时必须指明是信号。
过程定义的语法格式为:
PROCEDURE 过程名 (参数列表) IS
[子程序声明部分];
BEGIN
顺序语句;
END [PROCEDURE] [过程名] ;
2)过程的调用
过程的调用是一条语句,调用时通过其接口返回0个或多个值。过程可以直接调用,也可以在其他语句中调用。过程调用语句的语法格式为:
过程名 (参数);
在过程语句执行结束后,如没有特别说明,输出和输入输出参数将按变量对待将值传递给调用者的变量。如果调用者需要输出和输入输出作为信号使用,则在过程参数定义时要指明是信号。
3库的调用
使用库之前,首先需要对库进行声明。经过声明之后,在设计中就可以调用库中的代码了。用户库声明的语法格式:
LIBRARY 库名;
USE 库名.程序包名.包集合名;
4结束语
用户库是VHDL语言中非常重要的代码分割、共享、重用的方法,只要将重用的代码按功能特性以元件、函数、过程形式构建成可重用部件放置在包集合内,经过编译后生成用户库文件,在后续编码过程中通过库声明即可调用用户库。
用户库的使用可以使代码结构更加清晰,并且库中的代码通常要经过严格的测试和优化,利用用户库进行电路设计,可以在FPGA等可编程逻辑器件中达到最优的性能和最低的逻辑资源使用率,以保证电路的性能和质量。因而,能在降低开发成本、缩短开发周期的同时提高了设计可靠性。
【参考文献】
[1]孙晓东.FPGA软件设计[J].电脑编程技巧与维护,2010(12):5-6.
[2]李冰,吴金,魏同立.基于可重构核的FPGA电路设计[J].固体电子学研究与进展,2003,1(23):108-109.
[3]侯伯亨,顾新.VHDL硬件描述语言与数字逻辑电路设计[M].西安电子科技大学出版社,1999.
[4]乔庐峰,王志功.VHDL数字电路设计教程[M].电子工业出版社,2013.