1、数字逻辑1n硬件描述语言(Hardware Description Language,HDL)是一种用于数字系统设计的高级语言,具有很强的电路描述和建模能力,大大简化了硬件设计任务,提高设计的效率和可靠性。以HDL语言设计,以CPLD/FPGA为硬件实现载体,EDA软件为开发环境的现代数字系统设计方法已经被广泛采用。n本章将介绍常用硬件描述语言VHDL的基本知识,包括EDA、VHDL简介,基于VHDL的数字系统设计流程;VHDL语言的基本结构,数据对象、数据类型、运算符和表达式;顺序语句,并行语句;VHDL库和程序包等。数字逻辑2 数字逻辑3数字逻辑4188)(nmiiiOO数字逻辑5n硬件描
2、述语言(硬件描述语言(HDL:Hardware Description Language)是一种)是一种用形式化方法来描述数字电路和设计数字逻辑系统的语言,是用形式化方法来描述数字电路和设计数字逻辑系统的语言,是EDA技术的重要组成部分。技术的重要组成部分。n20世纪世纪70年代末和年代末和80年代初,面对各个电子系统承包商技术线路不年代初,面对各个电子系统承包商技术线路不一致,使得产品不兼容,采用各自的设计语言,信息交换和维护困一致,使得产品不兼容,采用各自的设计语言,信息交换和维护困难,设计不能重复利用等情况,由美国国防部牵头,来自难,设计不能重复利用等情况,由美国国防部牵头,来自IBM、
3、Texas Instruments和和Intermetrics公司的专家组成公司的专家组成VHDL(Very High Speed Integrated Circuit HDL)工作组,提出了新的硬件描)工作组,提出了新的硬件描述语言版本和开发环境。述语言版本和开发环境。IEEE标准化组织进一步发展,经过反复的标准化组织进一步发展,经过反复的修改与扩充,在修改与扩充,在1987年宣布了年宣布了VHDL语言标准版本,即语言标准版本,即IEEE STD 1076-1987标准。标准。1993年,年,VHDL-87标准被重新修订,更新为标准被重新修订,更新为IEEE STD 1076-1993标准。
4、现在公布的最新版本是标准。现在公布的最新版本是IEEE STD 1076-2019。数字逻辑6数字逻辑7以CPLD/FPGA为硬件载体,采用VHDL语言的EDA软件进行数字系统设计的的完整流程包括设计方案制定、设计输入、逻辑综合、布局布线、仿真测试、编程下载等。其他硬件描述语言的设计过程也是类似。设计流程图如图3-1所示。图3-1 设计流程图数字逻辑8n采用自顶向下、模块化设计的设计方式,确定整个系统的设计方案,划分系统的各个逻辑模块,确定各个模块的功能,以及采用的设计方式。n利用EDA软件中的文本编辑器将系统功能或结构用VHDL语言描述出来,保存问VHDL文件格式,为后面的综合优化做准备。数
5、字逻辑9n现代大多数EDA软件除了可以使用HDL语言设计输入以外,通常还支持类似传统电子系统设计的原理图输入方式。原理图输入方式中使用的逻辑模块或符号,可以使用EDA软件库中预制的功能模块,也可以使用VHDL语言设计的模块或原件。实际上,图形输入方式除了原理图输入外还有状态图输入和波形输入等常用方式。n采用模块化设计方式,完成各个功能模块设计后,将各个模块组合在一起,即完成对整个系统的设计。数字逻辑10数字逻辑11数字逻辑12n仿真是仿真是EDA设计过程中的重要步骤,通常设计过程中的重要步骤,通常EDA软件中会软件中会提供仿真工具,也可以使用第三方的专业仿真工具。根提供仿真工具,也可以使用第三
6、方的专业仿真工具。根据不同的实施阶段,分为功能仿真和时序仿真:据不同的实施阶段,分为功能仿真和时序仿真:n功能仿真:在采用不同方式完成设计输入后,即可进行功能仿真:在采用不同方式完成设计输入后,即可进行逻辑功能的仿真测试,以了解功能是否满足设计要求。逻辑功能的仿真测试,以了解功能是否满足设计要求。这个阶段的仿真测试不涉及具体的硬件结构、特性。这个阶段的仿真测试不涉及具体的硬件结构、特性。n时序仿真:又称后仿真,是最接近硬件真实运行的仿真。时序仿真:又称后仿真,是最接近硬件真实运行的仿真。利用布局布线后生成的包含硬件特性参数的仿真文件,利用布局布线后生成的包含硬件特性参数的仿真文件,对系统和各个
7、模块进行时序仿真,分析其时序关系和延对系统和各个模块进行时序仿真,分析其时序关系和延迟信息。迟信息。数字逻辑13n将适配后生成的下载或配置文件,通过编程器或将适配后生成的下载或配置文件,通过编程器或下载线缆下载到目标器件中。一般将对下载线缆下载到目标器件中。一般将对CPLD的的下载称为编程,对下载称为编程,对FPGA的下载称为配置。最后的下载称为配置。最后将整个系统进行统一的测试,验证设计在目标系将整个系统进行统一的测试,验证设计在目标系统上的实际工作情况。统上的实际工作情况。数字逻辑14nVHDL程序是由库(1ibrary)、程序包(package)、实体(entity declaratio
8、n)、结构体(architecture body)、配置(configuration)五部分组成。设计实体结构结构图如图3-2所示,其中设计实体必须有实体和结构体,其它部分根据设计需要来添加。图3-2 设计实体结构图数字逻辑15n实体是实体是VHDL程序的基本单元,类似原理图设计程序的基本单元,类似原理图设计中的而一个元件符号。其中实体说明部分规定了中的而一个元件符号。其中实体说明部分规定了其与外界通信的引脚或接口信号。在实体内部有其与外界通信的引脚或接口信号。在实体内部有一个或多个结构体,用来描述设计的逻辑结构或一个或多个结构体,用来描述设计的逻辑结构或功能。功能。数字逻辑16n【例例3-1
9、】VHDL程序基本结构程序基本结构LIBRARY IEEE;库说明部分库说明部分USE IEEE.STD_LOGIC_1164.ALL;程序程序包说明部分包说明部分ENTITY nand2 IS 实体说明部分实体说明部分PORT(a,b:IN STD_LOGIC;y:OUT STD_LOGIC);END nand2;数字逻辑17ARCHITECTURE arch_name OF nand2 IS 结构体描述部分BEGINPROCESS(a,b)VARIABLE comb:STD_LOGIC_VECTOR(1 DOWNTO 0);BEGIN Comb:=a&b;CASE comb IS WHEN
10、 00=y y y y y=0;END CASE;END PROCESS;END arch_name;数字逻辑18n实体说明部分的一般结构:nENTITY 实体名 ISnGENERIC(类属表);nPORT(端口表);nEND ENTITY 实体名;数字逻辑19数字逻辑20数字逻辑21数字逻辑22数字逻辑23数字逻辑24数字逻辑25数字逻辑26 数字逻辑27图3-3 半加器及其逻辑电路数字逻辑28nARCHITECTURE alg_ha OF half_adder ISnBEGINnPROCESS(a,b)n BEGINn IF a=0 AND b=0 THENn c=0;ns=0;n ELS
11、IF a=1 AND b=1 THENn c=1;ns=0;n ELSEn c=0;ns=1;n END IF;nEND PROCESSnEND alg_ha;数字逻辑29数字逻辑30数字逻辑31n结构化描述给出了实体内部结构组织,所包含的模块或元件及其互连关系。n结构化描述通常用于层次化结构设计。对于一个复杂的电子系统,将其分解成许多子系统,子系统再分解成各个功能模块。多层次设计的每个层次都可以作为一个元件,再构成一个模块或构成一个系统,每个元件分别仿真,然后再整体调试。n图3-3(a)所示的半加器可以用图3-3(b)所示的逻辑电路加以实现。对该电路结构采用结构化描述法的程序如下:数字逻辑3
12、2nARCHITECTURE struct_ha OF half_adder ISnCOMPONENT and_gate nPORT(a1,a2:IN BIT;na3:OUT BIT);nEND COMPONENT;nCOMPONENT xor_gate nPORT(x1,x2:IN BIT;nx3:OUT BIT);nEND COMPONENT;nBEGINngl:and_gate PORT MAP(a,b,c);n g2:xor_gate PORT MAP(a,b,s);nEND struct_ha;数字逻辑33n在在VHDL语言中可以赋值的客体叫做数据对象。语言中可以赋值的客体叫做数据对
13、象。每一种数据对象代表的物理含义和使用规则,允每一种数据对象代表的物理含义和使用规则,允许赋值的数据类型,可以参与的运算等都有严格许赋值的数据类型,可以参与的运算等都有严格的规定。的规定。nVHDL语言的基本数据对象有语言的基本数据对象有3种:常量、变量和种:常量、变量和信号。变量、常量和其它高级语言中相应类型类信号。变量、常量和其它高级语言中相应类型类似,信号则是硬件描述语言中特有的,它带有硬似,信号则是硬件描述语言中特有的,它带有硬件特征。从硬件电路的角度来看,信号和变量相件特征。从硬件电路的角度来看,信号和变量相当于电路之间的连线或连线上的信号值,常量则当于电路之间的连线或连线上的信号值
14、,常量则相当于电源(相当于电源(VCC)、地()、地(GND)等。)等。数字逻辑34n常量是设计者在实体中给某一常量名定义数据类型和赋值,在程序中试图多次给常量赋值是错误的。常量定义的一般格式如下:nCONSTANT 常量名:数据类型:=表达式;n其中表达式的数据类型必须和定义的常量数据类型一致。n常量定义一般包含在实体、结构体、程序包、进程、函数、过程等设计单元中。n例如:CONSTANT VCC:REAL:=3.3;数字逻辑35CONSTANT ABUS:BIT_VECTOR:=11000101;常量ABUS的数据类型是BIT_VECTOR,被赋初值为11000101,在程序中被做为某一器
15、件的固定地址。数字逻辑36n变量是个局部量,做为一个临时的数据存储单元,只能在进程、函数、过程等结构中使用,不能将信息带出它定义所在的当前结构。变量赋值是立即生效的,不存在延时。变量定义的一般格式如下:nVARIABLE 变量名:数据类型:=表达式;n其中表达式的数据类型必须和定义的变量数据类型一致。n例如:VARIABLE a:STD_LOGIC:=1 ;定义标准逻辑位类型变量a,初始值为 1 VARIABLE count:INTEGER RANGE 0 TO 255;定义整数类型变量count,取值范围为0到255数字逻辑37n在变量定义语句中可以给出和变量相同数据类型的初始值,但这不是必
16、须的。由于硬件电路上电后的随机性,很多综合器并不支持初始值设定,这样可以在程序中通过赋值语句来赋予变量一个值。变量赋值的方式如下:n变量名:=表达式;n变量在赋值时不能产生附加延时。例如,tmp1、tmp2是变量,那么下式产生延时的方式是不合法的:Tmp1:=tmp2 AFTER 10 ns;数字逻辑38n信号硬件系统描述中的基本数据类型,类似电路内部的连接线,实现实体和实体间、元件和元件间的连接。信号具有全局性特征,不但可以在一个设计实体内部各个单元间传递数据,还可以做为实体中并行语句模块间的信息通道,不需注明信息的流动方向。信号通常在实体、结构体、包集合中定义说明。注意不允许在进程和过程的
17、顺序语句中定义信号。信号定义的格式如下:nSIGNAL 信号名:数据类型:=表达式;n例如:SIGNAL bus_enable:BIT:=1 ;定义BIT类型信号,初始值为 1 SIGNAL data_bus:STD_LOGIC_VECTOR 7 DOWNTO 0 ;定义8位宽度的数据总线数字逻辑39n在给出信号的完整定义后,就可对信号赋值。信在给出信号的完整定义后,就可对信号赋值。信号赋值语句如下:号赋值语句如下:n信号名信号名=表达式表达式 AFTER 时间量;时间量;nAFTER 时间量,表示数据信号的传入需延时给时间量,表示数据信号的传入需延时给定的时间量,这与实际器件的硬件特征是吻合
18、的。定的时间量,这与实际器件的硬件特征是吻合的。数字逻辑40数字逻辑41nVHDL语言的标准数据类型共有语言的标准数据类型共有10种,如表种,如表3-1所示。所示。数字逻辑42VARIABLE a:INTEGER RANGER 128 TO 128;数字逻辑43nVHDL语言的实数类似于数学上的实数,实数值的范围为1.0E+38+1.0E+38。实数有正负数,书写时一定要有小数点。例如:1.0,+2.5,1.0E38,n有些数可以用整数表示也可以用实数表示。例如,数字1的整数表示为1,而用实数表示则为1.0。两个数的值是一样的,但数据类型却不一样。n大多数EDA工具只能在仿真器中使用实数类型数
19、据,综合器则不支持实数,这是因为VHDL语言适用于硬件系统设计与开发的语言,实数类型的实现太复杂,电路规模上难以承受。数字逻辑44n实数常量的书写方式举例如下:n2#11001011#二进制浮点数n1.0 十进制浮点数n 0.0 十进制浮点数n 65971.333333 十进制浮点数n 65_971.333_3333 与上一行等价n 8#43.6#e+4 八进制浮点数n 43.6E 4 十进制浮点数数字逻辑45n在数字系统中,信号值通常用一个位来表示。位值的表示方法是用字符0或者1(将值放在单引号中)来表示。位与整数中的1和0不同,1和0仅仅表示一个位的两种取值。n在程序包STANDARD中的
20、定义源代码是:TYPE BIT IS(0,1);数字逻辑46n位矢量基于BIT数据类型的数字,在程序包STANDARD中的定义源代码是:nTYPE BIT_VECTOR IS ARRAY(Natural Ranger )OF BIT;n使用位矢量时必须指明数据宽度,即数组元素个数和排列顺序,赋值是双引号括起来的一组位数据。例如:VARIABLE a:BIT_VECTOR(7 DOWNTO 0):=00110011数字逻辑47n布尔量是二值枚举量,具有两种状态:“真”或者“假”。布尔量位不同,没有数值的含义,也不能进行算术运算,只能进行关系运算。例如在IF语句中被测试,测试结果产生一个布尔量值,
21、TRUE或者FALSE。n如果某个信号或者变量被定义为布尔量,那么在仿真中将自动地对其赋值进行核查。一般这布尔量数据的初始值为FALSE。n在程序包STANDARD中的定义源代码是:TYPE BOOLEAN IS(FALSE,TRUE);数字逻辑48数字逻辑49n字符串是用双引号括起来的一个字符序列,也称字符串是用双引号括起来的一个字符序列,也称字符矢量或字符串数组,。例如:字符矢量或字符串数组,。例如:integer range,字符串一般用于提示和说明。,字符串一般用于提示和说明。n例如:例如:VARIABLE string_var:STRING(1 to 7);string_var:=a
22、 b c d数字逻辑50n错误等级(错误等级(SEVERITY LEVEL)n错误等级类型数据通常用来表征电子系统的状态,分为NOTE(注意)、WARNING(警告)、ERROR(出错)、FAILURE(失败)4个等级。n在系统仿真过程中用这4种状态来表示系统当前的工作情况,使开发者随时了解当前系统工作的情况,以采取相应的对策。n自然数(自然数(NATURAL)和正整数()和正整数(POSITIVE)n这两类数据都是整数的子类,自然数类类数据取值0和0以上的正整数,正整数类型数据为大于0的整数。BABAACABCABABCBAABCBCAAB)(数字逻辑51n时间(时间(TIME)n时间类型也
23、称为物理类型(PHYSICAL TYPE)。时间类型数据的范围是整数定义的范围,完整的时间量数据包含整数和单位两部分,整数和单位之间至少留一个空格,例如:n16 ns,25 ms,3 sec,162 min n在程序包STANDARD中给出了时间的类型定义:TYPE TIME IS RANGER-2147483647 TO 2147483647unitsfs;飞秒,VHDL语言中的最小时间单位ps=1000 fs;皮秒ns=1000 ps;纳秒us=1000 ns;微妙ms=1000 us;毫秒sec=1000 ms;秒min=60 sec;分hr=60 min;时END units;数字逻辑
24、52n事件类型一般用于仿真,VHDL综合器不支持时间类型。在系统仿真时,用时间类型数据可以表示信号的延时,从而使模型系统能更接近实际的硬件特性。n在IEEE库的程序包 STD_LOGIC_1164中定义了两个非常重要的数据类型:标准逻辑位STD_LOGIC和标准逻辑矢量 STD_LOGIC_VECTOR。n在程序中使用这两类数据类型时,必须在程序的开始部分加入下面的语句:LIBRARY IEEE;USE IEEE.STD_LOIGC_1164.ALL;数字逻辑53n标准逻辑位标准逻辑位STD_LOGICnIEEE的STD_LOGIC标准逻辑位数据类型是设计中常用的数据类型,在STD_LOGIC
25、_1164程序包中定义了该数据类型的9种取值。而传统的BIT类型只有0和1两种取值,因此较少使用。在IEEE库程序包STD_LOGIC_1164中STD_LOGIC数据类型的定义如下所示:TYPE STD_LOGIC IS (U -未初始化的 X -强未知的 0 -强0 1 -强1 Z -高阻态 W -弱未知的 L -弱0 H -弱1 -忽略 );数字逻辑54n标准逻辑矢量标准逻辑矢量 STD_LOGIC_VECTORn在IEEE库程序包STD_LOGIC_1164中STD_LOGIC_VECTOR类型的定义如下所 TYPE STD_LOGIC_VECTOR IS ARRAY (NATURAL
26、 RANGE )OF STD_LOGIC;可见,STD_LOGIC_VECTOR类型是在STD_LOGIC_1164程序包中定义的标准一维数组,数组中的每一个元素的数据类型都是标准逻辑位STD_LOGIC类型。向标准逻辑矢量 STD_LOGIC_VECTOR类型的数据对象赋值的方式与普通的一维数组 ARRAY数据对象赋值的方式是一样的,同位宽、同数据类型的矢量间才能进行赋值。数字逻辑55n VHDL语言也允许用户根据自己设计的需要自己定义数据类型,用户定义数据类型的一般格式为:nTYPE 数据类型名,数据类型名 数据类型定义;n用户定义数据类型可以有多种类型,如枚举(Enumerated)类型
27、、整数(Integer)类型、实数(Real)类型、浮点数(Floating)类型、数组(Array)类型、记录(Recode)类型、存取(Access)类型、文件(File)类型等,下面介绍几种常用的用户定义数据类型。数字逻辑56n枚举枚举(Enumerated)类型类型n枚举类型就是将类型中的所有元素都列出来。枚举类型定义的格式为:nTYPE 数据类型名 Is (元素,元素,);TYPE my_state IS (state1 state2 state3 state4 state5);数字逻辑57n但是,在逻辑电路中所有的数据都只能用0和1来表示,所以在综合过程中用符号名表示的元素都将被转
28、化为二进制编码。枚举类型元素的编码是自动的,编码顺序是默认的,一般第一个枚举元素编码为0,以后的依次加1。n综合器在编码过程中自动将每一枚举元素转变成位矢量,位矢的长度将取所需表达的所有枚举元素的最小值。n在前面地举例中,用于表达五个状态的位矢长度应该为3,编码默认值为如下方式:nstate1=000;state2=001;state3=010;state4=011;state5=100;数字逻辑58n在前面的基本类型中可以看到,整数和实数类型在标准程序包中已经定义过。但在实际应用中,这两种数据类型的取值范围太大,综合其无法进行综合。因此,用户经常根据实际的需要重新定义,限定其取值范围。例如:
29、TYPE my_num IS RANGE 100 TO 100;可见,整数或实数用户定义数据类型的格式如下:TYPE 数据类型名 IS 数据类型定义约束范围;数字逻辑59n数组类型就是将相同类型的数据集合在一起所形成的新的数据类型。数组可以是一维的,也可以是二维或多维。n数组类型定义的格式如下:nTYPE 数据类型名 IS 范围 OF 原数据类型名;n“范围”这一项默认是整数,例如:TYPE word IS ARRAY(INTEGER 1 TO 8)OF STD_LOGIC;TYPE d_bus IS ARRAY(0 TO 9)OF STD_LOGIC;TYPE instruction IS
30、(ADD,SUB,INC,SRL,SRF,LDA,LDB,XFR);SUBTYPE digit IS INTEGER 0 TO 9;TYPE insflag IS ARRAY(instruction ADD TO SRF)OF digit;数字逻辑60n多维数组需要用两个以上的范围来描述,而且多维数组不能生成逻辑电路,因此只能用于生成仿真图形及硬件的抽象模型。例如:TYPE memarray IS ARRAY(0 TO 5,7 DOWNTO 0)OF STD_LOGIC;CONSTANT romdata:memarray:=(0,0,0,0,0,0,0,0),(0,1,1,0,0,0,0,1)
31、,(0,0,0,0,0,0,0,0),(1,0,1,0,1,0,1,0),(1,1,0,1,1,1,1,0),(1,1,1,1,1,1,1,1);SIGNAL data_bit:STD_LOGIC;data_bit =romdata(3,7);数字逻辑61n在代入初值时,各范围最左边所说明的值为数组的初始位脚标。在上例中(0,7)是起始位,接下去右侧范围向右移一位变为(0,6),以后顺序为(0,5),(0,4)直至(0,0)。然后,左侧范围向右移一位变为(1,7),此后按此规律移动得到最后一位(5,0)。数字逻辑62n由不同类型的数据组织在一起形成的数据类型叫记录类型。记录类型定义的格式如下:
32、nTYPE 数据类型名 IS RECODEn 元素名:数据类型名;n 元素名:数据类型名;n nEND RECORD;n从记录类型中提取元素的数据类型时应使用“”。举例如下:数字逻辑63nTYPE bank IS RECORDnaddr0:STD_LOGIC_VECTOR(7 DOWNTO O);naddrl:STD_LOGIC_VECTOR(7 DOWNTO O);nr0:INTEGER;ninat:instruction;nEND RECORD;nSIGNAL addbusl,addbus2:STD_LOGIC VECTOR(31 DOWNTO 0);nSIGNAL result:1NTE
33、GER;nSIGNAL alu_code:instruction;nSIGNAL r_bank:bank:=(00000000,00000000,0,add);naddbusl=r_bank.addrl;nr_bank.inst=alu_code;数字逻辑64n用户定义的子类型是用户对已定义的数据类型,做一些范围限制而形成的一种新的数据类型。子类型的名称通常采用用户较易理解的名字。子类型定义的格式为:n SUBTYPE 子类型名 数据类型名 范围;n例如,在“STD_LOGIC_VECTOR”基础上所形成的子类:SUBTYPE a_bus IS STD_LOGIC_VECTOR(7 DOWNT
34、O 0);SUBTYPE digit IS INTEGER RANGE 0 TO 9;数字逻辑65n子类型可以对原数据类型指定范围而形成,也可以完全和原数据类型范围一致。例如:SUBTYPE abus IS STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL aio:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL bio:STD_LOGIC_VECTOR(15 DOWNTO O);SIGNAL cio:abvs;aio=cio;正确操作bio=cio;错误操作新构造的数据类型及子类型通常在包集合中定义,再由USE语句装载到描述语句中。数字逻辑66nV
35、HDL语言有4种运算符,分别是逻辑运算符、算术运算符、关系运算符和并置运算符。对于VHDL中的操作符与操作数间的运算有两点需要特别注意:n严格遵循在基本操作符间操作数是同数据类型的规则;n严格遵循操作数的数据类型必须与操作符所要求的数据类型完全一致 数字逻辑67n逻辑运算符逻辑运算符nVHDL中共有7种逻辑运算,它们分别是:nNOT 逻辑非;nAND 逻辑与;nNAND 逻辑与非;nOR 逻辑或;nNOR 或非;nXOR 异或;nXNOR 异或非。n逻辑运算符适用的数据类型是BIT、STD_LOGIC、BOOLEAN、BIT_VECTOR以及STD_LOGIC_VECTOR。如果运算符两边的值
36、的类型是数组,则数组的尺寸,即位宽要相等。数字逻辑68n在7种逻辑运算符中,运算符NOT的优先级最高,而其他6种运算符则具有相同的优先级。在高级编程语言中的逻辑运算符有自左向右或是自右向左的优先级顺序,但是VHDL语言的逻辑运算符则没有左右优先级差别,设计人员经常采用加括号的方法来解决逻辑表达式中没有左右优先级差别的问题。例如:q=a AND b OR NOT c AND d;数字逻辑69n在编译时将会给出语法出错的信息。对于这种情况,这里可以采用加括号的方法来解决,可以将其修改为:q=(a AND b)OR(NOT c AND d);通常情况下,对于逻辑表达式中只有AND或OR或XOR的情况
37、下可以不加括号,因为对于这三种逻辑运算来说,改变运算顺序并不会改变结果的逻辑。例如:q=a AND b AND c AND d;q=a OR b OR c OR d;q=a XOR b XOR c XOR d;数字逻辑70n在VHDL语言中,算术运算符主要包括16种,其中只有+(加)、一(减)和*(乘)能够被EDA开发工具综合为对应的逻辑电路,其余算术运算综合成逻辑电路将会很困难,甚至是完全不可能的。VHDL中的16种算术运算符如下所示:n+加;n 减;n*乘;n 除;nMOD 取模;nREM 取余;n*乘方;nABS 取绝对值;n+正号;n 负号;nSLL 逻辑左移;nSRL 逻辑右移;nS
38、LA 算术左移;nSRA 算术右移;nROL 逻辑循环左移;nROR 逻辑循环右移。数字逻辑71n算术运算符的使用规则如下:n+(加)、(减)、+(正号)、-(负号)四种运算符的操作与日常数值运算相同,可以用于整数、实数和物理类型。n*(乘)、(除)运算符的操作数可以为整数、实数。同时,物理类型可以被整数或实数相乘或相除,结果仍为物理类型;物理类型除以物理类型的结果是一个整数。nMOD(取模)和REM(取余)运算符只能用于整数类型。nABS(取绝对值)运算符可以用于任何数据类型。n*(乘方)运算符的左操作数可以是整数或是实数,而右操作数必须是整数。只有在左操作数为实数时,其右操作数才可以是负整
39、数。nSLL(逻辑左移)、SRL(逻辑右移)、SLA(算术左移)、SRA(算术右移)、ROL(逻辑循环左移)和ROR(逻辑循环右移)六种算术运算符为二元运算符,它们只能定义在一维数组上,并且其元素必须是bit和boolean型,左操作数必须为这种类型,而右操作数必须是整数类型。数字逻辑72n下面是几个整数REM(取余)和MOD(取模)的小例子。通过这些例子,读者能够掌握REM和MOD运算的规则:n7 REM 2=1,7 REM(2)=1,7 REM 2=1,7 REM(2)=1n7 MOD 2=1,7 MOD(2)=1,7 MOD 2=1,7 MOD(2)=1数字逻辑73nVHDL语言的关系运
40、算符如下所示:n 相等;n 不等于;n 大于;n 大于等于。数字逻辑74n关系运算符有如下规则:n关系运算符两边数据类型必须一致(除、);n(等于)、(不等于)适用于所有数据类型对象之间的比较;n(大于)、(大于等于)和(小于等于)适用于整数、实数、位矢量及数组之间的比较;n两个矢量比较时,自左向右,按位比较。数字逻辑75n关系运算符应用举例:PROCESS(num1,num2)SIGNAL a:STD_LOGIC_VECTOR(4 DOWNTO 0);SIGNAL b:STD_LOGIC_VECTOR(4 DOWNTO O);SIGNAL c:STD_LOGIC;BEGINa num 1;赋
41、值运算b num 2;赋值运算IF(a b)THEN 关系运算c 1;赋值运算ELSEc 0;赋值运算ENDIF;END PROCESS;数字逻辑76n并置运算符“”用于位的连接。并置运算的规则如下:n并置运算可用于位的连接,形成位适量;n并置运算可用于矢量的连接,形成新的矢量,例如,两个4位的矢量并置运算后,可以构成8位矢量;n并置运算可用于位和矢量的连接,形成新的矢量,例如,位和一个4位的矢量并置运算后,可以构成5位矢量。n下面是一个使用了并置运算符的小例子,可见并置运算符的使用方法:SIGNAL a,b:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL q:STD_
42、LOGIC_VECTOR(7 DOWNTO 0);q ab;数字逻辑77n在上面的小例子中,3条程序语句的作用是将两个4位长度的位矢量a和b连接成一个8位长度的位矢量并将其赋给信号q。n位的连接可以有不同的表示方法,下面进行介绍。先来看用并置运算符来连接4个STD_LOGIC类型的信号a、b、c、d,然看将连接后形成的位矢量赋给位矢量q。SIGNAL a,b,c,d:STD_LOGIC;SIGNAL q :STD_LOGIC_VECTOR(3 DOWNTO 0);q abcd;数字逻辑78n在VHDL语言中中,逻辑运算、关系运算、算术运算、并置运算优先级是不相同的,各种运算的操作不可能放在一个
43、程序语句中,所以把各种运算符排成统一的优先顺序表意义不明显。其次,VHDL语言的结构化描述,在综合过程中,程序是并行的,没有先后顺序之分,写在不同程序行的硬件描述程序同时并行工作。VHDL语言程序设计者不要理解程序是逐行执行,运算是有先后顺序的,这样是不利于VHDL程序的设计。运算符的优先顺序仅在同一行的情况下有顺序、有优先,不同行的程序是同时的。各个运算符的优先级别见下表3-2:数字逻辑79数字逻辑80nVHDL语言中的表达式与其他高级程序设计语言非常相似,同样是由运算符将基本元素连接起来的式子。要称为一个表达式,需要有两个要素:运算符和基本元素。基本元素包括对象名、文字、函数调用及括起来的
44、表达式。例如:ab,b(6)b(5)b(4),(AB)*B+(A REM B),7 REM(2)等。数字逻辑81n并行语句和顺序语句是VHDL语言中的两种基本描述语句,它们完整描述了数字系统的硬件结构和逻辑功能。n顺序语句的特点是按照书写的先后次序来执行,它们只能出现在进程、块和子程序中,子程序包括函数(FUNCTION)和过程(PROCEDURE)。数字逻辑82n顺序语句有两类:一类是只能作为顺序语句使用;另一类是既可以做顺序语句也可以做并行语句,这类语句放在进程、子程序以外是并行语句,放在进程、子程序内是顺序语句。nVHDL语言有6类基本顺序语句:赋值语句、流程控制语句、等待语句、子程序调
45、用语句、返回语句和空操作语句。数字逻辑83nVHDL语言中的赋值语句是指将一个值或一个表达式的运算结果传递给某一个数据对象,如信号或变量。在设计实体中,数据的传输以及对端口外部数据的读取都是通过赋值语句实现的。n信号赋值语句信号赋值语句n信号的说明要放在VHDL语言程序的并行部分进行,但可以在VHDL语言程序的并行部分和顺序部分同时使用。信号赋值语句的书写格式如下:n目标信号=表达式;n该语句表示,将右边信号量表达式的值赋予左边的目的信号量。例如:a=b;数字逻辑84n变量赋值语句变量赋值语句n在VHDL语言中,变量的说明和赋值语句只能在VHDL语言程序的顺序部分进行说明和使用,即只能出现在进
46、程、过程和函数中。变量赋值语句的书写格式为:n目标变量:=表达式;n例如:count:=10;向变量count赋值10数字逻辑85nIF语句是根据指定的条件确定执行哪条语句。IF语句的条件判断输出是布尔量,即是“真”(TRUE)或“假”(FALSE)。因此在IF语句的条件表达式中只能使用关系运算操作(=,一,=)及逻辑运算操作的组合表达式。nIF语句共有3种类型:数字逻辑86nIF_THEN语句语句n这种类型的语句书写格式如下:nIF 条件 THENn顺序处理语句nEND IF;n执行到IF语句时,判断指定条件是否成立。如果条件成立,则执行顺序处理语句部分;如果条件不成立,则跳过顺序处理语句部
47、分,向下执行IF语句后面的语句。数字逻辑87nIF_THEN_ELSE语句语句n这种类型的语句书写格式如下:nIF 条件 THENn顺序处理语句1;nELSEn顺序处理语句2;nEND IF;数字逻辑88n在这种格式的IF语句中,当IF语句所指定的条件成立时,将执行顺序处理语句1部分;当IF语句所指定的条件不成立时,将执行顺序处理语句2部分。也就是说,用条件来选择两条不同程序执行的路径。n这种描述的典型逻辑电路实例是二选一电路。例如,二选一电路的输入为a和b,选择控制端为sel,输出端为c。用IF语句来描述该电路行为的程序如例3-2所示。数字逻辑89n【例例3-2】IF_THEN_ELSE语句
48、示例ARCHITECTURE rtl OF mux2 ISBEGINPROCESS(a,b,sel)BEGINIF(sel=1)THENc=a;ELSEc=b;END IF;END PROCESS;END rtl;数字逻辑90nIF_THEN_ELSEIF_ELSE语句语句nIF语句的多选择控制又称IF语句的嵌套,在这种情况下,它的书写格式为:nIF 条件1 THENn顺序处理语句1;nELSIF 条件2 THENn顺序处理语句2;nnELSIE 条件n THENn顺序处理语句n;nELSEn顺序处理语句n+1;nEND IF;数字逻辑91n【例例3-3】四选一电路示例LIBRARY IEEE
49、;USE IEEE.STD_LOGIC_1164ALL;ENTITY mux4 ISPORT(input:IN STD_LOGIC_VECTOR(3 DOWNTO 0);sel:IN STD_LOGIC_VECTOR(1 DOWNTO 0);y:OUT STD_LOGIC);END mux4;ARCHITECTURE rtl OF mux4 ISBEGINPROCESS(input,sel)BEGINIF(sel=00)THENy=input(0);ELSIF(sel=01)THENy=input(1);ELSIF(sel=10)THENy=input(2);ELSEy 顺序处理语句;nEND
50、 CASE;数字逻辑93n当CASE和IS之间的表达式的取值满足指定的条件表达式的值时,程序将执行紧接着的,由符号=所指的顺序处理语句。条件表达式的值有如下的4种不同的表示形式:nWHEN值=顺序处理语句;nWHEN值|值|值|值=顺序处理语句;nWHEN值 TO 值=顺序处理语句;nWHEN OTHERS=顺序处理语句;数字逻辑94nLOOP语句与其它高级语句中的循环语句一样,使它所包含的顺序处理语句被循环执行,循环执行的次数由循环变量的取值范围决定。在VHDL语言中常用来描述位片逻辑及迭代电路的行为。nLOOP语句的书写格式一般有两种:数字逻辑95nFOR_LOOP语句语句n这种LOOP语