关键词不能为空

当前您在: 主页 > 英语 >

vhdl基本语法

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-09 07:11
tags:

-

2021年2月9日发(作者:stomachache)


VHDL


基础语法篇



——



VHDL



VHDL


硬件描述语言




1.1 VHDL


概述




1.1.1 VHDL


的特点




VHDL


语言作为一种标准的硬件描 述语言,具有结构严谨、描述能力强的特点,由于



VHDL< /p>


语言来源于


C



Fortran


等计算机高级语言,在


VHDL


语言中保留了部分高级语言的原



语句,如

< p>
if


语句、子程序和函数等,便于阅读和应用。具体特点如下:

< p>



1.


支持从系统级 到门级电路的描述,既支持自底向上(


bottom- up


)的设计也支持从顶向下




top-down


)的设计,同时也 支持


结构、行为和数据流三种形式


的混合描述。




2. VHDL


的设计单 元的


基本组成部分是实体(


entity


)和结构体(


architecture


< br>,


实体包含设



计系统单元的输 入和输出端口信息,结构体描述设计单元的组成和行为,便于各模块之间数


< p>
据传送。


利用单元(


componet

< p>


、块(


block


)< /p>


、过程(


procure


)和函数(


function


)等语句,


< p>
用结构化层次化的描述方法,使复杂电路的设计更加简便。采用包的概念,便于标准设计文



档资料的保存和广泛使用。




3.


VHDL

语言有常数、信号和变量三种数据对象



每一个数据对象都 要指定数据类型



VHDL


的数据类 型丰富,


有数值数据类型和逻辑数据类型,有位型和位向量型


。 既支持预定义的数



据类型,又支持自定义的数据类型,其定义 的数据类型具有明确的物理意义,


VHDL


是强类



型语言。




4.


数字系统有组合电路和时序电路,时序电路又分为同步和 异步,电路的动作行为有并行



和串行动作,

< br>VHDL


语言常用语句分为并行语句和顺序语句,完全能够描述复杂的电路结构< /p>



和行为状态。




1.1.2 VHDL


语言的基本结构




VHDL


语言是数字电路的硬件描述语言,在语句结构上吸取了


Fortran



C


等 计算机高级



语言的语句,如


IF


语句、循环语句、函数和子程序等,只要具备高级语言的编程技能和数字


逻辑电路的设计基础,就可以在较短的时间内学会


VHD L


语言。但是


VHDL


毕竟是一种描述



数字电路的工业标准语言,该种语言的标识符号、数据类型、 数据对象以及描述各种电路的



语句形式和程序结构等方面具有 特殊的规定,如果一开始就介绍它的语法规定,会使初学者



感 到枯燥无味,不得要领。较好的办法是选取几个具有代表性的


VHDL

< br>程序实例,先介绍整



体的程序结构,再逐步介绍程序中的语法概念。




一个


VHDL


语言的设计程序描述的是一个电路单元,这个电路单元可以是一个门电路,



或者是一个计数器,也可以是一个


CPU



一般情况下,一个完整的


VHDL


语言程序 至少要包含程序包、实


体和结构体三个部分。


实体给出电路单元 的外部输入输出接口信号和引脚信



息,结构体给出了电路单元的内部结构和信号的行为特点


,


程序包定义在设计结构体和实体



中将用到的常数、数据类型、子程序和设计好的电路单元等。




一位全加器的逻辑表达式是:




S=A



B



Ci



Co=AB+ACi+BCi



全加 器的


VHDL


程序的文件名称是



,其中


VHD



VH DL


程序的文件扩展名,



程序如下:




LIBRARY


IEEE;



--IEEE


标准库




USE _LOGIC_;



USE _LOGIC_;



USE _LOGIC_;



ENTITY


fulladder IS




-- fulladder


是实体名称




PORT(



A, B, Ci : IN STD_LOGIC; --


定义输入


/


输出信号




Co, S : OUT STD_LOGIC



);



END fulladder;



ARCHITECTURE addstr OF fulladder IS





--addstr


是结构体名




BEGIN



S <= A


XOR B XOR Ci;



Co <= (A


AND B) OR (A


AND Ci) OR (B AND Ci);



END addstr;



从这个例子中可以看出,一段完整的


VHDL


代码主要由以下几部分组成:




第一 部分是程序包,


程序包是用


VHDL


语 言编写的共享文件,定义在设计结构体和实体



中将用到的常数 、数据类型、子程序和设计好的电路单元等,


放在文件目录名称为


IEEE




程序包库中。



第二部分是程序的实体,定义电路单元的输入


/


输出引脚信 号。程序的实体名称


fulladder


是任意取的,但是必 须与


VHDL


程序的文件名称相同。实体的标识符是

< p>
ENTITY


,实体以



ENTITY


开头,以


END


结束。< /p>


其中,定义


A



B



Ci


是输入信号引脚,定义


Co



S


是输出信号 引脚。




第三部分是程序的结构体,


具体描述电路的内部结构和逻辑功能。


结构体有三种描述方



式,分别是行为(


BEHA


VIOR


)描述、数据流(


DA

TAFLOW


)描述方式和结构


(STRUCTURE)


描述方式,


其中数据流(


DA


TAFLOW


)描述方式又称为寄存器(


RTL


)描述方式,例中结



构体的描述方式 属于数据流描述方式。


结构体以标识符


ARCHITECTUR E


开头,以


END


< br>


尾。结构体的名称


addstr


是任意取的。




小提示:




VHDL


每条语句是以分号“;


”作为结束符的,并且


VHDL


对空格是不敏感的,


所以符合



之间空格的数目是可以自己设定的。


可以按自 己的习惯任意添加,增强代码可读性





1.1.3 VHDL


语言的实体(


ENTITY


)说明语句




实体是


VHDL

程序设计中最基本的组成部分,


在实体中定义了该设计芯片中所需要的输

< p>



/


输出信号引脚。< /p>


端口信号名称表示芯片的输入


/


输出信号 的引脚名,这种端口信号通常被



称为外部信号,信号的输入< /p>


/


输出状态被称为端口模式,


在实体中还 定义信号的数据类型。




实体说明语句的格式为:




ENTITY



实体名称



IS



GENERIC





常数名称


1


:类型



[:=


缺省值


]




常数名称


2


:类型



[:=


缺省值


]





?




常数名称


N


:类型



[:=


缺省值


]









PORT





端口信号名称


1


:输入


/


输出状态数据类型;



< /p>


端口信号名称


2


:输入

< br>/


输出状态数据类型;




?



端口信号名称

N


:输入


/


输出状态数据类型








END


实体名称;




小提示:




VHDL


语言具有


87


标准与


93


标准两种格式,以上为

VHDL



87


标准,

< p>
对于


93


标准





使用


END ENTITY



实体名称;结束实体。


注意为了保证代码的可综合性与通用性,最



好采用


87


标准的


VHDL


格式,有些


EDA

< p>
工具不一定支持


93


标准的


VHDL


语言格式。




Quartus II


支持


VHDL93



87


标 准)




类属


GENERIC


常用来定义实体端口大小,数据宽度,元件例化数目等。一般在简单的< /p>



设计中不常用。





1-1-2


一个同步十六进制加法计数器,带有计数控制、异步清零、和进位输出等功能。



电路有三个输入端和五个输出端,分别是时钟脉冲输入端


CLK


,计数器状态控制端


EN


,异



步清零控制端


Rd


,四位 计数输出端


Q0, Q1, Q2, Q3


和一个进位输出端< /p>


Co


。当计数器输出


< br>0000



1110


时,


Co=0


,只有当计数器输出


1111


时,


Co=1





该设计的实体部分如下:




ENTITY


cntm16 IS



PORT(



EN : IN STD_LOGIC;



Rd : IN STD_LOGIC;



CLK : IN STD_LOGIC;



Co : OUT STD_LOGIC;



Q : BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0)



);



END cntm16;



1. < /p>


实体名称表示所设计电路的电路名称,必须与


VHDL

< p>
文件名相同,


实体名称是“


cntm16





所存的


VHDL


文件名必须是









2.


端口信号名称表示芯片的输入


/


输出信号的引脚名,这种端口信号通常被称为外部信号,



端口信号名称可以表示一个信号,也可以表示一组信号(


BUS



,由数据类型定义,如



EN



Rd



CLK



Co


分别表示计数允许信号,异步清零信号,时钟输入信号和进位输出



信号,


Q


是一组输出信号,用来表示四位同步二 进制计数器的四位计数输出信号





3.


端口信号输入


/


输出状态有以下几种状态:




IN


信号进入电路单元。




OUT


信号从电路单元输出。




INOUT


信号是双向的,既可以进入电路单元也可以从电路单元输出。




BUFFER


信号从电路单元输出 ,同时在电路单元内部可以使用该输出信号





小提示:




O


UT




BUFFER


信号的区别就在于信号是否往内部有反馈,将输出 端口定义为



BUFFER


型,可以省 去一个用于中间运算的一个临时信号,但是


并不推荐这么做。




4.


端口数据类型(


TYPE


)定义端口信号的数据类型,在


VHDL< /p>


中,常用的端口信号数据类



型如下:





1




位(


BIT


)型:表示一位信号的值,


可以取值‘


0


’和‘


1



,放在单引号里面表示





X < =


‘< /p>


1




Y


<=



0







2




位向量(


BIT_VECTOR


)型:表示 一组位型信号值,


在使用时必须标明位向量的宽



度(个数)和位向量的排列顺序,


例如:


Q : OUT BIT_VECTOR(3 downto 0)


,表示



Q3


Q2



Q1


Q0


四个位型信号。


位向量的信 号值放在双引号里面表示


,例如


Q <=




0000”;




3




标准逻辑位(


STD_LOGIC


)型:< /p>


IEEE


标准的逻辑类型,


它是


BIT


型数据类型的扩展,


< br>可以取值‘


U





X



< br>‘


0





1





Z





W





L





H




< br>-




等。





4




标准逻辑位向量(


STD_LOGIC_VECTOR


)型:


IEEE


标准的逻辑向量,表示一组标



准逻辑位型信号值。




VHDL


是与类型高度相关的语言, 不允许将一种数据类型的信号赋予另一种数据类型的



信号。除 了上述介绍的数据类型外,还有其他多种数据类型用于定义内部信号和变量,请参




1-2


节。




小提示:




相同类型(模型相同,数据类型相同)的端口可以写在同一行,


如:




ENTITY


cntm16 IS



PORT(



EN, Rd,CLK : IN STD_LOGIC;



Co : OUT STD_LOGIC;



Q : BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0)



);



END cntm16;



此外要注意,最后一个端口结尾没有分号!




1.1.4 VHDL


语言的结构体 (


ARCHITECTURE





结构体是


VHDL

< br>程序设计中的最主要组成部分,是描述设计单元的具体结构和功能,在



程序中,结构体放在实体的后面。每一个结构体都有名称,结构体的名称是由设计者任取的,



结构体是以标识符


ARCHITECTU RE


开头,以


END


结尾。结构体可以 有三种描述方式,分别



是行为(


BE A


VHER


)描述方式、数据流(


DA


TAFLOW


)描述方式和结构


(ST RUCTURE)


描述方式,其中数据流(


DA


TAFLOW


)描述方式又称为寄存器(


RTL


)描述方式。不同的



结构体采用不同的描述语句。




结构体的一般格式为:




ARCHITECTURE


结构体名



OF


实体名称



IS



说明语句




BEGIN



电路描述语句




END


结构体名;




结构体说明语句是对结构体中用到的数据对象的数据类型、元 件和子程序等加以说明。



电路描述语句用

并行语句


来描述电路的各种功能,这些并行语句包括


并行信 号赋值语句、



条件赋值


(WHEN- ELSE)


语句、进程(


PROCESS


)语句、


元件例化


(COMPONET MAP)




句和子程序调用语句等。




小提示:




结构体中定义的参数(信号,变量等)名称不能与其所属实体的端口名重名。




结构体的结束语句也可以写成



END ARCHITECTURE


结构体名


,


或者简写为



END






1-1-2


设计程序的结构体部分如 下:




ARCHITECTURE counstr OF cntm16 IS



BEGIN



Co <= . (Q =



1111




AND EN =.1.) ELSE .0.;





--


条件赋值语句




PROCESS (CLK, Rd)




--PROCESS


语句




BEGIN



IF (Rd=.0.) THEN





--IF


语句




Q<= ”0000”;



ELSIF (CLK. EVENTAND CLK=.1.) THEN







--CLK


上升沿计数




IF(EN=.1.) then



Q <= Q+1;



END IF;



END IF;



END PROCESS;



END counstr;



结构体的名称是


counstr


,该结构体属于行为描述方式,采用多种描述语句,如进程




PROCRESS


)语 句,条件赋值语句(


WHEN- ELSE



,顺序语句(


IF- ELSE


)等,这些语



句的具体用 法参见


1-3


节相关内容。




小提示:




一个实体可以有多个结构体(反之不成立)


,多个结构体代表实 体实现的多种方式,同一



个实体的各结构体之间地位等同,< /p>


可以采用配置语句将特定的某个结构体关联到实体,这



样使同一个实体可以设计为多种实现功能,但是笔者不推荐使用多个结构体来实现实体功



能,因为在综合时,配置语句是不可综合的,所以尽量每个实体仅一个 结构体表述完整,



这样比较清晰,整体化。所以就不介绍配置 语句了,有兴趣的读者请查阅相关教材。




1.1.5


程序包(


PACKAGE



、库(


LIBRARY


)和


USE


语句




程序包定义了一组标准的数据类型说明、常量说明、元件说明 、子程序说明和函数说明



等,


它是一 个用


VHDL


语言描写的一段程序,


可 以供其他设计单元调用。


它如同


C


语言 中的


*.H


文件一样,


定义了一些数据 类型说明和函数说明。


在一个设计单元中,在实体部分所定义的数据类型、常数和子程序


在相应的结构体中是可以被使用的


(可见的)

< br>,


但是在一个实体的说明部分和结构体部分中定义的数据类型、

< br>常量及子程序却不能被其它设计单元的实体和结构体使用


(不可见)



程序包就是为了使一组类型说明、



量说明和子程序说明对多个设计单元都可以使用而提供的一种结构。程序包分为两大类,即

< p>
VHDL


预定义


标准程序包和用户定义的程序包。


VHDL


设计中常用的标准程序包的名称和内容如见表


1-1-3


所列。用户


定义的程序包是设计者把 预先设计好的电路单元设计定义在一个程序包中,放在指定的库中,以供其它设


计单元调 用,如果在设计中要使用某个程序包中的内容时,可以用


USE


语句打开该程序包。有关程序包的


设计方法参见


1-4-5


节的内容。




库 (


LIBRARY


)是专门用于存放预先编译好的程序包的地方 ,它实际上对应一个文件



目录,程序包的文件就存放在此目录 中。库名与目录名的对应关系可以在编译程序中指定,



库的说 明总是放在设计单元的最前面。例如,



IEEE


标准库的调用格式为:




LIBRARY


IEEE;




1-1-3 IEEE


两个标准库< /p>


STD



IEEE


中的程序包





1-1-3 IEEE


两个标准库< /p>


STD



IEEE


中的程序包






STD



程序包名



定义的内容



STANDA


RD



TEXTIO



IEEE



STD_LOGIC_1164



定义


VHDL


的数据类型,如


BIT



BIT_VECTOR




TEXT


读写控制数据 类型和


子程序等



定义


STD_LOG




STD_LOGIC_VECTOR




STD_LOGIC_ARITH



STD_LOGIC_SIGNED



STD_LOGIC_UNSIGNED





定义有符号与无符号数据类型,基 于这些数


据类型的算术运算符,如


“+”, “


-


”, “


?


”,


“/”SHL, SHR




定义基于


STD_LOGIC



STD_LOGIC_VECT OR


数据类型上的有符号


的算术运算



定义基于


STD_LOGIC



STD_LOGIC_VECTOR


类型上的无符号的算


术运算



1.


常用的库和包的种类




VHDL


程序中常用的库有


STD

< br>库、


IEEE


库和


WORK


等。其中


STD



IEEE


库中的标准程序



包是由提供


EDA


工具的厂商提供的,用户在设计程序时可以用相应的语句 调用。





1



STD





STD


库是


VHDL


语言标准库,库中定义了


STANDARD

< p>


TEXTIO


两个标准程序包。



STANDARD


程序包中定义了

< br>VHDL


的基本的数据类型,如字符(


CHARACTE R



、整数




INTEGER



、实数(


REAL



、位型(


B IT


)和布尔量(


BOOLEAN


)等 。用户在程序中



可以随时调用


STA NDARD


包中的内容,不需要任何说明。


TEXTIO


程序包中定义了对文本



文件的读和写控制的 数据类型和子程序。用户在程序中调用


TEXTIO


包中的内容 ,需要


USE


语句加以说明。





2



IEEE




< /p>


IEEE


标准库是存放用


VHDL


语言编写的多个标准程序包的目录,


IEEE


库中的程序包有



STD_LOGIC_1164



STD_LOGIC_ARITH



STD_LOGIC_UNSIGNED




STD_LOGIC_SIGNED


等程序包。其中

< br>STD_LOGIC_1164



IEEE


标准的程序包,定义了



STD_LOGIC



STD_LOGIC_VECTOR


等多种 数据类型,以及多种逻辑运算符子程序和数据类型转换子程


序等。


STD_LOGIC_ARITH




STD_LOGIC_UNSINGED


等程序包是



SYNOPSYS


公司提供的,包中定义了


S IGNED



UNSIGNED


数据类 型以及基于这些数据类型的运算符子


程序。用户使用包中的内容,需要用


USE


语句加以说明。



< /p>



3



WORK





WOR K


库是用户进行


VHDL


设计的当前目 录,用于存放用户设计好的设计单元和程序包。



在使用该库中的内容时不需要进行任何说明。




2


.库、包和


USE


语句的格式




用户在用到标准程序包中内容时,除了


STANDARD

程序包以外,都要在设计程序中加



以说明,


首先用


LIBRARY


语句说明程序包所在的库名, 再用


USE


语句说明具体使用哪一个程序包和具体


的子程序名


。各种标准程序包中的内容太多,初学者一时之间难以全面了解,



可以用下面的格式,以免出现不必要的错误。




库和包的调用格式:




LIBRARY


IEEE;



USE _LOGIC_;



USE _LOGIC_;



USE _LOGIC_;



小提示:




以下四个语句最好写任何模块的时候先加上,以免出现库没包 含全的问题





LIBRARY


IEEE;



USE _LOGIC_;



USE _LOGIC_;



USE _LOGIC_;



1.2 VHDL


的数据类型和数据对象




VHDL


语言和其它高级语言一样,除了具有一定的语法结构 外,还定义了常数、变量



和信号等三种数据对象,每个数据对 象要求指定数据类型,每一种数据类型具有特定的物理



意义。 由于


VHDL


语言是强类型语言,不同的语句类型的数据之间不 能进行运算和赋值,我们有必要详细


了解


VHDL


语言的数据类型和数据对象。




1.2.1 VHDL


的标记




一个完整的


VHDL


语句可以有下列几个部分组成:


标识符、保留字(


Re served Words





界符、常数、赋值符号和注释(


Comments

< br>)


,所有这些统称为标记。




1.


标识符




标识符是程序员为了书写程序所规定的一些词,


用来表示常数、变量、信号、子程序、



结构体和实 体等名称。


VHDL


基本的标识符组成的规则如下:

< p>




1




标识符由


26


个英文字母、数字

< p>
0



1



2


,?,


9


及下划线“


_


”组成;





2




标识符必须是以英文字母开头;





3




标识符中不能有两个连续的下划线“


_


”< /p>


,标识符的最后一个字符不能是下划线;





4




标识符中的英文字母不区分大小写;





5




标识符字符最长可以是


32


个字符。




例如:



CLK



QO



DA


T1



SX_ 1



NOT_Q


是合法的标识符。











3DA



_ QD



NA__C, DB-A



DB_


等是非法的标识符。




2.


保留字




小提示:



93


标准定义了扩展表示符,可以以数字打头,使用


VHDL


保留 字等,不过习惯上依然使用


87


标准。




VHDL


中的保留字是具有特殊含义 的标识符号,只能作为固定的用途,用户不能用保留



字作为标 识符。


比如


ENTITY


< p>
ARCHITECTURE



PROCESS



BLOCK



B EGIN



END


等。



VHDL


保留字如表


1-2 -1


所列。





1-2-1 VHDL


保留字



abs



and



begin



case



downto



exit



generic



in



library



mod



not



or



postponed



record



access



architecture



block



component



else



file



group



inertial



linkage



nand



null



others



procedure



register



after



array



body



configuration



elsif



for



guarded



inout



literal



new



of



out



process



reject



alias



assert



buffer



constant



end



function



if



is



loop



next



on



package



pure



rem



all



attribute



bus



disconnect



entity



generate



impure



label



map



nor



open



port



range



report



return



signal



srl



type



variable



xnor



rol



shared



subtype



unaffected



wait



ror



sla



then



units



when



xor



select



sll



to



until



while



severity



sra



transport



use



with




3. VHDL


中的界符




界符是作为


VHDL


语言中两个部分的分隔符用的。如


每个完整的语句均以




;




结尾,用



双减号


-



开头的部分是注释内容,< /p>


不参加程序编译。


信号赋值符号是



<=




变量赋值 符号是




:=




等。




在< /p>


VHDL


中,常用的界符如表


1-2-2


所列





1-2-2 VHDL


中的界符





4.


注释符





VHDL


中,为了便于理解和阅读程序,常常加上注释,注释符 用


双减号




.


”表示





释语句以注释符打头,到行尾结束


。注释可以加在语句结束符< /p>




;


”之后, 也可以加在空行处。




1.2.2 VHDL


的数据类型





VHDL


中,


定义了三种 数据对象,即


信号、变量和常数



每一 个数据对象都必须具



有确定的数据类型,只有相同的数据类型 的两个数据对象才能进行运算和赋值,为此


VHDL


定义了多 种标准的数据类型,而且每一种数据类型都具有特定的物理意义。例如



BIT


型、



STD_LOG IC


型、


INTEGER


型和


REAL


型等数据类型。




VHDL


的数据类型较多,根据数据 用途分类可分为标量型、复合型、存取型和文件型。



标量型包 括整数类型、实数类型、枚举类型和时间类型,其中位(


BIT


)型和标准逻辑位




STD_LOG IC


)型属于枚举类型。复合型主要包括数组(


ARRAY


)型和记录(


RECORD




型,存取类型和文件类型提供数据和文件的存取方式。这些数据类型又可以 分为两大类:即




VHDL


程序包中预定义的数据类型和用户自定义的数据类型。预定义的数据类型是最基本的数据类型,< /p>


这些数据类型都定义在标准程序包


STANARD



STD_LOGIC_1164


和其它标准的程序包 中,这些程序包放



EDA


软件中


IEEE



STD


目录中,


供用户随时调用。


在预定义的各种数据类型的基础上,


用户可以根据


实际需要自己定义数据类型和子类型,如标量型和 数组型。使用用户定义的数据类型和子类型可以使设计


程序的语句简练易于阅读,简化设 计电路硬件结构。




值得注意的是, 各种


EDA


工具不能完全支持


VHDL


的所有数据类型,只支持


VHDL


的子



集。




1. STANDARD


程序包中预定义的数据类型




(1)


整数(

INTEGER


)数据类型



< /p>


整数数据类型与数学中整数的定义是相同的,整数类型的数据代表正整数、负整数



和零。


VHDL


整数 类型定义格式为:




TYPE INTEGER IS RANGE -2147483648 TO 2147483647



实际上一个整数是由


32

< p>
位二进制码表示的带符号数的范围。




正整数(


POSITIVE


)和自然数(


NA


TURAL


)是整数的子类型,定义格式 为:




SUBTYPE POSITIVE IS INTEGER RANGE 0 TO INTEGER’HIGH



SUBTYPE NA


TURE IS INTEGER RANGE 1 TO INTEGER’HIGH


< /p>


其中



是数值类属性,代表整数上限的数值 ,也即


2147483647


。所以正整



数表示的数值范围是


0



2147483647



自然数表示的数值范围 是


1



2147483647



实际使用过程中为了节省


硬件组件,


常用


RANGER


?


T O


?限制整数的范围


。例如:




SIGNALA


:INTEGER;


--


信号


A


是整数数据类型




V


ARIABLE B :INTEGER RANGE 0 TO 15;


--


变量


B

< p>
是整数数据类型,变化范围是


0



15





SIGNAL C :INTEGER RANGE 1 TO 7;


--


信号


C

是整数数据类型,变化范围是


1



7





(2)


实数(


REAL


)数据类型




VHDL< /p>


实数数据类型与数学上的实数相似,


VHDL

的实数就是带小数点的数,分为正数



和小数。

< p>
实数有两种书写形式即小数形式和科学计数形式,不能写成整数形式。


例如




1.0



1.0E4



-5.2


等实数是合法的。实数数据类型的定义格式为:




TYPE REAL is range -1.7e38 to 1.7e38;



例如:


SIGNAL A, B, C :REAL



A<= 5.0;



B <= 3.5E5;



C <= -4.5;




小提示:




整数与实数均可以由下划线分割,便于阅读,如:


45_133_134; 124_452_112.113_429;



此外不同进制的数可以由如下格式表达


:

基数


#


数字文字


#E


指数




如:


2#1111_1110# = 254; 16#E#E1 = 14*161 = 224





(3)


位(


BIT


)数据类型




位数据类型的位值用字符


.0.


< br>.1.


表示,


将值放在单引号中,


表示二值逻辑的


0



1


。这里




0



1


与整数型的


0



1


不同,


可以进行算 术运算和逻辑运算,而整数类型只能进行算术运算。



位数据类型的定义格式为:




TYPE BIT is ( '0', '1' );



例如:




RESULT : OUT BIT;



RESULT<= .1.;



将< /p>


RESULT


引脚设置为高电平。




(4)


位向量(

< br>BIT_VECTOR


)数据类型




位向量是基于


BIT


数据类型的数组。


VHDL


位向量的定义格式为:




TYPE BIT_VECTOR is array (NA


TURAL range <>) of BIT;



使用位向量必须注明位宽


,即数组的 个数和排列顺序,


位向量的数据要用双引号括起来。



例如




10 10




X



A8



。其中


1010


是四位二进制数,用


X


表示 双引号里的数是十六进制数。




例如:




SIGNAL A


:BIT_VECTOR (3 DOWNTO 0 );



A


<= “1110”



表示


A


是四个


BIT


型元素组成的一维数组,数组元素 的排列顺序是


A3=1



A2=1



A1=1




A0=0





(5)


布尔(


BOOLEAN


)数据类型




一个 布尔量具有真(


TRUE


)和假(


FA LSE


)两种状态


。布尔量没有数值的含义,不能



用于数值运算,


它的数值只能通过关系运算产生< /p>



例如,



IF


语句中,


A>B


是关系运算,


如果


A=3



B=2< /p>




A>B


关系 成立,结果是布尔量


TRUE


,否则结果为

FALSE





VHDL


中,布尔数据类型的定义格式为


:



TYPE BOOLEAN IS (FALSE, TRUE);



(6)


字符(


CHARACTER


)数据类型





STANDARD


程序包中预定义了


128



A SCII


码字符类型,


字符类型用单引号括起来,



.A.



.b.



.1.


等,



VHDL


标识符不区分大小写不同,字符类型中的字符大小写是不同的 ,



.B.



.b.


不同。




(7)


字符串(


STRING





< p>
STANDARD


程序包中,字符串的定义是


:



TYPE STRING is array (POSITIVE range <>) of CHARACTER;



字符串数据类型是由字符型数据组成的数组,字符串必须用双引号括起来。




例如:




CONSTANT STR1 :STRING := “Hellow world”;



定义常数


ST1


是字符串,初值是“


Hellow world






小提示:





C


语言类似,


字符类型用单引号括起 来,而字符串必须用双引号括起来


,别弄混了。




(8)


时间(

TIME


)数据类型




表示时间的数据类型,一个完整的时间类型包括整数表示的数值部分和时间单位两个部

< p>


分,数值和单位之间至少留一个空格,如


1 ms



20 ns


等。




STANDARD


程序包中定义时间格式为:




TYPE TIME is range -9223372 to 9223372



UNITS



fs; --


飞秒




ps = 1000 fs; --


皮秒




ns = 1000 ps; --


纳秒




us = 1000 ns; --


微秒




ms = 1000 us; --


毫秒




sec = 1000 ms; --





min = 60 sec; --





hr = 60min; --


小时




END UNITS;



小提示:





实数,时间类型仅用于


VHDL


仿真, 一般综合器不支持。




2. IEEE


预定义的标准逻辑位和标准逻辑位向量




(1)


标准逻辑位(


STD_LOGIC


)数据类型




STD_LOGIC


是位(


BIT


)数据类型的扩展,是


STD_ULOG IC


数据类型的子类型。它是一



个逻 辑型的数据类型,其取值取代


BIT


数据类型的取值

< p>
0



1


两种数值,扩展定 义了九种值,在


IEEE


STD1164

程序包中,


STD_ULOGIC



STD_LOGIC


数据类型定义格式为


< br>



TYPE std_ulogic IS (



U', -- Uninitialized



'X', -- Forcing Unknown



'0', -- Forcing 0



'1', -- Forcing 1



'Z', --High Impedance



'W', -- Weak Unknown



'L', --Weak 0



'H', --Weak 1



'-' -- Don't care



);



FUNCTION resolved ( s : std_ulogic_vector ) RETURN std_ulogic;



SUBTYPE std_logic IS resolved std_ulogic;



小提示:




STD_LOGIC


中的数据类型必须要大写,不能使用小写字母代替,


在实际的


IC


集成时,



一般只使用


.0., .1., .Z., ._.


四种数据类型,


其余的


.W., .L., .H.


是不可综合的。




STD_LOGIC



STD_ULO GIC


数据类型的区别在于


STD_LOGIC


数据类型是经过重新定



义的,可以用来描述多路驱动 的三态总线,而


STD_ULOGIC


数据类型只能用于描述单 路驱



动的三态总线。




(2)


标准逻辑位向量(


STD_LOGIC_VECTOR


)数据类型




STD_LOGIC_VECTOR


是基于


STD_LOGIC


数据类型的标准逻辑一维数组,和< /p>



BIT_VECTOR


数组一样,使用 标准逻辑位向量必须注明位宽和排列顺序,数据要用双引号



括起来。




例如:




SIGNAL SA1 :STD_LOGIC_VECTOR (3 DOWNTO 0 );



SA1 <= “0110”




IEEE_STD_1164


程序包中,


STD_LOGIC_VECTOR

数据类型定义格式为:




TYPE std_logic_vector IS ARRAY


( NA


TURAL RANGE <>) OF std_logic;



3.


其它预定义的数据类型



< p>


STD_LOGIC_ARITH


程序包中定义 了无符号(


UNSIGNED


)和带符号(

SIGNED


)数



据类型,


这两种数据类型主要用来进行算术运算。


定义格式为:




TYPE UNSIGNED is array (NA


TURAL range <>) of STD_LOGIC;



TYPE SIGNED is array (NA


TURAL range <>) of STD_LOGIC;



(1)


无符号(

< br>UNSIGNED


)数据类型




无符号数据类型是由


STD_LOGIC


数据类型构成的一维数组,它表示一个自然数


。在一



个结构体中,


当一个数据除了执行算术运算之外,还要执行逻辑运算, 就必须定义成



UNSIGNED


,而 不能是


SIGNED



INTEGER


类型。



例如:




SIGNAL DA


T1 :UNSIGNED



3 DOWNTO 0



;



DA


T1 <= “1001”;



定义信号


DA


T1

是四位二进制码表示的无符号数据,数值是


9


< p>



(2)


带符号(< /p>


SIGNED


)数据类型




带符号(


SIGNED


)数据类型表示一个带符号的整数,


其最高位用来表示符号位,用补



码表示数值的大小。


当一个数据的最高位是< /p>


0


时,这个数表示正整数,当一个数据的最高位

< br>



1


时,这个数表示负整数。



例如:




V


ARIABLE DB1, DB2 : SIGNED



3 DOWNTO 0



;



DB1 <= “0110”



DB2 <= “ 1001”



定义变量


DB1



6


,变量


DB2



-7





4.


用户自定义的数据类型



< p>


VHDL


中,用户可以根据设计需要,自己定义 数据的类型,称为用户自定义的数据类



型。利用用户自己定义 数据类型可以使设计程序便于阅读。用户自定义的数据类型可以通过


< br>两种途径来实现,一种方法是通过对预定义的数据类型作一些范围限定而形成的一种新的

< br>


数据类型。这种定义数据类型的方法有如下几种格式:




TYPE


数据类型名称



IS


数据类型名


RANGE


数据范围;




例如:




TYPE DA


TA


IS INTEGER RANGER 0 TO 9



定义< /p>


DA


TA



IN TEGER


数据类型的子集,数据范围是


0


9





SUBTYPE


数据类型名称



IS


数据类型名



RANGE


数据范围;




例如:




SUBTYPE DB IS STD_LOGIC_VECTOR



7 DOWNTO 0



;



定义


DB



STD_LOGIC_VECTOR


数据类型的子集,位宽


8< /p>


位。




另一种 方法是在数据类型定义中直接列出新的数据类型的所有取值,称为枚举数据类



型。定义该种数据类型的格式为:




TYPE


数据类型名称


< p>
IS


(取值


1


,取值


2


,?)





例如






TYPE BIT IS



.0.,. 1.



;



TYPE STA


TE_M IS (STA


T0, STA


T1, STA


T2, STA


T3);


< /p>


定义


BIT


数据类型,取值


0



1


。定义


STA


TE_M


是数据类型,表示状态变量


STA


T0



STA< /p>


T1




STA


T2



STA


T3


。在


VHDL


中,为了便于阅读程 序,可以用符号名来代替具体的数值,前例




STA


TE_M


是状态变量,用符号

< br>STA


T0, STA


T1, STA


T2, STA


T3


表示四种不同的状态取值是



00



01



10



11





例如定义一个




WEEK




的数据类型用来表示一个星期的七天,定义格式为:




TYPE WEEK IS (SUN, MON, TUE, WED, THU, FRI, SA


T);



小提示:




使用枚举数据类型定义后,综合器会自动将字符类型从


0


开始进 行二进制编码,编码的位



数由枚举元素个数决定。




5


.数组(


ARRAY


)的定义




数组是将相同类型的单个 数据元素集合在一起所形成的一个新的数据类型。


它可以是一



维数组(一个下标)和多维数组(多个下标)



下标的数据类型必须是整数


。前面介绍的位



向量(


BIT_VECTOR


)和标准逻辑位向 量(


STD_LOGIC_VECTOR


)数据类型都属于一维



数组类型。


数组定义的格式为:




TYPE


数据类型名称



IS ARRAY



数组下标的范围



OF


数组元素的数



小提示:




VHDL


多维数组定义,多维数组声明即将第一维的数组作为第二维数组的元素定义即可





TYPE 1


维数据类型名称



IS ARRAY



数组下标的范围



OF


数组元素的数据类型;




TYPE 2


维数据类型名称



IS ARRAY



数组下标的范围



OF


上面所定义的


1


维数据类型;




根据数组元素下标的范围是否指定,把数组分为非限定性 数组和限定性数组两种类型。



非限定性数组不具体指定数组元 素下标的范围,而是用


NA


TURAL RANGER <>


表示,当用到该数组时,


再定义具体的下标范围。


如前面介绍的位向量



BIT_VECTOR



和标准逻辑位向量



STD_LOGIC_VECTOR



数据类型等在程序包中 预定义的数组属于非限定性数组。




例如,在


IEEE


程序包中定义


STD _LOGIC_VECTOR


数据类型的语句是




TYPE std_logic_vector IS ARRAY


( NA


TURAL RANGE <>) OF std_logic;



没有具体指出数组元素的下标范围, 在程序中用信号说明语句指定。




例如:




SIGNAL DA


T : STD_LOGIC_VECTOR



3 DOWNTO 0



;



限 定性数组的下标的范围用整数指定,数组元素的下标可以是由低到高,如



0 TO 3




也可以是由高到低,如


7 DOWNTO 0

< br>,表示数组元素的个数和在数组中的排列方式





例如:




TYPE D IS ARRAY



0 TO 3



OF STD_LOGIC;



TYPE A


IS ARRAY



4 DOWNTO 1



OF BIT;



定义数组


D


是一维数组,由四个

STD_LOGIC


型元素组成,数组元素的排列顺序是


D (0)




D(1)

< br>,


D(2)



D(3)



A


数组是由四个元素组成的

< br>BIT


数据类型,数组元素的排列顺序是


A(4)




A(3)



A(2)



A(1)





小提示:




对于数组数据类型,


可以给一组数据多个值一起赋值:




如上例:




SIGNAL ARRAY1: D





BEGIN



ARRAY1<=(.1.,.0.,.0.,.1.);



6


.数据类型的转换





VHDL


语言中,数据类型的定义是相当严格的,不同类型的数据是不能进行运算和赋



值的。为了实现不同类型的数据赋值,就要进行数据类型的变换。变换函数在

VHDL


语言程序包中定义。


在程序包

STD_LOGIC_1164



STD_LOGITH_ ARITH



STD_LOGIC_



UNSIGNED


中提供的数据类型变换函数如表


1-2-3


所列。




例如



INTEGER

数据类型的信号转换为


STD_LOGIC_VECTOR


数据类型的方法是





定义


A, B


为:




SIGNALA


:INTEGER RANGER 0 TO 15;



SIGNALB : STD_LOGIC_VECTOR(3 DOWNTO 0);


< br>需要调用


STD_LOGIC_ARITH


程序包中的函 数


CONV_STD_LOGIC_VECTOR



调用的格式是:


B <= CONV_STD_LOGIC_VECTOR(A)






1-2-3


数据类型变换函数



程序包名称



STD_LOGIC_1164



函数名称



TO_BIT



TO_BITVECTOR


TO_STDULOGIC



TO_STDULOGICVECTER



功能




S TD_LOGIC


转换为


BIT


< /p>



STD_LOGIC_VECTOR


转 换为



BIT_VECTOR


< /p>



BIT


转换为


STD_LOGIC




BIT_V ECTOR


转换为


STD_LOGIC_VECTOR




UNSIGNED, SIGNED


转换为


INTEGER




SIGNED, INTEGER


转换为


UNSIGNED




INTEGER, UNSDGNED,


SIGNED



转换为


STD_LOGIC_VECTOR




STD_LOGIC_VECTO T


转换为


INTEGER



STD_LOGIC_ARITH



CONV_INTEGER



CONV_UNSIGNED



CONV_STD_LOGIC_VECTOR



STD_LOGIC_UNSIGNED



CONV_INTEGER



1.2.3 VHDL


的运算符




与高级语言一样,


VHDL


语言的表达式也是由运算符和操作数组成的。


VHDL

< br>标准预



定义了四种运算符,即逻辑运算符、算术运算符 、关系运算符、移位运算符和连接运算符,



并且定义了与运算 符相应的操作数的数据类型。各种运算符之间是有优先级的,例如在所有



运算符中,逻辑运算符


NOT


的优先级别最高。表< /p>


1-2-4


列出了所有运算符的优先级顺序。



1-2-4 VHDL


运算符列表




算符类型



逻辑运算符



OR



NAND



NOR



XOR



NXOR



关系运算符



/=



<



>



<=



>=



移位运算符



SLA



SRL



SRA



ROL



ROR



符号运算符



-



连接运算符



运算符



功能



优先级



AND



=



SLL



+




&



+



逻辑与



逻辑或



逻辑与非



逻辑或非



逻辑异或



逻辑异或非



等于



不等于



小于



大于



小于等于



大于等于



逻辑左移



算术左移



逻辑右移



算术右移



逻辑循环左移



逻辑循环右移







位合并











求模



求余



乘方



求绝对值



逻辑非



最低




算术运算符



-



*



/



MOD



REM



**



ABS



逻辑非运算符



NOT



最高



1


.逻辑运算符





VHDL


语言中定义了七种基本的逻辑运算符,它们分别是:




AND


(与)



OR


(或)



NOT


(非)



NAND


(与非)



NOR


(或非)


、< /p>


XOR


(异或)




NXOR


(异或非)


等。




由逻辑运算符和操作数组成了逻辑表达式。 在


VHDL


语言中,逻辑表达式中的操作数的

< br>


数据类型可以是


BIT



STD_LOGIC


数据类型,也可以是一维数组类型


BIT_VECTOR




STD_LOGIC_VECTOR



要求运算符两边的操作数 的数据类型相同、


位宽相同。


逻辑运算是



按位进行的,运算的结果的数据类型与操作数的数据类型相同。




例如用


VHDL

描述逻辑表达式是


Y=AB



Z= A+B+C


的程序如下:




ENTITY


loga IS



PORT(



A, B, C : IN STD_LOGIC;



Y


, Z : OUT STD_LOGIC



);


END loga;



ARCHITECTURE stra OF loga IS



BEGIN



Y<= A


AND B;



Z <= A


OR B OR C;



END stra;


< p>
例如用


VHDL


描述两个位向量的逻辑运算的程序 如下:




ENTITY


logb IS



PORT(



A, B : IN BIT_VECTOR



0 TO 3



;



Y


: OUT BIT_VECTOR



0 TO 3






;



END logb;



ARCHITECTURE strb OF logb IS



BEGIN



Y<=A


AND B;



END strb;



如果


A=1011



B=1101

< br>,则程序仿真的结果是


Y=1001


< br>



在一个逻辑表达式中有两个以上的运算符时,需要用 括号对这些运算进行分组。




例如语句




X1 <=(A


AND B ) OR (C AND B);



X2 <=( A


OR B) AND C;


是正确的。




如果一个逻辑表达式中只有


AND


、< /p>


OR



XOR


三 种运算符中的一种运算符,那么改变运



算顺序不会影响电路的 逻辑关系,表达式中的括号是可以省略的


。例如下列语句是正确的。



Y1 <=A


AND B AND C;



Y2 <= A


OR B OR D;



2


.算术运算符




VHDL


语言定义了五种常用的算术 运算符,分别是




+


加或正,



A+B



+A




-


减或负,



A-B




-B



*


乘,



A*B



/


除,



A/B



**


指数,



N**2



以及


MOD


(求模)



REM


(取余)

< p>


ABS


(求绝对值)等算术运算符。

< p>



在算术运算表达式中,两个操作数必须具有相 同的数据类型


,加法和减法的操作数的数


据类型可以是整数、


实数或物理量,


乘除法的操作数可以是 整数或实数。


为了节约硬件资源,



除 法和乘法的操作数应该选用


INTEGER


< br>STD_LOGIC_VECTOR



BIT_VECT OR


等数据


类型。




例如




X<=A+B;



Y<=C*D;



Z<=A-C**2



小提示:




对于



/ , MOD, REM


运算,要求操作符的右操作数必须为


2


的正 整数次幂,


可以用实际电



路移位实现,才可以综合。




3


.关系运算符




关系运算符是将两个相同类型的操作数进行数值比较或关系比 较,关系运算的结果的




数据类型是


TRUE



FALSE


,即


BOOLEAN


类型。


V HDL


语言中定义了六种关系运算符,



分别是:




=


等于




/=


不等于




>


大于




<


小于




>=


大于或等于




<=


小于或等于





VHDL


中,关系运算符的数据类型根据不同的运算符有不同的要求。


其中




=



( 等于)






/=



(不等于)操作数的数据类型 可以是所有类型的数据,其他关系运算符可以使用整



数类型、


实数类型、


枚举类型和数组



整数和实数的大小排序方法与数学中的比较大小方法


< br>相同。


枚举型数据的大小排序方法与它们的定义顺序一致,


例如


BIT


型数据


1>0

< p>


BOOLEAN


型数据


TRUE>FALSE





在利用关系运算符对位向量数据进行比较时,比较过程是从左到右的顺序按位进行比较



的,操作数的位宽可以不同,但有时会产生错误的结果。




如果


A


、< /p>


B



STD_LOGIC_VECTOR


数据类型,



A


=



1 110




B=


10110



,关系表达式



A>B








TRUE







A>B






< p>









STD_LOGIC_ARITH


程序包中定义的数据 类型


UNSIGNED


来解决,把要比较的操作数定义成


UNSIGNED


数据


类型。




4


.移位运算符




VHDL93


标准中增加了六个移位 运算符,分别是


SLL


逻辑左移,


SR L


逻辑右移,


SLA


算术



左移,


SRA


算术右移,


ROL


逻辑循环左移,


ROR


逻辑循环右移



移位运算符的格式是:




操作数名称



移位运算符



移位位数;




操作数的数据类型可以是


BIT_VECTOR


< p>
STD_LOGIC_VECTOR


等一维数组,也可以是



INTEGER


型,移位位数必须是


INTEGER


型常数。




六条移位运算符所执行的操作如图


1-2-1

< br>所示。




< br>其中


SLL


是将位向量左移,右边移空位补零

< p>


SLA


是将位向量左移,右边第一位的数值



保持原值不变。



SRL


是将位向量右移,左边移空位补零


< br>SRA


是将位向量右移,左边第一


位的数值保持原值不变。


ROR



ROL


是自循环移位方式。




例如




A<= “0101”;



B <=A


SLL 1;



仿真的结果是


B = 1010





5


.连接运算符(


&





用连接运算符可以将多个数据对象合并成一个新 的一维数组,也可以将两个一维数组中



的元素分解合并成新的 一维数组。


连接两个操作符产生新的一维数组的位宽等于两个操作



数的位宽之和,新的数组元素的顺序是由操作数的位置决定的,连接符“

< p>
&


”左边的操作数


的元素在左,连接符

< p>



&


”右边的操作数的 元素在右。操作数可以是


BIT



ST D_LOGIC


如果




1011,0010 A


:BIT_VECTOR



0 TO 7





0001,0110 B :BIT_VECTOR



0 TO 7






C <=B(0 TO 3)&A( 5 TO 7)&.1.;




C=1011,1101



1.2.4 VHDL


的数据对象




在算法语言中,定义了多种数据对象,如常数、变量和数组等,用来存放不同类型的数



据,如整数、实数、复数、逻辑常数和逻辑变量等。



VHDL


程序中,常用的数据对象分


为三种类型,


即常数(


CONSTANT



、变量(


V


ARIABLE


)和信号(


SIGNAL


< br>,


在使用过



程中,

< p>
这三种数据对象除了具有一定的数据功能外,


还赋予了不同的物理意义,< /p>


在应用时要



特别注意。




1.


常数(


CONSTANT





常数被赋值后 就保持某一固定的值不变




VHDL


中,常数通常用来表示计数器的模的



大小、


数组数据的位宽和循环计数次数等,


也可以表示电源电压 值的大小。


常数的使用范围



与其在设 计程序中的位置有关,


如果常数在结构体中赋值,


则这个常数可 供整个设计单元使



用,属于全局量,如果常数在


PROCESS


语句或子程序中赋值,只能供进程或子程序使用,

< p>


属于局部量。


程序设计中使用常数有利于提高程 序的可读性和方便对程序进行修改。


通常常


< br>数的赋值在程序开始前进行,其数据类型在常数说明语句中指明,


赋值符号为




:=






常数定义语句的格式为:




CONSTANT


常数名称:数据类型



:=


表达式




例如:




CONSTANT Vcc: REAL := 5.0;



CONSTANT DALY


: TIME := 20ns;



CONSTANT KN : INTEGER := 60;



在上面的例子中,


V cc


的数据类型是实数,被赋值为


5.0



DALY


被赋值为时间常数


20n s




KN


被 赋值为


60


的整数。




注意:


常数所赋的值的数据类型必须 与定义的数据类型一致,在程序中常数被赋值后不能



再改变。




2


.变量(


V


ARIABLE






VHDL


程序中,


变量只能在进程和子程序中定义和 使用,


不能在进程外部定义使用,



变 量属于局部量,在进程内部主要用来暂存数据


。对变量操作有变量定义语句和变量赋值< /p>



语句,


变量在赋值前必须通过定义,< /p>


可以在变量定义语句中赋初值,变量初值不是必需的,



变量初值的赋值的符号是“



:=






小提示:




变量与信号赋初值语句仅可用于仿真,在综合时被忽略,不起作用。



变量定义语句的格式为:




V


ARABLE


变量名称:数据类型



:=


初值;




例如:




V


ARABLE S1 :INTEGER := 0



V


ARABLE S2, S3 :INTEGER



V


ARABLE CON1 :INTEGER RANGER 0 TO 20



V


ARABLE D1, D2 :STD_LOGIC



S1


是整数型变量、初值是


0



CON1


是整数型 变量,其变化范围是


0



20



D1



D2


是一



位标准逻辑位型变量。




变量赋值语句的格式为:




变量名称



:=


表达式



;



在对变量进行赋值时,要求表达式的数据类型必须与变量定义语句中的数据类型一致,< /p>



表达式的数据对象可以是常数、变量和信号。

< br>变量赋值是立即发生的,没有任何时间延迟



的,


所以变量只有当前值,并且对同一个变量可以多次赋予新值


。多个变量 的赋值是根据



赋值语句在程序中的书写位置,按照自上而下顺 序进行的,所以


变量赋值语句属于顺序执



行语句。变量不能放在进程的敏感信号表中。




例如:




PROCESS



D, E





V


ARIABLE A


V


, BV


, CV :INTEGER := 0



BEGIN



A


V := 1



BV := A


V + D



A


V := E + 2



CV := A


V * 2



A


<= A


V



B <= BV



C <= CV



END PROCESS



这是 一个进程语句,定义


A


V


< p>
BV



CV


是整数型变量 ,当敏感信号


D



E

< br>只要有一个发



生变化,放在进程中的语句就要全部执行一次,如


D = 1



E


变化为



2


,则这段程序的执行



结果是:


A


= 4



B =2



C = 8





3.


信号(


SIGNAL






VHDL


中,信号分为外部端口信号和内部信号,外部端口信号是设计单元电路的引脚




在程序实体中定义



外部信号对应四种


I/O


状态是

IN



OUT


< br>INOUT



BUFFER


等< /p>


,其作


用是在设计单元电路之间起互连作用,

外部信号可以供整个设计单元使用属于全局量



例如


在结构体中,


外部信号可以直接使用,


不需要 加以说明,


可以通过信号赋值语句给外部输出


信号赋值。




小提示:




内部信号是用来描述设计单元内部的传输信号,它除了没有外 部信号的流动方向之外,



其它性质与外部信号一致。




内部信号的使用范围(可见性)与其在设计程序中的位置有关,内部信号可以在包体、



结构体和块语句中定义,


如果信号在结构体中 定义,


则可以在供整个结构体中使用,


如果在

< br>


块语句中定义的信号,


只能供块内使用,


不能在进程和子程序中定义内部信号



信号在状态< /p>



机中表示状态变量。




对内部信号操作有信号定义语句和信号赋值语句,内部信号在 赋值前必须通过定义,



可以在信号定义语句中赋初值,内部信 号初值不是必需的,内部信号的定义格式与变量的



定义格式基 本相同,只要将变量定义中的保留字


V


ARIABLE


换成


SIGNAL


即可。




内部信号定义语句的格式为:




SIGNAL


信号名称:数据类型



:=


初值;




例如:




SIGNAL S1 :STD_LOGIC := .0.



SIGNAL D1 :STD_LOGIC _VECTOR



3 DOWNTO 0



:=



1001




;



定义信号


S1


是标准逻辑位型,初值是逻辑


0


;信号


D1


是标准逻辑位向量,初值是逻


辑向量


1001





信号赋值符号与变量赋值符号不同,信号赋值符号为





<=






小提示:




对于赋值语句还可以采用如下格式:




SIGNAL VEC1,VEC2: BIT_VECTOR( 3 DOWNTO 0);



VEC1<=( 0=>.1. OTHERS=> .0.);--


表示判别性的整集内涵赋值,


VEC


的第三位为


1


,其



余为


0



VEC2 (1 TO 2)<=



1 0



; --



VEC2


部分位赋值




信号赋值语句的格式为:




信号名称



<=


表达式;




在对信号进行赋值时,表达式的数据对象可以是常数、变量和信号,但是要求表达式


< /p>


的数据类型必须与信号定义语句中的数据类型一致


。在结构体中信 号的赋值可以在进程中



也可以在进程外,但两者的赋值方式是 不同的。


在进程外,信号的赋值是并行执行的,所


< p>
以被称之为并行信号赋值语句。在进程内,信号的赋值方式具有特殊性。




信号不能在进程中定义,但可以在进程中赋值


。在进程中,变量赋值是立即起作用的,



信号只有在 进程被激活(敏感信号发生变化)后,在进程结束时才能赋予新的值。信号具



有时间特性,信号赋值不是立即发生的,需要经过固有的时间延迟,所以信号具有过去值



和当前发生值,这与实际电路的特性是一致的。信号的赋值过程分为顺 序处理和并行赋值



两个阶段。顺序处理是按照自上而下的顺序 ,用信号原来的值对所有的表达式进行运算,



运算结果不影响 下一个表达式的运算,直到处理好进程中的最后一个表达式。并行赋值是



把表达式的值并行同时赋给信号。整个过程是一个无限循环的过程,循环停止的条件是敏



感信号保持不变,所以在进程中的信号赋值语句属于顺序执行语句。在进程 之外的信号赋



值语句属于并行同时语句。




小提示:




信号与变量赋值的区别




SIGNAL D :INTEGER --


信号要定义在进程外的结构体中




PROCESS



A,B,C





BEGIN



D <= A




X <= B + D



D <= C



Y


<= B + D



END PROCESS



执行的结果是:



D <= C



X <= B + C



Y


<= B + C --


进程中同一信号多次赋值



只有最后一次生效




PROCESS



A,B,C





V


ARIABLE D :INTEGER --


变量要定义在进程内部




BEGIN



D := A




X <= B + D



D := C



Y


<= B+ D



END PROCESS



执行的结果是:



X <= B + A




Y


<= B + C --


进程中变量多次赋值则立即生效





1-2-3

通过一位


BCD


码的加法器的程序,比较信号、常量、变量 的赋值及使用方法。




ENTITY


bcdadd IS



PORT





op1, op2 :IN INTEGER RANGE 0 TO 9



result :OUT INTEGER RANGE 0 TO 31




;



END bcdadder;



ARCHITECTURE a OF bcdadder IS



CONSTANT adj :INTEGER := 6 ; --


定义常数


adj=6



SIGNAL binadd :INTEGER RANGE 0 TO 18



--


定义信号


binadd


的取值范围是


0



18



BEGIN



binadd <=op1+op2; --



op1+op2


和运算




PROCESS (binadd)



V


ARIABLE tmp : INTEGER:=0; --


定义变量


tmp


是整数型,初值是


0



BEGIN



IF binadd > 9 THEN --


如果


binadd

大于


9


,结果要调整




tmp := adj --


方 法是和加


6


,否则,结果加


0





ELSE



tmp := 0



END IF



result <=binadd+tmp --


给外部信号赋值




END PROCESS;



END a;



小提示:




常量,变量,信号的物理含义如下:




常量:电源,地,恒定逻辑值等常数。




变量:某些值的载体,存储单元,常用于描述算法。




信号:物理设计中的硬连接线,包括输入输出端口。




信号与常数相当于全局变量,变量相当于局部变量,变量只能 存在于


PROCESS



< p>
FUNCTION



PROCEDUCE


中。不能带出


PROCESS



FUNCTION



PROCEDUCE


,传



送出去,而信号可以。




1.3 VHDL


设计的基本语句




VHDL


常用语句可以分为两大类并 行语句和顺序语句


,在数字系统的设计中,这些语句



用来描述系统的内部硬件结构和动作行为,


以及信号之间的基本逻辑关系 。


顺序语句必须放



在进程中



因此可以把顺序语句称作为进程中的语句。


顺 序语句的执行方式类似于普通计算



机语言的程序执行方式,都 是按照语句的前后排列的方式顺序执行的,一次执行一条语句,



并且从仿真的角度来看是顺序执行的。


结构体中的并行语句总是处于进程的外部,


所有并行



语句都是一次同时执行的,与他 们在程序中排列的先后次序无关。




常用的并行语句有:





1




并行信号赋值语句,用




<=




运算符





2




条件赋值语句,


WHEN-ELSE




3




选择信号赋值语句,


WITH-SELECT




4




方块语句,


BLOCK



常用的顺序语句有:





1




信号赋值语句和变量赋值语句





2




IF- ELSE


语句





3




CASE-WHEN


语句





4




FOR-LOOP



1.3.1


并行信号赋值语句




信号赋值语句的功能是将一个数据或一个表达式的运算结果传 送给一个数据对象,这个



数据对象可以是内部信号,也可以是预定义的端口信号。





1-3-1


用并行信号赋值语句描述逻辑表达式是


Y=AB+C



D


的电路。




ENTITY


loga IS



PORT (



A, B, C, D : IN BIT;



Y


: OUT BIT



);



END loga;



--


定义


A



B

< p>


C



D


是输入端口信号,


Y


是输出端口信号

< br>



ARCHITECTURE stra OF loga IS



SIGNALE : BIT; --


定义


E


是内部信号




BEGIN



Y


<=(A


AND B) OR E; --


以下两条并行语句与顺序无关




-


-


-


-


-


-


-


-



本文更新与2021-02-09 07:11,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/619650.html

vhdl基本语法的相关文章

  • 爱心与尊严的高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊严高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊重的作文题库

    1.作文关爱与尊重议论文 如果说没有爱就没有教育的话,那么离开了尊重同样也谈不上教育。 因为每一位孩子都渴望得到他人的尊重,尤其是教师的尊重。可是在现实生活中,不时会有

    小学作文
  • 爱心责任100字作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任心的作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文