1、第七章 VHDL语言简介硬件描述语言:就是可以描述硬件电路的功能、信号的连接关系及定时关硬件描述语言:就是可以描述硬件电路的功能、信号的连接关系及定时关系语言。系语言。最常用的最常用的HDL是是VHDL和和Verilog HDL一、VHDL的发展史二、VHDL的基本语法三、VHDL程序的基本结构四、VHDL语言构造体的描述方式 五、VHDL构造体的子结构描述方式 六、VHDL的基本描述语句七、基本逻辑电路设计八、VHDL仿真与综合一、VHDL的发展史 VHSIC 计划计划 美国国防部在上个世纪美国国防部在上个世纪7070年代末和年代末和8080年代初提出的年代初提出的VHSICVHSIC(Ve
2、ry High Speed Integrated CircuitVery High Speed Integrated Circuit)计划的产物。)计划的产物。19811981年提出了一种新的硬件描述语言,称为年提出了一种新的硬件描述语言,称为VHSIC VHSIC Hardware Description Language Hardware Description Language。简称。简称VHDLVHDL。VHDL标准化标准化 1987年年12月月VHDL被接纳为被接纳为IEEE std-1076-1987标准,一般标准,一般称为称为 VHDL87。1993年进一步修订,形成年进一步修订
3、,形成IEEE std 1076-1993标准,称为标准,称为VHDL93。采用采用VHDL语言的硬件电路设计方法语言的硬件电路设计方法 采用VHDL设计数字系统一般采用自上而下(Top Down)的分层设计方法,所谓自上而下的设计方法,就是从系统总体出发,自上而下地逐步将设计内容细化,最后完成系统硬件的整体设计。1)第一层次行为描述第一层次行为描述:就是对整个系统的数学模型的描述。2)第二层次第二层次RTL方式描述方式描述,即寄存器传输描述,也称为数据流描述。采用RTL方式描述,才能导出系统的逻辑表达式,才能进行逻辑综合。3)第三层次是逻辑综合第三层次是逻辑综合。就是利用逻辑综合工具,将RT
4、L方式描述的程序转换成用基本元件表示的文件(门级网表)。采用采用VHDL语言设计硬件电路的优点语言设计硬件电路的优点 1、计技术齐全、方法灵活、支持广泛计技术齐全、方法灵活、支持广泛。VHDL语言可以支持自上而下和基于库的设计方法,而且支持同步电路、异步电路、FPGA以及其它随机电路的设计。2、系统硬件描述能力强,能支持硬件的设计、验证、系统硬件描述能力强,能支持硬件的设计、验证、综合和测试综合和测试,是一种多层次的硬件描述语言。3、VHDL语言可以与工艺无关编程语言可以与工艺无关编程。当门级或门级以上的描述通过仿真验证后,再利用相应的工具将设计映射成不同的工艺(如MOS、CMOS等)。这样,
5、在工艺更新时,就无须修改原设计程序,只要改变相应的映射工具就行了。4、VHDL语言标准、规范,易于共享和重复利用语言标准、规范,易于共享和重复利用。二、二、VHDL的基本语法规则的基本语法规则1、词法规则、词法规则2、标识符、标识符3、保留字、保留字4、VHDL的数据类型的数据类型5、VHDL的运算操作符的运算操作符2-1 词法规则词法规则2-1-1 注释注释 由两个短线“-”开始的一行文字,如:-this is a counter2-1-2 数字数字 十进制整数表示法:012 12_345(=12345)以基数表示:2#1110_1001#,16#AB0#E1 实数:必需带小数点。12.0
6、3.144 0.0 5.54E-22-1-3 字符和字符串字符和字符串字符:用单引号引起来的ASCII字符,可以是数字,也可以是符号或字母。字符串:是一维的字符数组,需放在双引号中。如:“FALSE”,B“100”2-2 标识符标识符 短标识符(短标识符(VHDL87)VHDL的短标识符必须遵守以下规则:1、必须以英文字母开头;2、英文字母、数字(09)和下划线都是有效的字符;3、短标识符不区分大小写;4、下划线(_)的前后都必须有英文字母或数字;如:A_1 5、不能和VHDL语言的保留字重名。扩展标识符(扩展标识符(VHDL93)2-1-4下标名和段名下标名和段名 下标名用于指示数组型变量或
7、信号的某一元素。下标名用于指示数组型变量或信号的某一元素。下标段名则表示数组型变量或信号的某一段元素。下标段名则表示数组型变量或信号的某一段元素。下标名的语句格式为:下标名的语句格式为:标识符(表达式)标识符(表达式)SIGNAL a,b:STD_LOGIC_VECTOR(O TO 3);SIGNAL X,Y:STD_LOGIC;X=a(2);Y=b(3);2-3 保留字保留字 VHDL内部用的字符串,标识符不能与保留内部用的字符串,标识符不能与保留字重名字重名 如:如:if else elsif end wait when case entity architecture package c
8、omponent xnor xor 2-4 VHDL的数据类型的数据类型 客体:凡是可以赋予一个值的对象就称客体:凡是可以赋予一个值的对象就称客体。客体。常数:对某一常数赋予一个固定值。常数:对某一常数赋予一个固定值。变量:在进程和子程序中使用,是一个局部量。变量:在进程和子程序中使用,是一个局部量。信号:是电路内部硬件连接的抽象。信号:是电路内部硬件连接的抽象。常常 数数常数说明格式为:常数说明格式为:CONSTANT 常数名:数据类型:常数名:数据类型:=表达式表达式;如:如:CONSTANT VCC:REAL:=5.0;常量是一个恒定不变的量,一旦被赋值就不常量是一个恒定不变的量,一旦被
9、赋值就不能再改变。能再改变。变变 量量 变量只能在进程和子程序中使用,是一个局变量只能在进程和子程序中使用,是一个局部量,不能将信息带出所定义的当前设计单部量,不能将信息带出所定义的当前设计单元。与信号不同,变量的赋值是理想化数据元。与信号不同,变量的赋值是理想化数据传输,其赋值是立即生效的,不存在任何延传输,其赋值是立即生效的,不存在任何延迟。迟。变量定义语句的格式为:变量定义语句的格式为:VARIABLE 变量名:数据类型变量名:数据类型 约束条件:约束条件:=初始值;初始值;例如:例如:VARIABLE n:INTEGER RANGE 0 TO 15:=2;信信 号号信号信号信号定义语句
10、的格式为:信号定义语句的格式为:SIGNAL 信号名:数据类型信号名:数据类型 约束条件:约束条件:=表达式;表达式;例如:例如:SIGNAL data:STD_LOGIC_VECTOR(7 DOWNTO 0);信号赋值语句的格式为:信号赋值语句的格式为:目标信号名目标信号名=表达式;表达式;例如:例如:y=0;信号与变量的区别信号与变量的区别信号和变量是信号和变量是VHDL中的重要客体,中的重要客体,它们之间的主要区别有:它们之间的主要区别有:信号赋值至少有信号赋值至少有延时;而变量赋值没有延时。延时;而变量赋值没有延时。信号除当前值外有许多相关信息,如历史信息;信号除当前值外有许多相关信息
11、,如历史信息;而变量只有当前值。而变量只有当前值。进程对信号敏感而不对变量敏感。进程对信号敏感而不对变量敏感。信号可以是多个进程的全局信号。信号可以是多个进程的全局信号。数据类型数据类型 1、标准数据类型标准数据类型 2、用户自定义数据类型用户自定义数据类型 3、IEEE 预定义标准预定义标准标准数据类型(标准数据类型(10种)种)整数(整数(INTERGER)自然数(自然数(Natural)和正整数()和正整数(Positive)实数(实数(REAL)位(位(BIT)位数据类型也属于枚举型,取值只能是位数据类型也属于枚举型,取值只能是1和和0 位矢量(位矢量(BIT_VECTOR)位矢量使用
12、双引号括起来的一组位数据,如位矢量使用双引号括起来的一组位数据,如“1011”。使用位矢量时必须注明位宽,即数组中元素个数和使用位矢量时必须注明位宽,即数组中元素个数和排列,如:排列,如:SIGNAL S1:BIT_VECTOR(15 DOWNTO 0););标准数据类型(标准数据类型(10种)种)布尔量布尔量:TRUE,FALSE 字符(字符(CHARACTER)字符串字符串 时间时间:错误等级错误等级 在在VHDL仿真器中,错误等级类型数据用来表征系仿真器中,错误等级类型数据用来表征系统的状态,它共有统的状态,它共有4种:种:NOTE(注意),(注意),WARNING(警告),(警告),E
13、RROR(出错),(出错),FAILLURE(失败)。(失败)。用户自定义数据类型用户自定义数据类型 可以由用户定义的数据类型有:可以由用户定义的数据类型有:枚举类型、整数类型、数组类型、存取类型枚举类型、整数类型、数组类型、存取类型 文件类型、时间类型、实数类型文件类型、时间类型、实数类型用户用用户用TYPE语句定义自己的数据类型。语句定义自己的数据类型。TYPE语句的格式为:语句的格式为:TYPE 数据类型名数据类型名 IS 数据类型定义数据类型定义 OF 基本数据类型;基本数据类型;例如:例如:TYPE word IS ARRAY(0 TO 15)OF STD_LOGIC;IEEE 预定
14、义标准预定义标准 标准化数据类型标准化数据类型 IEEE93 增加了多值逻辑包增加了多值逻辑包 STD_LOGIC_1164,使得,使得“STD_LOGIC”数据具有数据具有9种不同的值。其定义如下:种不同的值。其定义如下:TYPE STD_LOGIC IS(U,-初始值初始值X,-不定不定0,-01,-1Z,-高阻高阻W,-弱信号不定弱信号不定L,-弱信号弱信号0H,-弱信号弱信号1-不可能情况不可能情况 ););“STD_LOGIC”和和“STD_LOGIC_VECTOR”是是IEEE新制定的标准化数据新制定的标准化数据类型,将它们归属到用户定义的数据类型中。类型,将它们归属到用户定义的数
15、据类型中。其他预定义标准数据类型其他预定义标准数据类型 无符号数据类型无符号数据类型UNSIGNED、有符号数、有符号数据类型据类型SIGNED、小整形、小整形SMALL_INT。在。在包集合包集合STD_LOGIC_ARITH中就定义了有中就定义了有符号数据类型和无符号数据类型。符号数据类型和无符号数据类型。数据类型转换数据类型转换 在在VHDL语言中不同数据类型的对象之间是不语言中不同数据类型的对象之间是不能进行运算和直接代入的。为了实现正确的代入操能进行运算和直接代入的。为了实现正确的代入操作,必须将要代入的数据进行类型转换。类型转换作,必须将要代入的数据进行类型转换。类型转换可用转换函
16、数实现,转换函数通常由可用转换函数实现,转换函数通常由VHDL语言的语言的包集合提供。例如,在包集合提供。例如,在STD_LOGIC_1164,STD_LOGIC_ARITH,STD_LOGIC_UNSIGNED包集合中就提供了数据类型转换函数。包集合中就提供了数据类型转换函数。TO_STDLOGICVECTOR(A)-由由BIT_VECTOR转换转换为为STD_LOGIC_VECTOR 2-5 VHDL 运算操作符运算操作符 算术运算:算术运算:+,-,*,/,MOD,REM,+(正),(正),-(负),(负),*,ABS。逻辑运算:逻辑运算:AND,OR,NAND,NOR,XOR,NOR和
17、和NOT。关系运算:关系运算:=,/=,=。并置运算:并置运算:用于位连接。用于位连接。(0&A)运算符优先级:运算符优先级:NOT,ABS,*,乘法运算符,正负,乘法运算符,正负,加、减、并,关系,逻辑运算符。加、减、并,关系,逻辑运算符。v括号可改变运算次序括号可改变运算次序 下面以加法器为例说明并置运算符的用法:下面以加法器为例说明并置运算符的用法:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY addition IS
18、PORT(A,B:IN STD_LOGIC_VECTOR(3 DOWNTO 0);Q1:OUT STD_LOGIC_VECTOR(4 DOWNTO 0);END addition;ARCHITECTURE behav OF addition ISBEGIN PROCESS(A,B)BEGIN Q1=(0&A)+(0&B);END PROCESS;END behav;三、三、VHDL程序的基本结构程序的基本结构一个完整的一个完整的VHDL语言程序通常包含:实体(语言程序通常包含:实体(Entity)、构造)、构造体(体(Architecture)、配置()、配置(Configuration)、包
19、集合)、包集合(Package)和库()和库(Library)五部分。)五部分。实体(实体(Entity):):“symbol”构造体(构造体(Architecture):):配置(配置(Configuration):):包集合(包集合(Package):):库(库(Library):):3-1 实体实体 实体说明实体说明 实体说明定义了一个给定的设计单元及该设计单元与周围实体说明定义了一个给定的设计单元及该设计单元与周围 的接口,它具有如下结构:的接口,它具有如下结构:ENTITY 实体名实体名 IS 类属参数说明类属参数说明 端口说明端口说明 END 实体名;实体名;类属参数说明与端口说明
20、类属参数说明与端口说明 类属参数说明类属参数说明可选可选 GENERIC CONSTANT 名字表:名字表:IN 子类型标志子类型标志:=静静态表达式态表达式,;端口说明端口说明 PORT(端口名(端口名,端口名,端口名:方向:方向 数据类型;数据类型;端口名端口名,端口名,端口名:方向:方向 数据类型);数据类型);端口方向端口方向端口方向用来定义外部引脚的信号方向是输入还是输出。表端口方向用来定义外部引脚的信号方向是输入还是输出。表示方向的说明符及含义如下表所示:示方向的说明符及含义如下表所示:方向定义方向定义 含含 义义IN输入输入OUT 输出(构造体内部不能再使用)输出(构造体内部不能
21、再使用)INOUT 双向双向 BUFFER 输出(构造体内部可再使用)输出(构造体内部可再使用)LINKAGE 不指定方向,无论哪个方向都可连接不指定方向,无论哪个方向都可连接 实体举例实体举例1下面为一个异步复位的下面为一个异步复位的D触发器的实体说明触发器的实体说明entity dff_async_rst isport(D,CLK,RESET:in STD_LOGIC;Q :out STD_LOGIC);end dff_async_rst;实体举例实体举例2二选一电路的实体说明:二选一电路的实体说明:entity mux isport(a:in std_logic;b:in std_log
22、ic;s:in std_logic;f:out std_logic )end mux;ABSF实体举例实体举例3带类属参数说明的实体:带类属参数说明的实体:entity adder isgeneric(width:integer:=2);port(in_a:in std_logic_vector(width-1 downto 0);in_b:in std_logic_vector(width-1 downto 0);z :out std_logic_vector(width-1 downto 0);carry:out std_logic);end entity adder;3-2 构造体构造体
23、构造体:确定基本设计单元输入输出关系,即它定义构造体:确定基本设计单元输入输出关系,即它定义了设计单元的具体功能。了设计单元的具体功能。构造体说明构造体说明构造体的描述方式构造体的描述方式 行为描述行为描述 寄存器传输级描述(寄存器传输级描述(RTL描述)描述)结构描述结构描述构造体的说明构造体的说明一定要跟在实体的后面一定要跟在实体的后面,书写格式:,书写格式:可任意取,但一般用描述方式定义可任意取,但一般用描述方式定义 ARCHITECTURE 构造体名构造体名 OF 实体名实体名 IS 定义语句定义语句 内部信号,常数,数据类型,函数等的定义(可选)内部信号,常数,数据类型,函数等的定义
24、(可选)BEGIN 并行处理语句并行处理语句 END 构造体名;构造体名;behevdataflowstructrual构造体举例构造体举例1具有异步复位的具有异步复位的D触发器的构造体:触发器的构造体:architecture behav of dff_async_rst is begin process(CLK,RESET)begin if(RESET=0)then Q=0;elsif(CLKEVENT AND CLK=1)then Q=D;endif;end process;end behav;进程语句(并发)IF语句(顺序)构造体举例2二选一的构造体描述1:architecture f
25、irst_rtl of mux is begin mux_p:process(a,b,s)begin f=(a and s)or(b and not s);end process mux_p;end first_rtl;构造体举例构造体举例3二选一的构造体描述二选一的构造体描述2:architecture rtl of mux is begin mux_p:process(a,b,s)begin if(s=1)then f=a;else f=b;end if;end process mux_p;end rtl;3-3 配置配置 配置语句描述层与层之间的连接关系以及实体与构造体之配置语句描述层与
26、层之间的连接关系以及实体与构造体之间的连接关系。间的连接关系。配置语句的书写格式为:配置语句的书写格式为:CONFIGURATION 配置名配置名 OF 实体名实体名 IS 说明语句说明语句 END 配置名;配置名;下面以二选一电路来说明配置语句的用法:下面以二选一电路来说明配置语句的用法:configuration mux_c of mux is for rtl end for;end mux_c;3-4 包集合包集合 为了实现数据的共享,可以将它们收集在一个包集为了实现数据的共享,可以将它们收集在一个包集合中。多个包集合可以并入一个合中。多个包集合可以并入一个VHDL库中库中。PACKAG
27、E 包集合名包集合名 IS 说明语句说明语句 包集合头包集合头 END 包集合名;包集合名;PACKAGE BODY 包集合名包集合名 IS 说明语句说明语句 包集合体包集合体 END BODY;要使用包集合必须用要使用包集合必须用USE语句说明:语句说明:USE IEEE.STD_LOGIC_1164.ALL 包集合包集合 常用的预定义包集合有:常用的预定义包集合有:1、STD_LOGIC_1164包集合包集合 是是IEEE的标准包集合的标准包集合,其中包含了一些数据类型、子类型和函数的定义,其中包含了一些数据类型、子类型和函数的定义。包含数据类型包含数据类型STD_LOGIC和和STD_L
28、OGIC_VECTOR的定义。的定义。2、STD_LOGIC_ARITH包集合包集合 在在STD_LOGIC_1164包集合的基础上扩展了包集合的基础上扩展了 3个数据类型:个数据类型:UNSIGNED、SIGNED和和SMALL_INT,并为其定义了相应的算术运算符和转换函数。,并为其定义了相应的算术运算符和转换函数。3、STD_LOGIC_UNSIGNED和和STD_LOGIC_SIGNED包集合包集合 这些包集合重载了可用于这些包集合重载了可用于INTEGER型、型、STD_LOGIC及及STD_LOGIC_VECTOR型混合运算的运算符,并定义了一个由型混合运算的运算符,并定义了一个由
29、STD_LOGIC_VECTOR型到型到INTEGER型的转换函数。型的转换函数。3-5 库库 库是经编译后的数据的集合,它存放包集合的定义、库是经编译后的数据的集合,它存放包集合的定义、实体定义、构造体定义和配置定义。实体定义、构造体定义和配置定义。库的种类库的种类(有有5种库种库)IEEE库、STD库、ASIC矢量库、用户定义的库和WORK库。库的使用库的使用(库在使用前都首先要说明库在使用前都首先要说明)LIBRARY 库名;USE LIBRARY_NASME.package_name.ITEM.name;如:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.AL
30、L;库库 库说明作用范围库说明作用范围 从一个实体说明开始到它所属的构造体、配置为从一个实体说明开始到它所属的构造体、配置为止。止。四、四、VHDL语言构造体的描述方式语言构造体的描述方式一、一、行为描述行为描述 行为描述方式是对系统数学模型的描述,其抽行为描述方式是对系统数学模型的描述,其抽象程度比象程度比RTL描述方式和结构描述方式更高。在行描述方式和结构描述方式更高。在行为描述方式的程序中大量采用算术运算、关系运算、为描述方式的程序中大量采用算术运算、关系运算、惯性延时、传输延时等难以进行逻辑综合和不能进惯性延时、传输延时等难以进行逻辑综合和不能进行逻辑综合的行逻辑综合的VHDL语句。一
31、般来说,采用行为描语句。一般来说,采用行为描述方式的述方式的VHDL程序主要用于系统数学模型的仿真程序主要用于系统数学模型的仿真或者系统工作原理的仿真。或者系统工作原理的仿真。二、二、RTL描述方式描述方式 RTL描述方式也称为数据流描述方描述方式也称为数据流描述方式,是一种明确规定积存器的描述方法。式,是一种明确规定积存器的描述方法。由于受综合的限制,在采用由于受综合的限制,在采用RTL描述方描述方式时所使用的式时所使用的VHDL语句有一定的限制,语句有一定的限制,所以必需查逻辑综合器手册,以确定哪所以必需查逻辑综合器手册,以确定哪些语句可以使用,哪些语句不能使用。些语句可以使用,哪些语句不
32、能使用。三、结构描述方式三、结构描述方式 指部件级的描述方式,可把已有的设计指部件级的描述方式,可把已有的设计单元方便地用到新的设计中。单元方便地用到新的设计中。1、结构描述方式的基本框架、结构描述方式的基本框架 COMPONENT语句指明电路中所用的已语句指明电路中所用的已生成的模块,用生成的模块,用PORTMAP()语句将模()语句将模块连接起来。块连接起来。2、COMPONENT 语句语句 COMPONENT语句的书写格式为:语句的书写格式为:COMPONENT 元件名元件名GENERIC 说明;说明;-参数说明参数说明PORT 说明;说明;-端口说明端口说明END COMPONENT;
33、COMPONENT语句可以放在语句可以放在ARCHITECTURE,PACKAGE及及BLOCK的说明部分中使用。的说明部分中使用。GENERIC通常用于该元件的可变参数的代入通常用于该元件的可变参数的代入或赋值,而或赋值,而PORT则说明该元件的输入输出端口的则说明该元件的输入输出端口的信号规定。信号规定。下面以下面以4BIT 伪随机序列产生器为例来说明结伪随机序列产生器为例来说明结构描述的使用:构描述的使用:LIBRARY A40MX;-Actel公司公司A40MX系列器件库系列器件库USE A40MX.ALL;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.AL
34、L;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY TEST IS PORT(QOUT:OUT STD_LOGIC;CLKIN,CLRIN:IN STD_LOGIC);END TEST;ARCHITECTURE structual OF test IS COMPONENT DFCIB PORT(D:in std_logic;CLK:in std_logic;CLR:in std_logic;Q :out std_logic);END COMPONENT;COMPONENT XNOR2 PORT(A:in std_logic;B:in std_logic;Y:out st
35、d_logic);END COMPONENT;SIGNAL Q1,Q2,Q3,Q4,Y1:std_logic;BEGIN QOUT=Q4;U1:DFC1B PORT MAP(Y1,CLKIN,CLRIN,Q1);U2:DFC1B PORT MAP(Q1,CLKIN,CLRIN,Q2);U3:DFC1B PORT MAP(Q2,CLKIN,CLRIN,Q3);U4:DFC1B PORT MAP(Q3,CLKIN,CLRIN,Q4);U5:XNOR2 PORT MAP(Q3,Q4,Y1);END structual;五、五、VHDL构造体的子结构描述方式构造体的子结构描述方式 BLOCK语句结构
36、子结构描述语句:PROCESS语句结构 过程 SUBPROGRAMS结构 函数 1)BLOCK语句结构描述语句结构描述 l l BLOCK语句的结构语句的结构 采用BLOCK语句描述局部电路的书写格式如下:块结构名:块结构名:BLOCK BEGIN (并发语句)(并发语句)END BLOCK 块结构名;块结构名;BLOCK块和子电路原理图的关系块和子电路原理图的关系 ARCHITECTURE BLOCK1:BLOCK BLOCK2:BLOCK3:l BLOCK中语句的并发性中语句的并发性 BLOCK中的语句是并行执行的,与书写中的语句是并行执行的,与书写顺序无关。顺序无关。进程语句结构描述进程
37、语句结构描述 l PROCESS语句的结构语句的结构采用PROCESS语句描述电路结构的书写格式如下:进程名:进程名:PROCESS(信号(信号1,信号,信号2,)BEGIN (顺序执行语句顺序执行语句)END PROCESS;子程序语句结构描述子程序语句结构描述 VHDL语言中子程序有两种类型:语言中子程序有两种类型:过程(过程(Procedure)函数(函数(Function)a)过程(过程(Procedure)语句)语句l 过程语句的结构过程语句的结构过程语句的书写格式为:过程语句的书写格式为:PROCEDURE 过程名(参数过程名(参数1;参数;参数2;)IS定义语句定义语句 (变量等
38、的定义)(变量等的定义)BEGIN 顺序处理语句顺序处理语句 (过程的语句)(过程的语句)END 过程名;过程名;l 过程结构中语句的顺序性过程结构中语句的顺序性 过程结构中的语句是按顺序执行的。过程结构中的语句是按顺序执行的。b)函数(函数(Function)语句)语句 l 函数语句的结构函数语句的结构 函数语句的书写格式为:FUNCTION 函数名(参数函数名(参数1;参数;参数2;)RETURN 数据类型名数据类型名 IS 定义语句定义语句 (变量等的定义)(变量等的定义)BEGIN 顺序处理语句顺序处理语句 RETURN 返回变量名返回变量名;END 函数名函数名;l FUNCTION
39、语句中括号内的所有参数都是输入参语句中括号内的所有参数都是输入参数或称输入信号数或称输入信号。六、六、VHDL的基本语句的基本语句6-1 顺序描述语句顺序描述语句l l WAIT语句;语句;l l 信号代入语句;信号代入语句;l l 变量赋值语句;变量赋值语句;l l IF语句;语句;l l CASE语句;语句;l l LOOP语句;语句;l l NEXT语句;语句;l l EXIT语句;语句;l l RETURN语句;语句;l l 过程调用语句;过程调用语句;l l 断言语句;断言语句;l l NULL语句。语句。WAIT语句语句 WAIT无限等待无限等待 WAIT ON敏感信号量变化敏感信
40、号量变化 WAIT UNTIL条件满足条件满足 WAIT FOR时间到时间到通常只有通常只有WAIT UNTIL格式的等待语句可以被格式的等待语句可以被VHDL综合器综合。综合器综合。WAIT UNTIL语句的书写格式为:语句的书写格式为:WAIT UNTIL 表达式;表达式;WAIT UNTIL 信号信号=VALUE;WAIT UNTIL 信号信号EVENT AND 信号信号=VALUE;WAIT UNTIL NOT 信号信号STABLE AND 信号信号=VALUE;WAIT语句举例语句举例entity dff_async_rst isport(D,CLK:in STD_LOGIC;Q :
41、out STD_LOGIC););end dff_async_rst;architecture wait_statement of dff_async_rst isbeginprocess-注意进程无敏感量表注意进程无敏感量表begin-进程在此等待直至条件满足进程在此等待直至条件满足wait until rising_edge(CLK);Q=D;end process;end wait_statement;信号代入语句信号代入语句 信号代入语句的书写格式为:信号代入语句的书写格式为:目的信号量目的信号量=信号表达式;信号表达式;如:如:Y=A AND B after 5ns;注意:注意:=两
42、边的信号量的类型和位长度应该一致。两边的信号量的类型和位长度应该一致。变量赋值语句变量赋值语句变量赋值语句的书写格式为:变量赋值语句的书写格式为:目的变量目的变量:=表达式;表达式;该语句表明,目的变量的值将由表达式的该语句表明,目的变量的值将由表达式的新值替代,但两者的类型必须相同。新值替代,但两者的类型必须相同。书写变量赋值语句应注意以下几点:书写变量赋值语句应注意以下几点:VHDL中变量赋值限定在进程、函数和过程等顺序区中变量赋值限定在进程、函数和过程等顺序区域内。域内。变量赋值无时间特性。变量赋值无时间特性。变量具有局部性。变量具有局部性。IF语句语句IF语句是根据指定的条件来确定执行
43、那些语句的,按其书写格式,通常可分语句是根据指定的条件来确定执行那些语句的,按其书写格式,通常可分为为三种类型。1、门闩控制语句、门闩控制语句 门闩控制语句的书写格式为:IF条件条件 THEN 顺序处理语句;顺序处理语句;END IF;其中:条件为布尔量,即:“真”或“假”,当条件为“真”时,执行顺序处理语句,否则,执行IF的后继语句。2、选择控制语句、选择控制语句当IF语句用作二选择控制时的书写格式为:IF 条件条件 THEN顺序处理语句;顺序处理语句;ELSE 顺序处理语句;顺序处理语句;END IF;IF 语句语句a)3、多选择控制的多选择控制的IF语句语句 多选择控制的IF语句又称为I
44、F语句的嵌套,其书写格式为:IF 条件条件 THEN 顺序处理语句;顺序处理语句;ELSIF 条件条件 THEN 顺序处理语句;顺序处理语句;ELSIF 条件条件 THEN 顺序处理语句;顺序处理语句;ELSE 顺序处理语句;顺序处理语句;END IF;IF 语句举例语句举例下面以下面以4 BIT 计数器为例说明计数器为例说明IF语句的用法:语句的用法:-设计一个异步复位、同步预置的设计一个异步复位、同步预置的4 BIT 同步计数器同步计数器library IEEE;use IEEE.STD_LOGIC_1164.all;use IEEE.STD_LOGIC_UNSIGNED.all;enti
45、ty counter4 is port(CLK,RESETN,LOAD,ENABLE:in STD_LOGIC;CNT_IN:in STD_LOGIC_VECTOR(3 downto 0);COUNT :out STD_LOGIC_VECTOR(3 downto 0);end counter4;IF 语句举例语句举例architecture rtl of counter4 isSIGNAL TEMP_COUNT:STD_LOGIC_VECTOR(3 downto 0);beginCOUN_PROC:process(CLK,RESETN)begin if(RESETN=0)then TEMP_C
46、OUNT 0);elsif RISING_EDGE(CLK)then if(LOAD=1)then TEMP_COUNT=CNT_IN;elsif(ENABLE=1)then TEMP_CONT=TEMP_COUNT+1;end if;end if;end process;COUNT 顺序处理语句;顺序处理语句;END CASE;上述上述CASE语句中的条件表达式可选如下语句中的条件表达式可选如下4种不同地表示形式:种不同地表示形式:WHEN 值值=顺序处理语句;顺序处理语句;-某个值某个值WHEN 值值|值值|值值|值值=顺序处理语句;顺序处理语句;-多个值多个值“或或”WHEN值值 TO值
47、值=顺序处理语句;顺序处理语句;-取值范围取值范围WHEN OTHERS=顺序处理语句;顺序处理语句;-其它所有值其它所有值CASE 语句举例语句举例下面以下面以4选选1多路选择器为例说明多路选择器为例说明CASE语句的用法。语句的用法。-4:1 Multiplexor Using A Case Statement library IEEE;use IEEE.STD_LOGIC_1164.all;entity mux isport(C,D,E,F:in STD_LOGIC;S :in STD_LOGIC_VECTOR(1 downto 0);MUXOUT :out STD_LOGIC);end
48、 mux;CASE语句举例语句举例architecture my_mux of mux isbeginprocess(S,C,D,E,F)begin case S is when“00”=MUXOUT MUXOUT MUXOUT MUXOUT=F;end case;end process;end my_mux;LOOP 语句语句 LOOP语句就是循环语句,它可以使包语句就是循环语句,它可以使包含的一组顺序语句被循环执行,其执行次数含的一组顺序语句被循环执行,其执行次数受迭代算法控制受迭代算法控制。LOOP语句有三种形式:语句有三种形式:单个单个LOOP语句语句 FOR LOOP语句语句 WHI
49、LE LOOP语句语句 单个单个LOOP语句语句 单个LOOP语句的书写格式为:标号:标号:LOOP 顺序语句顺序语句 END LOOP 标号标号;这种循环语句需引入其它控制语句(如EXIT)后才能确定,否则为无限循环。其中的标号是可选的。FOR LOOP语句语句 FOR LOOP 语句的书写格式为:标号:标号:FOR 循环变量循环变量 IN 离散范围离散范围 LOOP顺序语句顺序语句END LOOP 标号标号;FOR后面的循环变量是一个属于LOOP语句的局部的、临时变量,无须事先定义。下面以下面以8位奇偶校验电路为例说明位奇偶校验电路为例说明FOR LOOP 语句的用法:语句的用法:libr
50、ary ieee;use ieee.std_logic_1164.all;entity parity_check isport(a:in std_logic_vector(7 downto 0);y:out std_logic);end parity_check;architecture FOR_LOOP of parity_check isbeginprocess(a)variable tmp:std_logic;begintmp:=0;for I in 0 to 7 looptmp:=tmp XOR a(i);end loop;y=tmp;end process;end rtl;WHILE