1、第2章 VHDL语言程序基础2.1 概述VHDL语言具有以下主要优点:1)VHDL具有强大的功能,覆盖面广,描述能力强,可用于从门级、寄存器传输级(Register Transfer Language,RTL)直至系统级的描述、仿真和综合。2)VHDL具有良好的可读性。3)VHDL具有良好的可移植性。4)使用VHDL可以延长设计的生命周期。5)VHDL支持对大规模设计的分解和已有设计的再利用。第2章 VHDL语言程序基础2.1 概述一个完整的VHDL语言程序通常包含以下5个部分:实体(entity)构造体(architecture)配置(configuration)包集合(package)库(
2、Library)第2章 VHDL语言程序基础2.2.1 VHDL语言程序设计的基本单元 所谓VHDL语言程序设计的基本单元(design unit),就是VHDL语言的一个基本设计实体。一个基本设计单元,简单的可以是一个与门(and gate),复杂的可以是一个微处理器或一个系统。2.2 VHDL语言程序的结构第2章 VHDL语言程序基础2.2 VHDL语言程序的结构2.2.2 实体entity 实体名is 类属参数说明;端口说明;end实体名;类属参数说明必须放在端口说明之前,用于指定参数。第2章 VHDL语言程序基础2.2 VHDL语言程序的结构 端口说明是对基本设计实体(单元)与外部接口
3、的描述,也可以说是对外部引脚信号的名称、数据类型和输入输出方向的描述。其一般书写格式如下:port(端口名,端口名:方向 数据类型名;端口名,端口名:方向 数据类型名);端口模式说明:第2章 VHDL语言程序基础2.2 VHDL语言程序的结构2.2.3 构造体一个构造体的具体结构描述如下:architecture 构造体名 of 实体名 is 定义语句内部信号、常数、数据类型、函数等的定义;begin 并行处理语句;end构造体名;第2章 VHDL语言程序基础2.2 VHDL语言程序的结构例2-3entity mux is port(d0,d1:in bit;sel:in bit;q:out
4、bit);end mux;architecture dataflow of mux is begin q=(d0 and sel)or(not sel and d1);end dataflow;第2章 VHDL语言程序基础2.2 VHDL语言程序的结构2.2.4 配置配置语句的基本书写格式如下:configuration 配置名of 实体名 is 语句说明;end配置名;configuration 配置名of 实体名 is for选配构造体名-此处无“;”号 end for;end配置名;最简单的默认配置格式为:最简单的默认配置格式为:第2章 VHDL语言程序基础2.3 VHDL设计资源2.3
5、.1 库1.库的种类IEEE库、std库、ASIC库、work库和用户定义库。表2-1 IEEE两个标准库“std”和“ieee”程序包的内容库名包名内容stdstandardVHDL类型,如bit,bit_vectorieeestd_logic_1164定义std_logic、std_logic_vectorieeenumeric_std基于 std_logic_1164中算术运算符ieeestd_logic_arith定义有、无符号类型及基于这类型的运算ieeestd_logic_signed有符号的算术运算ieeestd_logic_unsigned无符号的算术运算第2章 VHDL语言程
6、序基础2.3 VHDL设计资源2.库的使用library IEEE;use IEEE.std_logic_1164.all;2.3.2包集合包集合的结构如下:package包集合名is 说明语句;包集合标题end包集合名;package body包集合名 is 说明语句;包集合体end body;第2章 VHDL语言程序基础2.4 VHDL语言要素2.4.1 标识符使用时应注意以下几点:1)VHDL不区分大小写;2)标识符一定要以字母开头;3)下划线不能放在结尾;4)下划线不能连用。第2章 VHDL语言程序基础2.4 VHDL语言要素2.4.2 数据对象数据对象主要有3种,即:常量(const
7、ant)、变量(variable)和信号(signal)。1.常量常量是全局量,在构造体描述、程序包说明、实体说明、过程说明、函数调用说明和进程说明中使用。constant常量名:数据类型:=表达式;第2章 VHDL语言程序基础2.4 VHDL语言要素2.变量变量是一个局部量,只能在进程和子程序中使用。variable 变量名:数据类型:=初始值;定义变量的语法格式如下:赋值语句的语法格式如下:目标变量名:=表达式;例:a:=b+c;第2章 VHDL语言程序基础2.4 VHDL语言要素3.信号信号的定义格式如下:signal信号名:数据类型:=初始值;信号的赋值语句表达式如下:目标信号名=表达
8、式;例:q=count;第2章 VHDL语言程序基础2.4 VHDL语言要素4.三者的使用比较(3)变量赋值立即生效;信号赋值时,语句执行也不会立即发生代入。(1)常量相当于电路中的恒定电平,如GND或VCC接口(2)符号 变量为“:=”;信号为“=”第2章 VHDL语言程序基础2.4 VHDL语言要素数据类型含义整数整数32位,-21474836472147483647实数浮点数,-1.0e+381.0e+38位逻辑0或1位矢量位矢量布尔量逻辑“假”或“真”字符ASCII字符时间时间单位错误等级not,warning,error,failor自然数,正整数整数的子集字符串字符矢量第2章 VH
9、DL语言程序基础2.4 VHDL语言要素2.4.3 VHDL的数据类型2.用户定义的数据类型(1)枚举类型。(2)整数类型、实数类型。(3)数组类型。(4)时间类型(物理类型)。(5)记录类型。第2章 VHDL语言程序基础2.4 VHDL语言要素2.4.3 VHDL的数据类型3.用户定义的子类型4.数据类型的转换5.数据类型的限定6.IEEE标准“std_logic”,“std_logic_vector”第2章 VHDL语言程序基础2.4 VHDL语言要素2.4.4 VHDL运算符1.逻辑运算符not 取反;and 与;or 或;nand 与非;nor 或非:xor 异或。第2章 VHDL语言
10、程序基础2.4 VHDL语言要素2.4.4 VHDL运算符2.算术运算符+加;-减;*乘;除;mod求模;rem取余;+正(一元运算);-负(一元运算);*指数;abs取绝对值 第2章 VHDL语言程序基础2.4 VHDL语言要素2.4.4 VHDL运算符3.关系运算符等于;/=不等于;小于;大于等于。4.并置运算符 第2章 VHDL语言程序基础2.4 VHDL语言要素2.4.5 VHDL的属性1.数值类属性2.函数类属性3.范围类属性第2章 VHDL语言程序基础2.4 VHDL语言要素2.4.6 常见错误entity many_errors is port -line1a:bit_vecto
11、r(3 to 0);-line2b:out std_logic_vector(0 to3);-line3c:in bit_vector(5 downto 0);)-line4end many_errors-line5architecture not_so_good of many_errors-line6begin -line7my_1abe1:process -line8begin -line9if c=xf then -line10 b=a;-line11else -line12 b=0101;-line13end if;-line14end process;-line15end not_
12、so_good -line16第2章 VHDL语言程序基础2.5 VHDL语言的描述方式2.5.1 行为描述architecture behavioral of eqcomp4 isbeginprocess(a,b)beginif a=b thenequals=1;elseequals=0;end if;end process;end behavioral;第2章 VHDL语言程序基础2.5.2 数据流描述2.5 VHDL语言的描述方式library IEEE;use IEEE.std_logic_1164.all;entity eqcomp4 is port(a,b:bit_vector(3
13、 downto 0);equals:out bit);end eqcomp4;architecture dataflow of eqcomp4 isbeginequals=1 when(a=b)else 0;end behavioral;第2章 VHDL语言程序基础2.5 VHDL语言的描述方式2.5.3 结构描述architecture struct of eqcomp4 issignal x:std_logic_vector(0 to 3);beginu0:nxor2 port map(a(0),b(0),x(0);u1:nxor2 port map(a(1),b(1),x(1);u2:n
14、xor2 port map(a(2),b(2),x(2);u3:nxor2 port map(a(3),b(3),x(3);u4:and4 port map(x(0),x(1),x(2),x(3),equals);end struct;第2章 VHDL语言程序基础2.6 VHDL顺序语句(1)赋值语句;(2)转向控制语句;(3)等待语句;(4)子程序调用语句;(5)返回语句;(6)空操作语句。第2章 VHDL语言程序基础2.6 VHDL顺序语句2.6.1 赋值语句 赋值语句的功能就是将一个值或一个表达式的运算结果传递给某一数据对象,如信号或变量,或由此组成的数组。变量赋值目标:=赋值源;信号赋
15、值目标顺序语句;when 选择值=顺序语句;when others=顺序语句;end case;选择值可以有4种不同的表达方式:单个普通数值,如4;数值选择范围,如(2 to 4),表示取值2、3或4;并列数值,如3|5,表示取值为3或者5;混合方式,以上三种方式的混合。第2章 VHDL语言程序基础2.6 VHDL顺序语句使用case语句需注意以下几点:2)除非所有条件句中的选择值能完整覆盖case语句中表达式的取值,否则最末一个条件句中的选择必须用“others”表示。3)case语句中每一条件句的选择只能出现一次,不能有相同选择值的条件语句出现。4)case语句执行中必须选中,且只能选中所
16、列条件语句中的一条。这表明case语句中至少要包含一个条件语句。1)条件句中的选择值必须在表达式的取值范围内。第2章 VHDL语言程序基础3.loop语句2.6 VHDL顺序语句loop标号:重复模式loop 顺序语句end looploop标号loop标号:for循环变量in循环次数范围loop -循环次数已知loop标号:while循环控制条件loop -循环次数未知格式如下:重复模式有两种:while和for,格式分别为:第2章 VHDL语言程序基础4.next语句2.6 VHDL顺序语句next语句主要用在loop语句执行中有条件的或无条件的转向控制。它的语句格式为:nextloop标
17、号when条件表达式;第2章 VHDL语言程序基础5.exit语句2.6 VHDL顺序语句exit语句也是loop语句的内部循环控制语句,其语句格式如下:exitloop标号when条件表达式;第2章 VHDL语言程序基础2.6.3 wait语句2.6 VHDL顺序语句waiton 信号表until条件表达式for时间表达式;单独的wait,未设置停止挂起条件的表达式,表示永远挂起。wait on信号表,称为敏感信号等待语句,在信号表中列出的信号是等待语句的敏感信号。当处于等待状态时,敏感信号的任何变化(如从01或从10的变化)将结束挂起,再次启动进程。wait until条件表达式,称为条件
18、等待语句,该语句将把进程挂起,直到条件表达式中所含信号发生了改变,并且条件表达式为真时,进程才能脱离挂起状态,恢复执行wait until语句之后的语句。第2章 VHDL语言程序基础2.6.4 子程序调用语句2.6 VHDL顺序语句2.6.5 返回语句2.6.6 空操作语句1.过程调用2.函数调用return表达式;null;第2章 VHDL语言程序基础2.6.7 其他语句2.6 VHDL顺序语句1.assert语句assert 条件表达式report 字符串severity 错误等级severity_level;2.report语句report字符串;report字符串severity se
19、verity_level;3.决断函数第2章 VHDL语言程序基础2.7 VHDL并行语句VHDL在构造体中的并行语句主要有7种:进程语句;块语句;并行信号赋值语句;条件信号赋值语句;元件例化语句;生成语名;并行过程调用语句。第2章 VHDL语言程序基础2.7 VHDL并行语句并行语句在构造体中的使用格式如下:architecture 构造体名of实体名is 说明语句 begin 并行语句end结构体名;第2章 VHDL语言程序基础2.7 VHDL并行语句2.7.1 进程语句process语句的表达格式如下:进程标号 process(敏感信号参数表)is进程说明部分begin顺序描述语句end
20、 process;第2章 VHDL语言程序基础2.7 VHDL并行语句2.7.2 块(block)语句block语句书写格式如下:块名:block(表达式)beginend block块结构名;第2章 VHDL语言程序基础2.7 VHDL并行语句2.7.3 并行信号赋值语句1.简单信号赋值语句信号赋值目标=表达式;2.条件信号赋值语句赋值目标=表达式when 赋值条件 else 表达式when 赋值条件 else 表达式第2章 VHDL语言程序基础2.7 VHDL并行语句3.选择信号赋值语句with选择表达式select赋值目标信号连接实体端口名,);第2章 VHDL语言程序基础2.7 VHD
21、L并行语句 元件例化语句中所定义的例化元件端口名与当前系统的连接实体端口名的接口表达有两种方式。一种是名字关联方式,在这种关联方式下,例化元件的端口名和关联(连接)符号“=”两者都是必须存在的。这时,例化元件端口名与连接实体端口名的对应式,在port map句中的位置可以是任意的。另一种是位置关联方式。若使用这种方式,端口名和关联连接符号都可省去,在port map子句中,只要列出当前系统中的连接实体端口名就行了,但要求连接实体端口名的排列方式与所需例化的元件端口定义中的端口名一一对应。第2章 VHDL语言程序基础2.7 VHDL并行语句例2-35beginu1:cntm10 port map
22、(ci,rd,clk,co,qa);u2:decode48 port map(decodeout=qout,adr=qa,en=en);end behave;元件例化时的端口列表可采用位置关联方法,如u1。这种方法要求的实参(该设计中连接到端口的实际信号,如ci,rd等)所映射的形参(元件的对外接口信号)的位置同元件声明中一样;元件例化时的端口列表也可采用名称关联方法映射实参与形参,如u2,格式为(形参1=形参1,实参2=实参2),这种方法与位置无关。第2章 VHDL语言程序基础2.7 VHDL并行语句 注意:元件声明时端口名一定要用原元件定义时的端口名,不能变动。若用到库中的元件,如2输入与
23、非门(nand2),在不知其原端口名称的情况下,建议重编nand2,但必须另起文件名(见例2-36)。参数化元件可增加元件例化的灵活性。所谓参数化元件是指元件的规模(或特性)可以通过引用参数而被指定。第2章 VHDL语言程序基础2.7 VHDL并行语句2.7.6 生成语句 生成语句有一种复制的作用,生成语句的语句格式有如下两种格式:标号:for 循环变量in取值范围generate 说明 begin 并行语句 end generate标号;标号:if 条件generate 说明 begin 并行语句 end generate标号;第2章 VHDL语言程序基础2.7 VHDL并行语句 生成参数(
24、循环变量)是自动产生的,它是一个局部变量,根据取值范围自动递增或递减。取值范围的语句格式与loop语句是相同的,有两种形式:表达式 to 表达式;-递增方式表达式 downto 表达式;-递减方式第2章 VHDL语言程序基础2.8 子程序 所谓子程序就是在主程序调用它以后能将处理结果返回主程序的程序模块,其含义和其他高级语言中的子程序概念相当。子程序有两种类型,即过程(procedure)和函数(function)。过程的调用可通过其界面获得多个返回值,而函数只能返回一个值。在函数入口中,所有参数都是输入参数,而过程有输入参数、输出参数和双向参数。过程一般被看作一种语句结构,而函数通常是表达式
25、的一部分。过程可以单独存在,而函数通常作为语句的一部分调用。第2章 VHDL语言程序基础2.8 子程序2.8.1 函数function 函数名(参数表)return数据类型;-函数首function 函数名(参数表)return数据类型is;-函数体开始说明部分Begin顺序语句:end function;函数的语句格式如下:第2章 VHDL语言程序基础2.8 子程序1.函数首 函数首是由函数名、参数表和返回值的数据类型三部分组成的。函数的参数表是用来定义输入值的,它可以是信号或常数,参数名需放在关键词signal或constants之后,若没有特别说明,则参数被默认为常数。函数首的作用只是作
26、为程序包的有关此函数的一个接口界面。第2章 VHDL语言程序基础2.8 子程序2函数体函数体包括对数据类型、常数、变量等局部说明,以及用以完成规定算法或转换的顺序语句,并以关键词以及函数名结尾。2.8.2 重载函数第2章 VHDL语言程序基础2.8 子程序2.8.3 过程过程的语句格式是:procedure过程名(参数表);-过程首procedure过程名(参数表)is -过程体开始说明部分;begin顺序语句;end procedure过程名;-过程体结束第2章 VHDL语言程序基础2.8 子程序1.过程首2.过程体 过程首由过程名和参数表组成。参数表用于对常数、变量和信号三类数据对象目标作出说明,并用关键词in、out和inout定义这些参数的工作模式,即信息的流向。过程体是由顺序语句组成的,过程的调用即启动了对过程体的顺序语句的执行。2.8.4 重载过程END