《跟我学VHDL.ppt》由会员分享,可在线阅读,更多相关《跟我学VHDL.ppt(155页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、跟我学跟我学VHDL目录nVHDL概述n常见HDL介绍nVHDL编程技术VHDL概述概述目录目录nHDL概述n选择VHDL还是Verilog HDL?n学习HDL的几点提示nHDL与原理图输入法的关系nHDL开发流程HDL概述概述-1n随着EDA技术的发展,使用硬件语言设计PLD/FPGA成为一种趋势。n目前最主要的硬件描述语言是VHDL和Verilog HDL。HDL概述概述-2nVHDL发展的较早,语法严格,而Verilog HDL是在C语言的基础上发展起来的一种硬件描述语言,语法较自由。nVHDL和Verilog HDL两者相比,VHDL的书写规则比Verilog烦琐一些,但Verilo
2、g自由的语法也容易让少数初学者出错。选择选择VHDL还是还是Verilog HDL?-1n这是一个初学者最常见的问题。其实两种语言的差别并不大,他们的描述能力也是类似的。掌握其中一种语言以后,可以通过短期的学习,较快的学会另一种语言。n选择何种语言主要还是看周围人群的使用习惯,这样可以方便日后的学习交流。选择选择VHDL还是还是Verilog HDL?-2n当然,如果您是集成电路(ASIC)设计人员,则必须首先掌握Verilog,因为在IC设计领域,90以上的公司都是采用Verilog进行IC设计。n对于PLD/FPGA设计者而言,两种语言可以自由选择。学习学习HDL的几点提示的几点提示n了解
3、HDL的可综合性问题n用硬件设计思想来编写HDLn语法掌握贵在精,不在多1.了解了解HDL的可综合性问题的可综合性问题nHDL有两种用途:系统仿真和硬件实现。如果程序只用于仿真,那么几乎所有的语法和编程方法都可以使用。n 但如果我们的程序是用于硬件实现(例如:用于FPGA设计),那么我们就必须保证程序“可综合”(程序的功能可以用硬件电路实现)。1.了解了解HDL的可综合性问题的可综合性问题n不可综合的HDL语句在软件综合时将被忽略或者报错。n我们应当牢记一点:“所有的HDL描述都可以用于仿真,但不是所有的HDL描述都能用硬件实现”。2.用硬件设计思想来编写用硬件设计思想来编写HDLn学好HDL
4、的关键是充分理解HDL语句和硬件电路的关系。n 编写HDL,就是在描述一个电路,我们写完一段程序以后,应当对生成的电路有一些大体上的了解,而不能用纯软件的设计思路来编写硬件描述语言。要做到这一点,需要我们多实践,多思考,多总结。3.语法掌握贵在精,不在多语法掌握贵在精,不在多n30%的基本HDL语句就可以完成95%以上的电路设计,很多生僻的语句并不能被所有的综合软件所支持,在程序移植或者更换软件平台时,容易产生兼容性问题,也不利于其他人阅读和修改。n建议多用心钻研常用语句,理解这些语句的硬件含义,这比多掌握几个新语法要有用的多。HDL与原理图输入法的关系与原理图输入法的关系nHDL和传统的原理
5、图输入方法的关系就好比是高级语言和汇编语言的关系。nHDL的可移植性好,使用方便,但效率不如原理图;原理图输入的可控性好,效率高,比较直观,但设计大规模CPLD/FPGA时显得很烦琐,移植性差。HDL与原理图输入法的关系与原理图输入法的关系n在真正的PLD/FPGA设计中,通常建议采用原理图和HDL结合的方法来设计,适合用原理图的地方就用原理图,适合用HDL的地方就用HDL,并没有强制的规定。n在最短的时间内,用自己最熟悉的工具设计出高效,稳定,符合设计要求的电路才是我们的最终目的。HDL开发流程开发流程n文本编辑n功能仿真(前仿真)n布局布线n时序仿真(后仿真)n编程下载常见常见HDL介绍介
6、绍目录目录nVHDLnVerilog HDLnAHDLnC/C+VHDLnVery-High-Speed Integrated Circuit Hardware Description Languagen诞生于1982年n1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言n有87版和93版Verilog HDLnVerilog HDL是在C语言的基础上发展起来的n由GDA(Gateway Design Automation)公司的PhilMoorby在1983年末首创n1989年CADENCE公司收购了GDA公司n1990年CADENCE公司公开发表了Verilog HDL,并
7、成立LVI组织以促进Verilog HDL成为IEEE标准AHDLnAltera HDL是ALTERA公司发明的n特点是非常易学易用n缺点是移植性不好,通常只用于ALTERA自己的开发系统C/C+n目前有两种相对成熟的硬件C语言:systemC和Handle-Cn目前各种硬件C语言的编译软件都还不够成熟,很少能直接投入到实际产品的开发中VHDL编程技术编程技术资料来源资料来源nCPLD系统设计技术入门与应用n黄正瑾 等编著目录目录nVHDL基本结构与语法nVHDL设计进阶n有限状态机(FSM)VHDL基本结构与基本结构与语法语法版本:版本:20030220修订:修订:20040303目录目录n
8、VHDL程序基本结构nVHDL语言要素nVHDL基本描述方法VHDL基本结构基本结构n实体n结构体VHDL程序基本结构程序基本结构 一个相对完整的一个相对完整的VHDL设计由以下几个部分组成:设计由以下几个部分组成:(1)库、程序包库、程序包(LIBRARY&PACKAGE);(2)实体实体(ENTITY);(3)结构体结构体(ARCHITECTURE);(4)配置配置(CONFIGURATION)。以上以上4个部分并不是每一个个部分并不是每一个VHDL程序都必程序都必须具备的,其中只有一个实体和一个与之须具备的,其中只有一个实体和一个与之对应的结构体是必须的。对应的结构体是必须的。LIBRA
9、RY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.ALL;一个异步清零、进位输入输出功一个异步清零、进位输入输出功能的能的4位计数器实例位计数器实例ENTITY cntm16 ISGENERIC(cntwidth:integer:=4);port(ci:IN std_logic;nreset :IN std_logic;clk:INstd_logic;co:OUT std_logic;qcnt:BUFFER std_logic_vector(cntwidth-1 DOWNTO 0);END cntm16;ARCHIT
10、ECTURE behave OF cntm16 ISBEGINco=1 when(qcnt=1111 AND ci=1)ELSE 0;PROCESS(clk,nreset)BEGINif(nreset=0)THENqcnt0);ELSIF(clkevent and clk=1)THENIF(ci=1)THENqcnt=qcnt+1;END IF;END IF;END PROCESS;END behave;实体实体实体实体(ENTITY)是是VHDL设计中最基本的组成部分之一,设计中最基本的组成部分之一,VHDL表达的所有设计均与实体有关。表达的所有设计均与实体有关。实体类似于原理图中的一个部件
11、符号,它并不描述设计的具实体类似于原理图中的一个部件符号,它并不描述设计的具体功能,只定义了该设计所需的全部输入输出信号。体功能,只定义了该设计所需的全部输入输出信号。实体格式如下所示:实体格式如下所示:ENTITY 实体名实体名 IS GENERIC (常数名常数名:数据类型数据类型 :设定值设定值 )-本篇均用本篇均用 表示可选项表示可选项;PORT(列出设计的所有输入列出设计的所有输入/输出信号输出信号);END 实体名实体名;ENTITY cntm16 IS-cntm16为实体名为实体名GENERIC(cntwidth:integer:=4);-类属表,可选类属表,可选port(ci:
12、IN std_logic;-每一句结尾均为每一句结尾均为;nreset :IN std_logic;clk:INstd_logic;co:OUT std_logic;qcnt:BUFFER-但最后一句没有但最后一句没有;std_logic_vector(cntwidth-1 DOWNTO 0);END cntm16;端口信号名端口信号名端口模式端口模式端口类型端口类型实体对应的原理图符号实体对应的原理图符号 实体名:实体名:Max+PlusII 要求实体名必须与要求实体名必须与VHDL的文件名相同。此例中的文件名相同。此例中计数器的计数器的VHDL设计文件必须以设计文件必须以cntm16.vh
13、d命名且项目名称命名且项目名称要与文件名一一对应,否则编译会出错。要与文件名一一对应,否则编译会出错。类属参量:类属参量:类属参量类属参量GENERIC是一种端口界面常数,常用来规定端口是一种端口界面常数,常用来规定端口的大小、实体中子元件的数目及实体的定时特性等。它和常的大小、实体中子元件的数目及实体的定时特性等。它和常数不同,常数只能从设计实体的内部得到赋值且不能改变,数不同,常数只能从设计实体的内部得到赋值且不能改变,而类属参量的值可由设计实体的外部提供。因此,设计者可而类属参量的值可由设计实体的外部提供。因此,设计者可以从外面通过类属参量的重新设定而容易地改变一个设计实以从外面通过类属
14、参量的重新设定而容易地改变一个设计实体或一个元件的内部电路结构和规模。体或一个元件的内部电路结构和规模。此例中此例中cntwidth宽度为宽度为4,也可容易地改变,也可容易地改变GENERIC(cntwidth:integer:8)端口信号名:端口信号名:端口信号名在实体中必须是唯一的,信号名应是合法的标识端口信号名在实体中必须是唯一的,信号名应是合法的标识符。符。端口模式端口模式IN 信号进入实体信号进入实体(不能给输入端口赋值不能给输入端口赋值)OUT 信号离开实体,不能在内部反馈使信号离开实体,不能在内部反馈使用用(不能读入输出端口的数据不能读入输出端口的数据)INOUT 信号是双向的信
15、号是双向的(既可以进入实体,既可以进入实体,也可以离开实体也可以离开实体)BUFFER 信号输出到实体外部,但同时也可信号输出到实体外部,但同时也可在实体内部反馈。在实体内部反馈。BUFFER(缓冲缓冲)是是INOUT(双向双向)的子集,但不是由外部驱动的子集,但不是由外部驱动 结构体结构体所有能被仿真的实体都由结构体所有能被仿真的实体都由结构体(ARCHITECTURE)描述,即结构体描述实体的结描述,即结构体描述实体的结构或行为。一个实体可以有多个结构体,每个结构或行为。一个实体可以有多个结构体,每个结构体分别代表该实体功能的不同实现方案。构体分别代表该实体功能的不同实现方案。结构体可以采
16、用行为描述、结构描述或数据流描结构体可以采用行为描述、结构描述或数据流描述,是述,是VHDL设计中最主要的部分。设计中最主要的部分。ARCHITECTURE 结构体名结构体名 OF 实体名实体名 说明语句说明语句 BEGIN功能描述语句;功能描述语句;-并行处理语句并行处理语句END 结构体名结构体名;-结构体名可以任意,但当一个实体具有多个结构体时,取结构体名可以任意,但当一个实体具有多个结构体时,取名不可重复名不可重复 VHDL语言要素语言要素内容内容n标识符n数据对象n数据类型n运算符nVHDL的属性VHDL语言要素语言要素1标识符标识符n标识符标识符(Identifiers)由英文字母
17、由英文字母“a”到到“z”、下划线下划线“_”组成组成。例外,例外,VHDL语言的保留语言的保留字和系统的子程序也不能字和系统的子程序也不能作为标识符出现。作为标识符出现。nVHDL不区分大小写不区分大小写n标识符一定要以字母标识符一定要以字母开头开头n下划线不能放在结尾下划线不能放在结尾n下划线不能连用下划线不能连用 VHDL语言要素语言要素2数据对象数据对象n信号信号(SIGNAL)n变量变量(VARIABLE)n常量常量(CONSTANT)信号信号(SIGNAL)n信号定义格式如下:信号定义格式如下:SIGNAL 信号名信号名:数据类型数据类型:=初始值初始值;如:如:SIGNAL co
18、unt:std_logic_vector(3 DOWNTO 0):=”0000”;n信号赋值语句语法格式:信号赋值语句语法格式:目标信号名目标信号名=表达式;表达式;如:如:q=count;变量变量(VARIBLE)n变量只在给定的进程中用于声明局部值或变量只在给定的进程中用于声明局部值或用于子程序中,变量的赋值符号为用于子程序中,变量的赋值符号为“:=”。n和信号不同,信号是实际的,是外输入,和信号不同,信号是实际的,是外输入,或者是内部的一个存储元件;而变量是虚或者是内部的一个存储元件;而变量是虚的,仅仅是为书写方便而引入的一个名称,的,仅仅是为书写方便而引入的一个名称,它常用在实现某种算
19、法的赋值语句中。它常用在实现某种算法的赋值语句中。变量变量(VARIBLE)n变量定义格式如下:变量定义格式如下:VARIABLE 变量名变量名:数据类型数据类型 :=初始值初始值;如:如:VARIABLE a:integer:=0;n变量赋值语句的语法格式:变量赋值语句的语法格式:目标信号名目标信号名:=表达式;表达式;如:如:a:=b+c:常量常量(CONSTANT)n常量是全局量,在结构体描述、程序包说常量是全局量,在结构体描述、程序包说明、实体说明、过程说明、函数调用说明明、实体说明、过程说明、函数调用说明和进程说明中使用。和进程说明中使用。n常量在设计描述中保持某一规定类型的特常量在
20、设计描述中保持某一规定类型的特定值不变。如利用它可设计不同模值的计定值不变。如利用它可设计不同模值的计数器,模值存于一常量中,对不同的设计,数器,模值存于一常量中,对不同的设计,改变模值仅需改变此常量值即可。改变模值仅需改变此常量值即可。常量常量(CONSTANT)n常量定义格式如下:常量定义格式如下:CONSTANT 常数名常数名:数据类型数据类型:=表达式;表达式;如:如:CONSTANT mod:integer:=6;如何定义数据对象如何定义数据对象LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.A
21、LL;ENTITY bcdadder ISPORT(op1,op2 :IN integer RANGE 0 to 9;result :OUT integer RANGE 0 to 31);END bcdadder;一位一位BCD码的加法器码的加法器ARCHITECTURE behave OF bcdadder ISCONSTANT adjustnum:integer:=6;-定义一个产量;整数型,值为定义一个产量;整数型,值为6SIGNAL binadd:integer RANGE 0 TO 18;-定义一个信号,以保存两个二进制数的和定义一个信号,以保存两个二进制数的和BEGINbinadd
22、 9 THENtmp:=adjustnum;-变量赋值,立即起作用变量赋值,立即起作用ELSEtmp:=0;END IF;result=binadd+tmp;END PROCESS;END behave;信号和变量的比较信号和变量的比较n信号与变量声明的形式与位置不同:信号声明为信号与变量声明的形式与位置不同:信号声明为SIGNAL,变量声明为,变量声明为VARIABLE;信号声;信号声明在子程序、进程等外部,而变量声明在于程序、明在子程序、进程等外部,而变量声明在于程序、进程等内部。进程等内部。n信号与变量的赋值不同:在进程中,信号赋值在信号与变量的赋值不同:在进程中,信号赋值在进程结束时起
23、作用,而变量赋值是立即起作用的。进程结束时起作用,而变量赋值是立即起作用的。n信号和变量赋值符不同:信号赋值为信号和变量赋值符不同:信号赋值为“=”,变量,变量赋值为赋值为“:=”。实例:信号和变量的比较实例:信号和变量的比较使用信号的情况使用信号的情况LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY xor_sig ISPORT(a,b,c:INstd_logic;x,y:OUT std_logic);END xor_sig;ARCHITECTURE sig_arch OF xor_sig ISSIGNAL d:std_logic;BEGINsi
24、g:PROCESS(a,b,c)BEGINd=a;-ignored it!x=c XOR d;d=b;-overrides it!y=c XOR d;END PROCESS;END sig_arch;结果:结果:x=c xor b,y=c xor b实例:信号和变量的比较实例:信号和变量的比较使用变量的情况使用变量的情况 LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.ALL;ENTITY xor_var ISPORT(a,b,c:INstd_logic;x,y:OUT std_logic);END xo
25、r_var;ARCHITECTURE var_arch OF xor_var ISBEGINvar:PROCESS(a,b,c)VARIABLE d:std_logic;BEGINd:=a;x=c XOR d;d:=b;y=c XOR d;END PROCESS;END var_arch;结果:结果:x=c xor a,y=c xor bVHDL语言要素语言要素3数据类型数据类型 nVHDL对每一个常数、变量、信号、函数及设定的各种参量的数据类型(Data Types)都有严格要求n相同数据类型的量才能互相传递和作用 n标准定义的数据类型都在VHDL标准程序表standard中定义,在实际使用
26、中,不需再用USE语句以显式调用。数据类型数据类型(DATA TYPES)1标准定义的数据类型标准定义的数据类型 n布尔量布尔量(Boolean):布尔量的取值为布尔量的取值为FALSE和和TRUE。n字符字符(Character):字符在编程时用单引号括起来,如字符在编程时用单引号括起来,如A。虽然标识符与字母格式无关,但字符文字区分大小写。虽然标识符与字母格式无关,但字符文字区分大小写。Z与与z是不相同的。是不相同的。n字符串字符串(String):字符串在编程时用双引号括起,如字符串在编程时用双引号括起,如“1111001101”。n整数整数(Integer):在:在VHDL中,整数的范
27、围从到。中,整数的范围从到。n实数实数(Real):在:在VHDL中,实数的范围为中,实数的范围为-1.0E+38到到+1.0E+38。由于实数类型的实现相当复杂,目前在电路规模由于实数类型的实现相当复杂,目前在电路规模上难以承受。通常情况下,实数类型仅能在上难以承受。通常情况下,实数类型仅能在VHDL仿真器中仿真器中使用,综合器不支持实数。使用,综合器不支持实数。n位位(Bit):取值只能是取值只能是0和和1。n时间时间(Time):时间类型值的范围是整数所定义的范围,时间时间类型值的范围是整数所定义的范围,时间类型的完整表达方法应包含整数和单位两部分类型的完整表达方法应包含整数和单位两部分
28、(在在maxplusII中中两部分间至少留一个空格,如两部分间至少留一个空格,如20 ns,10 ns)。n位矢量位矢量(Bit_vector):位矢量是基于位矢量是基于BIT数据类型的数组,使数据类型的数组,使用位大量必须注明宽度,即数组中的元素个数和排列。用位大量必须注明宽度,即数组中的元素个数和排列。n自然数自然数(Natureal)和正整数和正整数(Positive):自然数是整数的一个自然数是整数的一个子类型,包括零和正整数;正整数也是整数的一个子类型,包子类型,包括零和正整数;正整数也是整数的一个子类型,包括整数中非零和非负的数值。括整数中非零和非负的数值。n错误等级错误等级(Se
29、vrity level):在:在VHDL仿真器中,错误等级用来仿真器中,错误等级用来设计系统的工作状态。设计系统的工作状态。(NOTE,WARNING,ERROR,FAILURE)数据类型数据类型(DATA TYPES)2IEEE预定义标准逻辑位与矢量预定义标准逻辑位与矢量 nstd_logic:工业标准的逻辑类型,取值工业标准的逻辑类型,取值0(强强0)、1(强强1)、Z(高阻态高阻态)、X(强未知的强未知的)、W(弱未知的弱未知的)、L(弱弱0)、H(弱弱1)、一一(忽略忽略)、U(未初始化的未初始化的)。其中只有前其中只有前4种取值具有实际物理意义,其他的是为了与模种取值具有实际物理意义
30、,其他的是为了与模拟环境相容才保留的。拟环境相容才保留的。nstd_logic_vector:工业标准的逻辑类型,工业标准的逻辑类型,std_logic的的组合。组合。注意:在使用注意:在使用“std_logic”和和“std_logic_vector”时,在时,在程序中必须声明库及程序包说明语句,即程序中必须声明库及程序包说明语句,即LIBRARY ieee;USE ieee.std_logic_1164.ALL这两句在程序中必不可少。另外,由于这两句在程序中必不可少。另外,由于std_logic不像不像BIT只有两种取值,在编程时应当特别注意。只有两种取值,在编程时应当特别注意。如如IF语
31、句中是否会因未考虑语句中是否会因未考虑std_logic的所有可能取值情的所有可能取值情况而插入不希望的锁存器,况而插入不希望的锁存器,CASE语句中是否少了分枝等。语句中是否少了分枝等。数据类型数据类型(DATA TYPES)3用户自定义的数据类型用户自定义的数据类型n枚举类型枚举类型(Enumerated Types)枚举类型定义语法如下:枚举类型定义语法如下:TYPE 数据类型名数据类型名 IS (枚举文字,枚举文字,枚举文字,枚举文字,);如:如:TYPE color(red,green,yellow,blue);下面是两个枚举类型的定义及其相应的变量和信号声明:下面是两个枚举类型的定
32、义及其相应的变量和信号声明:TYPE color(red,green,yellow,blue);TYPE level IS(0,1,Z);VARIABLE a:color;SIGNAL v:level;数据类型数据类型(DATA TYPES)n整数类型整数类型(Integer Types)和实数类型和实数类型(Real Types)此处的整数类型与实数类型是标准包中预定义的整数类型此处的整数类型与实数类型是标准包中预定义的整数类型的子集。的子集。由于综合器无法综合未限定范围的整数类型的信号或变量,由于综合器无法综合未限定范围的整数类型的信号或变量,故一定要用故一定要用RANGE子句为所定义整数
33、限定范围以使综合子句为所定义整数限定范围以使综合器能决定该信号或变量的二进制的位数。器能决定该信号或变量的二进制的位数。整数类型和实数类型用户定义的一般格式为:整数类型和实数类型用户定义的一般格式为:TYPE 数据类型名数据类型名 IS RANGE 约束范围约束范围;如:如:TYPE int IS RANGE-10 TO 10;3用户自定义的数据类型用户自定义的数据类型数据类型数据类型(DATA TYPES)n数组类型数组类型(Array Types)数组类型定义语法如下:数组类型定义语法如下:数据类型名数据类型名 IS ARRAY(索引范围索引范围)0F 类型类型名称名称其中,索引范围为其中
34、,索引范围为(0,1,29),每一个,每一个数据元素的类型为数据元素的类型为std_logic。3用户自定义的数据类型用户自定义的数据类型VHDL语言要素语言要素4运算符运算符nVHDL为构造计算数值的表达式提供了许多为构造计算数值的表达式提供了许多预定义运算符预定义运算符(Operators)。n其中可分为其中可分为4种类型:算术运算符,关系运种类型:算术运算符,关系运算符,逻辑运算符与连接运算符。算符,逻辑运算符与连接运算符。算术运算符算术运算符(Arithmetic operators)n+加加n-减减n*乘乘n/除除n*乘方乘方nMOD 求模求模nREM 求余求余nABS 求绝对值求绝
35、对值 关系运算符关系运算符(Relation operators)n=等于等于n/=不等于不等于n 小于小于n 大于大于n=大于或等于大于或等于n其中其中=操作符也用于表示信号的赋值操作。操作符也用于表示信号的赋值操作。逻辑运算符逻辑运算符(Logic operators)nAND逻辑与逻辑与nOR逻辑或逻辑或nNAND 与非与非nNOR或非或非nXOR异或异或nNOR同或同或nNOT逻辑非逻辑非连接运算符连接运算符(Concatenation operator)n&连接,将多个对象或矢量连接成维数更大的矢量。连接,将多个对象或矢量连接成维数更大的矢量。如:如:BEGINPROCESS(a)B
36、EGINo1=0&a(7 DOWNTO 0);-右移一位右移一位o2=o1(6 DOWNTO 0)&0;-左移一位左移一位o3=a&b;-合并合并a,bEND PROCESS;VHDL语言要素语言要素5VHDL的属性的属性 n属性属性(Attribute)指的是关于实体、结构体、指的是关于实体、结构体、类型及信号的一些特征。有些属性对综合类型及信号的一些特征。有些属性对综合(设计设计)非常有用,如:数值类属性、函数类非常有用,如:数值类属性、函数类属性以有范围类属性等等。属性以有范围类属性等等。n其引用的一般形式均为:对象其引用的一般形式均为:对象属性。属性。属性属性(Attribute)数值
37、类属性数值类属性 n数值类属性用于返回数组、块或一般数据的有关值。n表示方法如left(左边界),right(右边界),low(下边界),high(上边界),1ength(数组长度)等。例:例:sdown:IN std_logic_vector(8 DOWNTO 0);sup :IN std_logic_vector(0 TO 8);这两个信号的各属性值如下:这两个信号的各属性值如下:sdownleft=8;sdownright=0;sdownlow=0;sdownhigh=8;sdownlength=9;supleft=0;supright=8;suplow=0;suphigh=8;supl
38、ength=9;属性属性(Attribute)函数类属性函数类属性 n信号属性函数属于函数类属性,用来返回信号属性函数属于函数类属性,用来返回有关信号行为功能的信息。有关信号行为功能的信息。nevent,它的值为布尔型,如果刚好有事件,它的值为布尔型,如果刚好有事件发生在该属性所附着的信号上发生在该属性所附着的信号上(即信号有变即信号有变化化),则其取值为,则其取值为True,否则为,否则为False。利。利用此属性可决定时钟边沿是否有效,即时用此属性可决定时钟边沿是否有效,即时钟是否发生。钟是否发生。若有如下定义:若有如下定义:SIGNAL clk:IN std_logic则:则:nclke
39、vent AND clk=1 表示时钟的上升沿。即时钟变化了,且其值为表示时钟的上升沿。即时钟变化了,且其值为1(从从0变化为变化为1),因此表示上升沿。,因此表示上升沿。nclkevent AND clk=0 表示时钟的下降沿。即时钟变化了,且其值为表示时钟的下降沿。即时钟变化了,且其值为0(从从1变化为变化为0),因此表示下降沿。,因此表示下降沿。此外,还可利用预定义好的两个函数来表示时钟的边此外,还可利用预定义好的两个函数来表示时钟的边沿。沿。nrising_edge(clk)表示时钟的上升沿表示时钟的上升沿(与与clkevent AND clk=1等效等效)。nfalling_edge
40、(clk)表示时钟的下降沿表示时钟的下降沿(与与clkevent AND clk=0等效等效)。属性属性(Attribute)范围类属性范围类属性 nRANGE属性,其生成一个限制性数据对象属性,其生成一个限制性数据对象的范围。的范围。n例如:例如:SIGNAL data_bus:std_logic_vector(15 DOWNTO 0);data_busRANGE=15 DOWNTO 0;注意:注意:Max+plusII 不支持该属性。不支持该属性。VHDL基本描述方法基本描述方法n顺序语句n并行语句VHDL基本描述方法基本描述方法顺序语句顺序语句 n顺序语句顺序语句顺序语句的特点从仿顺序语
41、句的特点从仿真的角度来看是每一真的角度来看是每一条语句的执行按书写条语句的执行按书写顺序进行。注意:顺顺序进行。注意:顺序语句只能出现在进序语句只能出现在进程和子程序程和子程序(函数和过函数和过程程)内部。内部。n赋值语句赋值语句n流程控制语句流程控制语句n等待语句等待语句n子程序调用语句子程序调用语句n返回语句返回语句n空操作语句空操作语句IF_THEN_ELSE nIF语句只能在进程中使用,它根据一个或一语句只能在进程中使用,它根据一个或一组条件的布尔运算而选择某特定的执行通组条件的布尔运算而选择某特定的执行通道道 PROCESS(s,a0,a1,a2,a3)BEGINIF s=“00”T
42、HENy=a0;ELSIF s=“01”THEN-注意:此处是注意:此处是ELSIF,而不是,而不是ELSE IFy=a1;ELSIF s=“10”THENy=a2;ELSEy=a3;END IF;END PROCESS;nELSIF可允许在一个语句中出现多重条件,每一可允许在一个语句中出现多重条件,每一个个“IF”语句都必须有一个对应的语句都必须有一个对应的“END IF”语句。语句。n“IF”语句可嵌套使用,但嵌套层数不宜过多。语句可嵌套使用,但嵌套层数不宜过多。在含有多个互不相关信号的条件时,采用在含有多个互不相关信号的条件时,采用CASE_WHEN语句程序的可读性比较好。语句程序的可读
43、性比较好。错误使用错误使用IF_THEN_ELSE LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY myand2 ISPORT(a,b:INstd_logic;c:OUT std_logic);END myand2;ARCHITECTURE behave OF myand2 ISBEGINPROCESS(a,b)BEGINIF(a=1 AND b=1)THENc=1;END IF;END PROCESS;END behave;该设计原意是设计一个二输入与门,但因该设计原意是设计一个二输入与门,但因“IF”语句语句中无中无“ELSE”语句,所以综合
44、器在对此语句逻辑综语句,所以综合器在对此语句逻辑综合时默认为合时默认为“ELSE”语句为语句为“c=c;”,即,即c保持不保持不变,因此可能形成的电路如图所示。变,因此可能形成的电路如图所示。即此时电路中有个隐含触发器。利用即此时电路中有个隐含触发器。利用MAX+PLUSII软件仿真时,在第一个软件仿真时,在第一个“a=1”及及“b=1”之前,之前,c处于不定状态。处于不定状态。而在第一个而在第一个“a=1”及及“b=1”之后,之后,c始终为始终为1。为改正此错误,仅需在原程序中加上为改正此错误,仅需在原程序中加上ELSEc y y y y=a3;END CASE;END PROCESS;EN
45、D archmux;因为因为s的类型为的类型为“std_logic_vector”,取值组合除了,取值组合除了00,01,10,11外还有外还有0X,0Z,X1,虽然这,虽然这些取值组合在实际电路中不出现,但也应列出,常些取值组合在实际电路中不出现,但也应列出,常使用使用“OTHERS”语句代替其他各种组合。语句代替其他各种组合。CASE语句中条件句的次序是不重要的,其执行过语句中条件句的次序是不重要的,其执行过程接近于并行方式。程接近于并行方式。一般地,对完成相同的逻辑功能,用一般地,对完成相同的逻辑功能,用CASE语句比语句比用用IF语句描述耗用更多的硬件资源。语句描述耗用更多的硬件资源。
46、LOOP n常用的是常用的是FOR_LOOP语句,其语法格式如语句,其语法格式如下:下:LOOP 标号标号:FOR 循环变量循环变量 IN 循环次数循环次数 LOOP顺序语句顺序语句END LOOP LOOP 标号标号;ARCHITECTUR test OF test_FOR_LOOP ISBEGINPROCESS(a)VARIABLE tmp:std_logic;BEGINtmp:=0;FOR i IN 0 TO 7 LOOP-循环变量循环变量i是一个临时变量,属是一个临时变量,属LOOP语句的局部变量,不语句的局部变量,不必事先定义。必事先定义。tmp:=tmp XOR a(i);END
47、LOOP;odd_num=tmp;even_num y y y y NULL;-NULL用于排除一些不用的条件。用于排除一些不用的条件。END CASE;END PROCESS;END archmux;VHDL基本描述方法基本描述方法并行语句并行语句n并行语句是硬件描述语言并行语句是硬件描述语言与一般软件程序最大的区与一般软件程序最大的区别所在,所有并行语句在别所在,所有并行语句在结构体中的执行都是同时结构体中的执行都是同时进行的,即它们的执行顺进行的,即它们的执行顺序与语句书写的顺序无关。序与语句书写的顺序无关。n这种并行性是由硬件本身这种并行性是由硬件本身的并行性决定的,即一旦的并行性决定
48、的,即一旦电路接通电源,它的各部电路接通电源,它的各部分就会按照事先设计好的分就会按照事先设计好的方案同时工作。方案同时工作。n进程语句进程语句n块语句块语句n并行信号赋值语句并行信号赋值语句n元件例化语句元件例化语句n生成语句生成语句n并行过程调用语句并行过程调用语句进程语句(进程语句(PROCESS)n进程语句是个复合语句,由一段程序构成。进程语句是个复合语句,由一段程序构成。各个进程是并发执行的,但进程内部的所各个进程是并发执行的,但进程内部的所有语句却都是顺序执行的。有语句却都是顺序执行的。n一个结构体可以包括多个进程语句,多进一个结构体可以包括多个进程语句,多进程间的通信依靠信号(程
49、间的通信依靠信号(SIGNAL)来传递。)来传递。进程语句(进程语句(PROCESS)进程语句的语法描述如下:进程语句的语法描述如下:标号标号:PROCESS (敏感信号表敏感信号表)声明区声明区;-此处声明局部变量、数据类型此处声明局部变量、数据类型及其他用于进程中的局部声明及其他用于进程中的局部声明 BEGIN -进程开始进程开始 顺序语句顺序语句;END PROCESS 标号标号;-进程结束进程结束 进程语句(进程语句(PROCESS)n提示:提示:n敏感信号表中是进程中的一些敏感信号表中是进程中的一些信号信号,只有当其中,只有当其中的某个信号发生变化时,该进程才被激活的某个信号发生变化
50、时,该进程才被激活(执行执行);切匆将变量列入敏感表,因为进程只对信号敏;切匆将变量列入敏感表,因为进程只对信号敏感。另外,感。另外,WAIT语句在进程中的作用同敏感表相语句在进程中的作用同敏感表相似,有敏感信号就不需要似,有敏感信号就不需要WAIT语句,有语句,有WAIT语语句则不能出现敏感表。不含敏感表的进程可以有句则不能出现敏感表。不含敏感表的进程可以有多个显式的多个显式的WAIT语句。语句。块语句(块语句(BLOCK)n块语句是将结构体中的并行语句组合在一块语句是将结构体中的并行语句组合在一起,其主要目的是改善并行语句及其结构起,其主要目的是改善并行语句及其结构的可读性,一般用于较复杂