《vhdl 高级特性 论文》由会员分享,可在线阅读,更多相关《vhdl 高级特性 论文(12页珍藏版)》请在金锄头文库上搜索。
1、 毕业设计(论文)译文题目VHDL 高级特性学生姓名张昕旭学号 2012409737 专业 电气及其自动化 班级 20124097 指导教师黄南山评阅教师完成日期 2016 年 1月14日8VHDL 高级特性在本章中,对一些更深奥的VHDL特性进行了讨论。一些功能可能是有用的对于某些类型有用,而某些类型不适用。本章用典型的使用实例来显示这些特性的使用方法。本章将要讨论的特性包括:重载、限定表达式、用户自定义属性、生成语句、别名、和TEXTIO。有这些特性为设计人员提供了一个高级的编程环境。8.1 重载重载可以使设计人员编写出阅读性更好的程序代码。 当多个子程序或类型使用相同的对象名时,就称对象
2、被重载。在每一个重载的应用实例中,由 VHDL 编译器选择相应的使用对象。在VHDL中,有许多类型可以重载:子程序重载、运算符重载、举重类型重载。子程序重载允许子程序处理不同类型的对象,重载运算符允许运算符对不同类型的对象完成相同的运算,重载使设计人员避免为了某一重复操作而设计多个不同名的子程序。使用重载子程序和重载运算符,可以使设计的程序更加易于读懂、易于维护。8.1.1 子程序重载子程序重载允许设计人员为多个子程序使用相同的程序名,但参数的数量、参数的类型和返回值(如果存在)可以不同。 VHDL 编译器在编译的时候,根据不同的子程序调用选择与之匹配的子程序。如果没有找到与调用匹配的子程序,
3、则产生一个错误提示。下面的例子说明如何根据参数类型重载子程序。LIBRARYIEEE; USE IEEE.std_logic_1164.ALL;PACKAGE p_shift ISTYPE s_int IS RANGE 0 TO 255;TYPE s_array IS ARRAY(0 TO 7) OF std_logic;FUNCTION shiftr( a : s_array) return s_array;FUNCTION shiftr( a : s_int) return s_int;END p_shift;PACKAGE BODY p_shift ISFUNCTION shiftr(
4、a : s_array) return s_array ISVARIABLE result : s_array;BEGINFOR i IN aRANGE LOOPIF i = aHIGH THENresult(i) := 0;ELSEresult(i) := a(i + 1);END IF;END LOOP;RETURN result;END shiftr;FUNCTION shiftr( a : s_int) return s_int ISBEGINRETURN (a/2);END shiftr;END p_shift;这个程序包里p_shift里有两个函数,函数名都是 shiftr ,两个
5、函数都实现向右移功能。但是每个函数只能对一个特定的类型进行右移操作。其中一个函数适用于 s_int 类型,而另一个函数适用于 s_array 类型。 编译器根据调用函数的参数类型选择相应的函数,并返回相应的运算结果。下面例子所示的是不同类型的函数调用,以及每次使用的结果:USE WORK.p_shift.ALL;ENTITY shift_example IS END shift_example; ARCHITECTURE test OF shift_example ISSIGNAL int_signal : s_int;SIGNAL array_signal : s_array;BEGIN-
6、picks function that works with s_int typeint_signal = shiftr(int_signal);- picks function that works with - s_array type array_signal = shiftr(array_signal);- produces error because no function - will match array_signal = shiftr(int_signal); END test;这个程序包里有三次使用了函数shiftr,第1次对函数 shiftr调用时使用的参数类型为s_in
7、t,返回类型也是 s_int。因为包体 p_shi白内第 2 个函数的输入参数类型和返回值的类型均为 s_nt ,与调用函数匹配,所以这次调用使用包内的第2个函数。第 2 次调用函数 shiftr 时使用了 s_array 数组类型的参数和返回值,所以选择使用包体p_shi白内第一个定义的函数。 因为两者的输入参数的类型和返回值的类型都匹配。第 3 次调用函数 shiftr 时,输入参数的类型 s_mt 匹配到了形参类型为 s_int 的函数,但是该函数返回值的类型与目标信号的类型不匹配, 根据 p_shi负包内现有定义的函数,没有找到能准确匹配的函数。 所以,编译器对第 3 行编译时产生一个
8、错误提示。为了使第 3 次函数调用有效,需要再定义一个函数,使新函数的类型与第 3 次调用要求的类型匹配。 在下面的程序行就有声明该函数的样例,至于该函数的函数体作为一个练习,留给读者自己编写。FUNCTION shiftr( a : s_int) return s_array;重载对子程序的参数类型的要求 为了实现子程序重载,两个子程序的参数类型、子程序参数的基类型或者返回值类型必须有差异。 例如,因为同一类型的两个子类型,其基类型相同。 所以,如果两个函数试图重载这两个子类型时, 就会产生一个编译错误信息。 请看下面的例子。PACKAGE type_error ISSUBTYPE log4
9、 IS BIT_VECTOR( 0 TO 3);SUBTYPE log8 IS BIT_VECTOR( 0 TO 7);- this function is Ok FUNCTION not( a : log4) return integer;- this function declaration will cause an- errorFUNCTION not( a : log8) return integer;END type_error;该程序包拥有两个子类型 log4 和 log8 ,然后声明了两个同名的函数,两个函数的输入参数类型分别是这两个子类型。那么第一个函数声明是有效的,但第二个
10、函数声明会产生一个编译错误信息。错误的原因在于这两个函数的参数的基类型相同。两个子类型 log4 和 log8 没有差别, 因为它们属于同一个基本类型。 所有的例子都显示了这是函数的超载的程序,以相同的方式工作。重载对子程序参数的要求具有相同名字的两个或多个子程序可以有数量不同的参数。若这些参数的类型相同,则参数的数量一定不能相同。 请看下面的例子。LIBRARY IEEE; USE IEEE.std_logic_1164.ALL;PACKAGE p_addr_convert ISFUNCTION convert_addr(a0, a1 : std_logic) return integer;
11、FUNCTION convert_addr(a0, a1, a2, a3 : std_logic) returninteger;FUNCTION convert_addr(a0, a1, a2, a3 : std_logic) returninteger;END p_addr_convert;PACKAGE BODY p_addr_convert ISFUNCTION convert_addr(a0, a1 : std_logic) RETURN INTEGER ISVARIABLE result : INTEGER := 0;BEGINIF (a0 = 1) THENresult := re
12、sult + 1;END IF;IF (a1 = 1) THEN result := result + 2; END IF;RETURN result; END convert_addr; FUNCTION convert_addr(a0, a1, a2 : std_logic) RETURN ITEGER IS VARIABLE result : INTEGER := 0; BEGIN result := convert_addr(a0, a1);IF (a2 = 1) THEN result := result + 4; END IF; RETURN result; END convert
13、_addr; FUNCTION convert_addr(a0, a1, a2, a3 : std_logic) RETURNINTEGER IS VARIABLE result : INTEGER := 0; BEGIN result := convert_addr(a0, a1, a2);IF (a3 = 1) THENresult := result + 8; END IF; RETURN result; END convert_addr; END p_addr_convert;这个包声明了三个函数,转换为2,3,或4个输入位成整数表示。每个函数被命名为相同的函数,但根据输入参数的数目,
14、调用相应的函数。如果调用函数时,传送给函数的参数是 2 位,那么就调用具有两个输入参数的函数。 如果传送的输入参数是 3 位,那么就调用具有 3 个输入参数的函数,以此类推。 下面是一个例子,使用这些函数。LIBRARY IEEE; USE IEEE.std_logic_1164.ALL;USE WORK.p_addr_convert.ALL;ENTITY test ISPORT(i0, i1, i2, i3 : in std_logic); END test; ARCHITECTURE test1 OF test IS SIGNAL int1, int2, int3 : INTEGER; B
15、EGIN - uses first function int1 = convert_addr(i0, i1);- uses second function int2 = convert_addr(i0, i1, i2);- uses third function int3 = convert_addr(i0, i1, i2, i3); END test1;第1 次调用 convert_addr 函数时,参数列表中只有两个参数,所以使用 p_addr_convert包中的第 1 个函数。 第 2 次调用时,参数列表中有 3 个参数,所以使用第 2 个函数。 最后一次调用,与第 3 个函数匹配,所以调用了第 3 个函数。8.1.2 重载运算符运算符的重载是对象重载中最重要的应用之一。 因为在 VHDL 语言中,运算符仅适用于对特定的类型进行运算操作,所以就产生了重载运算符的需求。 例如,加法运算符 + 仅适用于整数、实数和物理类型的运算,