组合逻辑电路设计设计05(第五章Bvhdl基本语素、语法、语句)_第1页
组合逻辑电路设计设计05(第五章Bvhdl基本语素、语法、语句)_第2页
组合逻辑电路设计设计05(第五章Bvhdl基本语素、语法、语句)_第3页
组合逻辑电路设计设计05(第五章Bvhdl基本语素、语法、语句)_第4页
组合逻辑电路设计设计05(第五章Bvhdl基本语素、语法、语句)_第5页
已阅读5页,还剩100页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数字电路与逻辑设计一、基于VHDL的组合逻辑分析数字电路与逻辑设计5-3-3基于VHDL的组合逻辑设计libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entity

sswr

isport(d:instd_logic_vector(3downto0);y:outstd_logic);end

sswr;实例1某数字电路的VHDL程序代码如下,请分析其逻辑功能architecture

behave

ofsswrisbeginy<='0'whend>=0andd<5else'1'whend>=5andd<10else'Z';end

behave;LIBRARYieee;USEieee.std_logic_1164.all;ENTITYencoderISPORT(i:IN

BIT_VECTOR(7DOWNTO0);y:OUT

BIT_VECTOR(2DOWNTO0));

ENDencoder;ARCHITECTURErtlOFencoderISBEGINy<="000"wheni(0)='0'

else"001"wheni(1)='0'

else"010"wheni(2)='0'

else"011"wheni(3)='0'

else"100"wheni(4)='0'

else"101"wheni(5)='0'

else"110"wheni(6)='0'

else"111"wheni(7)='0'

else"000";ENDrtl;二、VHDL硬件描述语言基础数字电路与逻辑设计5-3-3基于VHDL的组合逻辑设计一、VHDL概述

VHDL是超高速集成电路硬件描述语言

(VeryHighspeedIntegratedCircuitHardwareDescriptionLanguage)的英文缩写。

语法和风格:(1)类似与现代高级编程语言,如C语言。(2)VHDL描述的是硬件,它包含许多硬件特有的结构。硬件描述语言HDL:美国Iverson,1962VHDL硬件描述语言:20世纪80年代初,

美国国防部VHSIC计划目的:方便电子设计文档的交流和成果的再利用一、VHDL概述*VHDL发展历史1983年提出了硬件描述语言的标准化问题。

1985年,第1版VHDL完成;

1987年,国际电气与电子工程师协会(IEEE)将VHDL语言作为硬件描述语言的工业标准(IEEE1076);

1988年,美国国防部规定所有官方的ASIC设计都必须以VHDL作为设计描述语言,此后VHDL逐渐成为工业界标准。

1993年,IEEE在87版本的基础上进行了若干修订,增修为IEEE1164标准;

1999年,IEEE又将数字模拟混合VHDL的版本作为工业标准,即IEEE1076.3;一、VHDL概述*VHDL与电路图设计电路的方式不同:和电路图设计方式相比:(1)易于修改;(2)设计能力更强;(3)VHDL语言很方便:独立于器件设计;相同的程序代码可以用于不同厂家生产的器件。一、VHDL概述VHDL硬件描述语言VHDL概述VHDL数据类型与数据对象VHDL命令语句VHDL语言的程序结构

LIBRARY(USE)-----库

PACKAGE--------------程序包集合

ENTITY-----------------实体

ARCHITECTURE-----结构体

CONFIGURATION----配置语句一、VHDL概述一、VHDL概述*include“stdio.h”;include“math.h”;intmain(void){inta,b,c;a=8;b=9;c=a+b;returnc;}Librarystd;Usestd.standard.all;Entityand2isPort(a,b:inbit;c:outbit);Endand2;Architecturea1ofand2isBeginc<=aandb;Enda1;VHDL程序C程序Library(库)是用于存放预先编译好的Package(程序包)。Package

(程序包)中定义了基本的常数、数据类型、元件及子程序等。

作用:声明在实体和结构体定义中将用到的数据类型、元件或子程序等。声明格式:

Library

库名;

Use

库名.PACKAGE名.All;一、VHDL概述(1)Library和Package部分libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;

作用:ENTITY(实体)用于定义电路的外部接口,即I/O端口的类型和数量。

定义格式:Entity

实体名

is

Port(a:

in

bit;

b:

in

bit;

c:

out

bit);End

实体名;(2)ENTITY定义区一、VHDL概述端口名数据类型端口模式端口模式(MODE)有以下几种类型:

IN;OUT;INOUT;BUFFER

端口模式可用下图说明:(黑框代表一个设计或模块)

INOUTBUFFERINOUT一、VHDL概述(3)ARCHITECTURE定义区实体的实现。即说明电路执行什么动作或实现功能。定义格式:

Architecture

结构体名of

实体名

is[声明语句;(内部信号、变量、常数,元件,子程序声明)]Begin并行描述语句;End

结构体名;一、VHDL概述(4)CONFIGURATION部分

一个完整VHDL电路设计必须有一个实体和对应的结构体,即实体和结构体对构成一个完整的VHDL设计。

一个实体可对应一个结构体或多个结构体,即一个实体可以有不同的描述方式。作用:当实体有多个结构体时,系统默认实体选用最后一个结构体,利用CONFIGURATION语句可以任意选择采用哪一个结构体。一、VHDL概述*定义格式:Configuration

配置名

of实体名

isfor

选用的结构体名endfor;endconfiguration

配置名;一、VHDL概述*

标识符的定义原则:标识符由字母、数字和下划线组成,如ak_47;关于字母:(1)第一个字符必须是字母,即a666;(2)标识符不区分大小写,ab与AB等效;(3)标识符不能和关键字(专用标识符)相同,如Entity,is等。关于下划线(1)不允许有两个连续的下划线,a__b错误;(2)末尾不能是下划线,mname_错误;一、VHDL概述

设计范例:2输入与门abc电路真值表abc000100010111一、VHDL概述*LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;Entityand2is

Port(a:inbit;b:inbit;c:out

bit);Endand2;--实体定义结束。

双减号--为VHDL程序的注释符,类似C语言中的//注释符。一、VHDL概述*ArchitectureNa

ofand2is

Beginc<=’0’whena=’0’andb=‘0’else’0’whena=’1’andb=‘0’else’0’whena=’0’andb=‘1’else‘1’;--符号<=为信号直接赋值符。

EndNa;--结构体NaArchitectureNbof

and2is

Beginc<=aandb;--and为逻辑与操作EndNb;

--结构体Nb一、VHDL概述*Configurations1

of

and2

isfornaendfor;endconfigurations1;--结构体配置结束。一、VHDL概述*二、VHDL数据类型与数据对象在VHDL程序中,我们经常会遇到这样的语句:Port(X:instd_logic);SignalA:std_logic;VariableB:std_logic_vector(7downto0);

ConstantC:integer;数据对象类型(专用标识符)数据类型(取值空间)(专用标识符)数据对象名称(自定义标识符)数据对象VHDL语言中的基本数据类型逻辑类型数值类型布尔代数(Boolean)位(Bit)标准逻辑(Std_Logic)整数(Integer)实数(Real)二、VHDL数据类型与数据对象

逻辑数据类型

(1)布尔代数(Boolean)型;

标识关键字:BOOLEAN,

取值空间:{FALSE,TRUE};(2)位(Bit);标识关键字:BIT

,取值空间:{‘0’,‘1’}

示例:Port(A:inbit);SignalB:bit;二、VHDL数据类型与数据对象标识关键字:Std_Logic;取值空间:{

‘X’,-----ForcingUnknown‘0’,-----Forcing0‘1’,-----Forcing1‘Z’,-----HignImpedance‘W’,-----WeakUnknown‘L’,-----Weak0‘H’,-----Weak1

‘U’,-----Undefined‘-’,------Don’tCare};二、VHDL数据类型与数据对象

标准逻辑类型(9值逻辑)对数字逻辑电路的逻辑特性描述更加完整,真实,因此在VHDL程序中,对逻辑信号的定义通常采用标准逻辑类型.(3)标准逻辑(Std_logic);

逻辑序列位序列(Bit_Vector)

标准逻辑序列(Std_Logic_Vector)二、VHDL数据类型与数据对象Port(A:inStd_Logic_Vector(7downto0));Port(B:inBit_Vector(0to3));SignalC:Std_Logic_Vector(3downto0);序列范围的声明方式:To,Downto

序列的声明二、VHDL数据类型与数据对象多位宽度的逻辑变量(如二进制数)用序列表示。逻辑变量的最高位与声明时的最左序号对应,以此类推。

序列的分解与合成Port(A:IN

Std_Logic_Vector(3downto0);B:IN

Std_Logic_Vector(1downto0));Signal

C:Std_Logic_Vector(0to1);Signal

D:Std_Logic_Vector(0to3);将A逻辑变量的中间两路信号与C相连将A的最高一路、B的全部位和常量’1’与D相连二、VHDL数据类型与数据对象序列赋值原则:左右宽度相等。

数值类型(1)整数

标识关键字:Integer,

取值空间:{-231~231-1}示例Port(A:inInteger);Port(C:inInteger

Range0to7);(限定整数取值范围的方法:Range…to…)SignalB:Integer;二、VHDL数据类型与数据对象(2)无符号数标识关键字:Unsigned,取值空间:{0~2n-1}与标准逻辑序列相似,声明时必须指明其位数。Port

(A:in

Unsigned(

7

downto

0));Signal

B:Unsigned(

3

downto

0);注意:unsigned位数声明,只能使用downto。Port

(A:in

unsigned(0

to

7));×二、VHDL数据类型与数据对象(2)实数标志关键字:Real;取值空间:{-1.7E38to1.7E38};

实数类型的表示可用科学计数形式或者带小数点的形式。二、VHDL数据类型与数据对象*VHDL中的运算符二、VHDL数据类型与数据对象

算术运算符:

+ 加

- 减

* 乘

/ 除

** 乘方

mod 求模

rem 求余

abs 求绝对值

逻辑运算:

and

逻辑与

or

逻辑或

nand

与非

nor

或非

xor

异或

xnor 同或

not

逻辑非关系运算符:

= 等于

/= 不等于

< 小于

<= 小于或等于

> 大于

>= 大于或等于注:其中‘<=’操作符也用于表示信号的赋值操作。

&

连接符,将两个数据对象或矢量连接成维数更大的矢量,它可给代码书写带来方便。例如:

vabc=a&b&c;如果a=‘1’

,b=‘0’

,c=‘1’

,则

vabc=“101”

。二、VHDL数据类型与数据对象

用户自定义数据类型:(1)列举数据类型Type列举名称is(元素1,元素2,…)例子:Typestateis(S0,S1,S2,S3);SignalS:state;二、VHDL数据类型与数据对象*(2)数组类型

Type数组名称isArrary(范围)of数据类型;例子:

TypeByteisArrary(7downto0)ofBit;Signalsdo:Byte;二、VHDL数据类型与数据对象*

数据类型的转换

在VHDL语言里,不同类型的数据信号之间不能互相赋值。当需要不同类型数据之间传递信息时,就需要类型转换函数将其中的一种类型数据转换为另一中数据类型后,再进行信号的传递。二、VHDL数据类型与数据对象*例如:SignalY:Std_logic_vector(7downto0);SignalX:Integerrange0to255;Y<=CONV_STD_LOGIC_VECTOR(X,8);二、VHDL数据类型与数据对象*CONV_INTEGER

将数据类型UNSIGNED,SIGNED转换为INTEGER类型.CONV_UNSIGNED

将数据类型INTEGER,SIGNED转换为UNSIGNED类型.CONV_SIGNED

将数据类型INTEGER,UNSIGNED转换为SIGNED类型. CONV_STD_LOGIC_VECTOR

将数据类型INTEGER,UNSIGNED,SIGNED,STD_LOGIC转换为STD_LOGIC_VECTOR类型.

二、VHDL数据类型与数据对象*

数据对象常量(Constant)信号(Signal)变量(Variable)(DataObjects)二、VHDL数据类型与数据对象

数据对象常量(Constant)信号(Signal)变量(Variable)(DataObjects)二、VHDL数据类型与数据对象(1)常量(constant)

定义格式:Constant常量名称:数据类型:=给定值;常量通常来来定义延迟和功耗等参数。

注意!常数定义的同时进行赋初值。

常数在程序包说明、实体说明、结构体描述、过程说明、函数调用中使用。二、VHDL数据类型与数据对象*libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;--必需定义+entityexam1is

port(ip:instd_logic_vector(3downto0);op:outstd_logic_vector(3downto0));endexam1;architecturem1ofexam1isconstantnum:integer:=6;beginop<=ip+num;endm1;二、VHDL数据类型与数据对象*(2)信号定义格式I.(端口)信号Port(端口信号名称:数据类型);例如:Port(A:instd_logic);II.内部信号Signal信号名称:数据类型[:=初始值];例如:SignalB:std_logic;二、VHDL数据类型与数据对象“信号”数据对象的物理意义信号代表电路元件的端口和内部的物理连线,因此信号的赋值有一定的延迟时间.端口信号代表电路的输入/输出(在实体中说明);内部信号代表电路中间信号或中间连接线路,其在元件之间起互连作用(在结构体中说明和使用)。信号赋值的语法格式为:

信号名<=表达式;

例如:

SignalS1:Std_logic_vector(3Downto0);S1<=“0000”;(3)变量定义格式Variable变量名称:数据类型[:=初始值];

变量只能用于进程之中,变量的赋值是立即生效的,常用于高层次抽象的算法描述当中。二、VHDL数据类型与数据对象*“变量”数据对象,它用于对中间数据的临时存储,并不一定代表电路的某一组件。注意!变量定义的时候尽管可以直接赋初值,但系统往往忽略。建议变量对象定义后再进行赋值。变量为局部量。仅限于进程(Process)或子程序中使用。变量赋值的语法格式为:目标信号值:=表达式;如:VariableS1:Std_logic_vector(3Downto0);S1:=“0000”;二、VHDL数据类型与数据对象*信号和变量的比较*

(1)信号和变量的对应关系不同:信号代表电路内部信号或连接线路;而变量则不是。

(2)信号和变量声明的位置不同:信号声明在子程序、进程的外部;而变量声明在子程序、进程的内部。

(3)信号为全局量,而变量只在定义它的域中才可见。因此,变量不能在两个进程之间传递信息。

(4)在一个进程中多次为一个信号赋值时,只有最后一个值会起作用;而变量则不同,每次赋值都会改变它的值。(5)赋值不同。在进程中,信号赋值只有在进程结束时起作用,而变量赋值是立即进行的。而且赋值符号不同:信号赋值为“<=”,变量赋值为“:=”。数据对象属性*(1)数值类属性:(数组类型的数据对象)数值类属性有

'left,'right,'low,'high,'length。其中用符号‘隔开对象名及其属性。

left表示数组的左边界;

right表示数组的右边界;

low表示数组的下边界;

high表示数组的上边界;

length表示数组的长度。如:SignalA:std_logic_vector(7downto0);SignalB:std_logic_vector(0to3);则这两个信号的属性值分别为:

A’left=7;A’right=0;A’low=0;A’high=7;A’length=8;B’left=0;B’right=3;B’low=0;B’high=3;B’length=4;数据对象属性*(2)'event属性:

'event属性,它的值为布尔型,如果刚好有事件发生在该属性所附着的信号上(即信号有变化),则其取值为True,否则为False。

利用此属性可决定时钟信号的变化情况,即时钟是否发生。

数据对象属性*例如:时钟边沿表示:

signalclk:instd_logic;

则clk’eventandclk=’1’表示时钟的上升沿。即时钟变化了,且其值为1。

clk’eventandclk=’0’表示时钟的下降沿。即时钟变化了,且其值为0。此外,还可利用两个函数来表示时钟的边沿。 rising_edge(clk)

表示时钟的上升沿

falling_edge(clk)

表示时钟的下降沿数据对象属性*libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;ENTITYMISIS PORT(op1,op2:INUNSIGNED(3downto0); c0:INSTD_LOGIC; result:OUTUNSIGNED(3downto0); c5:OUTSTD_LOGIC);ENDMIS;实例2某数字电路的VHDL程序代码如下,试分析其逻辑功能ARCHITECTURE

OP

OFMISISsignalsum5,op1_5,op2_5,op_cin_5:unsigned(4downto0);BEGIN op1_5<='0'&op1; op2_5<='0'&op2; op_cin_5<="0000"&c0; sum5<=op1_5+op2_5+op_cin_5; result<=sum5(3downto0); c5<=sum5(4);END

OP;例3:四位二进制数转换为BCD码。三、VHDL命令语句并列语句顺序语句VHDL命令语句并列语句*

并列语句一般处于进程(PROCESS)的外部。所有并列语句都是并行执行的,即与它们出现的先后次序无关。

并列语句有三个特点:a.所有语句的执行是并行的;b.每条语句的执行和其所在的位置无关;c.并列语句的输出仅仅依赖于输入,没有其它的限制条件。

并列语句(1)直接赋值语句:<=赋值运算符(2)条件赋值语句:When-Else(3)选择赋值语句:With-Select-When(4)Process(进程)语句(5)Block(块)语句(6)函数调用语句(7)Component(元件)例化语句(8)For-Generate语句(1)直接赋值语句直接赋值语句的格式:Signal_name<=expression;示例:SignalA,B:std_logic_vector(7downto0);A<="00000000";B<="10000000"; op_cin_5<="0000"&c0; sum5<=op1_5+op2_5+op_cin_5; c5<=sum5(4);(1)直接赋值语句*直接赋值语句的格式:

Signal_name<=expression;如:SignalA,B:std_logic_vector(7downto0);A<="00000000";B<="10000000";我们也可以这样赋值:A<=(others=>’0’);

结果信号A的每一位的值都为0。B<=(‘1’,others=>’0’);信号对象的位数很多时,采用others来赋值很方便。(2)When-Else条件赋值语句例如:f<=‘1’when(x1=x2)

else‘0’whenx1<x2else‘Z’;通用语法格式:Signal_name<=

expression1When

logic_expression1

Elseexpression2When

logic_expression2

Elseexpression3;Entityand2isPort(a:inbit;b:inbit;c:outbit);Endand2;ArchitectureNaofand2isBeginc<=‘0’whena=‘0’andb=‘0’else‘0’whena=‘1’andb=‘0’else‘0’whena=‘0’andb=‘1’else‘1’;EndNa;Entity

example

isPort(x,y:instd_logic;z:outstd_logic_vector(1downto0));End

example;ArchitectureaofexampleISsignal

tmp:std_logic_vector(1downto0);Begintmp<=x&y;With

tmpSelectz<=‘1’

when

“01”,'1'when"10",'0'whenothers;Enda;With-Select-When选择式赋值(3)With-Select-When选择式赋值选择赋值语句通用格式:With

expression

SelectSignal_name<=expression1When

constant_value1,

expression2When

constant_value2,

expression3When

constant_value3;libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityFBIisport(a,b,ci:instd_logic;y,cout:outstd_logic);endFBI;实例3试用VHDL语言设计1位全加器architecturebh2ofFBIisbeginy<=axorbxorci;cout<=(aandb)or(aandci)or(bandci);endbh2;architecturebh1offull_bit_adderisbeginy<=((nota)and(notb)andci)or((nota)and(b)and(notci))or((a)and(notb)and(notci))or((a)and(b)and(ci));cout<=(bandci)or(aandci)or(aandb);endbh1;一、基于VHDL的组合逻辑分析二、VHDL基本语素及语法三、基于VHDL的组合逻辑设计数字电路与逻辑设计5-3基于VHDL的组合逻辑分析与设计一、常用组合逻辑电路分析题目1某数字电路libraryieee;useieee.std_logic_1164.all;entitytrioutisport(A:in

std_logic_vector(7downto0);en:in

std_logic;B:out

std_logic_vector(7downto0));endtriout;architecturebehaveoftrioutisbegin

B<=Awhenen='1'else

"ZZZZZZZZ";

endbehave;

--注意多位时用双引号;三态输出电路(多位宽度)

A7-A0ENB7-B0EN=1B=A;EN=0B=高阻态88一、常用组合逻辑电路分析题目2某数字电路libraryieee;useieee.std_logic_1164.all;entitymux81isPort(D:in

std_logic_vector(0to7);sel:in

std_logic_vector(2downto0);Y:out

std_logic);endmux81;architecture

archmux

ofmux41is

begin

with

sel

select

Y<=D(0)when"000",D(1)when"001",D(2)when"010",D(3)when"011",D(4)when"100",D(5)when"101",D(6)when"110",D(7)whenothers;end

archmux;

(2)数据选择器MUX8选1(单刀八掷)????一、常用组合逻辑电路分析题目3某数字电路Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;ENTITYcmpabIS

PORT

(A,B:in

std_logic_vector(7downto0); AGTB,ALTB,AEQB:out

std_logic); ENDcmpab;ARCHITECTUREaOFcmpabISBEGIN

aeqb<='1'when

a=belse'0';agtb<='1'whena>belse'0';altb<='1'whena<belse'0';ENDa;(3)比较器AGTBALTBAEQBABA和B都是8位二进制数,用三个输出表示A、B的大小关系。如果A>B,输出为:agtb=‘1’,altb=‘0’,aeqb=‘0’;如果A<B,输出为:agtb=‘0’,altb=‘1’,aeqb=‘0’;如果A=B,输出为:agtb=‘0’,altb=‘0’,aeqb=‘1’。一、常用组合逻辑电路分析题目4某数字电路LIBRARYieee;USEieee.std_logic_1164.all;ENTITYencoderISPORT(i:IN

BIT_VECTOR(7DOWNTO0);y:OUT

BIT_VECTOR(2DOWNTO0));

ENDencoder;ARCHITECTURErtlOFencoderISBEGINy<="000"wheni(0)='0'

else"001"wheni(1)='0'

else"010"wheni(2)='0'

else"011"wheni(3)='0'

else"100"wheni(4)='0'

else"101"wheni(5)='0'

else"110"wheni(6)='0'

else"111"wheni(7)='0'

else"000";ENDrtl;(4)编码器(B优先8-3编码器)I6I7I5I4I3I2I1I0Y2Y1Y08-3编码器I7I6I5I4I3I2I1I0Y2Y1Y0xxxxxxx0000xxxxxx01001xxxxx011010xxxx0111011xxx01111100xx011111101x0111111110

01111111111一、常用组合逻辑电路分析题目5某数字电路LIBRARYieee;USEieee.std_logic_1164.all;ENTITYdecode_3to8ISPORT(a,b,c,G1,G2A,G2B:INSTD_LOGIC;Y:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDdecode_3to8;ARCHITECTURErtlOFdecode_3to8ISSIGNALindata:STD_LOGIC_VECTOR(5DOWNTO0);BEGINindata<=G1&G2A&G2B&c&b&a;y<="11111110"whenindata="100000"else"11111101"whenindata="100001"else"11111011"whenindata="100010"else"11110111"whenindata="100011"else"11101111"whenindata="100100"else"11011111"whenindata="100101"else"10111111"whenindata="100110"else"01111111"whenindata="100111"else"11111111";ENDrtl;(5)译码器A.3-8译码器顺序语句

(1)顺序语句每一条语句的执行都是顺序进行的。如同高级编程语言中的命令执行方式,一次一条命令,按书写顺序由上而下执行。(2)顺序语句只能出现在进程和子程序内部。(3)由于顺序语句的次序很重要,因此,顺序语句要与并行语句分割开,这可以通过Process语句来实现。Process语句出现在结构体中,它将其内部的语句进行封装。顺序语句有三个特点:

a.所有语句的执行是顺序进行的;

b.每条语句的执行和其所在的位置有关;

c.顺序语句的输出不仅依赖于输入,而且还受位置的影响。顺序语句(1)Process语句(2)If-Else语句(3)Case-When语句(4)Null语句

(5)For-Loop语句(6)Waituntil语句(7)变量赋值语句

(8)Procedure(过程)调用语句

并列语句语句的顺序不影响代码的含义。例如:When…else;With—Select;顺序语句语句的顺序可能影响代码的含义。例如:if—else;case语句;因此,为了在代码段中区分顺序语句,VHDL规定顺序语句一定要放在Process语句内部;进程语句ProcessProcess语句格式[Process-label:]Process[(Sensitivitylist)][Variabledeclarations]--变量声明Begin[ifstatements][casestatements][Procedure调用语句][waituntilstatement][variableassignmentstatements]EndProcess;entityabcisport(w0,w1,s:instd_logic;f:outstd_logic);endabc;architecturebhofabcisbeginproc1:process(w0,w1,s)

beginf<=w0;--语句Aifs='1'thenf<=w1;endif;--语句B

endprocess;endbh;(1)一个结构体当中可以有多个Process语句,

不同Process语句是同时起作用的并列语句。(2)Process内的语句却是按顺序“执行”(被编译器解释)的顺序语句。(3)多进程之间的信息通过信号对象来传递。进程语句Process特点进程语句Process的语义敏感表每当任何信号的取值发生变化时,进程就会有效。只要进程有效:进程中的语句就会顺序执行。在进程内部所有语句执行完毕之前,进程内部的信号赋值对于进程外部都不可见。如果对相同信号进行了多次赋值,那么只有最后一次赋值在进程外部可见。

敏感表(Sensitivitylist)包括进程的一些信号,当敏感表中的某个信号变化时进程才被激活,进程内的顺序语句被执行。当进程结束时,进程内的输出信号值被更新,进程进入等待(睡眠)状态,直到敏感表中的某一信号发生变化,进程被再次激活。进程语句Process的语义Process模型-基本形式Process()begin If-elseEndprocess;Process()begin Case-whenEndprocess;条件语句IF-ELSEIfexpression1Thenstatement1;[statement;]Elsestatement2;[statement;]Endif;

If-else语句选择分支语句:从多个条件中选择一个满足条件的子句执行;如果条件都不满足则无操作;条件的排列方式有两种基本形式:1.并列;2.嵌套(分层);每个if-else语句都有明确的语句控制域:控制域以“if”开始,以“endif”结束。If…else语句块—常用样式If……then

子句1Endif;

If……then

子句1else

子句2End

if;If……then

子句1elsif…..then

子句2elsif…..then

子句3Endif;If……then

子句1elsif…..then

子句2elsif…..then

子句3else

子句4

Endif;①②③④嵌套if-else

if(clk'eventandclk='1')then

if(up_down=‘0’)then

if(q<9)then q<=q+1;

elseq<="0000";

endif;

elsif(up_down='1‘)then__________

endif;endif;ARCHITECTUREbehaviorOFmux4ISBEGIN process(i0,i1,i2,i3,sel) begin if(sel="00")then q<=i0; elsif(sel="01")then q<=i1; elsif(sel="10")then q<=i2; elsif(sel="11")then q<=i3; else q<='X'; endif; endprocess;ENDbehavior;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(i0,i1,i2,i3:INSTD_LOGIC;sel:INSTD_LOGIC_vector(1downto0);

q:OUTSTD_LOGIC);

ENDmux4;Case-when语句Case选择信号

iswhen值1=>

子句1;when值2=>

子句2;whenothers=>

子句3;Endcase;选择分支语句:根据选择信号的值从多个子句中选择一个子句执行;ARCHITECTUREbehaviorOFmux4ISBEGIN process(i0,i1,i2,i3,sel) begin caseselis when"00"=> q<=i0; when"01"=> q<=i1; when"10"=> q<=i2; when"11"=> q<=i3; whenothers=> q<='X'; endcase; endprocess;ENDbehavior;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(i0,i1,i2,i3:INSTD_LOGIC;sel:INSTD_LOGIC_vector(1downto0);

q:OUTSTD_LOGIC);

ENDmux4;变量赋值语句由于变量赋值是立即起作用的,所以在进程中变量赋值是顺序语句。例如:Process variablea,b:integer;begina:=30;b:=40;a:=b;b:=a;endprocess;由于变量的赋值是顺序进行的,所以运行结果是a=b=40。

数字逻辑电路—VHDL代码—CPLD/FPGA数字逻辑电路的表示方法逻辑表达式逻辑图真值表波形图HDL卡诺图VHDL代码QuartusII编译、综合CPLD/FPGAQuartusII集成开发环境—软件模块设计输入编辑器仿真器HDL综合器适配器(或布局布线器)下载器编译器PLD开发流程110原理图/VHDL文本编辑综合FPGA/CPLD适配FPGA/CPLD编程下载FPGA/CPLD器件和电路系统时序与功能门级仿真1、功能仿真2、时序仿真逻辑综合器结构综合器编译器VHDL的电路建模电路的输入、输出变量=>端口信号;电路的内部电路节点=>内部信号;逻辑关系=>代码的含义;代码的两种模型并列模型进程模型组合电路组合电路时序电路直接赋值语句,when-else,with-select直接赋值语句,if-else,case-when二、常用时序逻辑电路设计(1)触发器设计(D、JK)(2)计数器设计(分频器)(3)移位寄存器设计(4)状态机设计:序列信号发生器及检测器

状态机示例—序列信号发生器序列信号:110序列发生器CLKZARCHITECTUREaOFmealyISTYPESTATE_TYPEIS(s0,s1,s2);SIGNALstate:STATE_TYPE;BEGIN

PROCESS(clk) BEGIN

If

(clk’EVENTANDclk=‘1’)thenCASEstateIS

WHENs0=>z<=‘1’;state<=s1;WHENs1=>

z<=‘1’;state<=s2;

WHENs2=>

z<=‘0’state<=s0;

WHENothers=> state<=s0; ENDCASE;Endif;

ENDPROCESS;ENDa;

(5)状态机设计

我们可以用输入信号X和电路状态Q来描述时序电路的逻辑功能,这时时序电路称为

状态机(StateMachine)。根据输出信号和输入信号以及电路状态的关系,状态机可以分为两种:穆尔(Moore)型和米利(Mealy)型。Y=F[X,Q]

Y=F[Q]

米利(Mealy)型:穆尔(Moore)型:状态机示例—序列信号检测器序列信号:110序列检测器CLKZxS0S20/01/0S11/00/10/01/0Mealy型序列信号检测器—状态图序列信号:110Sx/Z‘1’‘11’S0/0S2/001S1/0101Moore型序列信号检测器—状态图序列信号:110S/Zx‘1’‘11’S3/1‘110’001LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYsqsISPORT(x,clk:inStd_logic;z:outStd_logic);ENDsqs;Mealy型-VHDL代码转换ARCHITECTUREaOFmealyISTYPESTATE_TYPEIS(s0,s1,s2);SIGNALstate:STATE_TYPE;BEGIN

Mealy型-VHDL代码转换PROCESS(clk) BEGIN

If

(clk’EVENTANDclk=‘1’)thenCASEstateIS

WHENs0=>IFdin=‘1’

THENstate<=s1;

elsestate<=s0; ENDIF;

WHENs1=>IFdin=‘1'THENstate<=s2;

elsestate<=s0; ENDIF;

WHENs2=>IFdin='0'THENstate<=s0;

elsestate<=s2; ENDIF;

WHENothers=> state<=s0; ENDCASE;Endif;

ENDPROCESS;z<='1'when(state=s2anddin=’0’)else'0';

--输出不仅与状态有关,而且和输入有关。ENDa;

Mealy型-VHDL代码转换I.Mealy型Mealy型-VHDL代码转换标准形式P0:PROCESS(clk)BEGIN

IFclk'eventandclk='1'THENcurrent_state<=excitation;

ENDIF;ENDPROCESSp0;P1:PROCESS(current_state,in1)BEGINCASEcurrent_stateISWHENs0=>IFin1='1'THENexcitation<=s1;ENDIF;WHENs1=>IFin1='0'THENexcitation<=s2;ENDIF;WHENs2=>IFin1='1'THENexcitation<=s3;ENDIF;WHENs3=>IFin1='0'THENexcitation<=s0;ENDIF;ENDCASE;END

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论