VHDL.docx

上传人:b****5 文档编号:7470912 上传时间:2023-01-24 格式:DOCX 页数:29 大小:834.80KB
下载 相关 举报
VHDL.docx_第1页
第1页 / 共29页
VHDL.docx_第2页
第2页 / 共29页
VHDL.docx_第3页
第3页 / 共29页
VHDL.docx_第4页
第4页 / 共29页
VHDL.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

VHDL.docx

《VHDL.docx》由会员分享,可在线阅读,更多相关《VHDL.docx(29页珍藏版)》请在冰豆网上搜索。

VHDL.docx

VHDL

 

并行语句结构是最具硬件描述语言特色的,在VHDL程序中各种并行语句在结构体中的执行是同步进行的,也就是说并行语句的执行与书写的顺序无关。

并行语句的七种基本语句是:

Ø并行信号赋值语句

Ø进程语句

Ø块语句

Ø条件信号赋值语句

Ø元件例化语句

Ø生成语句

Ø并行过程调用语句。

并行语句在结构体中的使用格式为:

ARCHITECTURE结构体名OF实体名IS

说明语句

BEGIN

并行语句

ENDARCHITECTURE结构体名;

 

8.1进程语句

进程语句本身是一种并行语句,在结构体中可以有多个进程语句以及其他并行语句并行存在。

进程语句的设计实例

例—1)一位十进制加法计数器(加一操作)

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164,ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYcnt10IS

PORT(clr:

INSTD_LOGIC;

in1:

INSTD_LOGIC_VECTOR(3DOWNTO0);

out1:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

END;

ARCHITECTUREbhvOFcnt10IS

BEGIN

PROCESS(in1,clr)--------敏感信号中无时钟信号,为组合进程。

BEGIN

IF(clr=’1’ORin1=“1001”)THEN

out1<=“0000”;---当有清零信号或输入数据为9时输出0

ELSE

Out1<=in1+1;---否则加一操作(+号使用了重装载算符)

ENDIF;

ENDPROCESS;

END;

 

 

形成组合电路

例—2)一位十进制加法计数器(同步清零)

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164,ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYcnt10IS

PORT(clr:

INSTD_LOGIC;

clk:

INSTD_LOGIC;

out1:

BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));

END;

ARCHITECTUREbhvOFcnt10IS

BEGIN

PROCESS

BEGIN

WAITUNTILclk’EVENTANDclk=’1’;---时钟为敏感信号,为时序进程。

IF(clr=’1’ORout1=“1001”)THEN

out1<=“0000”;---当有清零信号或输出数据为9时输出0(同步清零)

ELSE

out1<=out1+1;---否则加一操作(+号使用了重装载算符)

ENDIF;

ENDPROCESS;

END;

 

 

 

形成时序电路

 

例—3)可预置一位十进制加法计数器(异步置数、清零,同步计数)

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164,ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYcnt10IS

PORT(in1:

INSTD_LOGIC_VECTOR(3DOWNTO0);

Clr,en,clk:

INSTD_LOGIC;

out1:

BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));

END;

ARCHITECTUREbhvOFcnt10IS

BEGIN

PRO1:

PROCESS(en,clr,clk)-----------(异步清零、异步置数、同步计数)

BEGIN

IF(clr=’1’ORout1=“1001”)THEN---当有清零信号和数据为9时输出0。

(异步清零)

out1<=“0000”;

ELSIF(en=’1’)THEN

out1<=in1;

ELSIF(clk’EVENTANDclk=’1’)THEN

out1<=out1+1;---否则加一操作(+号使用了重装载算符)

ENDIF;

ENDPROCESSPRO1;注意条件的优先级

END;

 

例—3)可预置一位十进制加法计数器(同步置数、异步清零,同步计数)

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164,ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYcnt10IS

PORT(in1:

INSTD_LOGIC_VECTOR(3DOWNTO0);

Clr,en,clk:

INSTD_LOGIC;

out1:

BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));

END;

ARCHITECTUREbhvOFcnt10IS

BEGIN

PRO1:

PROCESS(clr,clk)----------(同步置数)

BEGIN

IF(clr=’1’ORout1=“1001”)THEN---当有清零信号和数据为9时输出0。

(异步清零)

out1<=“0000”;

ELSIF(en=’1’)THEN-----如果以上条件不成立说明是clk启动的进程

out1<=in1;

ELSIF(clk’EVENTANDclk=’1’)THEN

out1<=out1+1;---否则加一操作(+号使用了重装载算符)

ENDIF;

ENDPROCESS;

END;

 

8.2块语句

块语句本身是并行语句结构,其内部也都是由并行语句构成的(包括进程)。

与其它的并行语句相比,块语句本身并没有独特的功能,他只是一种并行语句的组合方式,利用它可将程序编排得更有层次,可读性更强。

块的引入并不会影响原来的电路功能。

8.3并行信号赋值语句

并行信号赋值语句有三种形式:

Ø简单信号赋值语句

Ø条件信号赋值语句

Ø

选择信号赋值语句

 

●在结构体内的所有并行信号赋值语句的执行都是同时发生的,与书写顺序无关。

●只要赋值源发生变化赋值语句将被启动,且是完全独立于其他语句的。

●以上三种形式都可以直接出现在结构体中。

8.3.1简单信号赋值语句

简单信号赋值语句格式如下:

赋值目标<=表达式(赋值源)

例并行的简单赋值操作---------以下5条信号赋值语句的执行是并行发生的

ARCHITECTUREbhvOFbc1IS

SIGNALs1:

STD_LOGIC;

BEGIN

output1<=aANDb;

output2<=c+d;

B1:

BLOCK

SIGNALe,f,g,h:

STD_LOGIC;-------------------信号无方向

BEGIN

g<=eOFf;----无赋值源应加e<=a;f<=b;

h<=eXORg;

ENDBLOCKB1;

s1<=g;-----g说明在块内而是用在块外

END;改错

 

8.3.1条件信号赋值语句

条件信号赋值语句格式如下:

赋值目标<=表达式WHEN赋值条件ELSE

表达式WHEN赋值条件ELSE

………

表达式;

 

 

Ø条件信号赋值语句的执行顺序与书写的顺序相同,第一句具有最高赋值优先级。

(条件语句一般是有顺序的如if语句)

Ø赋值条件的数据类型应该是布尔型。

Ø赋值条件中可以同时有多项满足(重叠),但按优先级最高的赋值。

Ø最后一项可以不跟条件子句,表示OTHER.

Ø每一个子句后无标点符号,最后一句有分号。

Ø条件信号赋值语句与CASE语句的区别:

●CASE语句是同一数据对象或表达式的不同取值的判断,执行的是不同的顺序语句,且条件不能重叠。

CASE表达式IS

WHEN选择值=>顺序语句;

WHEN选择值=>顺序语句;

………

WHEN选择值(OTHERS)=>顺序语句;

ENDCASE;

 

●条件信号赋值语句可以是不同的数据对象的不同条件的判断,而执行的却是向同一目标赋值,且条件可以有重叠。

赋值目标<=表达式WHEN赋值条件ELSE

表达式WHEN赋值条件ELSE

………

表达式;

 

 

例条件赋值操作

z<=aWHENp1=‘1’ELSE

bWHENp2=‘1’ELSE

c;

…………

当p1和p2同时为1时,z获得的赋值是a.

 

8.3.2选择信号赋值语句

选择信号赋值语句格式如下:

WITH选择表达式SELECT

赋值目标<=表达式WHEN选择值,

表达式WHEN选择值,

………

表达式WHEN选择值;

 

 

Ø选择信号赋值语句与CASE语句十分相似,但不能应用于进程语句中。

ØCASE语句的启动是靠进程语句的敏感信号,选择信号赋值语句的启动是靠选择表达式的变化。

Ø与CASE语句相同,选择信号赋值语句对条件选择值的测试具有同期性,与书写的顺序无关,因此不允许有条件重叠现象和条件涵盖不全的现象。

Ø选择信号赋值语句的每一子句结尾是逗号。

例逻辑运算的指令编码器

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164,ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYdecoderIS

PORT(a,b,c:

INSTD_LOGIC;

data1,data2:

INSTD_LOGIC;

dataout:

OUTINSTD_LOGIC);

END;

ARCHITECTUREbhvOFdecoderIS

SIGNALinstruction:

STD_LOGIC_VECTOR(2DOWNTO0)

BEGIN

Instrction<=c&b&a;-----------------输入数据并置为逻辑操作指令

WITHinstructionSELECT

dataout<=data1ANDdata2WHEN“000”,

data1ORdata2WHEN“001”,

data1NANDdata2WHEN“010”,

data1NORdata2WHEN“011”,

data1XORdata2WHEN“100”,

data1XNORdata2WHEN“101”,

‘Z’WHENOTHERS;

END;

 

8.4并行过程调用语句

并行过程调用语句可以作为一个并行语句直接出现在结构体中(函数调用不同)。

并行过程调用语句格式:

过程名(关联参量名);

 

过程调用实例----3位整数大小排序

PACKAGEdata_typesIS-----定义程序包(包首,包体不是必须的)

SUBTYPEdata_elementISINTEGERRANGE1TO3;-------定义数据子类型

TYPEdata_arrayISARRAY(1TO3)OFdata_element;

ENDdata_types;

USEWORK.data_types.ALL;

ENTITYsortIS

PORT(in_array:

INdata_array;

Out_array:

OUTdata_array);

END;

ARCHITECTUREbehaveOFsortIS

BEGIN

PROCESS(in_array)

PROCEDUREswap(data:

INOUTdata_array;-----------过程体(过程首不是必须的)

Low,high:

INdata_element)IS---swap的形参是data,Low,high

VARIABLEtemp:

data_element;

BEGIN

IF(data(low)>data(high))THEN------Low,high为数组data的下标

Temp:

=data(low);

data(low):

=data(high);

data(high):

=temp;

ENDIF;

ENDswap;

VARIABLEmy_array:

data_array;

BEGIN

my_array:

=in_array;

swap(my_array,1,2);---------过程调用my_array,1,2是对应data,Low,high的实参

swap(my_array,2,3);----------位置关联

swap(my_array,1,2);

out_array<=my_array;

ENDPROCESS

END;

 

 

8.5元件例化语句

8.6生成语句

 

8.5元件例化语句

元件例化是在当前的设计实体中引入第一级的设计实体(元件),它相当于在系统板上插入IC或IP核。

它可以是FPGA库中的元件,也可以是用户子自定义元件。

元件例化格式:

COMPONENT元件名IS------元件定义语句(用户自定义,如EDA

GENERIC(类属表);软件库中已经定义过可不定义)

PORT(端口名表);

ENDCOMPONENT元件名:

例化名:

元件名PORTMAP([端口名=>]连接端口名,….);-------元件例化语句

 

例:

与门的元件例化(四输入或门)

 

LIBRARYIEEE;----------------------下一层设计(二输入与非门)

USEIEEE.STD_LOGIC_1164,ALL;

ENTITYnd2IS

PORT(a,b:

INSTD_LOGIC;

c:

OUTINSTD_LOGIC);

END;

ARCHITECTUREbhvOFnd2IS

BEGIN

c<=aANDb;

END;

LIBRARYIEEE;-----------------顶层设计(四输入或门)

USEIEEE.STD_LOGIC_1164,ALL;

ENTITYord4IS

PORT(a1,b1,c1,d1:

INSTD_LOGIC;

z1:

OUTINSTD_LOGIC);

END;

ARCHITECTUREbhvOFord4IS

BEGIN

COMPONENTnd2---------------------元件定义语句(可选)

PORT(a,b:

INSTD_LOGIC;

c:

OUTINSTD_LOGIC);

ENDCOMPONENT;

SIGNALx,y:

STD_LOGIC;

BEGIN

U1:

nd2PORTMAP(a1,b1,x)-------------------------------位置关联--------元件例化语句

U2:

nd2PORTMAP(a=>c1,c=>y,b=>d1);-------------名字关联

U3:

nd2PORTMAP(x,y,c=>z1);----------------------混合关联

END;

 

Ø元件例化与子程序调用的区别:

子程序调用属于同一设计层次(同一实体),而元件例化属于不同设计层次(实体中插入实体)。

Ø

VHDL元件例化语句并不优于图形输入方式。

 

8.6类属映射语句

类属映射语句应用于元件例化语句中的元件规模参数的设定,为例化中的元件规模的改变提供了极大方便。

类属映射语句格式:

GENERICMAP(类属表);

 

 

8.7块生成语句(GENERATE)

生成语句是根据条件或要求将并行语句进行多次复制。

生成语句的格式:

[标号:

]FOR循环变量IN取值范围GENERATE

说明

BEGIN

并行语句----------------要复制的并行语句

ENDGENERATE[标号];

 

 

[标号:

]IF条件GENERATE

说明

BEGIN

并行语句----------------要复制的并行语句

ENDGENERATE[标号];

 

Ø生成语句多数用于产生一组完全相同的元件例化或过程调用。

Ø生成语句不能用于函数调用。

Ø生成语句可以嵌套,在嵌套时标号是必需的。

例复制元件例化

………

COMPONENTcomp

PORT(x:

INSTD_LOGIC;

y:

OUTSTD_LOGIC);

ENDCOMPONENT;

SIGNALa:

STD_LOGIC_VECTOR(0TO7);

SIGNALb:

STD_LOGIC_VECTOR(0TO7);

……….

gen:

FORiINa’RANGEGENERATE

u1:

compPORTMAP(x=>a(i),y=>b(i));

ENDGENERATEgen;

………

 

 

 

8.8属性描述与定义语句

VHDL中预定义了多种数据对象或其他项目的属性,可用于监测和统计。

属性描述语句格式:

属性测试项目名’属性标识符;

1.信号类属性(信号属性函数EVENT和STABLE)

ØEVENT表示某信号在当前的一个极小的时间段δ内发生的事件,也就是该信号的电平发生变化。

如:

clock’EVENT用来测试信号clock的电平变化,返回值为true。

如果改写为clock’EVENTANDclock=’1’则测试的是上升沿。

ØSTABLE的测试功能与EVENT相反,它是信号在δ时间段内无事件发生,则返还TRUE值。

如:

(NOTclock’STABLEANDclock=’1’)监测的还是上升沿。

2.数据区间类属性

数据区间属性格式

数据对象’RANGE(N)

-----------------------------------------------------------

数据对象’REVERSE_RANGE(N)

 

Ø数据对象’RANGE(N)表示某一数据对象的取值范围,返回值为定义的数据范围。

……

SIGNALrange1:

INSTD_LOGIC_VECTOR(0TO7)

……..

FORiINrange1’RANGELOOP

如:

 

’RANGE与数据类型数名中的RANGE不同如:

SUBTYPEshortISINTEGERRANGE0TO15;

Ø数据对象’REVERSE_RANGE表示某一数据对象的取值范围,返回值为与定义的顺序相反的数据范围。

……

SIGNALrange1:

INSTD_LOGIC_VECTOR(0TO7)

……..

FORiINrange1’REVERSE_RANGELOOP

如:

 

返回值为(7DOWNTO0)

 

状态机是一种对按顺序工作的数字系统的描述,其工作方式是按预定的顺序或条件实现系统的状态的相互转换,是纯硬件数字系统中的顺序控制电路。

采用VHDL设计有限状态机有很多优越性。

Ø比纯硬件系统设计更灵活,可以实现远离硬件的设计方式。

Ø运行的速度和可靠性优于CPU。

Ø有利于克服电路中的毛刺现象,设计方案有多种选择。

9.1一般有限状态机的设计

用VHDL设计的状态机的一般结构由以下4部分组成:

Ø说明部分

Ø主控时序进程

Ø主控组合进程

Ø辅助进程。

1.说明部分

说明部分是用来完成描述各状态数据对象的数据类型,一般定义为枚举类型,且放在ARCHITECTURE和BEGIN之间。

ARCHITECTURE……IS

TYPEstatesIS(st0,st1,st2,st3,st4);

SIGNALcurrent_state,next_state:

states;

……..

BEGIB

……….

如:

 

ARCHITECTURE……IS

TYPEweekIS(sun,mon,tue,wed,thu,fri,sat);

SIGNALcurrent_day,next_day:

week;

……..

BEGIB

……….

 

枚举类型文字元素的编码通常是在综合时自动设置的,一般将第一个枚举元素(最左边)编码为‘000’等。

2.主控时序进程

主控时序进程是指负责状态转换的进程,其作用就是在时钟的作用下将“现态”转换为“次态”的操作,一般不负责次态方案的选择。

3.主控组合进程

主控组合进程是指选择次态的进程,其作用是根据当前状态和外部信号(指令)等决定次态的取向,并将此次态传递给主控时序进程和输出控制信号。

4.辅助进程

辅助进程是配合状态机工作的组合或时序进程。

状态机状态图

 

有限状态机工作原理框图

 

状态机工作时序图(moore状态机)

 

9.2Moore型有限状态机的设计

Moore形有限状态机是同步状态机,其输出只是当前状态的函数(依赖于时钟)。

9.2.1AD574采样控制器设计(三进程有限状态机)

设计方法:

1.分析工作逻辑与时序

2.画出逻辑状态图

3.画出逻辑结构图

4.编写程序代码

AD574逻辑控制真值表

 

 

 

 

 

 

以上的COM1和COM2可以合并成一个进程。

 

9.2.1单进程Moore型有限状态机

为了克服纯组合进程输出的控制信号产生毛刺现象,可以采用混合进程方式,即组合进程和时序进程在同一个进程中。

单进程Moore型有限状态机克服毛刺的方法是采用同步锁存输出方案,即由锁存器在时钟控制下同步输出,从而避免竞争冒险现象。

缺点是输出时间比多进程方式晚一个时钟周期。

例:

 

 

由于CASE语句是在每次时钟上升沿处启动的,因此其对应的赋值语句(Q

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1