工学VHDL程序设计语言_第1页
工学VHDL程序设计语言_第2页
工学VHDL程序设计语言_第3页
工学VHDL程序设计语言_第4页
工学VHDL程序设计语言_第5页
已阅读5页,还剩195页未读 继续免费阅读

下载本文档

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

文档简介

工学VHDL程序设计语言第1页/共200页引例:VHDL原理:第2页/共200页

VHDL语言非常高速硬件描述语言,也就是一种硬件(数字电路)设计语言.其最大特点是对电路的行为与结构进行高度抽象化规范化,并对设计进行模拟验证与综合优化,使分析和设计高度自动化。

支持VHDL语言的软件平台Max+PlusII

由软件设计到硬件实现之间的媒介CPLD/FPGA(可编程器件)第3页/共200页在Max+PlusII编写VHDL程序存盘(文件名为实体名,后缀为.VHD)编译

软件仿真管脚安排下载

由软件设计到硬件实现的流程第4页/共200页

基本顺序语句(1)Process语句(2)If-Else语句(3)Case-When语句(4)Null语句(5)Waituntil语句(6)变量赋值语句(7)For-Loop语句(8)过程调用语句

基本的并行语句(1)直接赋值语句(2)Process语句(3)When-Else(4)With-Select-When(5)元件例化语句(6)For-Generate第5页/共200页常用数字电路回顾(1)编码器

输入信号输出信号使能端口第6页/共200页注:EN为1时编码器工作第7页/共200页举例参看EWB辅助电路第8页/共200页(2)译码器××

1111

译码器第9页/共200页VHDL与数字电路设计

VHDL简介

一、由来

VHDL是VeryHighspeedIntegratedCircuitHardwareDescriptionLanguage(非常高速集成电路硬件描述语言)的英文缩写。它是由美国国防部支持的一项研究计划,于1983年创建,目的是以文字化方法描述电子电路与系统。至今VHDL约有40年的发展历史,1987年,VHDL成为IEEE标准,即IEEE1076标准,1993年修改为IEEE1164标准,1996年,IEEE又将电路合成的标准程序与规格加入到VHDL语言中,称为1076.3标准。之后,又有1076.4标准和1076.6标准。第10页/共200页第一章

VHDL的程序结构和软件操作1-1VHDL程序的基本结构

1-2软件操作—Max+plusⅡ的操作

第11页/共200页第一章

VHDL的程序结构和软件操作1-1VHDL程序的基本结构

(1)LIBRARY和PACHAGE的声明部分

作用:库(Library)是用于存放预先编译好的程序包(Package),程序包中定义了数据集合体、逻辑操作和元件等。主要是声明在设计或实体中将用到的常数,数据类型,元件及子程序等。使用格式:LIBRARY库名;

USE库名.程序包名.All;

第12页/共200页(2)ENTITY定义

作用:定义本设计的输入/出端口,即定义电路的外观,即I/O接口的类型和数量使用格式:

端口名

:端口模式

数据类型;);ENTITY

实体名

IsEnd

实体名;

格式:Port(端口名

:端口模式数据类型;第13页/共200页(3)ARCHITECTURE定义作用:定义实体的实现。即电路的具体描述,说明电路执行什么动作或实现功能。

ARCHITECTURE

结构体名

Of实体名

IsBegin

描述语句;

End

结构体名;使用格式:第14页/共200页在Max+plusⅡ系统中有4个库能支持VHDL语言,它们分别是Std库、IEEE库、Altera库和Lpm库。Std库和IEEE库提供基本的逻辑运算函数及数据类型转换函数等。IEEE库中的程序包std_logic_1164定义了std_logic和std_logic_vector等数据类型。第15页/共200页举例:设计一个与门电路逻辑符号真值表第16页/共200页LibraryIEEE;Usestd.standard.all;Entityand2isPort(A:

inbit;

B:

inbit;

Y:outbit);Endand2;

--首先定义输入输出端口名字,模式(Mode),信号类型--注意最后语句的分号在括号外实体定义:第17页/共200页ArchitectureNaofand2isBeginY<=’0’whena=’0’andB=‘0’else’0’whenA=’1’andB=‘0’else’0’whenA=’0’andB=‘1’else‘1’;EndNa结构体定义:端口模式有以下几种类型:IN;OUT;INOUT;BUFFER。第18页/共200页ArchitectureNbofand2isBeginc<=’1’whena=’1’andb=‘1’else

‘0’;EndNb;以上结构体表达何种电路?一个实体可以有几个结构体,即结构体的定义可以有不同的形式结论:第19页/共200页1-2软件操作—Max+plusⅡ的操作

1-2-1建立和编写一个VHDL语言的工程文件1-2-2VHDL程序的编译

1-2-3VHDL语言程序的仿真

1-2-4芯片的时序分析1-2-5安排芯片脚位

第20页/共200页1-2软件操作—Max+plusⅡ的操作

1.Max+plusⅡ开发工具是美国Altera公司自行设计的一种软件工具,其全称为MultipleArrayMatrixandProgrammableLogicUserSystem。它具有原理图输入和文本输入(采用硬件描述语言)两种输入手段,利用该工具所配备的编辑、编译、仿真、综合、芯片编程等功能,将设计电路图或电路描述程序变成基本的逻辑单元写入到可编程的芯片中(如FPGA芯片),作成ASIC芯片。它是EDA设计中不可缺少的一种工具。2.软件安装第21页/共200页我们通过范例介绍:利用Max+plusⅡ系统(1)如何编写VHDL程序(使用TextEditor);(2)如何编译VHDL程序(使用Compiler);

(3)如何仿真验证VHDL程序(使用WaveformEditor,Simulator);

(4)如何进行芯片的时序分析(使用TimingAnalyzer);

(5)如何安排芯片脚位(使用FloorplanEditor);(6)如何下载程序至芯片(使用Programmer)。

第22页/共200页1-2-1建立和编写一个VHDL语言的工程文件

首先启动Max+plusⅡ系统,启动后系统进入主菜单画面,在主菜单上有5个选项,分别是:Max+plusⅡ、File、Assign、Options和Help。(1)打开文本编辑器;用鼠标点击File选项,点击子菜单中的

New选项,接着屏幕会出现New的对话框。在对话框内有4

种编辑方式:图形编辑、符号编辑、文本编辑和波形编辑。

VHDL文件属于文本,那么应该选择文本编辑方式,点击

OK按钮,屏幕上将出现一个无名的编辑窗口,则系统进入

文本编辑状态。第23页/共200页(2)在编辑窗口中进行编辑输入,输入相应的描述语句。

(3)存盘。(a我们编辑的VHDL文件扩展名为vhd;b保存的文

件名必须和所定义的实体名相同。c文件存盘的目录不应是

根目录或桌面,建议存放在Max2work或Maxplus2目录,或

其子目录。)以与门的设计为例讲述具体过程

第24页/共200页1-2-2VHDL程序的编译

(1)若文件没有打开,需首先打开要编译的VHDL文件;

(2)将目前的文件设置成工程文件;点击File选项,光标移到子菜单的

Project项停留几秒钟,屏幕上会出现下一级菜单,点击SetProjecttoCurrentFile(3)打开编译器;点击主菜单MAX+plusⅡ/Compiler选项,屏幕上就出现编译

对话框。(4)开始编译;完成了上述编译前的准备及必要的设置工作,点击编译对话框

中的Start按钮,编译即开始。

以与门的设计为例讲述具体过程

第25页/共200页1-2-3VHDL语言程序的仿真

仿真是为了验证我们所编写的VHDL程序的功能是否正确。

(1)首先生成仿真波形文件

(a)打开波形编辑器;点击主菜单的MAX+plusⅡ/WaveformEditor选项,就可在屏幕上显示波形编辑器窗口。在未输入信号名以前,整个窗口是空白的。(b)确定仿真持续时间(File/EndTime)。

(c)选则输入输出端口名;

(d)编辑输入信号波形;

(e)信号波形编辑完成后,需存盘为仿真使用,文件名采取默认方式即可。

第26页/共200页(2)打开仿真器;点击主菜单MAX+plusⅡ\Simulator项,此时弹出Simulator

对话框。点击对话框的Start按钮,仿真即开始。在仿真结束后打开仿真波

形文件(点击右下角的OpenSCF按钮)即可以显示仿真结果。(以与门的设计为例讲述具体过程

)第27页/共200页1-2-4芯片的时序分析仿真结果从波形上来看,很难给出定量的信号延迟关系,这一点时序分析却能直观地用表来进行显示。(1)选择要下载的器件型号;

(2)需要再编译一次。

(点击主菜单的Assign/Device项得到Device对话框)(3)打开时序仿真器;

(点击TimingAnalyzer选项

)(4)最后点击Start按钮后,时序分析器开始启动。

(以与门的设计为例讲述具体过程

)第28页/共200页1-2-5安排芯片脚位

为了将程序下载到芯片,需安排芯片脚位。

(1)打开芯片脚位设置器;

(MAX+plusⅡ/FloorplanEditor)(2)将实体定义的端口名字和下载芯片的管脚进行具体对应;

(3)最后再进行一次编译。

教学演示片第29页/共200页第二章VHDL语言要素

§2.1VHDL语言规则数字型文字、字符串文字、标识符、下标名、段名第30页/共200页§2-2数据类型

数据类型分类:逻辑信号类型和数值信号类型。

§2-2-1逻辑数据类型

(1)布尔代数(Boolean)型

定义位置:在std库的standard程序包中进行定义。

信号形式:FALSE,TRUE

(2)位(Bit)

定义位置:在std库的standard程序包中进行定义。

信号形式:0,1

(低电位,高电位)第31页/共200页编码器:输入信号输出信号第32页/共200页第33页/共200页(3)位数组类型(Bit_Vector)

定义位置:在std库的standard程序包中进行定义。

例:SignalA:bit_vector(0to7);

SignalB:bit_vector(2downto0);

输入信号输出信号第34页/共200页(4)标准逻辑型(Std_Logic)

定义位置:在IEEE库的std_logic_1164程序包中进行定义

第35页/共200页可以看出,这个“标准逻辑”信号定义,比“位即bit”信号对于数字逻辑电路的逻辑特性描述更完整、更真实。所以在VHDL的程序里,对于逻辑信号的定义,通常都是采用这个“标准逻辑”信号形式。使用这类数据信号,必须包含下面两条声明语句:

LibraryIEEE;UseIEEE.std_logic_1164.all;

(5)标准逻辑数组类型(Std_Logic_vector)

定义位置:在ieee库的std_logic_1164程序包中进行定义。

Bit_Vector与Std_Logic_vector的区别在于数组的每一位前者为BIT型(0,1)后者为Std_Logic型第36页/共200页§2-2-2数值数据类型(1)整数(Integer)定义位置:在std库的standard程序包中进行定义。即数值范围为-231~231。(2)无符号(Unsigned)和有符号(Signed)类型定义位置:有符号(Signed)和无符号(Unsigned)逻辑信号定义在库IEEE的程序包std_logic_arith中。第37页/共200页有符号类型数据代表有符号数值,即可以是正数,0,负数;编译器将有符号数类型作为一个补码的二进制数,最左边的位为符号位。无符号类型数据代表无符号数值,即代表0或正数;最左边的位为最高位。如:Unsigned(“0110”)代表;+6+10Unsigned(“1010”)代表如:signed(“0110”)代表+6;signed(“1010”)代表-2。第38页/共200页libraryieee;useieee.std_logic_1164.all;

useieee.std_logic_arith.all;entity

data

isport(a,b:inunsigned(3downto0);--相应改为a,b:insigned(3downto0);c:outstd_logic);enddata;architecture

m1

ofdataisbeginc<='1'whena<belse'0';endm1;

useieee.std_logic_1164.all;???useieee.std_logic_arith.all;???列举a、b具体值???

第39页/共200页当定义成无符号数据类型时,若a<=”1000”,b=’0001’,即a=8,b=1则结果另外:还有其他positive,natural,real数据类型以及用户自定义数据类型等。这些数据类型各有特点,以后用到再行讲解c=’1’。c=’0’;当定义成有符号数据类型时,若a<=”1000”,b=’0001’,a=-8,b=1,则结果第40页/共200页§2.3VHDL数据对象数据对象(DataObjects):

凡是可以被赋予一个值的对象称为数据对象,数据对象用于传递信号。例:

数据对象名

数据对象类型

数据对象值的类型

第41页/共200页2-3-1信号信号数据对象,代表电路内部传输线路线路,其在元件之间起互连作用

信号数据对象的定义格式为:

Signal信号名:数据类型[:=设定值];

如:

Signal

A:Std_logic_vector(3Downto0):=“0000”;

注意:由于MaxplusII系统往往会忽略信号对象定义时所赋初始值,建议在结构体中用赋值语句完成对信号的赋值。信号赋值语句的语法格式为:

目标信号名<=表达式(设定值);A

<=

“1010”第42页/共200页2-3-2变量

它用于对中间数据的临时存储,并不一定代表电路的某一组件。

变量数据对象的定义格式为:Variable变量名:数据类型[:=设定值];

如:Variablea:integer:=0;变量赋值语句的语法格式为:目标变量名:=表达式(设定值);

注意:由于MAXPLUSII系统往往会忽略变量对象定义时所赋初始值,建议在结构体中用赋值语句完成对变量的赋值。如:a:=b+c;第43页/共200页常数的定义格式为:Constant常数名:数据类型

:=表达式;

如:ConstantD1:Integer:=3;

ConstantD2:Std_Logic_Vector(D1Downto0):=”0000”;注意:常数数据对象定义的同时进行赋值。赋值符号为

“:=”

2-3-3常数第44页/共200页2-3-4信号、变量、常数对比一、定义SignalA:std_logic;VariableA:std_logic_vector(7downto0);ConstantA:integer:=6;二、赋值及赋值时刻A

<=

“1010”;(延时)A:=“1010”;(立刻)三、定义区域信号:实体、结构体、程序包变量:进程、子程序常数:实体、结构体、程序包、块、进程、子程序第45页/共200页四、适用范围信号:实体、结构体、程序包变量:定义了变量的进程、子程序的顺序语句中常数:视其定义的位置而定若常数定义在实体中,适用范围是实体所对应的有结构体。若常数定义在结构体中,适用范围就是本结构体。第46页/共200页执行结果为:

x<=cxorb,y<=cxorb

第47页/共200页执行结果为:

x<=cxora,y<=cxorb

第48页/共200页练习:1.定义信号A1,A2,A3,A4,A5,A6,A7,A8其中每一位信号均为标准逻辑型2.定义信号B,其数据类型为标准逻辑型。3.定义信号C,数据类型为整数型。4.给A、B赋值,其中A的值为11001101;B的值为0。第49页/共200页LibraryIEEEUseieee.std_logic_1164.allSignalA:std_logic_vector(1to8)SignalB:std_logicSignalC:integerLibraryStdUsestd.standard.allA<=“11001101”B<=‘0’第50页/共200页2.4VHDL操作符VHDL操作符:逻辑、算术、符号、关系操作符。2.4.1逻辑运算符一、分类及功能And(与),Or(或),Not(非),Nand(与非),Nor(或非),Xor(异或),Xnor(同或)。第51页/共200页二.用法1.操作数的数据类型必须符合操作符的要求能进行逻辑运算的数据类型:bit、bit_vector、booleanstd_logic、std_logic_vector例Signala,b,y:std_logic;Signalc,d,z:integer;y<=aandb;z<=candd;第52页/共200页2.表达式中有多个运算符时一般要加括号表达式中有多个运算符时一般要加括号,但and、or、xnor除外例Signala,b,c,d:std_logic_vector(3downto0);Signale,f,g,h:std_logic_vector(1downto0);d<=aandbandc;d<=aorborc;d<=axnorbxnorc;h<=enorfnorg;h<=(enorf)norg;3.运算符两侧的操作数要对称d<=(enorf)norg;×第53页/共200页LibraryIEEEUSEIEEE.STD_LOGIC_1164.ALL;ENTITYlitiIS;PORT(a,b,c,d:INSTD_LOGIC;e:outSTD_LOGIC);ENDliti;ACHITECTUREAA1OFlitiISBEGINe<=(aandb)ortmp;Signaltmp:std_logic;tmp<=cxord;ENDAA1;第54页/共200页2.4.2关系运算符=(等于),/=(不等于),<(小于),>(大于),<=(小于等于,和信号的赋值符号相同),>=(大于等于)。注1.等于和不等于的操作对象可以是任何数据类型构成的操作数。2.其它关系运算符对数据类型有一定的限制。(整数,枚举型)3.=、/=在实现硬件电路时比其它的关系运算符对芯片的利用率要高第55页/共200页ENTITYmy1isPORT(a,b:inbit_vector(0to3)m:outboolean);ENDmy1;ARCHITECTUREa1ofmy1BEGINm<=(a=b);ENDa1;ENTITYmy1isPORT(a,b:inbit_vector(0to3)m:outboolean);ARCHITECTUREa1ofmy1BEGINm<=(a>=b);ENDa1;以上两程序最终所实现的硬件电路见课本P78ENDmy1;第56页/共200页2.4.3算术运算符一、分类及功能求和运算符、求积运算符、符号运算符、混合运算符、移位运算符二.运用1.求和运算符VHDL中的求和运算符包括加减运算和并置运算,操作数的数据类型为整型。例1:Variablea,b,c,d,e,f:integerrange0to255;a:=b+c;d:=e–f;例2:Signala:std_logic_vector(4to0);Signalb:std_logic_vector(2to0);Signalc:std_logic_vector(1to0);a<=bc第57页/共200页2.移位运算符移位运算所对应的数据类型为一维数组,其中的元素维bit、boolean例:Variablea1:std_logic_vector(3to0);a1:=“1011”;a1SLL1;a1=0110a1SLL2;a1=1100a1ROL1;a1=01113.其它略第58页/共200页二、应用现在VHDL已成功地应用于ASIC自动设计的模拟验证和综合优化等方面。VHDL是以文字的方式设计电路,在应用上,目前VHDL语言还仅限于数字电路的开发和设计。三、VHDL和电路图设计方式比较VHDL与电路图设计电路的方式不同,主要有如下几方面的优越性:(1)易于修改;(2)设计能力更强;(3)VHDL语言很方便:独立于器件设计;相同的程序代码可以用于不同厂家生产的器件。第59页/共200页VHDL操作符复习回顾一、逻辑运算符And(与),Or(或),Not(非),Nand(与非),Nor(或非),Xor(异或),Xnor(同或)。能进行逻辑运算的数据类型:bit、bit_vector、booleanstd_logic、std_logic_vector第60页/共200页二、关系运算符=(等于),/=(不等于),<(小于),>(大于),<=(小于等于,和信号的赋值符号相同),>=(大于等于)。1.等于和不等于的操作对象可以是任何数据类型构成的操作数。2.其它关系运算符对数据类型有一定的限制。(整数,枚举型)三、算术运算符求和运算符、求积运算符、符号运算符、混合运算符、移位运算符VHDL中的求和运算符包括加减运算和并置运算,操作数的数据类型

为整型。第61页/共200页Signala:std_logic_vector(4downto0);Signalb:std_logic_vector(2downto0);Signalc:std_logic_vector(1downto0);bca<=bc第62页/共200页VariableA:std_logic_vector(6downto0);A:=“10110001”;ASLL1;AROL1;第63页/共200页

第三章VHDL顺序语句一、顺序语句概念顺序语句的特点是,每一条顺序语句的执行顺序是与它们的书写顺序基本一致的。顺序语句只能出现在进程(Process)和子程序中,子程序包括函数(Function)和过程(Procedure)。二、种类

进程语句赋值语句流程控制语句等待语句

子程序调用语句返回语句空操作语句第64页/共200页3.1进程语句(Process语句)0000输入信号发生变化时,电路启动进行计算第65页/共200页进程语句是由顺序语句构成的,通过信号与结构体其余部分进行信息交流,在进程中有一个敏感信号列表,表中列出的任何信号的改变都将启动进程,执行进程内相应的顺序语句。进程语句是将并行语句和顺序语句区分开来的标志之一。语法格式:

[进程标号:]Process[(敏感信号列表)]

[Variabledeclarations]--变量声明

Begin

顺序语句;

EndProcess[Processlabel];第66页/共200页Process(sel,x1,x2)Beginf<=x1;Ifsel=1thenf<=x2;endif;Endprocess;Process(sel,x1,x2)BeginIfsel=1thenf<=x2;endif;f<=x1;Endprocess;在第二个进程中,无论什么情况,f=x1,而在第一个进程中,只有信号sel/=1时,f=x1。因此,语句的排列顺序很重要,会影响信号的输出结果。区别第67页/共200页3.2赋值语句赋值语句包括变量赋值语句和信号赋值语句,前者的赋值是立刻发生的,后者的赋值发生在一个进程结束的时刻,并延时进行。变量赋值目标:=赋值源信号赋值目标<=赋值源在同一进程中,同一信号赋值目标有多个赋值源时,信号赋值目标获得的是最后一个赋值源的值,其前面相同的赋值目标不做任何变化。注:3.2.1信号和变量赋值第68页/共200页Signals1,s2:std_logic;Signalsec:std_logic_vector(0to7);Process(s1,s2)Variablev1,v2:std_logic;Beginv1:=‘1’;v2:=‘1’;s1<=‘1’;s2<=‘1’;sec(0)<=v1;sec(1)<=v2;sec(2)<=s1;sec(3)<=s2;v1:=‘0’;v2:=‘0’;s2<=‘0’;sec(4)<=v1;sec(5)<=v2;sec(6)<=s1;sec(7)<=s2;ENDPROCESS“01000111”sec=第69页/共200页3.2.2信号和变量赋值举例1.标识符赋值目标Variablea,b:std_logic;Signalc:std_logic_vector(1to4);a:=‘1’;b:=‘0’;c<=“1100”;c(3)<=‘1’;注:一位值用单引号,多位值用双引号第70页/共200页2.段赋值Signalc:std_logic_vector(1to4);c(1to2)<=‘10’;c(1to4)<=‘1010’;3.块赋值Signala,b,c,d:std_logic;Signals:std_logic_vector(1to4);s<=“0100”;(a,b,c,d)<=s;位置关联第71页/共200页Variablee,f:std_logic;Variableg:std_logic_vector(1to2);Variableh:std_logic_vector(1to4);e:=‘0’;f:=‘1’;g:=“10”;h:=(e=>3,f=>4,g(1)=>2,g(2)=>1);名称关联结果:h的值为1010第72页/共200页3.3流程控制语句3.3.1IF语句语法格式:IfexpressionThenstatement;ElsifexpressionThenstatement;ElsifThenstatement;elsestatement;Endif;根据条件进行相应赋值操作第73页/共200页例1:Process(A)BeginIfA=”00”thenf<=D0;elsifA=”01”thenf<=D1;elsifA=”10”thenf<=D2;elsef<=D3;endif;endprocess;第74页/共200页一、第一种IF语句IF条件句THEN

顺序语句ENDIF例题语句格式IF(a>b)THENout<=‘1’;ENDIF;第75页/共200页二、第二种IF语句IF条件句THEN

顺序语句ELSE

顺序语句ENDIF语句格式例题IF(a>b)THENout<=‘1’;ELSEout<=‘0’;ENDIF;第76页/共200页三、第三种IF语句语法格式:If条件句

Then顺序语句;Elsif条件句

Then顺序语句;Elsif条件语句Then顺序语句;else顺序语句;Endif;语句格式第77页/共200页例题1:Signala,b,c,p1,p2,z:bit;IF(p1=‘1’)THENz<=a;ELSIF(p2=‘0’)THENz<=b;ELSEz<=c;ENDIF;?选择方式cbaa画线部分意思:ELSIF(p1=‘0’andp2=‘0’)注第78页/共200页例题2:8线-3线优先编码器第79页/共200页LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcoderISPORT(I:INSTD_LOGIC_VECTOR(0TO7)Y:OUTSTD_LOGIC_VECTOR(1TO3));ENDcoder;实体设计功能:设计元件外观第80页/共200页ARCHITECTUREa1orcoderISBeginIF(I(7)=‘1’)THENY<=“111”;ELSIF(I(6)=‘1’)THENY<=“110”;ELSIF(I(5)=‘1’)THENY<=“101”;ELSIF(I(4)=‘1’)THENY<=“100”;ELSIF(I(3)=‘1’)THENY<=“011”;ELSIF(I(2)=‘1’)THENY<=“010”;ELSIF(I(1)=‘1’)THENY<=“001”;ELSEY<=“000”;ENDa1;结构体设计功能:描述输入和输出之间的逻辑关系ENDIF;第81页/共200页练习题:设计一个3线-8线译码器元件外观输入输出逻辑关系第82页/共200页LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcoderISPORT(A:INSTD_LOGIC_VECTOR(1TO3)Y:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDcoder;实体设计功能:设计元件外观第83页/共200页ARCHITECTUREa1orcoderISBeginIFA=“000”THENY<=“00000001”;ELSIFA=“001”THENY<=“00000010”;ELSIFA=“010”THENY<=“00000100”;ELSIFA=“011”THENY<=“00001000”;ELSIFA=“100”THENY<=“00010000”;ELSIFA=“101”THENY<=“00100000”;ELSIFA=“110”THENY<=“01000000”;ELSEY<=“10000000”;ENDa1;结构体设计功能:描述输入和输出之间的逻辑关系ENDIF;第84页/共200页3.3.2Case-When语句作用:根据条件进行相应的赋值操作。语法格式:Case表达式

Is

When选择值

=>顺序语句

When选择值

=>顺序语句

…Endcase;CASE语句根据满足的条件直接选择多项顺序语句的一项执行=>不是信号赋值符号,其意思等价于“THEN”注第85页/共200页例题1:用CASE语句设计四选一数据选择器第86页/共200页LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALLENTITYmux41ISPORT(s1,s2:instd_logic;a,,b,c,d:instd_logic;z:outstd_logic);ENDENTITYmux41;ARCHITECTUREactivOFmux41ISSIGNALs:std_logic_vector(1downto0);BEGINS<=s1&s2PROCESS(s1,s2,a,b,c,d)BEGINCASEsISWHEN“00”=>z<=a;WHEN“01”=>z<=b;WHEN“10”=>z<=c;WHEN“11”=>z<=d;WHENOTHERS=>z<=‘x’;ENDCASE;ENDPROCESS;ENDactiv;第87页/共200页ARCHITECTUREactivOFmux41ISSIGNALs:std_logic_vector(1downto0);BEGINS<=s1&s2PROCESS(s1,s2,a,b,c,d)BEGINIF

s=“00”thena=>z;ELSIFs=“01”thenb=>z;ELSIFs=“10”thenc=>z;ELSE

d=>z;ENDIF;ENDARCHITECTUREactiv;ARCHITECTUREactivOFmux41ISSIGNALs:std_logic_vector(1downto0);BEGINS<=s1&s2PROCESS(s1,s2,a,b,c,d)BEGINCASE

sISWHEN“00”=>z<=a;WHEN

“01”=>z<=b;WHEN“10”=>z<=c;WHEN“11”=>z<=d;WHENOTHERS=>z<=‘x’;ENDCASE;ENDPROCESS;ENDactiv;第88页/共200页例题2:SIGNALSEL:INTEGERRANGE0TO15;……CASESELISWHEN0=>Z1<=‘1’;WHEN13=>Z2<=‘1’;WHEN4TO72=>Z3<=‘1’;WHENOTHERS=>Z4<=‘1’;IF与CASE比较IF语句中条件句之间是相与的关系,

CASE语句中条件句之间是相或的关系。2.CASE条件语句必须将所有情况列出而IF则不必。3.IF语句可实现优先级,CASE语句则不可以。第89页/共200页课堂练习题:试设计一个4位奇偶校验器第90页/共200页数码显示一、数码显示器(一)发光二极管发光二极管特性:当加正向电压时,二极管导通并发光.利用这了一特性可制成共阴极和共阳极七段数码显示器。第91页/共200页(二)七段数码显示器1.工作原理共阴极接法第92页/共200页2.显示代码概念9的显示代码第93页/共200页辅助实验第94页/共200页显示译码器显示译码器功能第95页/共200页其真值表如下所示:输入代码输出显示代码第96页/共200页Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntitybtodisPort(A:instd_logic_vector(3downto0);Y:outstd_logic_vector(6downto0));Endbtod;Architecturea1ofbtodisBeginProcess(d)BeginCaseAiswhen"0000“=>Y<="0111111”;--0when"0001“=>Y<="0000110”;--1when"0010“=>Y<="1011011”;--2when"0011“=>Y<="1001111”;--3when"0100“=>Y<="1100110”;--4when"0101“=>Y<="1101101”;--5when"0110“=>Y<="1111101”;--6when"0111“=>Y<="0000111”;--7when“1000“=>Y<=“1111111”;--8when“1001“=>Y<="1101111”;--9Enda1;第97页/共200页3.3.3LOOP语句一、单个LOOP语句[LOOP标号:]LOOP

顺序语句ENDLOOP[LOOP标号];例:L2:LOOPa:=a+1;

EXITL2WHENa>10;ENDLOOPL2;第98页/共200页二、FOR_LOOP语句[LOOP标号:]FOR循环变量

IN循环次数范围LOOP

顺序语句;

ENDLOOP[LOOP标号];例:试设计一个八位奇偶校验器

注:

0XORa=a第99页/共200页LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYJIOUISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);

y:OUTSTD_LOGIC);ENDJIOU;ARCHITECTUREOPTOFJIOUISSIGNALtmp:STD_LOGIC;BEGINPROCESS(a)BEGINtmp<=‘0’;FORnIN0TO7LOOPtmp<=tmpXORa(n);ENDLOOP;y<=tmp;ENDPROCESS;ENDopt;第100页/共200页三.WHILE_LOOP语句[标号:]WHILE循环控制变量LOOP

顺序语句

ENDLOOP[标号];例1:Shift1:PROCESS(inputx)

VARIABLEn:POSITIVE:=1BEGINL1:WHILEn<8LOOPoutputx(n)<=input(n+8);

n:=n+1;ENDLOOPL1;ENDPROCESSShift1;第101页/共200页3.3.4NEXT与EXIT语句NEXT;NEXTLOOP标号;NEXTLOOP标号WHEN条件表达式;EXIT;EXITLOOP标号;EXITLOOP标号WHEN条件表达式;循环语句转向控制第102页/共200页LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYBIJIAOISPORT(a:INSTD_LOGIC_VECTOR(0TO7);

b:INSTD_LOGIC_VECTOR(0TO7);y:OUTSTD_LOGIC);ENDBIJIAO;ARCHITECTUREJIEGOUOFBIJIAOISSignaltmp:STD_LOGIC_VECTOR(0TO7);Signaltmq:std_logic;BEGINPROCESS(a,b)BEGINFORnIN0TO7LOOPtmp(n)<=a(n)xnorb(n);Nextwhen(tmp(n)=‘1’);tmq<=‘1’;ENDLOOP;y<=tmq;ENDPROCESS;ENDJIEGOU;NEXT语句第103页/共200页LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYBIJIAOISPORT(a:INSTD_LOGIC_VECTOR(0TO7);

b:INSTD_LOGIC_VECTOR(0TO7);y:OUTSTD_LOGIC);ENDBIJIAO;ARCHITECTUREJIEGOUOFBIJIAOISSignaltmp:STD_LOGIC_VECTOR(0TO7);BEGINPROCESS(a,b)BEGINFORnIN0TO7LOOPtmp(n)<=a(n)xnorb(n);EXITwhen(tmp(n)=‘0’);ENDLOOP;y<=‘1’;ENDPROCESS;ENDJIEGOU;EXIT语句第104页/共200页3.4子程序及其调用子程序概述函数(Function)过程(Procedure)子程序调用3.5返回语句(Return)3.6空操作语句(NULL)3.7其它语句第105页/共200页3.4.1子程序概述子程序是一个VHDL程序模块,由顺序语句构成,用于完成重复性的计算工作,子程序有两种类型,即过程(Procedure)和函数(Function)。子程序的使用方法只能通过子程序调用及与子程序的界面端口进行通信。每调用一次子程序都意味着增加了一个硬件电路模块,因此,在实际使用时,要密切关注和严格控制子程序的调用次数。第106页/共200页3.4.2函数(Function)--函数首Function函数名(参数表)Return数据类型Function函数名(参数表)Return数据类型IS

说明部分

Begin

顺序语句

ENDFunction函数名;--函数体注:参数表中参量可以是变量、信号、常数(默认)

无需定义参数的方向(默认为“输入”)第107页/共200页例1EntityfuncIsPort(a:inbit_vector(0to2);m:outbit_vector(0to2));EndEntityfunc;ArchitecturedemoOffuncIsFunctionsam(x,y,z:bit)ReturnbitisBeginReturn(xandy)orzEndFunctionsam;BeginProcess(a)Beginm(0)<=sam(a(0),a(1),a(2));m(1)<=sam(a(2),a(0),a(1));m(0)<=sam(a(1),a(2),a(0));EndProcess;EndArchitecturedemo;函数体输入变量注意:函数定义的位置函数调用第108页/共200页例2Functiontrans(value:bit_vector(0to3))Returnbit_vectorIsBeginCasevalueISWhen“0000”=>Return“1100”;When“0101”=>Return“1100”;WhenOthers=>Return“1111”;EndCase;EndFunctiontrans;第109页/共200页3.4.3过程(Procedure)--过程首Procedure过程名(参数表)Procedure过程名(参数表)IS

说明部分

Begin

顺序语句

ENDProcedure过程名;--过程体注:参数表中参量可以时变量、信号、常数(默认)参数的方向可以是IN、OUT、INOUT第110页/共200页例Procedureprg1(variablevalue:inoutbit_vector(0to3))BeginCasevalueISWhen“0000”=>Return“1100”;When“0101”=>Return“0000”;WhenOthers=>Return“1111”;EndCase;EndProcedurePrg1;第111页/共200页3.4.4子程序调用例题ENTITYlitiISPORT(a,b,c,d:inbit_vector(0to3);ra,rb,rc,rd:ourbit_vector(0to3));ENDliti;ARCHITECTUREmuxesOFlitiisProceduresort(x,y:inoutbit_vector(0to3))isvariabletmp:bit_vector(0to3);BeginIfx>ythentmp:=x;x:=y;y:=tmp;ENDIF;ENDSORT;BeginProcess(a,b,c,d)Beginsort(a,c);sort(b,d);sort(a,b);sort(c,d);sort(b,c);ENDprocess;ra<=a;rb<=b;rc<=c;rd<=d;ENDmuxes;第112页/共200页3.4.5函数与过程对比过程可以返回多值,函数只能返回一个值。过程的参数为IN、OUT、INOUT

函数的参数为IN(默认)。函数和过程均能产生新的电路模块。第113页/共200页3.5返回语句(Return)格式:Return;Return表达式;只能用于FunctionProcedurers(signals,r:instd_logic;signalq,nq:inoutstd_logic)isBeginIf(s=‘1’andr=‘1’)thenReturnElseq<=sandnqNq<=sandqEndif;Endprocedurers;例题1:第114页/共200页例题2:Functionopt(a,b,opr:std_logic)returnstd_logicisBeginIf(opr=‘1’)thenReturn(aandb);ElseReturn(aorb);Endif;EndFunctionopt;Return语句的作用就是结束当前运行的子程序,所不同的是过程无条件返回,并且不返回任何值。函数必须返回一个值第115页/共200页3.6空操作语句(NULL)例句:CASEOPCODEISWHEN“001”=>tmp:=regaandregb;WHEN“101”=>tmp:=regaorregb;WHEN“110”=>tmp:=NOTrega;WHENOTHERS=>NULL;ENDCASE;注:NULL语句有时会造成不必要的寄存器第116页/共200页3.7其它语句clock’EVENTandclock=‘1’;功能:clock’EVENT就是对信号在当前的一个极小的时间段内电平是否发生变化进行检测。例1:Process(clock)If(clock’EVENTandclock=‘1’)thenQ<=DATAEndIf;EndProcess;第117页/共200页例2:Process(clock)If(clock’EVENTandclock=‘0’)thenQ<=DATAEndIf;EndProcess;例3:Process(clock)Ifrising_edge(clock)thenQ<=DATAEndIf;EndProcess;与例1等价第118页/共200页第四章VHDL并行语句4.1并行语句概述4.2并行信号赋值语句4.3进程语句(process)第119页/共200页4.1并行语句概述并行语句一般处于进程(PROCESS)的外部。所有并行语句都是并行执行的,即与它们出现的先后次序无关。

一、并行语句特点

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

第120页/共200页二、基本的并行语句(1)直接赋值语句:<=赋值运算符(2)进程(Process)语句(3)条件式信号设置语句:When-Else(4)选择式信号设置语句:With-Select-When(5)块(Block)语句(6)元件(Component)例化语句(7)For-Generate语句第121页/共200页4.2并行信号赋值语句简单信号赋值语句条件信号赋值语句选择信号赋值语句第122页/共200页一、直接赋值语句:<=赋值运算符作用:直接对目标对象进行赋值操作。语法格式:Signal_name<=expression;如:SignalA,B:std_logic_vector(7downto0);

A<=”0000000”;B<=”1000000”;我们也可以这样赋值:

A<=(others=>’0’);

信号A的每一位的值都为0。

B<=(‘1’,others=>’0’);

信号B的第一位为1,其它位的值为0。

第123页/共200页下面举一个应用示例,如下面电路:

用VHDL对电路的描述如下:

第124页/共200页libraryieee;useieee.std_logic_1164.all;Entity

exam1isport(a,b:instd_logic;c,d:outstd_logic);Endexam1;Architecture

m1ofexam1isBeginc<=aandb;d<=aorb;ENDm1;并行语句的输出仅仅依赖于输入,没有其它的限制条件。每条语句的执行和其所在的位置无关。

第125页/共200页二、条件式信号设置语句:When-Else语法格式为:

赋值目标<=表达式1When赋值条件

Else

表达式2When赋值条件

Else

表达式N;在结构体中的条件赋值语句的功能与在进程中的IF语句相同,在执行条件信号语句时,每一赋值条件是按书写的先后关系测定的。第126页/共200页我们曾举过一个二输入的与门电路的例子:

Libraryieee;Useieee.std_logic_1164.all;Entity

and2isPort(d1,d2:instd_logic;op:outstd_logic);Endand2;Architecturem1ofand2isBeginop<=‘1’when(d1=’1’andd2=’1’)else

‘0’;Endm1;第127页/共200页Libraryieee;Useieee.std_logic_1164.all;Entity

muxisPort(a,b,c:inbit;p1,p2:inbit

z:outbit);Endand2;Architecturem1ofmuxisBeginz<=awhenp1=‘1’else

bwhenp2=‘1’else

c;Endm1;允许有重叠第128页/共200页三、选

温馨提示

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

评论

0/150

提交评论