版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章VHDL基础VHDL结构VHDL语法基础VHDL常用语句基本逻辑电路设计什么是VHDL?
VHDL是超高速集成电路硬件描述语言(VeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage)的英文缩写。4.1
VHDL结构库(Library)程序包(Package)实体(Entity)结构体(Architecture)配置(Configuration)
VHDL是用结构化程序设计原理构成的一种语言,每个VHDL文件整体结构为实体说明和结构体两部分。
VHDL借用了Pascal语言的设计思想。
1、实体说明定义硬件模块接口,隐藏模块内部的详细信息,简化成定义模块输入输出的说明。
2、结构体是模块内部结构和行为的详细说明。1.VHDL基本组成实体(Entity)结构体(Architecture)配置(Configuration)包集合(Package)库(Library)一个完整的VHDL程序VHDL设计文件的两个基本组成部分结构体用于描述系统的内部电路配置用于从库中选取所需元件安装到设计单元的实体中包集合存放各设计模块能共享的数据类型、常数、子程序等库用于存放已编译的实体、结构体、包集合和配置实体部分描述设计系统的外部接口信号(即输入/输出信号)--以下为两输入与门的VHDL代码library
ieee;useieee.std_logic_1164.all;entity
and2
isport(a,b:inbit;
y:outbit);end
and2;architecturea1ofand2isbegin
y<=aandb;enda1;--每条语句以分号结束程序包实体结构体库and2.vhd在QuartusII中,该程序的文件名与实体名一致。实体部分结构体部分2.VHDL基本组成的实例3.VHDL库和程序包(1)IEEE库:包括STD_LOGIC_1164、STD_LOGIC_ARITH、STD_LOGIC_SIGNED、STD_LOGIC_UNSIGNED
等4个常用程序包;
(2)STD库:包括STANDARD和TEXTIO等程序包;(3)WORK库:用户库;
(4)VITAL库:仿真库。
库:是用于存放预先编译好的程序包。程序包:定义基本的常数,数据类型,元件及子程序等。
主要包含程序包和其它支持工业标准的程序包。为设计人员最常用和最重要的程序包,它主要定义了常用的数据类型和函数。定义了一些数据类型、子程序和函数为标准资源库,也可以存放例化元件和模块应用广泛资源库,主要包括时序程序包和基本元件程序包4.库和程序包的语法:library<设计库名>;use<设计库名>.<程序包名>.all;
一般VHDL代码中库和程序包的调用语句:
libraryieee; useieee.std_logic_1164.all;
useieee.std_logic_arith.all; useieee.std_logic_signed.all;
useieee.std_logic_unsigned.all;--最常用--计数器常用5.实体
实体作为一个设计对象(独立的电路功能结构)的组成部分,其功能是对这个设计对象与外部电路进行接口描述,是设计对象对外的一个通信界面。实体的语句格式:entity
e_name
is
port
(
p_name:port_m
data_type;...
p_namei:port_m
data_type
);end
e_name;
entity
实体名
is
port(a:
inbit;
b:inbit;
y:outbit);end
实体名;端口名数据类型端口模式aby?
ENTITY、IS、END是VHDL的关键字(保留字)。实体中的每一个I/O信号被称为端口,其功能对应于电路图符号的一个引脚。端口说明则是对一个实体的一组端口的定义,即对基本设计实体与外部接口的描述。端口是设计实体和外部环境动态通信的通道。端口模式有以下四种类型:(方框代表一个设计实体)
in
out
buffer
inoutVHDL中端口模式单向输入端口:时钟、控制和单向数据输入等。
单向输出端口:提供给其它实体如计数输出、控制信号等,
缓冲端口:即是实体的输出端口,也用于反馈。双向端口:即可以输出或输入,也用于反馈,是完备的端口模式。*如果端口模式没有指定,则该端口处于缺省模式为:IN
。*数据类型原则上可以是任何标准的数据类型和用户自定义类型。inininoutoutbufferinoutmodemode模式及其信号源VHDL中端口数据类型在对VHDL的实体进行定义时,都要指定端口中的数据类型。VHDL有多种标准的数据类型,并且允许用户自定义数据类型。在VHDL语言语义约束中,对数据类型的要求反映在赋值语句的目标与源的一致,表达式中操作的一致,子类型中约束与类型的一致等许多方面。例:signalf1:integerrange0to15;1)整数(INTEGER)类型:整数与数学中整数的定义相似,如加“+”、减“-”、乘“×”、除“÷”进行算术运算。
-(231-1)~(231-1)(范围)2)布尔(BOOLEAN)类型
一个布尔量具有两种状态,“真”或者“假”。虽然布尔量也是二值枚举量,但它和位不同没有数值的含义,不能进行算术运算。它能进行关系运算。例如,它可以在if语句中被测试,测试结果产生一个布尔量TRUE或者FALSE。TYPEBOOLEANIS(FALSE,TRUE);
--库中该数据类型的定义语句
3)位(BIT)类型
用来表示数字系统中的信号值。位值用字符‘0’或者‘1’(将值放在引号中)表示。与整数中的1和0不同,‘1’和‘0’仅仅表示一个位的两种取值。位数据可以用来描述数字系统中总线的值。位数据不同于布尔数据,可以用转换函数进行转换。TYPEBITIS('0','1');例:signala,b:bit;4)位矢量(BIT_VECTOR)类型位矢量是用双引号括起来的一组数据,例如:“001100”,X“00bb”。在这里位矢量前面的X表示是十六进制。用位矢量数据表示总线状态最形象也最方便,在VHDL程序中将会经常遇到。使用位矢量时必须注明位宽,即数组中元素个数和排列。TYPEBIT_VECTORISARRAY(NaturalRange<>)OFBIT;例如:signalx:bit_vector(0to7);
variabley:bit_vector(3downto0);例:signala:std_logic;5)标准逻辑位(STD_LOGIC)类型TYPESTD_LOGICIS('U','X',‘0’,'1','Z','W','L','H','-');各值的含义是:‘U’--未初始化的,‘X’--强未知的,‘0’--强0,‘1’--强1,‘Z’--高阻态,‘W’--弱未知的,
'L'--弱0,'H'--弱1,'-'--忽略。
IEEE‘93增加了多值逻辑包STD_LOGIC_1164,使得“STD_LOGIC”数据具有9种不同的值,这里的九值逻辑系统是VHDL特殊定义的一种数据类型。6)标准逻辑矢量(STD_LOGIC_VECTOR)类型标准逻辑矢量STD_LOGIC_VECTOR是标准逻辑位STD_LOGIC的一维数组。数据类型的数据对象赋值的原则是:同位宽、同数据类型的矢量间才能进行赋值。
TYPESTD_LOGIC_VECTORISARRAY(NATURALRANGE<>)OFSTD_LOGIC;例:variabley:std_logic_vector(3downto0);6)字符(CHARACTER)和字符串(STRING)类型7)实数(REAL)类型:只能仿真不能综合8)时间(TIME)类型:只能仿真不能综合9)文件(FILES)类型:一般用于仿真
字符也是一种数据类型,所定义的字符量通常用单引号括起来,如‘a’。一般情况下VHDL对大小写不敏感,但对字符量中的大小写则认为是不一样的。
字符串是由双引号括起来的一个字符序列,也称字符矢量或字符串组。字符串常用于程序的提示和说明。5.结构体
结构体主要是描述实体的硬件结构、元件之间的互连关系、实体所完成的逻辑功能以及数据的传输变换等方面的内容。结构体的语句格式:architecture
arch_name
of
e_name
is[说明语句]begin
功能描述语句endarchitecture
arch_name
;结构体说明语句是指对结构体需要使用的信号、常数、数据类型和函数进行定义和说明。功能描述语句具体地描述了构造体的行为,为并发处理语句。进程语句块语句体结构说明语句功能描述语句元件例化语句子程序调用语句信号赋值语句常数说明数据类型说明信号说明例化元件说明子程序说明结构体内所采用的语句类型6.
配置
配置主要为顶层设计实体指定结构体,或为参与例化的元件实体指定所希望的结构体,以层次方式来对元件例化作结构配置。配置语句的一般格式如下:configuration配置名of实体名isfor结构体名
endfor;end配置名;配置语句
描述了层与层之间的连接关系,以及实体与结构体之间的连接关系。设计者可以利用配置语句选择不同的结构体,使其与要设计的实体相对应;在仿真某一个实体时,可以利用配置选择不同的构造体进行性能对比实验,以得到性能最佳的构造体。4.2
VHDL语法基础标识符的书写要遵守以下规则:(1)标识符由字母、数字和下划线组成,如a_7;(2)标识符中不区分大小写,ab和AB是一样的;(3)第一个字符必须是字母,如a666;(4)不允许有两个连续的下划线,如a__b错误;(5)末尾不能是下划线,如mname_错误;(6)标识符不能和关键字相同,如entity,is等。4.2.1
标识符用于定义程序中常数、变量、信号、端口、子程序和参数的名字4.2.2VHDL类型转换函数函数名功能程序包:STD_LOGIC_1164to_stdlogicvector(A)由bit_vector类型的A转换为std_logic_vectorto_bitvector(A)由std_logic_vector转换为bit_vectorto_stdlogic(A)由bit转换成std_logicto_bit(A)由std_logic转换成bit程序包:STD_LOGIC_ARITHconv_std_logic_vector(A,位长)将整数integer转换成std_logic_vector类型,A是整数conv_integer(A)将std_logic_vector转换成整数integer程序包:STD_LOGIC_UNSIGNEDconv_integer(A)由std_logic_vector转换成integerIEEE库类型转换函数表
4.2.3数据对象1.
常数(CONSTANT)CONSTANT常数名:数据类型
:=“表达式”
;--常数定义
constantfbt:std_logic_vector(0to5):="010110";--标准逻辑矢量类型
constantdatain:integer:=15;--整数类型
2.
变量(VARIABLE)VARIABLE变量名:数据类型:=初始值;--变量定义variablea:std_logic:=‘1’;--变量a定义为标准逻辑位数据类型,初始值是1
用于保存数据的一些基础单元,类似于一种装数据的容器,它接受不同数据类型的赋值,其数据对象有如三种:目标变量名
:=表达式
;--变量赋值
variablex,y:integerrange0to15;--分别定义变量x和y为整数类型
variablea,b:std_logic_vector(7downto0);… x:=11; y:=2+x; a:=b--b向a赋值
a(0to5):=b(2to7);
变量数值的改变是通过变量赋值来实现,其语法格式为:3.
信号(SIGNAL)SIGNAL信号名:数据类型:=初始值--信号定义目标信号名<=表达式;--信号赋值signala,b,c,y,z:integer;
...process(a,b,c)beginy<=a+b;z<=c–a;y<=b;endprocess;
为描述硬件系统的基本数据对象,类似于连线。可作为设计对象中并行语句模块间的连接,其格式如下:4.信号与变量的区别信号与变量赋值语句功能的比较
信号SIGNAL变量VARIABLE基本用法用于作为电路中的信号连线用于作为进程中局部数据存储单元适用范围在整个结构体内的任何地方都能适用所定义的进程、函数和过程中使用行为特性在进程的最后才对信号赋值立即赋值赋值符号
<=
:=逻辑操作符(LogicalOperator)
关系操作符(RelationalOperator)
算术操作符(ArithmeticOperator)
符号操作符(SignOperator)
重载操作符(OverloadingOperator)4.2.4
VHDL操作符
VHDL各种表达式由操作数和操作符组成,其操作数是各种运算的对象,而操作符是规定运算的方式。类型操作符功能操作数数据类型关系操作符=等于任何数据类型/=不等于任何数据类型<小于枚举与整数类型,及对应的一维数组>大于枚举与整数类型,及对应的一维数组<=小于等于枚举与整数类型,及对应的一维数组>=大于等于枚举与整数类型,及对应的一维数组逻辑操作符AND与BIT,BOOLEAN,STD_LOGICOR或BIT,BOOLEAN,STD_LOGICNAND与非BIT,BOOLEAN,STD_LOGICNOR或非BIT,BOOLEAN,STD_LOGICXOR异或BIT,BOOLEAN,STD_LOGICXNOR异或非BIT,BOOLEAN,STD_LOGICNOT非BIT,BOOLEAN,STD_LOGIC符号操作符
+正
整数
-负
整数类型操作符功能操作数数据类型算术操作符+加整数-减整数&并置一维数组*乘整数和实数(包括浮点数)/除整数和实数(包括浮点数)MOD取模整数REM取余整数SLL逻辑左移BIT或布尔型一维数组SRL逻辑右移BIT或布尔型一维数组SLA算术左移BIT或布尔型一维数组SRA算术右移
BIT或布尔型一维数组ROL逻辑循环左移
BIT或布尔型一维数组ROR逻辑循环右移
BIT或布尔型一维数组**乘方
整数ABS取绝对值
整数就是将端口“捆”在一起如:Imp=a&b运算符优先级NOT,ABS,**最高优先级*,/
,MOD,
REM+(正号),
-(负号)
+,
-
,
&
SLL,SLA,SRL,SRA,ROL,ROR
=,
/=,
<,
<=,
>,
>=
AND,OR,NAND,NOR,XOR,XNOR最低优先级VHDL操作符优先级
4.3
VHDL常用语句VHDL语句顺序语句(SequentiaStatements)并行语句(ConcurrentStatements)在VHDL中,编程语句有顺序语句和并行语句两大基本描述语句系列,它们可以从多则面完整描述数字系统的硬件结构和功能,如通信方式、信号的赋值、多层次的元件例化和系统行为等。在VHDL中,一个进程是由一系列顺序语句构成的,在同一设计实体中,所有的进程是并行执行的。任一给定的时刻内,在每一个进程内,只能执行一条顺序语句。
4.3.1顺序语句顺序语句用于实现算法,按照书写的顺序执行。具有如下特点:顺序语句只能出现在进程(Process)和子程序或块中。用于定义进程、子程序等的算法。顺序语句的功能操作有算术运算、逻辑运算、信号和变量赋值、子程序调用等。顺序语句有两大类:一类是真正的,另一类是可以做顺序语句,又可做并行语句,在进程内是顺序语句,在进程外是并行语句,如:
IF语句CASE语句LOOP语句NEXT语句
EXIT语句RETURN语句NULL语句
REPORT语句WAIT语句赋值语句、转向控制语句、等待语句、子程序调用语句、返回语句和空操作语句。顺序赋值语句包括信号赋值语句和变量赋值语句。
变量:=赋值源;信号<=赋值源;1.顺序赋值语句顺序赋值语句的功能就是将一个值或一个表达式的运算结果传递给某一数据对象,如信号或变量,或由此组成的数组。
VHDL设计实体内的数据传递以及对端口界面外部数据的读/写都必须通过赋值语句的运行来实现。在信号赋值中,需要注意的是:
当在同一进程中,同一信号赋值目标有多个赋值源时,信号赋值目标获得的是最后一个赋值源的赋值,其前面相同的赋值目标则不作任何变化。2.IF语句
IF语句是顺序语句结构中最常用的表达方式,根据指定的条件确定语句执行顺序,格式有如下四种:
if条件句
then
顺序处理语句
endif;
1用于锁存器控制的IF语句如果条件满足IF所包含的顺序语句将被执行如果条件不满足程序跳过IF包含的顺序处理语句,执行IF语句的后续语句这种IF语句常用于对时序逻辑电路的复位和时钟信号的判断k1:if(a>b)thenoutput<=‘1’;endifk1;if条件句
then
顺序处理语句1
else
顺序处理语句2
endif;
2用于条件二选一IF语句如果条件满足执行THEN之后的顺序语句如果条件不满足执行ELSE之后的顺序语句其功能为:
IF语句根据所指定的条件来确定执行哪些语句,条件一般为布尔表达式。常用于描述根据条件选择两条不同功能分支的硬件电路。如2选1电路。libraryieee;useieee.std_logic_1164.all;entitymux2isport(a:instd_logic;b:instd_logic;
sel:instd_logic;y:outstd_logic);endmux2;architecturertlofmux2isbeginprocess(a,b,sel)begin
if(sel=‘1')theny<=a;elsey<=b;endif;endprocess;endrtl;if条件句
then
顺序处理语句1elsif
条件句
then
顺序处理语句2...elsif
条件句
then
顺序处理语句nelse
顺序处理语句n+1endif;
3用于多条件的IF语句,执行过程如下:其特点为:依次判断各条件表达式,一旦有条件表达式成立,则执行其后的顺序语句,然后结束IF语句。排在后面的表达式无论是否成立,均被忽略。如所有的条件都不满足,则执行elsif之后的语句process(a,b,d0,d1,d2,d3)Begin
tmp<=a&b;
if(tmp=“00”)theny<=d0;
elsif(tmp=“01”)theny<=d1;
elsif(tmp=“10”)theny<=d2;elsey<=d3;endif;endprocess;if条件句
then
if条件句
then
顺序处理语句
...endif;endif;
4嵌套的IF语句其特点:语句中至少出现两个IF嵌套,主要是为了描述受多重条件控制的逻辑电路。如时序电路中的计数器,有同步置数/异步置零的描述。if条件句
then
顺序处理语句
if条件句
then
顺序处理语句
...endif;endif;
IF语句至少应有一个条件句,条件句必须由布尔表达式构成。
IF语句根据条件句产生的判断结果为
true
或
false
,有条件地选择执行其后的顺序语句。在IF语句的条件表达式中只能使用关系运算操作(=、/=、<、>、<=、>=)及逻辑运算操作的组合表达式。3.CASE语句
CASE语句的语句格式:CASE<表达式>ISWHEN<条件表达式的值>=><顺序语句>;...;<顺序语句>;
WHEN<条件表达式的值>=><顺序语句>;...;<顺序语句>;
...WHENOTHERS=><顺序语句>;ENDCASE;
CASE语句常用于描述总线或编码、译码的行为,其功能可以从许多不同语句的序列中选择其中之一执行,CASE语句的条件表达式与序列的对应关系十分明显,这给理解分析程序有很大的方便。CASE和IS之间的表达式取值满足指定的条件表达式的值程序将执行与之对应的顺序处理语句CASE语句条件表达式的选择值
:可以是单独一个值WHEN值=>顺序语句,是多个值的“或”WHEN值︱值︱……︱值
=>
值顺序语句,是一个取值范围WHEN值TO值=>顺序语句,表示成其他默认值WHENOTHERS=>顺序语句,单个普通数值:如6数值选择范围:如(2TO4),表示取值为2、3或4并列数值:如35,表示取值为3或者5默认值OTHERS1234例:4选1多路选择器ENTITY
mux4_1
IS
PORT(d:
IN
STD_LOGIC_VECTOR(3DOWNTO0);
sel:
INSTD_LOGIC_VECTOR(1DOWNTO0);y:OUT STD_LOGIC);ENDmux4_1;ARCHITECTUREarchOFmux4_1ISBEGIN
PROCESS
(d,sel)
BEGIN
CASE
sel
IS
WHEN
"00"=>y<=d(0);
WHEN"01"=>y<=d(1);
WHEN"10"=>y<=d(2);
WHEN"11"=>y<=d(3);
WHENOTHERS
=>y<=‘X';
ENDCASE;
ENDPROCESS;ENDarch;CASE语句与IF语句的区别:
在IF语句中,先处理最起始的条件,如果不满足,再处理下一个条件。
在CASE语句中,没有值的顺序号,所有值是并行处理的。因此,在WHEN项中的值只能出现一次,且不能重复使用。4.LOOP语句
[LOOP标号:]FOR循环变量IN循环次数范围LOOP
顺序处理语句
ENDLOOP[LOOP标号];该语句是表示循环的语句,它能使程序进行有规则的循环,其循环的次数受迭代算法控制。LOOP语句有两种类型:FOR类型:FOR类型的LOOP语句书写格式如下1LOOP标号是一个可选项循环变量是一个属于循环语句的局部的临时变量,无须事先定义循环次数范围用来指定循环变量的取值范围,它限定了循环的次数。循环量每取一个值就要执行一次循环体中的顺序处理语句,通过逐个取值就实现了整个循环过程。FOR类型的LOOP语句还具有如下赋值功能【例】signala,b,c:std_logic_vector(1to3);...fornin1to3loopa(n)<=b(n)andc(n);endloop;此段程序等效于顺序执行以下三个信号赋值操作:a(1)<=b(1)andc(1);a(2)<=b(2)andc(2);a(3)<=b(3)andc(3);[LOOP标号:]WHILE循环控制条件
LOOP
顺序处理语句
ENDLOOP[LOOP标号];
2WHILE类型:WHILE类型的LOOP语句书写格式如下:LOOP标号是一个可选项关键字WHILE的“条件”是指执行循环语句的条件,
如果控制条件为“真”;则执行顺序语句,完成循环。如果条件为“假”;则结束循环顺序处理语句END
LOOP[LOOP标号]5.NEXT语句:跳出本次循环,开始下一次循环NEXT;
--第一种语句格式NEXTLOOP标号;--第二种语句格式NEXTLOOP标号WHEN条件表达式;--第三种语句格式NEXT语句一般在LOOP语句内部使用,其书写格式如下三种:当执行到NEXT时,终止当前的循环,跳回到本次循环LOOP语句处,重新开始循环当多个LOOP语句嵌套,执行到该就语句时,跳到指定标号的LOOP语句处,重新开始循环条件表达式为真时,执行跳转指定标号的语句,否则继续执行下一条语句6.EXIT语句:跳出整个循环EXIT;
--第一种语句格式EXITLOOP标号;--第二种语句格式EXITLOOP标号WHEN条件表达式;--第三种语句格式
当执行到EXIT,终止当前的循环,跳到当前循环LOOP语句的结束处,退出循环当执行到EXIT,终止当前的循环,跳到指定标号的LOOP语句的结束处,退出循环条件表达式试为真时,执行跳转,跳到指定标号的LOOP语句结束处,退出循环
EXIT语句一般也在LOOP语句内部使用,其书写格式如下三种:该语句执行时,将结束本次循环,如EXIT后跟有LOOP标号,表明要终止的LOOP语句的位置。7.WAIT语句(等待语句)
WAIT;
--第一种语句格式(永远挂起)WAITON信号表; --第二种语句格式(敏感信号等待语句)WAITUNTIL条件表达式; --第三种语句格式(条件等待语句)WAITFOR时间表达式;--第四种语句格式(超时等待语句)WAIT语句可以设置成4种不同的条件,其书写格式如下:WAIT语句是一个使进程处无限等待的语句
WAITON语句让进程处于等待的语句,一直等到敏感信号中的某个信号发生变化才能将进程激活
WAITUNTIL语句让进程处于等待的语句,一直等到条件表达式的返回值为真时才能再次启动进程
WAITFOR语句也让进程处于等待的语句,一直等到时间表达式设定的时间到达才子佳人能再次执行进程8.RETURN(返回)语句RETURN;--第一种语句格式(过程)RETURN表达式;
--第二种语句格式(函数)
9.空操作语句
NULL;
RETURN语句是在一个子程序结束后,用来返回主程序的控制语句,其书写格式为:表达式可以缺省该语句只能用于过程中,其结果为将无条件结束过程,并且不返回任何值该语句只能用于函数中,其后的表达式用来提供函数的返回值。空操作语句,即不做任何操作。但电路状态保持不变。在设计组合逻辑电路时,避免使用NULL语句;在时序逻辑电路时,利用NULL来表示CASE语句中所有其它条件的操作行为。并行语句结构是最具VHDL特色的。它执行的顺序是按触发事件发生的先后顺序所决定,而不受语句的书写的先后顺序影响。由于硬件描述语言所描述的实际系统,其许多操作是并行的,描述的元件都是并行工作,所以,并行语句就是用于表示这种行为的,在执行过程中,并行语句之间可以有信息往来,也可以是相互独立、互不相关的。在VHDL中,并行语句具有多种语句格式,各种并行语句在结构体中的执行是同步进行的,或者说是并行运行的,其执行方式与书写的顺序无关。4.3.2并行语句结构体中的并行语句生成语句条件信号赋值语句元件例化语句并行信号赋值语句块语句进程语句并行过程调用语句信号信号信号信号信号信号ARCHITECTUREENDARCHITECTURE并行语句在结构体中的使用格式如下:ARCHITECTURE结构体名OF实体名IS
说明语句BEGIN
并行语句ENDARCHITECTURE结构体名;说明语句是指对结构体需要使用的信号、常数、数据类型和函数进行定义和说明并行语句位于BEGIN和END之间,这些语句具体地描述了结构体的行为。
并发处理语句是功能描述的核心部分,也是变化最丰富的部分。并发处理语句可以使用赋值语句、进程语句、元件例化语句、块语句以及子程序等。
需要注意的是,这些语句都是并发(同时)执行的,与排列顺序无关。这三种信号赋值语句的共同点是:赋值目标必须都是信号,所有赋值语句与其他并行语句一样,在结构体内的执行是同时发生的,与它们的书写顺序和是否在块语句中没有关系。1.并行信号赋值语句并行信号赋值语句有三种形式:简单信号赋值语句、条件信号赋值语句和选择信号赋值语句。(1)简单信号赋值语句
赋值目标
=表达式;
ARCHITECTUREcurtOFbc1ISSIGNALs1,e,f,g,h:STD_LOGIC;BEGINoutput1<=aANDb;output2<=c+d;g<=eORf;h<=eXORf;s1<=g;ENDARCHITECTUREcurt;(2)条件信号赋值语句目标信号量<=表达式1WHEN赋值条件ELSE
表达式2WHEN赋值条件ELSE...
表达式n-1WHEN赋值条件ELSE
表达式n;该语句的功能是:可以根据不同条件将不同的多个表达式的值赋给指定的信号量。书写格式如下:“WHEN”所指定的条件,如果满足该条件该表达式值代入目信号量;如果不满足条件,则再判别下一个表达式所指定的条件。最后一个表达式可以不跟条件,它表明上述表达式所指明的条件都不满足时,将该表达式的值代入目标信号量。【例】ENTITYmuxISPORT(a,b,c:INBIT;p1,p2:INBIT;z:OUTBIT);END;ARCHITECTUREbehvOFmuxISBEGIN
z<=aWHENp1='1'ELSEbWHENp2='1'ELSEc;END;(3)选择信号赋值语句WITH选择条件表达式SELECT赋值目标信号<=信号表达式1WHEN选择条件1,信号表达式2WHEN选择条件2,
...
信号表达式nWHEN选择条件n;
该语句的功能是:对选择表达式进行测试,当表达式取值不同时,将使不同的值赋给目标信号,书写格式如下:如果符合选择条件1,就将表达式1的值赋给目标信号程序将根据选择条件表达式的值执行过程为:当程序执行到该语句时,程序将根据选择条件表达式的当前值来决定把哪一个信号表达式的值赋给目标信号。
1.选择信号语句与进程中的CASE语句相似,但不能在进程中应用。
2.选择信号语句具有敏感量,即WITH后面的选择表达式。每当选择表达式的值发生变化,便启动该语句对各子句的选择值(条件)进行测试对比,当发现有满足条件的子句时,就将此子句表达式的值赋予目标信号。
3.与CASE语句相类似,该语句对子句条件选择值具有同期性(非顺序性)。
4.
不允许有条件重叠现象,也不允许存在条件涵盖不全的情况。选择信号赋值语句与CASE语句比较【例】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYdecoderISPORT(a,
b,
c:INSTD_LOGIC;data1,data2:INSTD_LOGIC;
dataout:OUTSTD_LOGIC);ENDdecoder;ARCHITECTUREconcuntOFdecoderISSIGNALinstruction:STD_LOGIC_VECTOR(2DOWNTO0);
BEGINinstruction<=c&b&a;
WITHinstructionSELECT
dataout<=data1ANDdata2WHEN"000",
data1ORdata2WHEN"001",
data1NANDdata2WHEN"010",
data1NORdata2WHEN"011",
data1XORdata2WHEN"100",
data1XNORdata2WHEN"101",
'Z'WHENOTHERS;
ENDconcunt;2.进程语句[进程标号:]PROCESS(敏感信号参数表
)[IS][进程说明部分]
BEGIN
顺序语句
ENDPROCESS[进程标号];
(1)为一种并行处理语句,在一个结构体中多个PROCESS语句可以同时并发运行。因此,PROCESS语句是VHDL中描述硬件系统并发行为的最常用、最基本的语句。一般表达格式如下:(2)进程结构组成进程说明部分顺序描述语句部分敏感信号参数表列出用于启动本进程可读入的信号名,当有WAIT语句时例外,敏感信号参数表是放在WAIT语句中的,定义了一些局部变量,可以数据类型、常数、属性和子程序等。但不允许定义信号和共享变量包括代入语句、进程启动语句、子程序调用语句、顺序描述部分和进程当敏感信号参数表中的任一敏感信号值发生变化时,称为进程的启动或激活按进程语句中顺序语句完成一定的功能行为(3)进程要点1.
PROCESS为一无限循环语句
2.PROCESS中的顺序语句具有明显的顺序/并行运行双重性3.进程必须由敏感信号的变化来启动4.进程语句本身是并行语句5.信号是多个进程间的通信线6.一个进程中只允许描述对应于一个时钟信号的同步时序逻辑7.进程中必须包含一个显式的敏感信号表或者包含一个WAIT语句。【例】ENTITYmulISPORT(a,b,c,selx,sely:INBIT;
data_out:OUTBIT);ENDmul;ARCHITECTUREexOFmulISSIGNALtemp:BIT;BEGINp_a:PROCESS(a,b,selx)BEGINIF(selx='0')THENtemp<=a;ELSEtemp<=b;ENDIF;ENDPROCESSp_a;p_b:PROCESS(temp,c,sely)BEGINIF(sely='0')THENdata_out<=temp;ELSEdata_out<=c;ENDIF;ENDPROCESSp_b;ENDex;
3.元件例化语句元件语句使我们能够把原来设计好的VHDL功能模块当作元件一样用在其它VHDL文件中。
元件例化:即引入一种连接关系,它将预先设计好的设计实体定义为一个元件,然后利用特定的语句将此元件与当前的设计实体中的指定端口相连接,从而为当前设计实体引入一个新的低一级的设计层次。元件例化是使VHDL实体构成自上而下层次化设计的一个重要途径。元件例化可以是多层次的。--元件定义语句--元件例化语句元件例化语句有两种格式例化名
:元件名
PORTMAP([元件端口名
=>]实际连接端口名,...);--元件例化语句
COMPONENT
元件名IS
GENERIC(参数说明)
PORT(端口名表);
ENDCOMPONENT
文件名;
--元件定义语句元件名用于指定要在结构体中进行例化的元件,它已存在于调用的工作库中,传递参数说明引用元件的端口说明,必须与该元件的实体说明中的端口属性一致用于指明结构体所要调用的元件、单元或模块。其格式如下:将定义好的元件、单元或模块与结构体相连接,其格式如下:与具体的结构体中描述一致与定义语句的结构体中名称一致映射语句将元件的参数和端口与实际连接信号对应(1)名字关联方式:该方式下,例化元件的端口名和关联符号“=>”都必须要有。这时端口名和连接端口名的对应式在映射语句中的位置是任意的。PORTMAP(形参=>实参)(2)位置关联方式:该方式为例化元件的端口名和关联符号“=>”都可省去。在映射语句(PORTMAP)中只要列出当前系统中连接端口名即可,但连接端口名的排列方式与所需例化的元件端口要一一对应。端口连接有两种方式使用元件例化语句注意元件定义语句可用于结构体、块语句和程序包的说明部分,4.生成语句
生成语句是一种可以重复建立结构或是在多个模块的表示形式之间进行选择的语句。它可以用来产生多个相同的结构,适用于采用简单元件扩展相同结构或规则结构更大的数字电路描述,简化复杂系统的设计,如生成存储器阵列和寄存器阵列。生成语句有如下两种形式:
※
FOR…GENERATE※
IF…GENERATE[标号:]FOR循环变量
IN取值范围
GENERATE
说明
BEGIN
并行语句
ENDGENERATE[标号];(1)FOR形式的生成语句FOR形式的生成语句其书写格式如下:标号是生成语句的标示符,可以缺省循环变量是属于该生成语句局部和临时的变量,由该语句自动定义,只能作赋值源,不能为赋值对象用于指定循环变量的取值范围,取值从取值范围最左边的值开始递增到取值范围最右边的值循环变量每取一个值,就执行一次生成语句(并行语句)FOR-GENERATE语句在形式上与FOR-LOOP语句相象,但结构中前者是并发处理,后者是顺序处理。故FOR-GENERATE语句结构中不能使用EXIT和NEXT语句。在FOR-GENERATE语句中,变量i不需要事先定义。[标号:]IF条件GENERATE
说明
Begin
并行语句
ENDGENERATE[标号];(2)IF形式的生成语句IF形式的生成语句其书写格式如下:标号是生成语句的标示符,可以缺省指的是执行该生成语句的条件,当IF后的条件得到满足时程序就去执行生成语句中的并行语句当IF后的条件不满足时,程序就不执行生成语句中的并行语句
IF-GENERATE语句在形式上与IF语句相象,但结构中没有ELSE项。
IF-GENERATE语句是并发处理的,只有当条件为“真”时才执行结构内的语句。本章作业:
4-14-114.4基本逻辑电路设计4.4.1组合逻辑电路设计
1.基本门电路基本门电路可以使用VHDL中定义的逻辑操作符,实现与门(AND)、或门(OR)、非门(NOT)、与非门(NAND)、或非门(NOR)、异或门(XOR)及同或门(XNOR)的逻辑,同时可构成这些基本门电路构成的逻辑函数式和逻辑图。libraryieee;useieee.std_logic_1164.all;entityxiti309is
port(a,b,c,d:in
std_logic; y3,y2,y1,y0:outstd_logic);end;architecturexiti309arofxiti309isbeginy3<=aor(bandc)or(bandd);y2<=(aandd)or(band(notc)and(notd));y1<=(aand(notd))or((notb)andc)or(candd);y0<=(aand(notd))or((nota)and(notb)andd)or(bandcand(notd));endxiti309ar;【教材P153】8421码转换成5421码的码组变换电路
libraryieee;useieee.std_logic_1164.all;entityadderisport(ai,bi,ci:instd_logic;
si,co:outstd_logic);endadder;architectureadderofadderisbegin
si<=ai
xorbixor
ci; co<=(aiandbi)or(ciand(ai
xorbi));endadder;【教材P157】一位全加器
2.3-8线译码器【教材P168】
libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitydecoder38is
port(inp:instd_logic_vector(2downto0);
outp:outstd_logic_vector(7downto0));endentitydecoder38;architectureart4ofdecoder38isbeginprocess(inp)begincaseinpiswhen"000"=>outp<="00000001";when"001"=>outp<="00000010";when"010"=>outp<="00000100";when"011"=>outp<="00001000";when"100"=>outp<="00010000";when"101"=>outp<="00100000";when"110"=>outp<="01000000";when"111"=>outp<="10000000";whenothers=>outp<="xxxxxxxx";endcase;endprocess;endarchitectureart4;
4线-2线优先编码器真值表
注:表中的“x”为任意,类似VHDL中的“-”值。
3.4线-2线优先编码器【教材P179】libraryieee;useieee.std_logic_1164.all;entityencoderis
port(a:instd_logic_vector(3downto0);
y:outstd_logic_vector(1downto0);
eo:out
std_logic);endencoder;architectureencoderpofencoderisbeginprocess(a)begin ifa(3)='1'theny<="11";eo<='1';
elsifa(2)='1'theny<="10";eo<='1';
elsifa(1)='1'theny<="01";eo<='1';
elsifa(0)='1'theny<="00";eo<='1';
elsifa="0000"theny<="00";eo<='0'; endif;endprocess;endencoderp;
4.1路-4路数据分配器【教材P182】libraryieee;useieee.std_logic_1164.all;entitymux4t1isport(s1,s2:instd_logic;
datain:in
std_logic;
a,b,c,d:out
std_logic);endmux4t1;architectureoneofmux4t1issignals:std_logic_vector(1downto0);signaldataout:std_logic_vector(3downto0);begins<=s1&s2;process(s,datain)begincasesis when"00"=>dataout<=datain&"zzz"; when"01"=>dataout<="z"&datain&"zz"; when"10"=>dataout<="zz"&datain&"z"; when"11"=>dataout<="zzz"&datain; whenothers=>dataout<="zzzz";endcase;endprocess;a<=dataout(0);b<=dataout(1);c<=dataout(2);d<=dataout(3);endarchitectureone;5.4选1数据选择器【教材P185】libraryieee;useieee.std_logic_1164.all;entitymux41isport(inp:instd_logic_vector(3downto0);
a,b:in
std_logic;
y:out
std_logic);endentitymux41;architectureartofmux41issignalsel:std_logic_vector(1downto0);beginsel<=b&a;process(inp,sel)isbegin
if(sel="00")theny<=inp(0);
elsif(sel="01")theny<=inp(1);
elsif(sel="11")theny<=inp(2);elsey<=inp(3);endif;endprocess;endarchitectureart;共阴极数码管及其电路BCD七段译码器真值表4.BCD-7段译码器【教材P173】libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityled7sis
port(din:instd_logic_vector(3downto0); led7:outstd_logic_vector(6downto0));endled7s;architecturebehvofled7sisbegin
process(din)begincasedinis when"0000"=> led7<="0111111";--"0" when"0001"=> led7<="0000110";--"1" when"0010"=> led7<="1011011";--"2" when"0011"=> led7<="1001111";--"3" when"0100"=> led7<="1100110";--"4" when"0101"=> led7<="1101101";--"5" when"0110"=> led7<="1111101";--"6“when"0111"=> led7<="0000111";--"7"when"1000"=> led7<="1111111";--"8"when"1001"=> led7<="1101111";--"9"whenothers=> led7<="0000000";--"不显示"endcase;endprocess;endbehv;1.边沿JK触发器【教材P236】libraryieee;useieee.std_logic_1164.all;entityjkcfqis
port(j,k,clk:instd_logic;
q,qb:outstd_logic);endentityjkcfq;architectureartofjkcfqissignalq_s,qb_s:std_logic;beginprocess(clk,j,k)isbegin if(clk'eventandclk=‘1’)then4.4.2时序逻辑电路设计
if(j=‘0’andk=‘1’)then
q_s<=‘0’;
qb_s<=‘1’;
elsif(j=‘1’andk=‘0’)then
q_s<=‘1’;
qb_s<=‘0’;
elsif(j=‘1’andk=‘1’)then
q_s<=notq_s;
qb_s<=notqb_s;
endif;endif;q<=q_s;qb<=qb_s;endprocess;endarchitectureart;2.同步复位的D触发器libraryieee;useieee.std_logic_1164.all;entitysyndcfqis
port(d,clk,reset:instd_logic;
q:outstd_logic);endentitysyndcfq;architectureartofsyndcfqisbeginprocess(clk)isbeginif(clk'eventandclk=‘1’)then
if(reset=‘0’)then q<=‘0’;--时钟边沿到来且有复位信号,触发器被复位
elseq<=d;
endif;endif;endprocess;endarchitectureart;【教材P239】3.异步复位/置位的D触发器libraryieee;useieee.std_logic_1164.all;entityasyndcfqis
port(clk,d,preset,clr:instd_logic;
q:outstd_logic);endentityasyndcfq;architectureartofasyndcfqisbeginprocess
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冬天穿打底裤会影响健康吗课件
- 年底诈骗高发 - 捂紧钱包课件
- 生鲜市场动物产品消费安全指引课件
- 2026年船舶船体结构设计船体强度工程师资格考试试题及答案
- 2026年遥感设计师遥感技术试题及答案
- 人字梯安全方案
- 2026年胸腔穿刺急救技能三基年度培训方案
- 2026年事业单位意识形态工作考试试题及答案
- 2026年药品经营文件作废回收销毁培训试题(含答案)
- 2026年血透室医师三基三严培训考核计划
- 2026年黑龙江哈三中高三一模英语试题含答案
- 2026年中国宠物行业白皮书 消费版
- 低空空域资源合理配置与运行效率优化策略研究
- 2026年人工智能训练师(二级)实操技能综合试题及解析
- 尺神经松解术课件
- 储能方面培训
- 显微手足外科科普
- AI与3D打印融合的个性化智能医疗方案设计
- (2026年)实施指南《JBT 3233-2018 超硬磨料 钻探用人造金刚石聚晶》
- 胃癌中西医结合诊疗指南
- 土建消防安全培训内容课件
评论
0/150
提交评论