VHDL语言前言1.VHDL语言简介VHDL语言(VHSICHardwareDescriptionLanguage,甚高速集成电路硬件描述语言)是一种设计、仿真、综合的标准硬件描述语言,是对可编程逻辑器件进行开发与设计的重要工具,其优点是:支持自上而下和基于库的设计,支持范围广,具有多层次描述系统硬件功能的能力。VHDL语言已成为IEEE的一种工业标准,是实现信息系统硬件开发所必备的知识和技能。2.本课程的主要内容:数字系统硬件设计描述VHDL语言程序的基本结构VHDL语言的数据类型与运算操作符VHDL语言构造体的描述方式VHDL语言的主要描述语句基本逻辑电路设计仿真与逻辑综合MAXPLUSII使用说明ACTIVEHDL使用说明电路设计实例3.参考教材《VHDL硬件描述语言与数字逻辑电路设计》侯伯亨顾新西安电子科技大学出版社1999;《VHDL编程与仿真》王毅平张振荣人民邮电出版社2000年7月第一章数字系统硬件设计概述1.1传统的系统硬件设计方法采用自下而上(BottomUp)的设计方法采用通用的逻辑元、器件在系统硬件设计的后期进行仿真和调试主要设计文件是电原理图1.2利用硬件描述语言(HDL)的硬件电路设计方法硬件描述语言:可以描述硬件电路的功能,信号连接关系和定时关系的语言。利用硬件描述语言编程来表示逻辑器件与系统硬件的功能和行为,是该设计方法的一个重要特征。采用自上而下(TopDown)的设计方法就是从系统的总体要求出发,自上而下地逐步将设计内容细化,最后完成系统硬件的总体设计。设计的三个层次:第一层次是行为描述。实质上就是对整个系统的数学模型的描述(抽象程度高)。第二层次是RTL方式描述,又称寄存器传输描述(数据流描述),以实现逻辑综合。第三层次是逻辑综合,就是利用逻辑综合工具,将RTL方式描述的程序转换成用基本逻辑元件表示的文件(门级网络表)。在门电路级上再进行仿真,并检查定时关系。完成硬件设计的两种选择:由自动布线程序将网络表转换成相应的ASIC芯片制造工艺,作出ASIC芯片。将网络表转换成FPGA编程代码,利用FPGA器件完成硬件电路设计。自上而下硬件设计流程HDL语言设计硬件电路的优点:系统中可大量采用芯片采用系统早期仿真降低了硬件电路设计难度1.3VHDL语言设计硬件电路的优点美国国防部1982年开发VHDL(Very-High-SpeedIntegratedRTL级描述行为级仿真行为级描述规格设计门级仿真定时检查RTL级仿真输出门级网表逻辑综合优化CircuitHardwareDescriptionLanguage)语言,是当前广泛使用的HDL语言之一,并被IEEE和美国防部采用为标准的HDL语言。设计技术齐全、方法灵活、支持广泛系统硬件描述能力强可以与工艺无关编程语言标准、规范、易于共享和复用第二章VHDL语言程序的基本结构2.1VHDL语言设计的基本单元及其构成一个完整的VHDL语言程序通常包含实体(Entity)、构造体(Architecture)、配置(Configuration)、包集合(Package)和库(Library):功能:实体-—-用于描述所设计的系统的外部接口信号;构造体——用于描述系统内部的结构和行为;包集合——存放各设计模块都能共享的数据类型、常数和子程序库;配置——用于从库中选取所需单元来组成系统设计的不同版本;库——存放已经编译的实体、构造体、包集合和配置。基本组成:实体说明和构造体两部分实体说明(接口)构造体(实现)1.实体说明:规定此实体输入与输出的数目与类型。结构:entity实体名is[generic(类属参数说明)];[port(端口说明)];end实体名;类属参数说明:generic(常数名:数据类型:=数值);在端口说明前,用于指定参数。端口说明:在entity语句的实体说明部分,常用port语句描述实体对外界连接的端口(数目、方向和数据类型)。port(端口名:端口方向端口数据类型;...端口名:端口方向端口数据类型;);端口方向:in(输入),只能读,用于:时钟输入、控制输入(装入、复位、使能)、单向数据输入;out(输出),只能被赋值,用于不能反馈的输出;inout(输入输出),既可读又可被赋值,被读的值是端口输入值而不是被赋值,作为双向端口。buffer(缓冲),类似于输出,但可以读,读的值是被赋值,用做内部反馈用,不能作为双向端口使用。例1):entityNAND2isport(A,B:inBIT;Z:outBIT);endNAND2;例2):--Defineanentity(design)calledCOMP--thathas2N-bitinputandoneoutput.entityCOMPisgeneric(N:INTEGER:=8);--defaultis8bitsport(x,y:inBIT_VECTOR(0toN-1);equal:outBOOLEAN);endCOMP;2.构造体构造体定义实体功能的一种实现。构造体的结构:architecture构造体名of实体名is{块说明项}begin{并发语句}end构造体名;块说明项(或定义语句),位于architecture和begin之间,对构造体内部的使用信号、常数、数据类型和函数进行说明,包括:使用语句子程序说明子程序体类型说明子类型说明常数说明信号说明元件说明并行语句处于begin与end之间,描述构造体的行为与连接关系。构造体的描述方法:行为描述(按算法的路径来描述);数据流描述或RTL描述(采用寄存器传输描述);结构化描述(采用例化元件)例化(instantiation):在高层次的设计中调用低层次的实体作为元件的过程。构造体的组织例entityCOUNTER3isport(clk:inbit;reset:inbit;count:outintegerrange0to7);endCOUNTER3;architectureMY_ARCHofCOUNTER3is构造体说明说明在并行语句间或并行语句与接口端口之间所使用的信号。说明构造体中使用的类型、常数、和子程序。并行语句block将并行语句集中在一起信号赋值元件例化进程过程调用signalcount_tmp:integerrange0to7;beginprocessbeginwaituntil(clk'eventandclk='1');ifreset='1'orcount_tmp=7thencount_tmp=0;elsecount_tmp=count_tmp+1;endif;endprocess;count=count_tmp;endMY_ARCH;注:构造体中的信号和常数名不能与实体端口名相同。2.2语言结构体的子结构描述1.block语句结构语句结构:块结构名:blockbegin...endblock块结构名;2.进程(process)语句结构进程语句的结构:[进程名]:process(信号1,信号2,……){说明内部变量}begin{顺序语句}endprocess;进程的组织功能独立的电路可用进程来描述进程中语句的顺序性进程的启动*敏感表进程说明:按计算顺序暂存的变量,以及局部使用的数据类型、常数、元件及子程序顺序语句过程调用NEXT语句变量赋值EXIT语句WAIT语句NULL语句CASE语句IF语句信号赋值LOOP语句*敏感表中信号的变化将启动进程语句*启动后,语句从上到下逐句执行,最后一个语句执行完毕后,返回进程开始的语句,等待下一次敏感表的变化。进程的同步描述同一结构体中有多个进程存在时,进程之间可一边进行通信,一边并行同步执行。3.子程序(subprogram)语句结构描述两种类型:过程(procedure)函数(function)过程语句结构:procedure过程名(参数1,参数2,…)is[定义语句];begin[顺序处理语句];end过程名;*参数可以是输入也可以是输出*例:将位矢量转换为整数procedurevector_to_int(z:instd_logic_vector;x_flag:outboolean;q:inoutinteger)isbeginq:=0;x_flag:=false;foriinz'rangeloopq:=q*2;if(z(i)=1)thenq:=q+1;elsif(z(i)/=0)thenx_flag:=true;endif;endloop;endvector_to_int;循环次数由z的位数决定,z(0)为最高位。函数语句结构:function函数名(参数1,参数2,…)return数据类型名is[定义语句];begin[顺序处理语句];return返回变量名end函数名;*参数为输入参数*通常集中在包集合中*例:将boolean型信号转换到bit型functionb12bit(a:Boolean)returnBITisbeginifathenreturn'1';elsereturn'0';endif;endb12bit;2.3包集合、库与配置1.库库(Library)是经编译后的数据的集合,库说明总是放在设计单元的最前面。1)库的种类:IEEE库包含:STD_LOGIC_1164STD_LOGIC_ARITHSTD_LOGIC_UNSIGNEDSTD库包含:STANDARD包集合TEXTIO包集合TEXTIO包集合使用例:LIBRARYSTD;USESTD.TEXTIO.ALL;ASIC矢量库各公司提供的ASIC称逻辑门库WORK库为现行作业库,存放设计者的VHDL语言程序用户定义的库用户为自身设计需要所开发的共用包集合和实体。2)库的使用除WORK、STD库外,首先要说明。格式:library[库名];use[库名.包名.项目名];例:libraryieee;useieee.std_logic_1164.all;库说明的作用范围:从实体开始到其所属构造体、配置为止。2.包集合包集合用于封装属于多个设计单元分享的公共信息。包集合由包说明(说明数据类型、子程序和常量等)和包体(它含有子程序体与现有的延时常数)所组成。子程序由执行公共操作的过程和函数组成。包集合是分享属于实体数据的一种机制,把子程序、数据类型和元件说明看成建立设计的工具,则包集合可看成工具箱。1)包集合的结构:package包集合名is[包集合说明语句];end包集合名;packagebody包集合名is[包集合体说明语句];end包集合名;注:包集合体为可选项。3)包集合的使用:usework.[包集合名].all;例:建一个包集合。此例中,用字母符号代表用于控制的二进编码序列。libraryieee;useieee.std_logic_1164.all;--ALUsourceoperandcontrolmnemonicspackagemnemonics0isconstantaq:std_logic_vector(2downto0):=000;constantab:std_logic_vector(2downto0):=001;constantzq:std_logic_vector(2downto0):=010;constantzb:std_logic_vector(2downto0):=011;constantza:std_logic_vector(2downto0):=100;constantda:std_logic_vector(2downto0):=101;constantdq:std_logic_vector(2downto0):=110;constantdz:std_logic_vector(2downto0):=111;endmnemonics0;编译通过后即可使用。注:maxplus2在编译此package时,报告:…doesnotcontainanarch