资源预览内容
第1页 / 共302页
第2页 / 共302页
第3页 / 共302页
第4页 / 共302页
第5页 / 共302页
第6页 / 共302页
第7页 / 共302页
第8页 / 共302页
第9页 / 共302页
第10页 / 共302页
亲,该文档总共302页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第三章第三章VHDL语言与应用设计语言与应用设计n3.1VHDL硬件描述语言简介硬件描述语言简介n3.2VHDL的结构与语言要素的结构与语言要素n3.3VHDL的基本语句的基本语句n3.4VHDL应用设计实例应用设计实例3.1VHDL硬件描述语言简介硬件描述语言简介VHDL(VHSICHardwareDescriptionLanguage)是一种标准的硬件描述语言,它是在20世纪7080年代中,由美国国防部资助的VHSIC(VeryHighSpeedIntegratedCircuit)项目开发的产品。在这个语言首次开发出来时,其目标仅是使电路文本化的一种标准,为了使人们采用文本方式描述的设计,能够被其他人所理解。1987年,VHDL被正式确定为IEEE 1076标准。VHDL可使各种复杂度(系统级、电路板级、芯片级、门级)的电路网络在同一抽象程度上被描述。1993年,IEEE 1076标准被升级、 更新, 新的VHDL标准为IEEE1164。1996年,IEEE1076.3成为VHDL综合标准。(1).VHDL的优点的优点VHDL已成为一个数字电路和系统的描述、建模、综合的工业标准。在电子产业界,无论ASIC设计人员,还是系统级设计人员,都需要学习VHDL,来提高工作效率。由于VHDL所具有的通用性,它成为可支持不同层次设计者需求的标准语言。VHDL有如下所述的一些优点。1)功能强大, 灵活性强VHDL具有功能强大的语言结构,可用简洁明确的代码描述来进行复杂控制逻辑的设计。它还具有多层次的设计描述功能,支持设计库和可重复使用的元件生成。VHDL是一种设计、模拟、综合的标准硬件描述语言。2)不依赖于器件设计VHDL允许设计者生成一个设计,而并不需要首先选择一个用来实现设计的器件。对于同一个设计描述,可以采用多种不同的器件结构来实现其功能。若需对设计进行资源利用和性能方面的优化,也并不是要求设计者非常熟悉器件的结构才行。3)可移植性因为VHDL是一个标准语言,故VHDL的设计描述可以被不同的工具所支持,可以从一个模拟工具移植到另一个模拟工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台去执行。4)性能评估能力非依赖器件的设计(DeviceIndependentDesign)和可移植能力允许设计者采用不同的器件结构和不同的综合工具来评估设计。设计者可以进行一个完整的设计描述,并且对其进行综合,生成选定的器件结构的逻辑功能,然后评估结果,选用最适合你设计需求的器件。为了衡量综合的质量,可用不同的综合工具所得到的综合结果来进行分析、评估。(2).VHDL的不足之处的不足之处 VHDL的不足之处是:(1)电路采用高级的简明结构VHDL描述,意味着放弃了对电路门级实现定义的控制;(2)由综合工具生成的逻辑实现效果有时不优化;(3)采用工具的不同导致综合质量不一样。VHDL设计数字系统,可划分为设计数字系统,可划分为6个步骤:个步骤:(1)设计要求的定义;设计要求的定义;(2)用用VHDL进进行行设设计计描描述述(系系统统描描述述与与代代码码设设计计);(3)原代码模拟;原代码模拟;(4)设计综合、设计综合、设计优化和设计的布局布线;设计优化和设计的布局布线;(5)布局、布局、布线后的设计模块模拟;布线后的设计模块模拟;(6)设设计计实实现现的的工工作作(如如芯芯片片的的物物理理版版图图设设计计、可编程门阵列器件的编程等)。可编程门阵列器件的编程等)。(3).VHDL的设计步骤的设计步骤 (4).VHDL程序的结构程序的结构库说明(库说明(LIBRARY)程序包使用说明(程序包使用说明(USE)实体说明(实体说明(ENTITY)结构体(结构体(ARCHITECTURE)配置(配置(CONFIGURATION)在在VHDL中中,基基本本单单元元是是设设计计实实体体。设设计计实实体体可可以以是是整整个个系系统统,如如像像CPU那那样样复复杂杂的的系系统统,也也可可以以是是一一个个芯芯片片、逻逻辑辑器器件件,或或者者是是一一个个最最简简单单的的门门电电路路。在在VHDL中中,设设计计实实体体可可以以代代表表任任何何一一个个模模块块,它它可可以以是是某某个个层层次次中中的的一一个个元元件件,也也可可以以是是设设计计中中的的顶层模块。顶层模块。设计实体由设计实体由实体说明实体说明和和构造体(结构体)构造体(结构体)所组成。所组成。实体说明用来描述电路的外部特征(接口说明)。实体说明用来描述电路的外部特征(接口说明)。构造体用来描述电路的内部逻辑。构造体用来描述电路的内部逻辑。图设计实体的组成3.2VHDL的结构与语言要素的结构与语言要素lVHDL语言是现代数字系统设计的基本硬件描述语言。lVHDL+EDA工具+FPGA器件,构成了典型的数字系统现场集成设计方式,正推动着数字系统设计技术的进步。VHDL硬件描述语言语法的基本要素是:数据对象、 数据类型、 运算符和标识符。3.2.1VHDL基本要素基本要素3.2.1.1数据对象(数据对象(dataobject)定义:可以赋予一个值的对象定义:可以赋予一个值的对象VHDL语言的数据对象有:语言的数据对象有:信号、信号、变量、变量、常量常量信号信号l是描述硬件系统的基本数据对象,类似于电路内部的是描述硬件系统的基本数据对象,类似于电路内部的连线和节点。连线和节点。l信号说明全局量,信号说明全局量,用于描述中的结构(构造)体用于描述中的结构(构造)体(Architecture)、)、实体(实体(Entity)和程序包)和程序包(Package)。)。l信号定义:信号定义:SIGNAL信号名:信号名:数据类型数据类型:=初始值初始值信号定义示例:信号定义示例:SIGNALsl:std_logic:=0定义了一个标准的单值信号定义了一个标准的单值信号sl,初始值为低电平。,初始值为低电平。SIGNALs2:std_logic_vector(15DOWNTO0)定义了一个标准的位矢量信号定义了一个标准的位矢量信号s2,共有,共有16个信号元素。个信号元素。l信号定义了数据类型后,就可对其赋值。信号信号定义了数据类型后,就可对其赋值。信号的赋值语句格式为:的赋值语句格式为:目标信号名目标信号名=表达式;表达式;例:例:a=y;a=1;s1=s2after10ns;表示表示s2经经10ns延迟后,延迟后,其值才赋值到其值才赋值到s1中。中。变量变量l是指在设计实体中值会发生变化的量,程序运是指在设计实体中值会发生变化的量,程序运算中的中间量。算中的中间量。l用于对暂时数据进行存储,是局部量。用于对暂时数据进行存储,是局部量。l其主要作用是用在进程中作为临时的数据存储其主要作用是用在进程中作为临时的数据存储单元。单元。变量定义的语句格式为:变量定义的语句格式为:VARIABLE变量名:数据类型变量名:数据类型:=初始值初始值例:例:VARIABLEa:integerrange0TO15;定义定义a的取值范围是从的取值范围是从0到到15的整型变量的整型变量VARIABLEb,c:integer:=2;定义定义b,c为初始值为初始值2的整型变量的整型变量VARIABLEd:std_logic;定义定义d为标准逻辑位类型的变量为标准逻辑位类型的变量变量赋值格式为:变量赋值格式为:目标变量名:目标变量名:=表达式;表达式;其中,变量赋值符号是其中,变量赋值符号是“:=”;“表达式表达式”必须是一个与必须是一个与“目标变量名目标变量名”具有相同数据具有相同数据类型的数值。类型的数值。表达式可以是一个运算表达式,也可是一个数值。表达式可以是一个运算表达式,也可是一个数值。目标变量可以是单值变量,也可是一个变量的集合,目标变量可以是单值变量,也可是一个变量的集合,如位矢量类型的变量。如位矢量类型的变量。例:例:VARIABLEx,y:real;VARIABLEa,b:std_logic_vector(7DOWNTO0);x:=100.0;实数赋值实数赋值y:=1.5+x;运算表达式赋值运算表达式赋值a:=“10111011”;位矢量赋值;位矢量赋值;a(0TO5):=b(2TO7);段赋值段赋值常量常量l指在指在VHDL程序中值一经定义,就不再发生变化的量。程序中值一经定义,就不再发生变化的量。l常量的物理意义在于用来代表硬件电路的电源或地线。常量的物理意义在于用来代表硬件电路的电源或地线。l常量在构造体(常量在构造体(Architecture)、)、实体(实体(Entity)、)、程程序包(序包(Package)、)、进程语句(进程语句(Process)、)、函数函数(Function)和过程()和过程(Procedure)中均可使用。)中均可使用。常量在使用之前必须进行说明,其说明语句为:常量在使用之前必须进行说明,其说明语句为:CONSTANT常量名常量名,常量名常量名:数据:数据:=表达式;表达式;常量说明示例:常量说明示例:CONSTANTVcc:real:=5.0;CONSTANTGND:real:=0.0;CONSTANTnumber:integer:=8;CONSTANTdelay_time:real:=10ns;信号和变量的区别信号和变量的区别l变量赋值是直接生效的,没有延迟;而信号赋值有延变量赋值是直接生效的,没有延迟;而信号赋值有延时。时。l变量赋值符为变量赋值符为“:=”,信号代入符为信号代入符为“=”。l进程对变量不敏感而对信号敏感。即在变量的赋值语进程对变量不敏感而对信号敏感。即在变量的赋值语句中,句中,该语句一旦执行,该语句一旦执行,其值立即将赋予变量;其值立即将赋予变量;而信而信号的代入,号的代入,其语句执行后不会立即使信号发生代入,其语句执行后不会立即使信号发生代入,在下条语句执行时,在下条语句执行时,仍使用原来的信号值,仍使用原来的信号值,如进程语如进程语句中的敏感表的信号代入就是如此。句中的敏感表的信号代入就是如此。3.2.1.2. . 数据类型数据类型VHDL语言是强类型语言,对各操作数的数据类型有语言是强类型语言,对各操作数的数据类型有严格要求。严格要求。它的数据类型一般可分为标量类型和组合类型,它的数据类型一般可分为标量类型和组合类型,在在实际使用中,实际使用中,也可分成预定义类型和用户定义类型。也可分成预定义类型和用户定义类型。(1)预定义类型预定义类型1)标准数据类型标准数据类型整数整数;不同进制整数常量示例不同进制整数常量示例:2:十进制整数十进制整数10E4:十进制整数十进制整数12_345_678(=12345678)16#D2#:十六进制整数十六进制整数整数文字均是十进制的数。整数文字均是十进制的数。以数制基数表示对文字,格式为以数制基数表示对文字,格式为基数基数#基于该基的整数基于该基的整数.基于该基的整数基于该基的整数#E指数指数其中,第其中,第1部分是用十进制数标明数制进位的基数;部分是用十进制数标明数制进位的基数;第第2部分是数制隔离符号部分是数制隔离符号“#”;第第3部分是表达的文字;部分是表达的文字;第第4部分是指数隔离符号部分是指数隔离符号“#”;第第5部分是用字符部分是用字符“E”加十进制表示的指数部分。加十进制表示的指数部分。例:例:10#254#-十进制表示,等于十进制表示,等于2542#1111_1110# -二进制表示,等于二进制表示,等于25416#FE#-十六进制表示,等于十六进制表示,等于2548#367#-八进制表示,等于八进制表示,等于254实数(浮点数,取值范围实数(浮点数,取值范围-1.0E+38+1.0E38);实数文字也是十进制的数,但需带小数点,如实数文字也是十进制的数,但需带小数点,如188.993,1.0位数据位数据(bit;0,1),取值只能为),取值只能为1,0;CONSTANTc:bit:=1;值为值为1的位类型常量的位类型常量cVARIABLEq:bit:=0;值为值为0的位类类型变量的位类类型变量qSIGNALa,b:bit;两个位类型常量两个位类型常量a,b位矢量位矢量;是基于是基于bit数据类型的数组,如数据类型的数组,如“10110101”使使用用位位矢矢量量需需要要注注明明位位宽宽,即即数数组组中中元元素素的的个个数数和和排排列,例如:列,例如:SIGNALa:bit_vector(7DOWNTO0)信号信号a定义为一个具有定义为一个具有8位位宽的矢量,位位宽的矢量,布尔量布尔量(“假假”,“真真”);false,true字符(字符(ASCII字符);字符);通常用单引号括起来,如通常用单引号括起来,如A;字符区分大小写,如字符区分大小写,如B;不同于不同于b;VHDL中,标识符的大小写是不区分的,但字符的大中,标识符的大小写是不区分的,但字符的大小写是有区别的。小写是有区别的。时间时间;完完整整的的时时间间类类型型包包括括整整数数和和物物理理量量单单位位,且且整整数数和和单单位之间至少留一个空格,如:位之间至少留一个空格,如:55ms,20ns。错误等级错误等级;用用以以表表征征系系统统工工作作状状态态,一一般般有有四四种种:note(注注意意),warning(警告警告),error(出错出错),failure(失败)(失败)自然数(大于等于自然数(大于等于0的整数)的整数);(10)字符串(字符矢量)。字符串(字符矢量)。即字符串数组,必须用双撇号标明,如即字符串数组,必须用双撇号标明,如VARIABLEstring_var:string(1TO7)string_var:“abcd”VHDL有有2种字符串:文字字符串和数位字符串。种字符串:文字字符串和数位字符串。(1)文字字符串)文字字符串是用双硬撇号引起来的一串文字,如:是用双硬撇号引起来的一串文字,如:“ERROR”,“X”,“OTHSAND”(2)数位字符串)数位字符串也称位矢量,是用字符形式表示的多位数码,表也称位矢量,是用字符形式表示的多位数码,表示二进制、八进制或十六进制的数组。示二进制、八进制或十六进制的数组。数位字符串的表示首先要有计数基数,然后将该数位字符串的表示首先要有计数基数,然后将该基数表示的值放在双引号中,基数符以基数表示的值放在双引号中,基数符以B,O,X表示,并表示,并放在字符串的前面。放在字符串的前面。B:二进制基数符号,表示二进制数位二进制基数符号,表示二进制数位0或或1,在字符串,在字符串的每一位表示一个比特。的每一位表示一个比特。O:八进制基数符号八进制基数符号(07),在字符串的每一个数表示八,在字符串的每一个数表示八进制数,即代表一个进制数,即代表一个3位的二进制数。位的二进制数。X:十六进制基数符号十六进制基数符号(0F),在字符串的每一个数表示,在字符串的每一个数表示十六进制数,即代表一个十六进制数,即代表一个4位的二进制数。位的二进制数。例:例:B“111011110”-二进制数数组,位矢量数组长度二进制数数组,位矢量数组长度9O“15”-八进制数数组,位矢量数组长度八进制数数组,位矢量数组长度6X“AD0”-十六进制数数组,位矢量数组长度十六进制数数组,位矢量数组长度12用户自定义数据类型用类型定义语句用户自定义数据类型用类型定义语句TYPE实现:实现:TYPE数据类型名数据类型名数据类型名数据类型名数据类型定义数据类型定义枚举类型枚举类型;整数类型整数类型;实数类型实数类型;数组类型数组类型;存取类型存取类型;文件类型文件类型;记录类型记录类型;时间类型。时间类型。(2)用户定义的数据类型用户定义的数据类型枚举类型枚举类型是一类的数据类型,用文字符号来表示一组实际的二是一类的数据类型,用文字符号来表示一组实际的二进制数。进制数。例:例:TYPEstate1IS(st0,st1,st2,st3)用以表达用以表达4个状态的位矢量长度可以为个状态的位矢量长度可以为2,编码默认值,编码默认值为:为:st0=”00“,st1=”01“,st2=”10“,st3=”11“一般将第一个枚举量的编码为一般将第一个枚举量的编码为0或或0000等,以后的编码等,以后的编码值依次加值依次加1.数组类型数组类型将一组具有相同类型的元素集合在一起,作为一个数将一组具有相同类型的元素集合在一起,作为一个数据对象来处理的数据类型。据对象来处理的数据类型。数组定义格式:数组定义格式:TYPE数组类型名数组类型名ISARRAY约束范围约束范围OF数据类型数据类型实例:实例:TYPEstbISARRARY(7DOWNTO0)OFstd_logic数组名是数组名是stb,各元素分别为,各元素分别为stb(7),stb(0)若若一一个个对对象象可可能能取取值值范范围围是是某某个个类类型型说说明明定定义义范范围围的的子集,则需用到子类型。子集,则需用到子类型。SUBTYPE子类型名子类型名IS数据类型名范围数据类型名范围 例例:SUBTYPEdigitisINTEGERRANGE0TO9(子类型子类型digit为整数的为整数的09范围)范围)子类型子类型digits是把是把integer约束到只含约束到只含10个值的数据类型。个值的数据类型。(3)用户定义子类型用户定义子类型1函数转换法函数转换法数数 据据 类类 型型 的的 变变 换换 函函 数数 通通 常常 由由 “STD_LOGIC_1164”、 “STD_LOGIC_ARITH”、“STD_LOGIC_UNSIGNED”的程序包等提供。的程序包等提供。(4)数据类型转换数据类型转换表典型的类型变换函数以下语句表示以下语句表示bit_vector和和std_logic_vector的赋值语句:的赋值语句:a=XA8十六进制值可赋予位矢量十六进制值可赋予位矢量b=TO_STDLOGICVECTOR(XAF7)b=TO_STDLOGICVECTOR(O5177)八进制变换八进制变换b=TO_STDLOGICVECTOR(B1010_1111_0111)2类型标记转换法类型标记转换法直接利用类型名进行数据类型的转换,与高级语言的直接利用类型名进行数据类型的转换,与高级语言的强制类型转换类似。强制类型转换类似。其语句格式为:其语句格式为:数据类型标志(表达式):数据类型标志(表达式):例:例:VARIABLEa:INTEGER;VARIBALEb:REAL;a:=INTEGER(b);b:=REAL(a);3.2.1.3VHDL操作符操作符lVHDL的各种表达式由操作数和操作符组成。的各种表达式由操作数和操作符组成。其中操作数是各种运算的对象,而操作符则规其中操作数是各种运算的对象,而操作符则规定运算的方式。定运算的方式。lVHDL操作符包括逻辑操作符,关系操作符,操作符包括逻辑操作符,关系操作符,算术操作符和重载运算符。算术操作符和重载运算符。表表VHDL中的运算符的优先级中的运算符的优先级操作符的使用说明操作符的使用说明遵循在操作符之间的操作数是相同数据类型的原则。遵循在操作符之间的操作数是相同数据类型的原则。当一个表达式中有两个以上的运算符时,可使用括号当一个表达式中有两个以上的运算符时,可使用括号将这些运算分组。将这些运算分组。若一串逻辑运算中的算符相同,且是若一串逻辑运算中的算符相同,且是AND,OR,XOR这三个算符中的一种,则不需使用括号;其他情这三个算符中的一种,则不需使用括号;其他情况则需使用括号。况则需使用括号。例:逻辑运算的例:逻辑运算的VHDL描述描述SIGNALa,b,c:std_logic_vector(3DOWNTO0);SIGNALd,e,f,g:std_logic_vector(1DOWNTO0);SIGNALh,i,j,k:std_logic;SIGNALs,m,n,o,p:bollean;a=bANDc;d=eORfORg;-两个操作符两个操作符OR相同,不需括号相同,不需括号s=(mXORn)AND(oXORp);-操作符不同,需加括号操作符不同,需加括号h=iANDjANDk;-操作符相同,不需加括号操作符相同,不需加括号算符操作符号中的并置运算符算符操作符号中的并置运算符&的操作数的数据类型是的操作数的数据类型是一维数组,可以利用其将普通操作数或数组组合起来一维数组,可以利用其将普通操作数或数组组合起来形成新的数组。形成新的数组。“VH”&“DL”的结果为的结果为“VHDL”例如,例如,并置运算符的使用:并置运算符的使用:tmp_b=bAND(en&en&en&en)y=a&tmp_b第第一一个个语语句句表表示示b的的4位位位位矢矢量量由由en进进行行选选择择,得得到到一个一个4位位矢量输出位位矢量输出;第第二二个个语语句句表表示示4位位位位矢矢量量a和和4位位位位矢矢量量b再再次次连连接(并置)接(并置),构成构成8位的位矢量位的位矢量y输出。输出。图所示为并置运算符操作的电路示意。图所示为并置运算符操作的电路示意。图并置运算符操作重载运算符(重载运算符(overloadedoperators)是基本操作符作重新定义的函数型操作符。是基本操作符作重新定义的函数型操作符。很多重载运算符是由很多重载运算符是由IEEE1164和和IEEE1076.3标准所标准所定义的。定义的。例例如如, IEEE 1076标标准准定定义义了了类类型型为为signed和和integer以及以及unsigned和和natural重载运算符重载运算符的函数。的函数。运运算算符符的的重重载载函函数数在在IEEE1076.3标标准准的的numeric_std集集合合包包中中被被定定义义。使使用用时时,此此集集合合包包必必须须用用USE从从句句,使之对设计实体可见。使之对设计实体可见。LIBRARYieee;USEieee.std_logic_1164.all;USEwork.numeric_std.all;ENTITYcompareISPORT(a:INUNSIGNED(3DOWNTO0);x:OUTSTD_LOGIC;ENDadd_vec;ARCHITECTUREcompareOFcompareISBEGINx=1WHENa=123ELSE1;END;标标识识符符的的基基本本作作用用就就是是给给VHDL中中的的语语法法单单位位起起一一个独特的名字,个独特的名字,以区别于其它的语法单位。以区别于其它的语法单位。标标识识符符可可以以是是常常数数、变变量量、信信号号、端端口口、子子程程序序或参数的名字。或参数的名字。在在VHDL87中中有有关关标标识识符符的的语语法法规规范范被被VHDL93全部接受并加以扩展。全部接受并加以扩展。下下面面分分别别介介绍绍扩扩展展前前后后的的标标识识符符命命名名规规则则。为为了了对对二二者者加加以以区区别别,前前者者称称为为短短标标识识符符,后后者者则则称称为为扩扩展标识符。展标识符。3.2.1.4标识符标识符1)短标识符短标识符VHDL87中的短标识符遵循以下命名规则。中的短标识符遵循以下命名规则。有有效效字字符符包包括括: 英英文文字字母母(az, AZ)、数数字字(09)和和下下划划线线(_);必须以英文字母打头;必须以英文字母打头;下下划划线线(_)的的前前后后都都必必须须有有英英文文字字母母或或者者数数字;字;不区分大小写。不区分大小写。在在VHDL设设计计中中,应应该该注注意意在在定定义义短短标标识识符符时时,避开使用避开使用VHDL中的保留字。中的保留字。这些保留字如下这些保留字如下:2)扩展标识符扩展标识符VHDL93中中对对标标识识符符进进行行了了扩扩展展,扩扩展展后后的的标标识识符符遵遵循以下语法规则。循以下语法规则。扩展标识符用反斜杠来分隔。扩展标识符用反斜杠来分隔。如:如:adder,begin_add扩展标识符允许包含图形符号及空格等。扩展标识符允许包含图形符号及空格等。如:如:counter&adder,entity%end扩展标识符的两个反斜杠之间可以用保留字。扩展标识符的两个反斜杠之间可以用保留字。如:如:entity,architecture扩展标识符的两个反斜杠之间可以用数字打头。扩展标识符的两个反斜杠之间可以用数字打头。如:如:1adder,44counter扩展标识符中允许多个下划线相连。扩展标识符中允许多个下划线相连。如:如:addercounter同名的扩展标识符和短标识符不表示同一名称。同名的扩展标识符和短标识符不表示同一名称。如:如:adder和和adder不相同。不相同。扩扩展展标标识识符符中中如如果果含含有有一一个个反反斜斜杠杠,可可以以两两个个反反斜斜杠杠来来代替。代替。如:如:addercounter表示的扩展标识符名称为表示的扩展标识符名称为addercounter。扩展标识符要区分大小写扩展标识符要区分大小写:GATE和和gate不同不同扩展标识符规则使得扩展标识符规则使得VHDL中的标识符的定义更加自由。中的标识符的定义更加自由。3.2.2VHDL程序的结构程序的结构采用VHDL进行数字系统设计,需要根据VHDL的基本语法规则,对所要说明的功能目标进行描述。不管所描述的是一个百万门的数字系统,还是描述一个基本门电路,其基本的结构都是实体。示例:示例:2选选1选择器设计选择器设计图1是一个2选1选择器框图,a,b为输入端,s为控制端,y为输出端,其逻辑功能为:LIBRARYIEEE;-库说明部分库说明部分USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux21IS-实体说明部分实体说明部分PORT(a,b:INSTD_LOGIC;s:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDENTITYmux21;ARCHITECTUREoneOFmux21IS-结构体部分结构体部分BEGINy=a WHENs=0ELSEb WHENs=1;ENDARCHITECTUREone;VHDL程序的基本结构包括:程序的基本结构包括:库说明库说明LIBRARY程序包使用说明程序包使用说明USE实体说明实体说明ENTITY结构体结构体ARCHITECTURE配置配置CONFIGURATION其中,实体和结构体是其中,实体和结构体是VHDL程序的基本组成部程序的基本组成部分分。LIBARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF1ISPORT(CLK :INSTD_LOGIC;D:INSTD_LOGIC;Q:OUTSTD_LOGIC);ENDENTITYDFF1;ARCHITECTUREbhvOFDFF1ISSIGNALQ1:STD_LOGIC;BEGINPROCESS(CLK)BEGINIFCLKEVENTANDCLK=1THENQ1=D;ENDIF;Q=Q1;ENDPROCESS;ENDARCHITECTUREbhv;例:例:D触发器触发器ENTITY 名称IS接口信号说明接口信号说明END名称;ARCHITECTURE 构造名OF实体名IS功能描述功能描述END构造名;d0d1d2q&d0qd2d11.实体(实体(Entity)实实体体主主要要由由实实体体说说明明和和构构造造体体组组成成。实实体体说说明明描描述电路的外部特征述电路的外部特征;结构体描述的是电路内部的逻辑。结构体描述的是电路内部的逻辑。(1)实体说明主要包括实体说明主要包括:类属参数说明类属参数说明;端口说明。端口说明。实体说明语句格式为:实体说明语句格式为:ENTITY实体名实体名ISGENERIC(类属表类属表)PROT(端口表)(端口表)END实体名实体名LIBARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF1ISPORT(CLK:INSTD_LOGIC;D:INSTD_LOGIC;Q:OUTSTD_LOGIC);END ENTITYDFF1;l类属说明语句类属说明语句GENERIC类属参量是一种端口界面常数,以一种说类属参量是一种端口界面常数,以一种说明的形式放在实体或块结构体前的说明部分。明的形式放在实体或块结构体前的说明部分。类属为设计实体和其外部环境的通信的静类属为设计实体和其外部环境的通信的静态信息提供通道,特别用来规定端口的大小、态信息提供通道,特别用来规定端口的大小、实体中子元件的数目、实体的定时属性等。实体中子元件的数目、实体的定时属性等。类属说明的一般格式为:类属说明的一般格式为:GENERIC(常数名:数据类型(常数名:数据类型:=设定值设定值;常数名:数据类型常数名:数据类型:=设定值设定值);例:对于译码器电路,其特点是有例:对于译码器电路,其特点是有n个输入,就个输入,就有有2n个输出。用类属统一描述为:个输出。用类属统一描述为:ENTITYdecoderISGENERIC(n:positive);PROT(se1:INbit_vector(1TOn);dout:OUTbit_vector(1TO2*n);ENDdecoderl端口说明语句端口说明语句PROT端口为设计实体和外部环境的动态通信提供端口为设计实体和外部环境的动态通信提供通道,实体端口说明语句格式为:通道,实体端口说明语句格式为:PORT(端口名:端口模式(端口名:端口模式数据类型;数据类型;端口名:端口模式端口名:端口模式数据类型);数据类型);端口名:为实体的对外通道所取的名字端口名:为实体的对外通道所取的名字端口模式:定义了端口模式:定义了4种常用模式,种常用模式,输入输入IN:用于时钟、控制和单向数据的输入;用于时钟、控制和单向数据的输入;输出输出OUT:主要用于计数输出;主要用于计数输出;双向双向BUFFER:信号输出到实体外部,同时在信号输出到实体外部,同时在内部反馈使用内部反馈使用缓冲缓冲INOUT:信号是双向的,可进入信号是双向的,可进入/离开实离开实体。体。端口定义INPUTPORTOUTPUTPORT数据类型:数据类型:VHDL预定义的数据类型有,预定义的数据类型有,整数数据类型整数数据类型布尔数据类型布尔数据类型boolean标准逻辑位数据类型标准逻辑位数据类型std_logic位数据类型位数据类型bit(逻辑位逻辑位1和和0)2结构体结构体用以描述实体的内部结构和实体端口之间用以描述实体的内部结构和实体端口之间的逻辑关系。的逻辑关系。具体实现一个实体,每个实体有多个结构具体实现一个实体,每个实体有多个结构体。体。对有多个结构体的实体,必须用对有多个结构体的实体,必须用CONFIGURATION配置语句说明配置语句说明结构体的语句格式为结构体的语句格式为ARCHITECTURE结构体名结构体名OF实体名实体名IS说明语句说明语句BEGIN并行处理语句并行处理语句ENDARCHITECTURE结构体名结构体名说明语句说明语句:对结构体的功能描述语句中用到的:对结构体的功能描述语句中用到的信号信号SIGNAL,数据类型,数据类型TYPE,常数,常数CONSTANT,元件,元件COMPONENT,函数,函数FUNCTION和过程和过程PROCEDURE等加以说明等加以说明的语句。的语句。并行处理语句并行处理语句:描述结构体的行为和结构:描述结构体的行为和结构例例:设设a,b是是或或非非门门的的输输入入端端口口,c是是输输出出端端口口,y是是结结构构体体内内部部信信号号,VHDL描描述述的的二二输输入入或或非非门门的的结结构构体体为:为:ARCHITECHTUREnor1OFnor_2ISSIGNALy:std_logicBEGINy=aORb;c=NOTy;ENDnor1;图设计实体与其实体说明、构造体的关系3配置配置配配置置语语句句是是VHDL设设计计实实体体中中的的一一个个基基本本单单元元,综综合合和仿真中可用配置语句为实体配置一个结构体。和仿真中可用配置语句为实体配置一个结构体。设设计计者者可可以以利利用用配配置置语语句句来来选选择择不不同同的的构构造造体体,使使其其与要设计的实体相对应。与要设计的实体相对应。在在仿仿真真某某个个实实体体时时,可可利利用用配配置置来来选选择择不不同同的的构构造造体体进行性能对比试验,进行性能对比试验,以得到性能最佳的实体。以得到性能最佳的实体。CONFIGURATION配置名配置名OF实体名实体名IS语句说明语句说明END配置名配置名最简单的配置格式:最简单的配置格式:CONFIGURATION配置名配置名OF实体名实体名ISFOR选配构造体名选配构造体名ENDFOREND配置名配置名4.库、库、程序包程序包1)库库VHDL的的库库是是用用来来放放置置和和存存储储可可编编译译设设计计单单元元的的仓仓库。库。为为了了方方便便使使用用VHDL进进行行编编程程,IEEE将将预预定定义义的的数数据据类类型型、元元件件调调用用声声明明及及一一些些常常用用子子程程序序收收集集在在一一起,形成程序包,供设计程序时共享和调用。起,形成程序包,供设计程序时共享和调用。若若干干程程序序包包形形成成库库,库库可可以以使使设设计计者者共共享享已已经经编编译的设计成果和数据。译的设计成果和数据。VHDL程程序序利利用用库库中中的的单单元元时时,需需要要在在每每个个实实体体开开始始说说明明引引用用的的库库,然然后后利利用用USE子子句句来来指指明明要要使使用用库库中中的的哪哪一一个个设设计计单单元元,即即每每个个实实体体开开始始均均要要有有打打开开库库或或程序包的语句。程序包的语句。常常用用的的库库是是IEEE库库。VHDL程程序序需需要要使使用用库库中中的的单单元元时时,需需要要在在每每个个实实体体开开始始时时说说明明引引用用的的库库,然然后后用用USE子句来说明要使用库中哪一个设计单元。子句来说明要使用库中哪一个设计单元。库说明语句和库说明语句和USE子句的语句结构为:子句的语句结构为:LIBRARY,库名库名;USE.ALLUSE.;关键词关键词LIBRARY指明所使用的库名,指明所使用的库名,USE指明库中程指明库中程序包。序包。例:例: LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_1164.rising_edge;表示打开表示打开ieee库,允许设计程序中被描述器件的输库,允许设计程序中被描述器件的输入、输出端口和数据类型使用入、输出端口和数据类型使用ieee标准库中的标准库中的std_logic_1164.ALL程序包和程序包和std_logic_1164程序包中的程序包中的rising_edge函数。函数。库的种类库的种类nVHDL库分为设计库和资源库,设计库不需要使库分为设计库和资源库,设计库不需要使用用LIBRARY和和USE子句声明,资源库是标准模块子句声明,资源库是标准模块和常规元件存放的库,使用之前需要声明。和常规元件存放的库,使用之前需要声明。nVHDL库的设计库主要是库的设计库主要是STD库、库、WORK库;库;nVHDL库的资源库包括用户定义库和库的资源库包括用户定义库和IEEE库库。(1)IEEE库库该库存放了该库存放了IEEE1076中的标准设计单元,中的标准设计单元,如程序包如程序包std_logic_1164、numeric_std和和numeric_bit。其中其中std_logic_1164是最重要和最常用的程是最重要和最常用的程序包。序包。Synopsys的的std_logic_arith,std_logic_signed,std_logic_unsigned也并入了也并入了IEEE库。库。(2)STD库库逻辑名为逻辑名为STD的库是所有设计单元隐含定的库是所有设计单元隐含定义的库,义的库,即下面的即下面的LIBRARY子句隐含存在任子句隐含存在任意设计单元之前,意设计单元之前,而不需显式地写出。而不需显式地写出。LIBRARYSTD;STD库库中中包包含含预预定定义义的的程程序序包包Standard和和Textio。(3)WORK库库用用户户当当前前库库,可可用用于于保保存存当当前前正正在在进进行行的的设设计计;它它也也是是在在开开发发过过程程中中,各各种种VHDL工工具具处理设计文件的地方。处理设计文件的地方。用用户户在在设设计计项项目目中中已已经经设设计计好好的的,正正在在校校验、未仿真的中间件等均放在工作库验、未仿真的中间件等均放在工作库work中。中。(4)用户定义库用户定义库VHDL工具厂商往往都有他们自己的资源库,工具厂商往往都有他们自己的资源库,其其中包括各厂商自己预定义的程序包。中包括各厂商自己预定义的程序包。用户可以直接使用户可以直接使用这些库。用这些库。另外,另外,用户也可以建立自己的资源库,用户也可以建立自己的资源库,如如对每个项目建立的用户库等。对每个项目建立的用户库等。为为了了使使用用已已经经定定义义好好的的某某个个资资源源库库,必必须须在在要要使使用用资资源源库库的的每每个个设设计计单单元元的的开开头头用用LIBRARY子子句句显显式式地说明。地说明。(5)面向面向ASIC库库FPGA公公司司提提供供的的现现成成的的IP资资源源库库,有有许许多多可可以以由由用用户户定定制制的的功功能能元元件件形形式式出出现现的的设设计计。这这些些元元件件的的功功能能范范围围从从简简单单的的加加法法器器、多多路路选选择择器器等等到到复复杂杂的的系系统统级级的的滤滤波波器器、存存储储器器模模块块等等。这这些些功功能能元元件件都都经经过过专专业业设设计计和和验验证证,并并在在性性能能和和占占用用器器件件资资源源等等方方面面进进行了优化。行了优化。应用它们对提高设计效率和质量十分有利。应用它们对提高设计效率和质量十分有利。2)程序包程序包程程序序包包是是一一个个可可编编译译的的设设计计单单元元,也也是是库库结结构构中中的的一一个个层层次次,用用来来存存放放各各个个设设计计共共享享的的信信号号定定义义、常常数数定定义义、数数据据类类型型、元元件件结结构构、函数定义和过程定义等。函数定义和过程定义等。程序包的一般格式:程序包的一般格式:PACKAGE程序包名程序包名IS说明单元说明单元ENDPACKAGE程序包名程序包名;以下为程序包包体单元以下为程序包包体单元PACKAGEBODY程序包名程序包名IS说明单元说明单元ENDPACKAGEBODY程序包名程序包名;程序包体名应该与其对应的程序包说明的名字相同。程序包体名应该与其对应的程序包说明的名字相同。程程序序包包说说明明单单元元是是主主设设计计单单元元,它它可可以以独独立编译并插入设计库中。立编译并插入设计库中。程程序序包包体体是是次次级级单单元元,它它可可以以在在其其对对应应的的主主设设计计单单元元编编译译并并插插入入设设计计库库之之后后独独立立进进行行编编译,译,然后插入设计库中。然后插入设计库中。例如:程序包的说明单元PACKAGEmy_packageISFUNCTIONand_f(a,b:STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTOR;TYPEmy_arrayISARRAY2DOWNTO0OFSTD_LOGIC_VECTOR(3DOWNTO0);CONSTANTmy_5v:STD_LOGIC_VECTOR(7DOWNTO0):=(OTHER=1);END;程序包的包体单元PACKAGEBODYmy_packISFUNCTIONadd_f(a,b:STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTORISBEGINRETURN(0&A)+b);END;常用程序包常用程序包VHDL标准提供了一些预先定义的标准程序包,标准提供了一些预先定义的标准程序包,包括包括standard,textio,std_logic_1164,numeric_std,numeric_bit等程序包。等程序包。std_logic_1164程序包程序包定义了一些数据类型、子类型和函数,这些定定义了一些数据类型、子类型和函数,这些定义将义将VHDL扩展为能描述多值逻辑的硬件描述扩展为能描述多值逻辑的硬件描述语言。语言。该程序包对所有设计实体均不可见,在使用时该程序包对所有设计实体均不可见,在使用时需在需在VHDL开始部分添加以下语句:开始部分添加以下语句:LIBRARYieee;USEieee.std_logic_1164.ALL;std_logic_arith程序包程序包该程序包已预先编译在该程序包已预先编译在ieee库中,在库中,在std_logic_1164程序包基础上的扩展。程序包基础上的扩展。std_logic_signed和和std_logic_unsigned程序包程序包该程序包已预先编译在该程序包已预先编译在ieee库中,其中库中,其中std_logic_signed定义有符号数的运算,定义有符号数的运算,std_logic_unsigned定义无符号数的运算,定义无符号数的运算,standard程序包程序包存在于标准设计库存在于标准设计库std中。定义了布尔量类型,中。定义了布尔量类型,位类型,字符类型,实数类型,整数类型等。位类型,字符类型,实数类型,整数类型等。textio程序包程序包存在于标准设计库存在于标准设计库std中。定义了中。定义了line类型,类型,text类型,文件类型,文件input等。等。程序包程序包textio对所有设计实体均不可见,故在使对所有设计实体均不可见,故在使用它时需要在用它时需要在VHDL程序的开始部分添加:程序的开始部分添加:LIBRARYstd;USEstd.textio.ALL;3.3VHDL的基本语句的基本语句VHDL语语句句主主要要是是并并行行语语句句Concurrentstatements和和顺序语句顺序语句Sequentialstatements。并并行行语语句句在在执执行行过过程程中中,语语句句的的执执行行顺顺序序与与语语句句的的书书写顺序无关,所有语句是并发执行的。写顺序无关,所有语句是并发执行的。顺顺序序语语句句在在执执行行过过程程中中,语语句句的的执执行行顺顺序序按按照照语语句句的的书写顺序依次执行的。书写顺序依次执行的。并并行行语语句句主主要要用用于于表表示示算算法法模模块块间间的的连连接接关关系系,顺顺序序语句主要用于实现模型的算法部分。语句主要用于实现模型的算法部分。结构体中各个模块之间是并行执行的,应采用并行语结构体中各个模块之间是并行执行的,应采用并行语句来描述。句来描述。模块内部的语句则需根据描述方式决定,即模块内部模块内部的语句则需根据描述方式决定,即模块内部既可采用并行描述语句,也可采用顺序描述语句。既可采用并行描述语句,也可采用顺序描述语句。实际电子系统中,几乎所有操作都是并发执行的。实际电子系统中,几乎所有操作都是并发执行的。这这些些操操作作没没有有顺顺序序之之分分。一一旦旦得得到到事事件件触触发发,它它们们就就会开始工作。会开始工作。为为了了描描述述电电子子系系统统的的工工作作方方式式,VHDL提提供供了了并并行行描述语句。描述语句。各各种种并并行行语语句句在在结结构构体体中中的的执执行行是是同同步步进进行行的的,即即并行运行的,其执行方式与书写的顺序无关并行运行的,其执行方式与书写的顺序无关3.3.1并行语句并行语句并并行行语语句句内内部部的的语语句句运运行行方方式式包包括括并并行行执执行行方方式式(块块语语句)和顺序执行方式(进程语句)句)和顺序执行方式(进程语句)并行语句在结构体中的格式为:并行语句在结构体中的格式为:ARCHITECTURE结构体结构体OF实体名实体名IS说明语句;说明语句;BEGIN并行处理语句;并行处理语句;END结构体名结构体名VHDL中的主要并行语句包括:中的主要并行语句包括: 信号赋值语句信号赋值语句; 块(块(BLOCK)语句)语句; 进程(进程(PROCESS)语句)语句; 过程调用语句过程调用语句; 生成(生成(GENERATE)语句)语句; 元件例化语句元件例化语句; 断言断言(ASSERT)语句。语句。并并行行信信号号复复制制语语句句用用于于进进程程和和子子程程序序外外部部的的信信号赋值。号赋值。并行信号赋值语句有并行信号赋值语句有3种形式:种形式:基本基本(简单简单)信号赋值语句、信号赋值语句、条件信号赋值语句、条件信号赋值语句、选择信号赋值语句。选择信号赋值语句。1)信号赋值语句信号赋值语句(1)基本信号赋值语句基本信号赋值语句(2)将将信信号号直直接接赋赋给给赋赋值值目目标标,其其格格式式如下:如下:赋值目标赋值目标=表达式表达式;注意:赋值目标的数据对象必须是信号,注意:赋值目标的数据对象必须是信号,=两边的数据类型必须一致。两边的数据类型必须一致。多条并发信号赋值语句是并行执行的。多条并发信号赋值语句是并行执行的。例:如下结构体中例:如下结构体中3条信号赋值语句并行执行。条信号赋值语句并行执行。ARCHITECTUREcurtOFbclISSIGNALs,e,f,g,h:std_logic;BEGINoutput1=aANDb;output2=c+d;g=eORf;ENDcurt;(2)条件信号赋值语句条件信号赋值语句在在满满足足条条件件表表达达式式的的情情况况下下将将表表达达式式的的值值赋赋给给目目标标信信号,号,其格式如下:其格式如下:赋值目标赋值目标=表达式表达式WHEN赋值条件赋值条件ELSE-第一句表达式表达式WHEN赋值条件赋值条件ELSE-第二句表达式;表达式;-最后一句1)执行该语句的过程是,首先判断第一句中的赋值条件是)执行该语句的过程是,首先判断第一句中的赋值条件是否满足,若满足时就把对应的表达式的值传递个赋值目标,否满足,若满足时就把对应的表达式的值传递个赋值目标,并且结束该赋值语句(整个语句);否则,判断第二句中并且结束该赋值语句(整个语句);否则,判断第二句中的赋值条件,的赋值条件,如果所有的赋值条件都不满足,把最,如果所有的赋值条件都不满足,把最后一句表达式的值传递给赋值目标。后一句表达式的值传递给赋值目标。2)语句的执行具有优先次序,第一条优先级最高;)语句的执行具有优先次序,第一条优先级最高;3)赋值目标与表达式的值数据类型应相同;)赋值目标与表达式的值数据类型应相同;4)赋值条件是布尔量,为真时表示条件满足)赋值条件是布尔量,为真时表示条件满足;5) 这是一种并行描述语句,不能在进程和子程序中使用。这是一种并行描述语句,不能在进程和子程序中使用。例:利用条件信号赋值语句描述例:利用条件信号赋值语句描述4选选1数据选择电路程序数据选择电路程序LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYmux41_2ISPROT(s1,s0,d0,d1,d2d3:INstd_logic;q:OUTstd_logic);ENDmux41_2;ARCHITECTUREbhvOFmux41_2ISSIGNALsel:std_logic_vector(1DOWNTO0);BEGINsel=s1&s0;q=d0WHENsel=“00”ELSEd1WHENsel=“01”ELSEd2WHENsel=“10”ELSEd3WHENsel=“11”ELSEX;ENDbhv;(3)选择信号赋值语句选择信号赋值语句与与条条件件信信号号赋赋值值语语句句基基本本相相同同,都都是是在在条条件件表表达达式式为为真时将表达式赋给目标信号,只是在基本格式上有所不同。真时将表达式赋给目标信号,只是在基本格式上有所不同。选择信号赋值语句的基本格式如下:选择信号赋值语句的基本格式如下:WITH表达式表达式SELECT目标信号目标信号=表达式表达式1WHEN选择条件选择条件1;表达式表达式2WHEN选择条件选择条件2; 表达式表达式nWHEN选择条件选择条件n;先进行选择条件表达式的判断,然后根据其值来决定把哪先进行选择条件表达式的判断,然后根据其值来决定把哪一个表达式赋给目标信号。一个表达式赋给目标信号。例:利用选择信号赋值语句描述例:利用选择信号赋值语句描述4选选1数据选择电路程序数据选择电路程序LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYmux41_3ISPROT(s1,s0,d0,d1,d2d3:INstd_logic;q:OUTstd_logic);ENDmux41_3;ARCHITECTUREbhvOFmux41_3ISSIGNALsel:std_logic_vector(1DOWNTO0);BEGINsel=s1&s0;WITHselSELECTq=d0WHEN“00”d1WHEN“01”d2WHEN“10”d3WHEN“11”ZWHENOTHERS;ENDrtl;选择信号赋值语句需注意:选择信号赋值语句需注意:仅当条件表达式的值满足选择条件时,才能将表达式仅当条件表达式的值满足选择条件时,才能将表达式赋给目标信号赋给目标信号是并行描述语句,不能在进程和子程序中使用是并行描述语句,不能在进程和子程序中使用表达式后面均含表达式后面均含WHEN子句。子句。块块语语句句把把多多个个并并行行语语句句打打包包,形形成成结结构构体体中中的的一一个个单单独的块区域,独的块区域,可以看作结构体中的一个子模块。可以看作结构体中的一个子模块。BLOCK语句的目的是改善并行语句及其结构的可读性。语句的目的是改善并行语句及其结构的可读性。2)块(块(BLOCK)语句)语句其基本格式如下:其基本格式如下:块标号:块标号:BLOCK(保护表达式保护表达式)块说明部分语句块说明部分语句BEGIN并行描述语句并行描述语句ENDBLOCK块标号;块标号;1)块语句本身是并行语句,块内的语句也需是并行语句。)块语句本身是并行语句,块内的语句也需是并行语句。2)语句包括类属说明语句和端口说明语句。类属说明语)语句包括类属说明语句和端口说明语句。类属说明语句用于参数的定义,端口说明语句用于信号的定义,句用于参数的定义,端口说明语句用于信号的定义,通常用通常用GENERIC,PORT语句来实现。语句来实现。3)块中定义的数据类型、数据对象(信号、变量和常量)块中定义的数据类型、数据对象(信号、变量和常量)、子程序等都是局部的。在块嵌套时,外层定义的内、子程序等都是局部的。在块嵌套时,外层定义的内容可被内层接受,反之则不然。如果块中出现同名数容可被内层接受,反之则不然。如果块中出现同名数据对象,则遵循相邻优先的原则。据对象,则遵循相邻优先的原则。例:例:含含BLOCK语句的语句的1位全加器位全加器LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYfull_adderISPORT(a,b,ci:INstd_logic;co:OUTstd_logic;s:OUTstd_logci);ENDfull_adder;ARCHITECTURrtlOFfull_adderISBEGINexample:BLOCKPORT(a_tmp,b_tmp,ci_tmp:INstd_logic;co_tmp:OUTstd_logic;s_tmp:OUTstd_logic);PORTMAP(a,b,ci,co,s);SIGNALtmp1,tmp2:std_logic;BEGINP1:PROCESS(a_tmp,b_tmp)BEGINtmp1=a_tmpXORb_tmp;ENDPROCESSP1;P2:PROCESS(tmp1,ci_tmp)BEGINtmp2=tmp1ANDci_tmp;ENDPROCESSP2;P3:PROCESS(tmp1,ci_tmp)BEGINs_tmp=tmp1XORci_tmp;ENDPROCESSP3;P4:PROCESS(a_tmp,b_tmp,tmp2)BEGINco_tmp=tmp2OR(a_tmpANDb_tmp);ENDPROCESSP4;ENDBLOCKexample;ENDrtl;一一个个结结构构体体可可包包一一个个或或多多个个进进程程语语句句,各各个个进进程语句之间是并行执行。程语句之间是并行执行。而组成进程语句的各个语句是顺序执行的。而组成进程语句的各个语句是顺序执行的。3)进程进程(PROCESS)语句语句进程语句基本格式如下:进程语句基本格式如下:进进程程标标号号:PROCESS(信信号号敏敏感感表表)IS进程说明部分进程说明部分BEGIN顺序处理语句顺序处理语句ENDPROCESS进程标号;进程标号;ENTITYexampleISPORT(in1,clk:INBIT;Out1:OUTBIT);ENDexample;ARCHTECTUREexampleOFexampleISBEGINPROCESS(clk)BEGINOut1=in1AFTER10ns;ENDPROCESS;ENDexample;进进程程语语句句的的说说明明部部分分用用来来定定义义局局部部变变量量,在在该该说说明明区区中可以说明数据类型、中可以说明数据类型、子程序和变量。子程序和变量。敏感信号列表是列出用于启动本进程可读入的信号名。敏感信号列表是列出用于启动本进程可读入的信号名。通通常常将将所所有有输输入入信信号号均均列列入入敏敏感感信信号号列列表表中中,当当其其中中某个信号变化时,该进程被激活执行。某个信号变化时,该进程被激活执行。不能将变量列入敏感表,因进程只对信号敏感。不能将变量列入敏感表,因进程只对信号敏感。进进程程语语句句中中的的敏敏感感信信号号有有两两种种表表示示方方式式:其其一一是是将将敏敏感感信信号号紧紧跟跟在在保保留留字字PROCESS之之后后的的显显式式敏敏感感表表形形式式;其其二二是是采采用用WAIT语语句句形形式式,即即在在该该进进程程末末加加WAITON信号敏感表。信号敏感表。一一个个进进程程语语句句可可以以看看作作是是一一个个无无限限循循环环:当当进进程程的的最最后后一一个个语语句句执执行行完完成成之之后后,又又从从该该进进程程的的第第一一个个语语句句开始执行。开始执行。在在一一个个进进程程语语句句中中,如如果果没没有有显显式式的的信信号号敏敏感感表表,则则在在进进程程体体内内部部至至少少必必须须含含有有一一个个WAIT语语句句;否否则则,该进程陷入无限循环。该进程陷入无限循环。WAIT语语句句的的执执行行会会暂暂停停进进程程的的执执行行,直直到到信信号号敏敏感感表发生变化或某种条件满足为止。表发生变化或某种条件满足为止。WAIT语句的基本格式有语句的基本格式有3种:种:WAITON信号敏感表;信号敏感表;WAITUNTIL条件表达式;条件表达式;WAITFOR时间表达式。时间表达式。WAITON使使进进程程暂暂停停,直直到到信信号号敏敏感感表表中中的的某某个个信信号号值值发发生生变变化化为为止止;WAITUNTIL语语句句使使进进程程暂暂停停,直直到到预预期期的的条条件件为为真真;WAITFOR语语句句使使进进程程暂暂停停一一段段由时间表达式指定的时间。由时间表达式指定的时间。在在信信号号敏敏感感表表的的位位置置,如如果果没没有有信信号号敏敏感感表表而而有有一一个个条条件件表表达达式式,则则默默认认的的信信号号敏敏感感表表由由在在该该表表达达式式中出现的信号组成。中出现的信号组成。例:含有进程语句的例:含有进程语句的D触发器触发器LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYd_ffISPORT(clk,d:INstd_logic;q,qn:OUTstd_logic);ENDd_ff;ARCHITECTURErtlOFd_ffISBEGINPROCESS(clk)BEGINIF(clkEVENTANDclk=1)THENq=d;qb=NOTd;ENDIF;ENDPROCESS;ENDrtl;其中敏感信号激励方式是敏感信号列表方式。若信号其中敏感信号激励方式是敏感信号列表方式。若信号clk发生变化,发生变化,则程序顺序执行进程中的描述语句。执行完成后,进程语句进入则程序顺序执行进程中的描述语句。执行完成后,进程语句进入等待状态,等待信号等待状态,等待信号clk的下次变化。的下次变化。采用采用WAIT语句的进程描述语句的进程描述D触发器触发器PROCESSBEGINIF(clkEVENTANDclk=1)THENq=d;qb连接端口名,连接端口名,);-元件例化语句元件例化语句p断断言言语语句句可可以以做做并并行行语语句句,也也可可以以做做顺顺序序语语句句,它它是是具有双重特性的语句。具有双重特性的语句。p放放在在进进程程、块块、子子程程序序之之外外是是并并行行语语句句;反反之之,则则是顺序语句。是顺序语句。p断断言言语语句句的的执执行行将将不不引引起起任任何何事事件件的的发发生生,其其用用途途只只是是让让模模拟拟器器在在模模拟拟过过程程中中报报告告指指定定的的错错误误信信息息,以以方方便程序的修改、便程序的修改、编译及仿真。编译及仿真。7)断言断言(ASSERT)语句语句断言语句的基本格式如下:断言语句的基本格式如下:ASSERT条件条件REPORT报告信息报告信息SEVERITY出错级别;出错级别;上上述述格格式式中中的的报报告告信信息息必必须须是是字字符符串串类类型型的的一一段段文文字字;出出错错级级别别则则必必须须是是Severity_Level类类型型的的。如如果果 REPORT子子 句句 缺缺 省省 , 则则 默默 认认 的的 报报 告告 信信 息息 为为“AssertionViolation”;如如果果SEVERITY子子句句缺缺省省,则默认的错误级别为则默认的错误级别为Error。断断言言语语句句检检查查一一个个布布尔尔表表达达式式为为真真或或为为假假。如如果果为为真真,则则该该语语句句不不做做任任何何操操作作;否否则则,断断言言语语句句将将输输出一个用户规定的字符串到标准输出终端。出一个用户规定的字符串到标准输出终端。设计者可以规定输出字符串的严重程度,设计者可以规定输出字符串的严重程度,按严重按严重程度的递增分为程度的递增分为4个级别:个级别:note(注意注意)、warning(告警告警)、error(出错出错)和和failure(失败失败)。这这4个级别的严重程个级别的严重程度允许设计者按适当的类别分类信息。度允许设计者按适当的类别分类信息。note(注注意意)类类别别传传给给用用户户模模块块当当前前发发生生了了一一些些应应予予注注意意的的事事的的信信息息,例例如如,如如果果该该模模型型有有一一个个很很大大的的循循环环并并且且要要花花很很长长时时间间执执行行,一一个个note级级别别的的声声明明可可以以用用来来提醒设计者当前所执行的进度。提醒设计者当前所执行的进度。warning(告告警警)类类别别的的断断言言用用于于在在设设计计暂暂时时不不会会完完全全失失败败时时让让设设计计者者做做些些修修改改,若若不不做做修修改改,则则会会在在后后面面引引起一些有害的结果。起一些有害的结果。error(出出错错)类类别别的的断断言言可可以以让让设设计计者者修修改改将将引引起起不不正正确确工工作作情情况况的的模模块块或或者者整整个个都都会会不不工工作作的的模模块块。如如果果计计算算的的预预期期结结果果应应该该返返回回正正值值,而而实实际际计计算算结结果果得到的是负值,得到的是负值,则根据操作将认为计算出错。则根据操作将认为计算出错。failure(失失败败)类类别别的的断断言言用用于于在在模模型型中中可可能能发发生生有有破破坏坏性性影影响响的的情情况况下下。它它允允许许设设计计者者修修改改设设计计,如如用用exit语语句句退退出出当当前前循循环环。它它可可以以提提醒醒设设计计者者模模块块的的行行为为是是不不正正确确的的。并并行行断断言言语语句句可可用用于于构构造造体体中中和和实实体体的语句说明部分。的语句说明部分。顺顺序序断断言言语语句句与与并并行行断断言言语语句句基基本本相相同同,但但是是只只能用在进程、能用在进程、函数及过程中,函数及过程中,其基本格式如下:其基本格式如下:ASSERT条件条件REPORT报告信息报告信息SEVERITY出错级别;出错级别;上上述述格格式式中中的的报报告告信信息息必必须须是是字字符符串串类类型型的的一一段段文文字字;出出错错级级别别则则必必须须是是Severity_Level 类类型型的的。 如如果果REPORT子子 句句 缺缺 省省 , 则则 默默 认认 的的 报报 告告 信信 息息 为为“AssertionViolation”。如如果果SEVERITY子子句句缺缺省省,则默认的错误级别为则默认的错误级别为Error。VHDL可可提提供供顺顺序序语语句句,用用来来定定义义进进程程、过过程程或或函函数数的行为。的行为。“顺顺序序”是是指指将将完完全全按按照照程程序序中中出出现现的的顺顺序序去去执执行行各各条语句,但其硬件逻辑工作方式未必是顺序执行的。条语句,但其硬件逻辑工作方式未必是顺序执行的。顺序语句只能出现在进程和子程序中。顺序语句只能出现在进程和子程序中。VHDL中中,进进程程是是由由顺顺序序语语句句构构成成,而而进进程程本本身身属属于于并行语句并行语句3.3.2顺序语句顺序语句变量赋值语句变量赋值语句;信号赋值语句信号赋值语句;IF语句语句;CASE语句语句;EXIT语句语句;LOOP语句语句;NEXT语句语句;NULL语句语句;REPORT语句语句;RETURN语句语句;WAIT语句语句;过程调用语句。过程调用语句。VHDL中的顺序语句主要有:中的顺序语句主要有:1)变量赋值语句变量赋值语句在在VHDL中中,变变量量的的说说明明和和赋赋值值只只能能在在进进程程、函函数和过程中进行。数和过程中进行。变量赋值符号为变量赋值符号为“:=”。该该符符号号也也可可用用于于给给任任何何对对象象赋赋初初值值,包包括括变变量量、信号、信号、常量和文件等。常量和文件等。2)信号赋值语句信号赋值语句信信号号赋赋值值语语句句用用于于把把特特定定的的波波形形赋赋予予信信号号,其其基基本格式如下:本格式如下:信号名信号名=表达式;表达式;要求两边的类型和长度要一致。要求两边的类型和长度要一致。信号赋值语句和变量赋值语句的区别:信号赋值语句和变量赋值语句的区别:赋值符号赋值符号=只能对信号赋值,可在顺序语句和只能对信号赋值,可在顺序语句和并行语句中使用并行语句中使用赋值符号赋值符号“:=”只能对变量赋值,在顺序语句只能对变量赋值,在顺序语句中使用中使用信号和变量赋值的操作过程不同信号和变量赋值的操作过程不同变量赋值只能在进程或子程序中使用,不能传递变量赋值只能在进程或子程序中使用,不能传递到进程之外,因此,变量具有局部特征,对其赋值是到进程之外,因此,变量具有局部特征,对其赋值是立即发生的。立即发生的。信号具有全局特征,不但可作为一个设计实体内信号具有全局特征,不但可作为一个设计实体内部各单元之间数据传送的载体,还可通过信号与其他部各单元之间数据传送的载体,还可通过信号与其他实体进行通信。信号的赋值不是立即发生的,发生在实体进行通信。信号的赋值不是立即发生的,发生在一个进程结束时。一个进程结束时。若在同一进程中多次为一个信号赋值,若在同一进程中多次为一个信号赋值,只有最后只有最后一个赋值才起作用一个赋值才起作用,因为信号赋值发生在进程结束时;,因为信号赋值发生在进程结束时;而当变量赋值时,变量值的改变是立即发生的,而当变量赋值时,变量值的改变是立即发生的,即变量将保持当前值,直到被赋予新的值。即变量将保持当前值,直到被赋予新的值。例:信号赋值例:信号赋值LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYsigISPORT(a,b,c:INstd_logic;x,y:OUTstd_logic);ENDsig;ARCHITECTUREsiOFsigISSIGNALd:std_logic;BEGINPROCESS(a,b,c)BEGINd=a;x=cXORd;d=b;y=cXORd;ENDPROCESS;ENDsi;执行结果:执行结果:x=cXORb,y=cXORb.例:变量赋值例:变量赋值LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.ALL;ENTITYvarISPORT(a,b,c:INstd_logic;x,y:OUTstd_logic);ENDvar;ARCHITECTUREvaOFvarISBEGINPROCESS(a,b,c)BEGINd:=a;x:=cXORd;d:=b;y:=cXORd;ENDPROCESS;ENDva;执行结果:执行结果:x:=cXORa,y:=cXORb.l开关控制开关控制IF语句语句格式为:格式为:IF条件条件THEN顺序处理语句顺序处理语句ENDIF3)IF语句语句例:例:D触发器触发器LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYd_ffISPORT(clk,d:INstd_logic;q,qn:OUTstd_logic);ENDd_ff;ARCHITECTURErtlOFd_ffISBEGINPROCESS(clk)BEGINIFclk EVENTANDclk=1THENq=d;qnb时,输出时,输出q=1,否则,否则q=0LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYcomp_abISPORT(a,b:INbit;q:OUTbit);ENDcomp_ab;ARCHITECTUREoneOFcomp_abISBEGINPROCESS(a,b)BEGINIFabTHENq=1;ELSEq=0;ENDIF;ENDPROCESS;ENDonel多路选择控制多路选择控制IF语句语句语句格式为:语句格式为:IF条件条件1THEN顺序处理语句顺序处理语句1;ELSIF条件条件2THEN顺序处理语句顺序处理语句2;ELSE顺序处理语句顺序处理语句n;ENDIF;例:例:4选选1数据选择器数据选择器LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYmux41ISPORT(sel:INstd_logic_vector(1DOWNTO0);d0,d1,d2,d3:INstd_logic;q:OUTstd_logic);ENDmux41;ARCHITECTURErtlofmux41ISBEGINPROCESS(sel,d0,d1,d2,d3)BEGINIFsel=“00”THENq=d0;ELSIFsel=“01”THENq=d1;ELEIFsel=“10”THENq=d2;ELSEsel=“01”THENq顺序处理语句顺序处理语句1;WHEN选择值选择值2=顺序处理语句顺序处理语句2;WHENOTHERS=顺序语句顺序语句n;ENDCASE;4)CASE语句语句说明说明:1)CASE语句中条件句的选择值可以是一个值,或语句中条件句的选择值可以是一个值,或多个值的多个值的“或或”关系;或一个取值范围等。如:关系;或一个取值范围等。如:WHEN值值=顺序处理语句。顺序处理语句。WHEN取值取值1|取值取值2|取值取值n=顺序处理语句。顺序处理语句。WHEN小值小值TO大值大值=顺序处理语句。顺序处理语句。WHEN大值大值DOWNTO小值小值=顺序处理语句。顺序处理语句。执行执行CASE语句时,先计算表达式的值,然后看表达式语句时,先计算表达式的值,然后看表达式与与WHEN后的那个选择值相同,然后执行对应的语句。后的那个选择值相同,然后执行对应的语句。例:例:4选选1数据选择器数据选择器LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYmux41_1ISPORT(s1,s0,d0,d1,d2,d3:INstd_logic;q:OUTstd_logic);ENDmux41_1;ARCHITECTUREbhvOFmux41_1ISSIGNALsel:std_logic_vector(1DOWNTO0);BEGINselTHENqTHENqTHENqTHENqq=NULL;ENDCASE;ENDPROCESS;ENDbhv5)LOOP语句语句LOOP语句又叫循环语句,用于重复执行的操作。语句又叫循环语句,用于重复执行的操作。LOOP语句有两种形式,即语句有两种形式,即FOR模式的模式的LOOP语句和语句和WHILE模式的模式的LOOP语句。语句。FOR模式的模式的LOOP语句语句其基本格式如下:其基本格式如下:循环标号:循环标号:FOR循环变量循环变量IN循环次数范围循环次数范围LOOP顺序处理语句顺序处理语句;ENDLOOP循环标号循环标号;操作过程:操作过程:从从循循环环变变量量的的初初值值开开始始,每每执执行行一一次次循循环环体体中中的的顺顺序序处处理理语语句句后后,循循环环变变量量的的值值自自动动加加1或或减减1,直直到到循循环环变变量量的的值值超超过过循循环环范范围围,程程序序才才跳跳出出循循环环去去执执行行ENDLOOP的后续语句。的后续语句。例:编写例:编写8位奇偶校验逻辑电路的位奇偶校验逻辑电路的VHDL程序,当程序,当8位中位中1的的个数为偶数时,个数为偶数时,y=0;当;当8位中位中1的个数为奇数时,的个数为奇数时,y=1。用用a表示输入信号,它是一个长度为表示输入信号,它是一个长度为8的标准逻辑位矢量。的标准逻辑位矢量。在程序中,用在程序中,用FOR模式的模式的LOOP语句对语句对a的值逐位进行模的值逐位进行模2和(和(XOR)运算,循环变量)运算,循环变量n控制模控制模2和的次数。和的次数。LIBRARAYieee;USEieee.std_logic_1164.ALL;ENTITYp_checkISPORT(a:INstd_logic_vector(7DOWNTO0);y:OUT_std_logic);ENDp_check;ARCHITECTUREoptOFp_checkISBEGINPROCESS(a)VARIABLEtmp:std_logic;BEGINtmp:=0FORnIN0TO7LOOPtmp:=tmpXORa(n);ENDLOOP;y=tmp;ENDPROCESS;ENDopt;WHILE模式的模式的LOOP语句语句其基本格式如下:其基本格式如下:循环标号:循环标号:WHILE循环控制条件循环控制条件LOOP顺序处理语句顺序处理语句;ENDLOOP循环标号循环标号;目目前前,一一般般EDA软软件件可可对对FOR模模式式的的LOOP语语句句进进行行综综合合,而而对对WHILE模模式式的的LOOP语语句句,仅仅高高级级EDA综综合合工工具具才才能能对对其其进进行行逻逻辑辑综综合合,故故尽尽可可能能采采用用FOR模模式的式的LOOP语句。语句。EXIT语句用于语句用于LOOP语句内部的循环控制语句。语句内部的循环控制语句。它它有有条条件件地地或或无无条条件件地地终终止止当当前前循循环环迭迭代代并并终终止止该该循循环。环。若若LOOP标标号号缺缺省省,则则EXIT语语句句作作用用于于当当前前最最内内层层循循环,环,否则转到指定的循环中。否则转到指定的循环中。6)EXIT语句语句EXIT语句有语句有3种格式:种格式:格式格式1:EXIT;格式格式2:EXITLOOP标号;标号;格式格式3:EXITLOOP标号标号WHEN条件表达式条件表达式EXIT语句是用来从整个循环中跳出而结束循环;而语句是用来从整个循环中跳出而结束循环;而NEXT语句是用来结束循环执行过程中的某一次循环,语句是用来结束循环执行过程中的某一次循环,重新执行下一次循环。重新执行下一次循环。例:两元素位矢量值比较程序。当发现例:两元素位矢量值比较程序。当发现a,b不同时,由不同时,由EXIT语句跳出语句跳出循环比较程序,并报告结果。循环比较程序,并报告结果。SIGNALa,b:std_logic_vector(1DOWNTO0);SIGNALa_less_then_b:BOOLEAN;a_less_then_b=FALSE;FORiIN1DOWNTO0LOOPIF(a(i)=1ANDb(i)=0)THENa_less_then_b=FALSE;EXIT;ELSEIF(a(i)=0ANDb(i)=1)THENa_less_then_b=TRUE;EXIT;ELSENULL;ENDIF;ENDLOOP;7)NEXT语句语句NEXT语语句句用用于于LOOP语语句句内内部部,其其作作用用是是终终止止当当前循环迭代并开始下一次循环。前循环迭代并开始下一次循环。NEXT语句的基本格式如下:语句的基本格式如下:NEXT;NEXTLOOP标号标号NEXTLOOPWHEN语句语句;若若LOOP标标号号缺缺省省,则则NEXT语语句句作作用用于于当当前前最最内内层层循循环环;否否则则转转到到指指定定的的循循环环中中。若若WHEN子子句句出出现现但条件为但条件为False,则循环正常继续。则循环正常继续。8)NULL语句语句NULL语语句句表表示示一一个个空空操操作作,不不发发生生任任何何动动作作。执行该语句只是为了使程序流程运行到下一个语句。执行该语句只是为了使程序流程运行到下一个语句。NULL语句的基本格式为:语句的基本格式为:NULL;NULL语语句句常常用用于于CASE语语句句中中,利利用用NULL表表示示CASE语句中所剩余不用的条件选择值下的操作行为语句中所剩余不用的条件选择值下的操作行为ARCHITECTUREbhvOFmux41_1ISSIGNALsel:std_logic_vector(1DOWNTO0);BEGINselTHENqTHENqTHENqTHENqq=NULL;ENDCASE;ENDPROCESS;ENDbhv9)RETURN语句语句RETURN语语句句是是在在一一段段子子程程序序结结束束后后,返返回回主主程程序的控制语句。序的控制语句。只只能能用用在在函函数数与与过过程程体体内内,用用来来结结束束当当前前最最内内层层函数或过程体的执行。函数或过程体的执行。函数返回语句的格式如下:函数返回语句的格式如下:RETURN表达式;表达式;过程返回语句的格式:过程返回语句的格式:RETURN;10)WAIT语句语句WAIT语语句句用用于于进进程程(过过程程)内内部部,提提供供描描述述进进程程语语句对其敏感信号激励的情况。句对其敏感信号激励的情况。在在进进程程中中,当当执执行行到到WAIT语语句句时时,运运行行程程序序将将挂挂起起,直直到到满满足足此此语语句句设设置置的的结结束束条条件件后后,重重新新开开始始执执行进程中的程序。行进程中的程序。WAIT语句的基本格式有语句的基本格式有4种:种:WAIT;使使进进程程语语句句处处于于无无限限等等待待中中,表表示示永永远远挂挂起起,即即此后进程语句将不再执行。此后进程语句将不再执行。WAITON信号敏感表;信号敏感表;敏敏感感信信号号等等待待语语句句,使使得得进进程程处处于于等等待待状状态态,直直到到敏敏感感信信号号表表中中任任一一信信号号发发生生变变化化,才才进进入入执执行行状状态态,继续执行进程中的顺序语句。继续执行进程中的顺序语句。例:例:PROCESSBEGINWAITONa,b;y=aANDb;ENDPROCESS;表表示示当当a,b中中任任一一信信号号发发生生变变化化时时,就就结结束束等等待待状状态,继续执行后续语句,否则处于等待状态。态,继续执行后续语句,否则处于等待状态。WAITUNTIL条件表达式;条件表达式;当当条条件件表表达达式式中中所所含含信信号号发发生生变变化化,且且表表达达式式的的值为值为TRUE时,时,进程才脱离等待状态,执行后续语句。进程才脱离等待状态,执行后续语句。WAITFOR时间表达式时间表达式;为为超超时时等等待待语语句句,从从该该语语句句开开始始,只只要要在在此此时时间间段段内内,进进程程处处于于等等待待状状态态;超超过过这这一一时时间间段段后后,进进程程恢复执行该等待语句的下一条语句。恢复执行该等待语句的下一条语句。例:例:WAITFOR5ns执行到该语句时等待执行到该语句时等待5ns后再执行下一条语句。后再执行下一条语句。WAIT语语句句仅仅在在仿仿真真过过程程中中使使用用,用用来来对对VHDL程程序序进进行功能验证。行功能验证。3.3.3属性描述与定义语句属性描述与定义语句VHDL预定属性语句可用于对信号或其他项目预定属性语句可用于对信号或其他项目的多种属性检测或统计。的多种属性检测或统计。预定义属性描述语句是一个内部预定义函数,预定义属性描述语句是一个内部预定义函数,其格式为:其格式为:属性测试项目名属性测试项目名属性标识符;属性标识符;1)信号类属性)信号类属性最常用的是最常用的是EVENT。clockEVENT是对以是对以clock为标识符的信号,在当为标识符的信号,在当前一个极小的时间段内发生的事件的情况进行检测。前一个极小的时间段内发生的事件的情况进行检测。所谓发生事件是指电平发生变化,即电平发生转所谓发生事件是指电平发生变化,即电平发生转变,变,clock由由0变到变到1,或由,或由1变到变到0。这一测试事件发生。这一测试事件发生与否的表达式将向测试语句返回布尔值与否的表达式将向测试语句返回布尔值TURE,否则为,否则为FALSE。clockEVENTANDclock=1表示对表示对clock信号上升沿的测试,即一旦测试到信号上升沿的测试,即一旦测试到clock有有一个上升沿,此表达式将返回一个一个上升沿,此表达式将返回一个TURE。例:对信号例:对信号clock的上升沿进行检测的的上升沿进行检测的VHDL描述语句描述语句PROCESSIF(clockEVENTANDclock=1)THENq=data;ENDIF;-IF开关控制语句开关控制语句ENDPROCESS;上升沿一旦到来,表达式返回上升沿一旦到来,表达式返回TRUE后,执行赋值语句后,执行赋值语句q=data,并保持。,并保持。3.3.4子程序子程序子程序是一个子程序是一个VHDL程程序模块,是利用顺序语句来定义和完成算序模块,是利用顺序语句来定义和完成算法的。法的。子程序可以在子程序可以在VHDL程序包,结构体和进程中定义。只有程序包程序包,结构体和进程中定义。只有程序包中子程序可被其他设计应用。中子程序可被其他设计应用。子程序只能通过调用子程序的界面端口进行通信。子程序只能通过调用子程序的界面端口进行通信。每调用一次子程序就增加了硬件电路。每调用一次子程序就增加了硬件电路。子程序有过程子程序有过程PROCEDURE和函数和函数FUNCTION两种类型两种类型(1)过程过程(Procedure)过程由过程首和过程体组成。过程由过程首和过程体组成。过程首不是必须的,过程体可独立存在和使用。过程首不是必须的,过程体可独立存在和使用。在进程和结构体中不必定义过程首,而在程序包中必在进程和结构体中不必定义过程首,而在程序包中必须定义过程首。须定义过程首。过程的语句格式为:过程的语句格式为:PROCEDURE过程名(参数表);过程名(参数表);-过程首过程首PROCEDURE过程名过程名IS;-过程体开始过程体开始过程说明部分过程说明部分;BEGIN顺序处理语句;顺序处理语句;END过程名;过程名;-过程体结束过程体结束n过程首过程首定义子程序和外部的界面端口;定义子程序和外部的界面端口;由保留字由保留字PROCEDURE、过程名和参数表、过程名和参数表组成;组成;过程名表示过程的标识符;过程名表示过程的标识符;参数表给出过程中所有参数的列表,定义过参数表给出过程中所有参数的列表,定义过程与外部的接口信息。其语法结构为:程与外部的接口信息。其语法结构为:(对象名称对象名称参数名称参数名称,参数名称参数名称:端口模端口模式式数据类型)数据类型)其中,对象名称用来表示参数对象的标识符,其中,对象名称用来表示参数对象的标识符,通常接受信号、变量和信号通常接受信号、变量和信号3中数据对象;中数据对象;参数名称表示过程参数的标识符号;参数名称表示过程参数的标识符号;端口模式表示过程参数的数据流方向,包括端口模式表示过程参数的数据流方向,包括IN,OUT和和INOUT3种模式。种模式。过程首的定义示例:过程首的定义示例:PROCEDUREprol(VARIABLEa,b:INOUTreal)表示过程表示过程pro1定义了两个实数双向变量定义了两个实数双向变量a,bPROCEDUREpro2(SIGNALsig:INOUTbit)表示过程表示过程pro1定义了信号定义了信号sig,是双向,是双向INOUT,数据类,数据类型是型是bitn过程过程体体由顺序语句组成,用来描述子程序的逻辑功由顺序语句组成,用来描述子程序的逻辑功能;能;过程体中的过程说明语句用来对过程使用的过程体中的过程说明语句用来对过程使用的变量、常数和数据类型进行说明,这些说明变量、常数和数据类型进行说明,这些说明仅在过程中有效,是一个局部变量。仅在过程中有效,是一个局部变量。n过程过程的定义和调用的定义和调用过程可在程序包、结构体和进程语句中定义。过程可在程序包、结构体和进程语句中定义。结构体和进程中定义的子程序只能在本结构结构体和进程中定义的子程序只能在本结构(进程)中使用,程序包中定义的子程序可(进程)中使用,程序包中定义的子程序可被其他设计调用。被其他设计调用。过程调用是指过程作为子程序被主程序调用。过程调用是指过程作为子程序被主程序调用。过程调用是指过程作为子程序被主程序调用,类过程调用是指过程作为子程序被主程序调用,类似高级语言。似高级语言。过程调用遵循以下规则:过程调用遵循以下规则:过程调用语句是一个完整的描述语句,前面可过程调用语句是一个完整的描述语句,前面可加标号;加标号;过程调用语句省略参数的对象类型,端口模式过程调用语句省略参数的对象类型,端口模式和数据类型,通常只含参数名称。和数据类型,通常只含参数名称。可具有多个返回值。可具有多个返回值。结构体中定义和调用过程示例:结构体中定义和调用过程示例:LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYprocedureISPORT(d1:INintegerRANGE0TO31;d2:INintegerRANGE0TO31;fout:OUTintegerRANGE0TO31);ENDprocedure;ARCHITECTUREa2OFprocedureISPROCEDUREjfq(din1:INintegerRANGE0TO31;din2:INintegerRANGE0TO31;din3:INintegerRANGE0TO31)ISBEGINdout:=din1+din2;ENDjfqBEGINPROCESS(d1,d2)VARIABLEfo:integerRANGE0TO31;BEGINjfq(d1,d2,fo);fout=fo;ENDPROCESS;ENDa2;过程在结构体中定义,即在过程在结构体中定义,即在ARCHITECTURE和和BEGIN之间;之间;然后在结构体进程语句中调用;只包含了过程体,无过程首。然后在结构体进程语句中调用;只包含了过程体,无过程首。例:定义一个二输入例:定义一个二输入“与与”过程过程and_2。该过程输入该过程输入两位信号,两位信号,输出一位信号,输出一位信号,输出信号为二输入信号的输出信号为二输入信号的逻辑逻辑“与与”。可先定义过程可先定义过程and_2的外观。的外观。PROCEDUREand_2(SIGNALx,y:INBIT;SIGNALO:OUTBIT;CONSTANTDelay:INTime);再定义过程体再定义过程体 PROCEDUREand_2(SIGNALx,y:INBIT;SIGNALO:OUTBIT;CONSTANTDelay:INTime)ISBEGINIFx=1ANDy=1THENO=1AFTERdelay;ELSEO=0AFTERdelay;ENDIF;RETURN; ENDand_2上上述述过过程程体体中中的的返返回回语语句句RETURN只只是是用用于于结结束束过过程程,不具有返回值的功能。不具有返回值的功能。过程的调用需直接写过程名及参数对应表。过程的调用需直接写过程名及参数对应表。例如:例如:SIGNALA:BIT:=1;SIGNALB:BIT:=0;SIGNALC:BIT:=0;and_2(A,B,C,10ns);Ck)THENtmp:=j;ELSEtmp:=k;ENDIF;RETURNtmp;ENDmax;SIGNALj1,k1:bit_vector(2DOWNTO0);BEGINj1=data1&data2&data3;k1=dat1&dat2&dat3;PROCESS(j1,k1)BEGINIF(set=1)THENdataoutbELSEdataout=max(j1,k1);ENDIF;ENDPROCESS;ENDa3;3.4VHDL的描述方式的描述方式VHDL的结构体用来描述整个设计实体的逻辑功能。的结构体用来描述整个设计实体的逻辑功能。VHDL结构体的描述方法包括:结构体的描述方法包括:行为级,寄存器传输级行为级,寄存器传输级RTL和结构描述。和结构描述。RTL描述也称数据流描述方式。描述也称数据流描述方式。实际中,通常混合使用。实际中,通常混合使用。指指VHDL的结构体只描述电路的功能或行为,而没有直的结构体只描述电路的功能或行为,而没有直接指明实现这些行为的硬件结构。接指明实现这些行为的硬件结构。它只表示输入和输出间转换的行为,不包含结构信息。它只表示输入和输出间转换的行为,不包含结构信息。行为描述通常由一个或多个进程构成,每个进程包含一行为描述通常由一个或多个进程构成,每个进程包含一系列顺序语句。系列顺序语句。3.4.1行为描述行为描述2选选1数据选择器的行为描述数据选择器的行为描述LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYmuxISPORT(d0,d1:INbit;sel:INbit;q:OUTbit;)ENDmux;ARCHITECTUREbehaveOFmuxISBEGINPROCESS(d0,d1,sel)BEGINIFsel=0THENq=d0;ELSEq=d1;ENDIF;ENDPROCESS;ENDbehave;整个程序只是对所设计电路的行为功能做了描述,不整个程序只是对所设计电路的行为功能做了描述,不涉及具体电路内容。涉及具体电路内容。此描述语句中,不存在与硬件选择相关的语句。此描述语句中,不存在与硬件选择相关的语句。3.4.2数据流描述数据流描述即寄存器传输级即寄存器传输级RTL描述,以规定设计中的各种寄存器形式为特描述,以规定设计中的各种寄存器形式为特征,在寄存器之间插入组合逻辑。征,在寄存器之间插入组合逻辑。RTL描述类似布尔方程,可描述时序和组合电路。描述类似布尔方程,可描述时序和组合电路。是非结构化的并行语句描述,建立在并行信号赋值语句描述的基是非结构化的并行语句描述,建立在并行信号赋值语句描述的基础之上。础之上。语句中任一输入信号发生变化,则赋值语句被激活。语句中任一输入信号发生变化,则赋值语句被激活。直观地表达了底层逻辑行为。直观地表达了底层逻辑行为。2选选1数据选择器的数据流描述数据选择器的数据流描述LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYmuxISPORT(d0,d1:INbit;sel:INbit;q:OUTbit;)ENDmux;ARCHITECTUREdatafowOFmuxISSIGNALtmp1,tmp2,tmp3,nsel:bit;BEGINPROCESS(d0,d1,sel)BEGINnsel=NOTsel;tmp1=d0ANDsel;tmp2=d1ANDsel;tmp3=tmp1ORtmp2;qsel,c=nsel);-元件例元件例化化u2:and_2PORTMAP(d0,sel,tmp1);-位置关联位置关联u3:and_2PORTMAP(d1,nsel,tmp2);u4:or_2PORTMAP(tmp1,tmp2,tmp3);q=tmp3;ENDstru;利用结构化,模块化思想,将大设计划分为小的模块,利用结构化,模块化思想,将大设计划分为小的模块,设计调试完成后,利用结构描述方法将其组装形成更复设计调试完成后,利用结构描述方法将其组装形成更复杂的设计。杂的设计。3.4.5VHDL编程风格编程风格1 1 注释和文本格式注释和文本格式在文本开始描述设计文件地功能和端口在文本开始描述设计文件地功能和端口重要语句应加以注释,如果代码更新,注释也应更新重要语句应加以注释,如果代码更新,注释也应更新不应使用语句本身作为注释,例如:不应使用语句本身作为注释,例如:注释应位于其说明的代码之上,并且应该左右均对齐。注释应位于其说明的代码之上,并且应该左右均对齐。在注释分解符和注释文本之间应该留有空格在注释分解符和注释文本之间应该留有空格2 2 常规风格常规风格所有关键词、器件名称、常数、图元应该大写,其他所有关键词、器件名称、常数、图元应该大写,其他文本应该小写文本应该小写3 3 缩进格式指导:缩进格式指导:IFIF语句语句缩进格式指导:缩进格式指导:CASE语句语句缩进格式指导:缩进格式指导:VARIABLE语句语句4 4 命名惯例:使用下划线作(命名惯例:使用下划线作(_ _)为分割符)为分割符命名惯例:不使用含义不明的缩写命名惯例:不使用含义不明的缩写命名惯例:对于常数,不直接在代码中使命名惯例:对于常数,不直接在代码中使用数字,而应该定义一个常数变量名用数字,而应该定义一个常数变量名5 留白在在逻辑段落逻辑段落之间之间增加增加空行空行在下列符号前不要插入空格:在下列符号前不要插入空格:分号分号(;)逗号逗号(,),闭双引号闭双引号(“),or闭括弧闭括弧(),在下列符号后不要插入空格:在下列符号后不要插入空格:开双引号开双引号(“),or开括弧开括弧(),使用使用TAB键对齐冒号键对齐冒号(:)、ENTITY中的标识符等中的标识符等在开括弧在开括弧()之前使用空格,以便分割标识符之前使用空格,以便分割标识符在在 运算符运算符 前后前后 均均 插入空格插入空格3.5应用设计实例应用设计实例例例1:三输入与非门:三输入与非门组合逻辑电路的设计组合逻辑电路的设计逻辑表达式:逻辑表达式:数据流描述数据流描述LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYnand3_gateISPORT(a,b,c:INstd_logic;f:OUTstd_logic;)ENDnand3_gate;ARCHITECTURErtlOFnand3_gateISBEGINf=NOT(aANDbANDc);ENDrtl;例例2:非门:非门逻辑表达式:逻辑表达式:功能表:功能表:af0110法法1LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYnotISPORT(a:INstd_logic;f:OUTstd_logic;)ENDnot;ARCHITECTURErtlOFnotISBEGINf=NOTa;ENDrtl;法法2LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYnotISPORT(a:INstd_logic;f:OUTstd_logic;)ENDnot;ARCHITECTUREbehaveOFnotISBEGINprocess(a);BEGINIFa=1THENf=0;ELSEf=1;ENDIFENDprocess;ENDbehave;例例3:三态门:三态门在普通门电路基础上附加控制电路使得门在普通门电路基础上附加控制电路使得门电路具有高阻状态电路具有高阻状态输入:输入:输出:输出:endindout1001110xZ高阻高阻LIBARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYtri_sISPORT(enable,:INSTD_LOGIC;datain:INSTD_LOGIC_VECTOR(7DOWNTO0);dataout:OUT STD_LOGIC_VECTOR(7DOWNTO0);ENDtri_s;ARCHITECTUREBEHAVOFtri_sISBEGINPROCESS(enable,datain)BEGINIFenable=1THENdataout=datain;ELSEdataout=ZZZZZZZZ;ENDIF;ENDPROCESS;ENDBEHAV;例例4 乘法器乘法器1)乘法的基本原理)乘法的基本原理在在二二进进制制乘乘法法中中,乘乘法法的的基基本本算算法法常常可可用用所所谓谓的的一一位位乘乘法法和和两两位位乘乘法法进进行行。进进行行这这种种乘乘法法运运算算时时,通通常常分分别别用用乘乘数数的的一一位位或或二二位位与与被被乘乘数数相相乘乘,再再把把部部分分积积加加起起来来。例例分分别别用用一一位位乘乘法法和和两两位位乘乘法法求求下下式式的的积积:0111010101001110解解(1)用一位乘法求积。用一位乘法求积。011101010100111000000000011101010111010101110101000000000000000001110101+00000000010001110100110即0111010101001110=010001110100110。(2)用两位乘法求积。用两位乘法求积。把乘数按下列方法分成两位一组把乘数按下列方法分成两位一组:01001110(1)(0)(3)(2)那么,那么,用用10乘以被乘数乘以被乘数B时,时,为为2B。它可以用被它可以用被乘数左移一位来实现,乘数左移一位来实现,即即011101010;用用11乘以被乘数时,乘以被乘数时,为为3B,即为即为101011111;用用0乘以被乘数为乘以被乘数为00000000;用用1乘以乘以B,即为即为B=01110101。再把上述部分积移位后相加,再把上述部分积移位后相加,如下所示如下所示:01110101(1)(0)(3)(2)011101010101011111000000000+0111010110001110100110结果与一位乘法相同。但两位乘法的运算步骤较少。2)乘法器的电路实现归纳起来,常用来实现硬件乘法运算器的方法大致有如下几种:移位相加;查找表;加法器树;逻辑树;混合乘法器。1.移位相加乘法器移位相加是最基本的乘法器设计思路,实现起来较为简单。它的设计思想就是根据乘数的每一位是否为1进行计算,若为1则将被乘数移位相加。这种方法硬件资源耗用较少。以8位移位相加乘法器为例,其实现过程如下。先对乘数的最低位进行判断是否为1。如果为1,则把被乘数相加,然后被乘数向高位移1位,乘数向低位移1位;如果为0,则被乘数不相加而仍然向高位移1位,乘数向低位移1位。如此循环判断8次,结束运算。这个乘法器的VHDL源代码可如下所示:8位移位相加乘法器LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_unsigned.all;ENTITYmult_8ISPORT(product:OUTSTD_LOGIC_VECTOR(15DOWNTO0);a:INSTD_LOGIC_VECTOR(7DOWNTO0);b:INSTD_LOGIC_VECTOR(7DOWNTO0);rst:INSTD_LOGIC;clk:INSTD_LOGIC);ENDmult_8;ARCHITECTUREmult_8OFmult_8ISSIGNALb_tmp:STD_LOGIC_VECTOR(7DOWNTO0);用于记录乘数用于记录乘数SIGNALa_tmp:STD_LOGIC_VECTOR(15DOWNTO0);用于记录被乘数用于记录被乘数SIGNALprod_tmp:STD_LOGIC_VECTOR(15DOWNTO0);用于记录乘积用于记录乘积BEGINPROCESS(a,b,clk,rst)BEGINIFrst=1then异步复位异步复位product0);输出清零输出清零a_tmp=00000000&a;寄存寄存ab_tmp=b;寄存寄存bprod_tmp=0000000000000000;-寄存寄存器清零器清零ELSIF(clkEVENTANDclk=1)THENIFb_tmp(0)=1THENprod_tmp=prod_tmp+a_tmp;-逐位累加逐位累加ENDIF;b_tmp=0&b_tmp(7DOWNTO1);a_tmp(15DOWNTO0)=a_tmp(14DOWNTO0)&0;-向高位移位向高位移位ENDIF;product=prod_tmp;输出运算结果输出运算结果ENDPROCESS;ENDmult_8;对该功能设计可采用对该功能设计可采用Actel公司公司Libero软件中的软件中的ModelSim的的仿真工具进行仿真,仿真工具进行仿真,结果如图结果如图6-1所示。所示。移位相加乘法器的仿真波形仿仿真真确确定定其其功功能能逻逻辑辑无无误误后后,采采用用Synplify综综合合工工具进行综合实现的结果如下:具进行综合实现的结果如下:CombinationalCells:121of128(95%)SequentialCells:40of64(63%)TotalCell:161of192(84%)ClockBuffers:2IOCells:34SequentialCell序向元件,如序向元件,如Flip-Flop课堂练习课堂练习半加器:半加器:不考虑低位来的进位,只考虑向更高位进位的加法器。不考虑低位来的进位,只考虑向更高位进位的加法器。二进制输入端二进制输入端a,b分别表示加数和被加数,分别表示加数和被加数,输出端是本位和输出端是本位和so,另一个输出是向更高位的进位,另一个输出是向更高位的进位co逻辑表达式:逻辑表达式:so=aXORb;co=aANDb;abcodoLIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYh_adderISPORT(a,b:INstd_logic;so,co:OUTstd_logic;)ENDh_adder;ARCHITECTUREhalfOFh_adderISBEGINso=aXORb;co=aANDb;ENDhalf;例例52ASK调制解调的设计调制解调的设计(1)2ASK的原理的原理数字信号对载波振幅调制称为振幅键控数字信号对载波振幅调制称为振幅键控(Amplitudeshiftkeying:ASK)调制。)调制。ASK调制的信号表示为调制的信号表示为其中,其中,为载波信号的角频率,为载波信号的角频率,A(t)为随基带为随基带信号变换的振幅,即信号变换的振幅,即(2)ASK调制的调制的VHDL程序程序ASK乘法器实现乘法器实现ASK调制原理:输入随机信息序列,调制原理:输入随机信息序列,经基带信号产生波形序列,乘法器产生振幅键控信号。经基带信号产生波形序列,乘法器产生振幅键控信号。ASK调制的模型如下调制的模型如下:其中其中start是开始调制信号,是开始调制信号,clk是高频载波输入信号,作为系统时钟,它经分频器产生载是高频载波输入信号,作为系统时钟,它经分频器产生载波信号波信号f加到与门的输入端,数字基带信号加到与门的输入端,数字基带信号x作为键控信号作为键控信号控制与门完成控制与门完成ASK调制。调制。LIBARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_arith.ALL;USEIEEE.STD_LOGIC_unsigned.ALL;ENTITYaskISPORT(clk:IN std_logic;-系统时钟系统时钟start:IN std_logic;-开始调整信号开始调整信号x:INstd_logic;-基带信号基带信号y:OUTstd_logic);-已调制输出信号已调制输出信号ENDask;ARCHITECTUREbehaveOFaskISSIGNALq:integerRANGE0TO3;-分频计数器分频计数器SIGNALf:std_logic;-载波信号载波信号BEGINPROCESS(clk)BEGINIF(clkeventANDclk=1)THENIFstart=0THENq=0;ELSEIFq=1THENf=1;q=q+1;-改变改变q,可改变载波信号占空比,可改变载波信号占空比ELSEIFq=3THENf=0;q=0;-改变改变q,可改变载波信号频率,可改变载波信号频率ELSEf=0;q=q+1;ENDIF;ENDIF;ENDPROCESS;y=3时,输出时,输出“1”,否则输出,否则输出“0”以数字载波作为判决时钟,对计数器输出信号进行抽以数字载波作为判决时钟,对计数器输出信号进行抽样判决,并输出解调后的基带信号。样判决,并输出解调后的基带信号。LIBRARYieee;USEieee.std_logic_arith.all;USEieee.std_logic_1164.all;UESieee.std_logic_unsigned.all;ENTITYDASKisPort(clk:instd_logic;-系统时钟系统时钟start:instd_logic;-同步信号同步信号x:instd_logic;-调制信号调制信号y:outstd_logic);-基带信号基带信号ENDDASK;ARCHITECHUREbehavOFDASKISSIGNALq:integerrange0to11;-计数器计数器SIGNALxx:std_logic;-寄存寄存x信号信号SIGNALm:integerRANGE0TO5;-计计xx的脉冲数的脉冲数BEGINPROCESS(clk)-对系统时钟进行对系统时钟进行q分频,分频,BEGINIFclkeventANDclk=1THENxx=x;IFstart=0THENq=0;-if语句完成语句完成q的循环计数的循环计数ELSIFq=11THENq=0; ELSEq=q+1;ENDIF;ENDIF;ENDPROCESS;PROCESS(xx,q)-此进程完成此进程完成ASK解调解调BEGINIFq=11THENm=0;-m计数器清零计数器清零ELSIFq=10THENIFm=3THENy=0ELSEy=1;ENDIF;ELSIFxxeventandxx=1THENm=m+1;-计计xx信号的脉冲个信号的脉冲个数数ENDIF;ENDPROCESS;ENDBEHAV;例例6BPSK调制解调调制解调(1)BPSK的原理的原理数字信号对载波相位调制称为相位键控(数字信号对载波相位调制称为相位键控(Phaseshiftkeying:PSK)调制。)调制。PSK信号码元的信号码元的“0”、“1”分别用两个不同初分别用两个不同初始相位始相位0和和来表示;而振幅和频率保持不变。来表示;而振幅和频率保持不变。PSK调制的信号表示为调制的信号表示为其中,当发送其中,当发送“1”时,时,;当发送;当发送“0”时,时,即即PSK调制的相位选择实现方法:调制的相位选择实现方法:设振荡器产生的载波信号为设振荡器产生的载波信号为它加到与门它加到与门1,同时经反相器变为,同时经反相器变为之后加到与门之后加到与门2。基带信号和它的反相信号分别作为门。基带信号和它的反相信号分别作为门1和门和门2的选通信号。的选通信号。当基带信号为当基带信号为“1”码时,与门码时,与门1选通,输出选通,输出当基带信号为当基带信号为“0”码时,与门码时,与门2选通,输出选通,输出由此可得由此可得PSK调制信号。调制信号。(2)BPSK的的VHDL程序程序PSK调制的核心部分包括计数器,调制的核心部分包括计数器,2选选1数据选择器。数据选择器。系统时钟系统时钟clk通过计数器完成分频、移相,产生通过计数器完成分频、移相,产生2路相位路相位相反的载波信号,数字基带信号相反的载波信号,数字基带信号x作为键控信号控制作为键控信号控制2选选1数据选择器完成数据选择器完成PSK调制。调制。实现实现BPSK调制的调制的VHDL程序如下:程序如下:LIBARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_arith.ALL;USEIEEE.STD_LOGIC_unsigned.ALL;ENTITYaskISPORT(clk:IN std_logic;-系统时钟系统时钟start:IN std_logic;-开始调整信号开始调整信号x:INstd_logic;-基带信号基带信号y:OUTstd_logic);-调制信号调制信号ENDask;ARCHITECTUREbehaveOFpskISSIGNALq:std_logic_vector(1DOWNTO0);-2位计数器位计数器SIGNALf1,f2:std_logic;-载波信号载波信号BEGINp1:PROCESS(clk)BEGINIF(clkeventANDclk=1)THENIFstart=0THENq=“00”;ELSEIFq=“01”THENf1=1;f2=0;q=q+1;ELSEIFq=“11”THENf1=0;f2=1;q=“00”; ELSEf1=0;f2=1;q=q+1;ENDIF;ENDIF;ENDPROCESS;p2:PROCESS(clk,x)-此进程完成对基带信号此进程完成对基带信号x的调制的调制BEGINIF(clkeventANDclk=1)THENIFq(0)=1THENIFx=1THENy=f1;ELSEy=f2;ENDIF;ENDIF;ENDIF;ENDPROCESS;ENDbehave;该程序有该程序有3个输入,即时钟信号个输入,即时钟信号clk、开始调制、开始调制信号信号start和数字基带信号和数字基带信号x;有有1个输出,即已调个输出,即已调PSK信号信号y;程序中,两个相位相反的载波信号程序中,两个相位相反的载波信号s是外部输入是外部输入的时钟信号经过进程的时钟信号经过进程p1产生的;产生的;进程进程p2通过数字基带信号对载波的调制来完成通过数字基带信号对载波的调制来完成PSK调制。调制。课后作业课后作业1(3)BPSK解调解调1)描述原理)描述原理2)编写)编写VHDL语言语言例例7FSK调制解调调制解调1FSK原理原理频移键控即频移键控即FSK(FrequencyShiftKeying)数字信号对载波频率调制,通过数)数字信号对载波频率调制,通过数字基带信号控制载波信号的频率来来传递数字基带信号控制载波信号的频率来来传递数字信息。字信息。在二进制情况下,在二进制情况下,“1”对应于载波频率对应于载波频率f1,“0”对应载波频率对应载波频率f2,但是它们的振幅和初,但是它们的振幅和初始相位不变化。始相位不变化。表达式为:表达式为:初始相位初始相位码元的频率码元的频率A是常数,表示码元的包络是矩形脉冲。是常数,表示码元的包络是矩形脉冲。FPGA载波f1clkstart基带信号分频器1分频器2载波f2二选一选通开关调制信号FSK调制调制VHDL程序程序libraryieee;useieee.std_logic_arith.all;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityFSKisport(clk:instd_logic;-系统时钟系统时钟start:instd_logic;-开始调制信号开始调制信号x:instd_logic;-基带信号基带信号y:outstd_logic);-调制信号调制信号endFSK;architecturebehavofFSKissignalq1:integerrange0to11;-信号信号f1的分频计数器的分频计数器signalq2:integerrange0to3;-载波信号载波信号f2的分频计数器的分频计数器signalf1,f2:std_logic;-载波信号载波信号f1,f2beginprocess(clk)-对系统时钟对系统时钟clk的分频,得到载波的分频,得到载波f1ifclkeventandclk=1thenifstart=0thenq1=0;elsifq1=5thenf1=1;q1=q1+1;elsifq1=11thenf1=0;q1=0;elsef1=0;q1=q1+1;endif;endif;endprocess;process(clk)-对系统时钟对系统时钟clk的分频,得到载波的分频,得到载波f2beginifclkeventandclk=1thenifstart=0thenq2=0;elsifq2=1thenf2=0;q2=0;elsifq2=0thenf2=1;q2=q2+1;elsef2=0;q2=q2+1;endif;endif;endprocess;process(clk,x)-完成对基带信号的完成对基带信号的FSK调制调制beginifclkeventandclk=1thenifx=0theny=f1;elsey=f2;endif;endif;endprocess;endbehav;课后作业课后作业2FSK解调解调1)描述原理)描述原理2)编写)编写VHDL语言语言或数字相关器或数字相关器1)描述原理)描述原理2)编写)编写VHDL语言语言
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号