VHDL与数字电路设计.ppt_第1页
VHDL与数字电路设计.ppt_第2页
VHDL与数字电路设计.ppt_第3页
VHDL与数字电路设计.ppt_第4页
VHDL与数字电路设计.ppt_第5页
免费预览已结束,剩余301页可下载查看

下载本文档

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

文档简介

VHDL与数字电路设计,主讲:崔刚北京工业大学电控学院电工电子中心2005年9月1,目录,概述第一章VHDL的程序结构和软件操作第二章数据类型与数据对象的定义第三章并行赋值语句第四章顺序赋值语句第五章组合逻辑电路的设计第六章时序逻辑电路的设计第七章子程序、库和程序包第八章CPLD和FPGA的结构与工作原理第九章数字钟电路的设计,本节主要内容,传统数字电路设计方法EDA设计方法PLD器件PLD器件设计流程文本设计输入VHDL程序设计,数字电子技术的基本知识回顾,组合逻辑电路编码器、译码器、数据选择器、加法器、数值比较器等时序逻辑电路同步时序逻辑电路异步时序逻辑电路寄存器、移位寄存器、计数器、序列信号发生器,一、传统设计方法,(1)首先确定可用的元器件;(2)根据这些器件进行逻辑设计,完成各模块;(3)将各模块进行连接,最后形成系统;(4)而后经调试、测量观察整个系统是否达到规定的性能指标。,传统的设计方法是基于中小规模集成电路器件进行设计(如74系列及其改进系列、CC4000系列、74HC系列等都属于通用型数字集成电路),而且是采用自底向上进行设计:,EDA(ElectronicsDesignAutomation)即电子设计自动化技术,是利用计算机工作平台,从事电子系统和电路设计的一项技术。EDA技术为电子系统设计带来了这样的变化:(1)设计效率提高,设计周期缩短;(2)设计质量提高;(3)设计成本降低;(4)能更充分地发挥设计人员的创造性;(5)设计成果的重用性大大提高,省去了不必要的重复劳动。,二、EDA设计方法,自顶向下的设计方法,数字电路的EDA设计是基于PLD进行设计的,支持自顶向下的设计方法:(1)首先从系统设计入手,在顶层进行功能划分和结构设计;(2)然后再逐级设计底层的结构;(3)并在系统级采用仿真手段验证设计的正确性;(4)最后完成整个系统的设计,实现从设计、仿真、测试一体化。,传统设计方法vsEDA设计方法,三、PLD器件(一)出现的背景,如果能把所设计的数字系统做成一片大规模集成电路,则不仅能减小电路的体积、重量、功耗,而且会使电路的可靠性大为提高。为某种专门用途而设计的集成电路叫做专用集成电路,即所谓的ASIC(ApplicationSpecificIntegratedCircuit的缩写)。在用量不大的情况下,设计和制造这样的专用集成电路成本很高,而且设计、制造的周期也较长。可编程逻辑器件的研制成功为解决上述问题提供了比较理想的途径。,(二)PLD概述,PLD是可编程逻辑器件(ProgrammableLogicDevice)的英文缩写。可编程逻辑器件是一种数字集成电路的半成品,在其芯片上按一定排列方式集成了大量的逻辑门和触发器等基本逻辑元件。通过编程可以设置其逻辑功能。PLD编程:利用开发工具对PLD进行加工,即按设计要求将这些片内的元件连接起来,使之完成某个逻辑电路或系统的功能,成为一个专用集成电路(ASICApplicationSpecificIntegratedCircuit)。,PLD开发系统,PLD开发系统包括硬件和软件两部分。硬件部分:计算机、下载电缆或编程器;软件部分:集成开发系统。Altera公司:Maxplus、QuartusXilinx公司:Foundation、ISELattice公司:SynarioSystem、ispEXPERTSystem,四、PLD设计流程,设计准备,设计输入,设计处理,器件编程,功能仿真,时序仿真,器件测试,PLD设计准备,在设计之前,首先要进行方案论证和器件选择等设计准备工作。设计者首先要根据任务要求,判断系统的可行性。系统的可行性要受到逻辑要求合理性、成本、开发条件、器件供应等方面的约束。若系统可行,则根据系统所完成的功能及复杂程度,对器件本身的资源和成本、工作速度及连线的可布性等方面进行权衡,选择合适的设计方案和合适的器件类型。,设计输入,将所设计的电路的逻辑功能按照开发系统要求的形式表达出来的过程称为设计输入。通常,设计输入有如下三种方式:(1)原理图输入方式适用于对系统及各部分电路很熟悉的场合。(2)硬件描述语言输入方式硬件描述语言是用文本方式描述设计,硬件描述语言有ABEL、AHDL、VHDL、Verilog等,其中VHDL和Verilog已成为IEEE标准。(3)波形输入方式,设计处理,逻辑优化把逻辑描述转变为最适合在器件中实现的形式,优化使设计所占用的资源最少。逻辑综合根据设计描述,对给定的硬件结构组件,最终获得门级电路甚至更底层的电路描述文件,即将多个模块化设计文件合并为一个网表文件。适配确定优化后的逻辑能否与器件中的宏单元和I/O单元适配。分割将大的设计分割为多个便于器件内部资源实现的逻辑小块的形式。,设计校验,设计校验过程包括功能仿真和时序仿真。功能仿真时序仿真,器件编程,器件编程就是将开发系统生成的目标文件下载到可编程逻辑器件中,来定义内部模块的逻辑功能以及它们的相互连接关系。两种编程方式:编程器下载电缆,PLD开发系统,PLD开发系统包括硬件和软件两部分。硬件部分:计算机、下载电缆或编程器;软件部分:集成开发系统。Altera公司:Maxplus、QuartusXilinx公司:Foundation、ISELattice公司:SynarioSystem、ispEXPERTSystem,设计举例,设计内容:十进制计数器电路设计。,PLD器件:ACEX1K系列的EP1K30QC208。开发系统:MAX+plus系统。编程方式:下载电缆。,实验下载板,11:12:36,设计过程,1、设计输入VHDL演示12、逻辑验证演示23、设计处理引脚设定演示34、器件编程连接下载电缆演示4,三、PLD电路设计的特点,1、设计简单,方便;2、电路系统可以集成在一片芯片上;3、电路设计不依赖于器件进行设计;4、电路系统很容易完善和升级。,器件选择:(1)电路系统所完成的功能及复杂程度;(2)器件本身的资源和成本、性能参数、器件编程工艺等方面进行权衡。,VHDL是非常高速集成电路硬件描述语言(VeryHighspeedIntegratedCircuitHardwareDescriptionLanguage)的英文缩写。,五、文本设计输入VHDL程序设计,语法和风格:(1)类似与现代高级编程语言,如C语言。(2)VHDL描述的是硬件,它包含许多硬件特有的结构。,VHDL设计VS电路图设计,VHDL与电路图设计电路的方式不同,和电路图设计方式相比:(1)易于修改;(2)设计能力更强;(3)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程序,VHDL程序的基本结构,(1)LIBRARY和PACHAGE声明区;(2)ENTITY定义区;(3)ARCHITECTURE定义区;,Library(库)是用于存放预先编译好的Package(程序包)。Package(程序包)中定义了基本的常数,数据类型,元件及子程序等。作用:声明在实体和结构体定义中将用到的数据类型、元件或子程序等。声明格式:Library库名;Use库名.PACKAGE名.All;,(1)LIBRARY和PACKAGE声明区,作用:ENTITY(实体)用于定义电路的外观,即I/O端口的类型和数量。定义格式:Entity实体名isPort(a:inbit;b:inbit;c:outbit);End实体名;,(2)ENTITY定义区,端口名,数据类型,端口模式,端口模式(MODE)有以下几种类型:IN;OUT;INOUT;BUFFER端口模式可用下图说明:(黑框代表一个设计或模块)INOUTBUFFERINOUT,(2)ENTITY定义区,(3)ARCHITECTURE定义区,实体的实现。即说明电路执行什么动作或实现功能。定义格式:Architecture结构体名of实体名is声明语句;(内部信号、变量、常数,元件,子程序声明)Begin并行描述语句;End结构体名;,二输入与门电路设计范例,电路真值表,二输入与门电路设计范例,Librarystd;Usestd.standard.all;Entityand2isPort(a:inbit;b:inbit;c:outbit);Endand2;-实体定义结束。,双减号-为VHDL程序的注释符,类似C语言中的/注释符。,二输入与门电路设计范例,ArchitectureNaofand2isBeginc=0whena=0andb=0else0whena=1andb=0else0whena=0andb=1else1;符号=为信号直接赋值符。EndNa;-结构体NaArchitectureNbofand2isBeginc=aandb;-and为逻辑与操作EndNb;-结构体Nb,第一章VHDL的程序结构和软件操作,1-1VHDL程序的基本结构1-2Max+plus的操作,1-1VHDL程序的基本结构,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程序,1-1VHDL程序的基本结构,(1)LIBRARY和PACHAGE声明区;(2)ENTITY定义区;(3)ARCHITECTURE定义区;(4)CONFIGURATION定义区。,Library(库)是用于存放预先编译好的Package(程序包)。Package(程序包)中定义了基本的常数,数据类型,元件及子程序等。作用:声明在实体和结构体定义中将用到的数据类型、元件或子程序等。声明格式:Library库名;Use库名.PACKAGE名.All;,(1)LIBRARY和PACKAGE声明区,作用:ENTITY(实体)用于定义电路的外观,即I/O端口的类型和数量。定义格式:Entity实体名isPort(a:inbit;b:inbit;c:outbit);End实体名;,(2)ENTITY定义区,端口名,数据类型,端口模式,(2)ENTITY定义区,标识符的定义原则:(1)标识符由字母、数字和下划线组成,a7_;(2)在标识符不区分大小写,ab和AB是一样的;(3)第一个字符必须是字母,即a666;(4)不允许有两个连续的下划线,a_b错误;(5)末尾不能是下划线,mname_错误;(6)标识符不能和关键字相同,如Entity,is等。,端口模式(MODE)有以下几种类型:IN;OUT;INOUT;BUFFER端口模式可用下图说明:(黑框代表一个设计或模块)INOUTBUFFERINOUT,(2)ENTITY定义区,(3)ARCHITECTURE定义区,定义了实体的实现。即电路的具体描述,说明电路执行什么动作或实现功能。定义格式:Architecture结构体名of实体名is声明语句;(内部信号、变量、常数,元件,子程序声明)Begin并行描述语句;End结构体名;,(4)CONFIGURATION定义区,一个完整VHDL电路设计必须有一个实体和对应的结构体,即实体和结构体对构成一个完整的VHDL设计。一个实体可对应一个结构体或多个结构体,即一个实体可以有不同的描述方式。作用:当实体有多个结构体时,系统默认实体选用最后一个结构体,利用CONFIGURATION语句可以任意选择采用哪一个结构体。,(4)CONFIGURATION定义区,定义格式:Configuration配置名of实体名isfor选用的结构体名endfor;endconfiguration配置名;,二输入与门电路设计范例,电路真值表,二输入与门电路设计范例,Librarystd;Usestd.standard.all;Entityand2isPort(a:inbit;b:inbit;c:outbit);Endand2;-实体定义结束。,双减号-为VHDL程序的注释符,类似C语言中的/注释符。,二输入与门电路设计范例,ArchitectureNaofand2isBeginc=0whena=0andb=0else0whena=1andb=0else0whena=0andb=1else1;符号=为信号直接赋值符。EndNa;-结构体NaArchitectureNbofand2isBeginc=aandb;-and为逻辑与操作EndNb;-结构体Nb,二输入与门电路设计范例,Configurations1ofand2isfornaendfor;endconfigurations1;-结构体配置结束。,1-2Max+plus系统的操作,Max+plus开发工具是美国Altera公司自行设计的一种软件工具,其全称为MultipleArrayMatrixandProgrammableLogicUserSystem。它具有原理图输入和文本输入(采用硬件描述语言)两种输入手段,利用该工具所配备的编辑、编译、仿真、时序分析、芯片编程等功能,将设计电路图或电路描述程序变成基本的逻辑单元写入到可编程的芯片中(如CPLD或FPGA芯片),作成ASIC芯片。它是EDA设计中不可缺少的一种工具。,下面我们介绍利用Max+plus系统如何实现如下操作:(1)如何编写VHDL程序(使用TextEditor);(2)如何编译VHDL程序(使用Compiler);(3)如何仿真验证VHDL程序(使用WaveformEditor,Simulator);(4)如何进行芯片的时序分析(使用TimingAnalyzer);(5)如何安排芯片脚位(使用FloorplanEditor);(6)如何下载程序至芯片(使用Programmer)。,1-2Max+plus系统的操作,(1)如何编写VHDL程序,a.打开文本编辑器;File/new/Texteditorfileb.编写VHDL程序;c.保存文件,文件名和定义的实体名必须相同,文件扩展名为VHD,文件存盘的目录不应是根目录或桌面,建议存放在Max2work或Maxplus2目录,或其子目录。,(2)如何编译VHDL程序,a.打开需要编译的文件;b.设置工程到目前打开的文件;File/Project/SetProjecttoCurrentFile,c.打开编译器;点击主菜单MAX+plus/Compiler选项。d.选定VHDL源文件的版本;Interfaces/VHDLNetlistReaderSettingse.打开编译器进行编译。,(3)如何仿真验证VHDL程序,a.打开波形编辑器(WaveformEditor);b.确定仿真持续时间(File/EndTime);c.将输入输出端口名选入波形编辑器;d.编辑输入信号波形;e.保存仿真波形文件;f.打开仿真器MAX+plusSimulator进行仿真。在仿真结束后打开仿真波形文件(点击右下角的OpenSCF按钮)即可以显示仿真结果。,(4)如何进行芯片的时序分析,a.选择要下载的器件型号;点击主菜单的Assign/Device项得到Device对话框。在DeviceFamily框中选择芯片系列,在Devices选择框下选择具体的芯片名,最后点击OK按钮。b.再编译一次;c.打开时序分析器(TimingAnalyzer);d.点击Start进行时序分析。,(5)如何安排芯片脚位,a.打开芯片脚位设置窗口;点击主菜单Assign/Pin/Location/Chip,出现脚位设置对话框;b.将实体定义的端口名字和下载芯片的管脚进行具体对应;在NodeName框中输入我们定义的实体端口名字,然后在Pin列表选项框中输入下载芯片的管脚序号,再点击对话框右下角的Add按钮,将所有端口设置完成以后,点击Ok按钮,则实现实体端口和下载芯片的管脚的对应;c.再编译一次,将生成可以下载的文件(And2.Sof)。,(6)如何下载程序至芯片,a.将下载电缆与计算机并口相连,然后给芯片通电;b.打开编程器Programmer;Options/HardwareSetup,在HardwareType选择ByteBlaster(MV)方式,则在ParallelPort处显示LPT1,单击OK钮返回Programmer窗口。c.下载方式选择;d.选择下载的芯片类型和要下载的文件(选择JTAG/MutiDevicJTAGChainSetup)。e.点击Configure进行下载,将程序写入芯片中。,第二章数据类型与数据对象的定义,2-1数据类型2-2数据对象的定义2-3信号运算符2-4信号属性,2-1数据类型,在VHDL程序中,我们经常会遇到这样的语句:SignalA:std_logic;VariableB:std_logic_vector(7downto0);ConstantC:integer;,数据对象类型,数据类型,数据对象名,2-1-1逻辑数据类型,(1)布尔代数(Boolean)型;(2)位(Bit);(3)位数组类型(Bit_Vector),在std库的standard程序包中进行定义。,typeBIT_VECTORisarray(NATURALrange)ofBIT;,typeBITis(0,1);,typeBOOLEANis(FALSE,TRUE);,(4)标准逻辑型(Std_Logic);TypeSTD_LOGICis(U,-Uninialized;未初始化X,-Forcingunknown;浮接不定0,-Forcing0;低电位1,-Forcing1;高电位Z,-HighImpedance;高阻抗W,-WeakUnknown;弱浮接L,-Weak0;弱低电位H,-Weak1;弱高电位-,-Dontcare;不必理会);(5)标准逻辑数组类型(Std_Logic_vector);,在ieee库的std_logic_1164程序包中定义。,TYPEstd_logic_vectorISARRAY(NATURALRANGE)OFstd_logic;,2-1-2数值数据类型,(1)整数(Integer);a.正整数(POSITIVE)b.自然数(NATURAL),在std库的standard程序包中进行定义。,subtypePOSITIVEisrange1toINTEGERHigh;,TypeINTEGERisrange2147483648to2147483647;,subtypeNATURALisrange0toINTEGERHigh;,(2)实数(Real)(3)有符号数(Signed)无符号数(Unsigned),在ieee库的std_logic_arith程序包中定义。,typeREALisrange1.7E38to1.7E38;,typeUNSIGNEDisarray(NATURALrange)ofSTD_LOGIC;typeSIGNEDisarray(NATURALrange)ofSTD_LOGIC;,SIGNED的最高位为符号位,其余位为数值位,数值位为补码形式。如:符号数”1001”表示-7。,libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;entitydataisport(a,b:inunsigned(3downto0);-a,b:insigned(3downto0);c:outstd_logic);enddata;architecturem1ofdataisbeginc=1whenabelse0;endm1;,当定义成无符号类型时,若a=”1000”,b=0001,即a=8,b=1则结果c=0;当定义成有符号类型时,若a=”1000”,b=0001,则a=-8,b=1,则结果c=1。,2-1-3列举和数组数据类型,(1)列举数据类型(EnumeratedTypes)定义格式:Type列举名称is(元素1,元素2,);(2)数组数据类型(ArrayTypes)定义格式:Type数组名称isArray(range)of数据类型;,2-1-4数据类型的转换,在VHDL语言里,不同类型的数据信号之间不能互相赋值。当需要不同类型数据之间传递信息时,就需要类型转换函数将其中的一种类型数据转换为另一中数据类型后,再进行信号的传递。例如:SignalY:Std_logic_vector(7downto0);SignalX:Integerrange0to255;Y=CONV_STD_LOGIC_VECTOR(X,8);转换函数有两个参数,被转换的对象和转换后的位数。,常用的数据类型转换函数,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类型.,在库ieee的程序包std_logic_arith中定义,2-2数据对象的定义,常用的数据对象有三种:常数(Constant)信号(Signal)变量(Variable),2-2-1常数的定义,(1)将数据对象定义为常数,一方面希望该数据对象的值不会被改变;另一方面,为了提高程序的可读性。(2)常数为全局量。(3)常数在程序包说明、实体说明、结构体描述、过程说明、函数调用中使用。(4)常数的定义格式:Constant常数名:数据类型:=常数值;如:ConstantD1:Integer:=3;注意!常数定义的同时进行赋初值。,常数的应用示例,libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;-必需定义+entityexam1isport(ip:instd_logic_vector(3downto0);op:outstd_logic_vector(3downto0);endexam1;architecturem1ofexam1isconstantnum:integer:=6;beginop=ip+num;endm1;,2-2-2信号的定义,(1)“信号”数据对象,代表电路内部信号或连接线路,其在元件之间起互连作用。,注意!信号定义的时候尽管可以直接赋初值,但系统往往忽略。建议信号对象定义后再进行赋值。,(2)信号为全局量。,(3)在实体说明、结构体描述和程序包说明中使用。,(4)信号的定义格式:Signal信号名:数据类型;,(5)信号赋值的语法格式为:信号名=表达式;如:SignalS1:Std_logic_vector(3Downto0);S1=“0000”;,2-2-3变量的定义,(1)“变量”数据对象,它用于对中间数据的临时存储,并不一定代表电路的某一组件。,注意!变量定义的时候尽管可以直接赋初值,但系统往往忽略。建议变量对象定义后再进行赋值。,(2)变量为局部量。,(3)仅限于进程(Process)或子程序中使用。,(4)变量的定义格式:Variable变量名:数据类型;,(5)变量赋值的语法格式为:目标信号值:=表达式;如:VariableS1:Std_logic_vector(3Downto0);S1:=“0000”;,libraryieee;useieee.std_logic_1164.all;entitybcvisport(a,b,c:instd_logic;x,y:outstd_logic);endbcv;,architecturem2ofbcvisbeginprocess(a,b,c)variabled:std_logic;begind:=a;x=cxord;d:=b;y=cxord;endprocess;endm2;,例一,结果:x=cxorb,y=cxorb,x=cxora,y=cxorb,architecturem1ofbcvissignald:std_logic;beginprocess(a,b,c)begind=a;-ignoredx=cxord;d=b;y=cxord;endprocess;endm1;,libraryieee;useieee.std_logic_1164.all;Entitycmpisport(cp,ip:instd_logic;-cp为时钟脉冲op,oq:outstd_logic);-ip为输入信号endcmp;Architecturem1ofcmpissignald:std_logic;beginprocess(cp)variablee:std_logic;beginifcpeventandcp=1thend=ip;op=d;e:=ip;oq=e;endif;endprocess;endm1;,例二D触发器,在进程中,信号赋值只有在过程结束时起作用,而变量赋值是立即进行的。,2-2-4信号和变量的比较,(1)信号和变量的对应关系不同:信号代表电路内部信号或连接线路;而变量则不是。,(2)信号和变量声明的位置不同:信号声明在子程序、进程的外部;而变量声明在子程序、进程的内部。,(3)信号为全局量,而变量只在定义它的域中才可见。因此,变量不能在两个进程之间传递信息。,(4)在一个进程中多次为一个信号赋值时,只有最后一个值会起作用;而变量则不同,每次赋值都会改变它的值。,(5)赋值不同。在进程中,信号赋值只有在进程结束时起作用,而变量赋值是立即进行的。而且赋值符号不同:信号赋值为“=”,变量赋值为“:=”。,Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;,一位BCD码的加法器,EntitybcdadderisPort(a,b:instd_logic_vector(3downto0);result:outstd_logic_vector(4downto0);Endbcdadder;,ArchitectureNaofbcdadderisconstantadjnum:integer:=6;-常数定义signalbinadd:std_logic_vector(4downto0);-信号Beginbinadd9thentmp:=adjnum;elsetmp:=0;endif;result=大于或等于注:其中=操作符也用于表示信号的赋值操作。上述运算在库ieee的程序包std_logic_arith中定义。,VHDL运算符算术运算符,+加-减*乘/除*乘方mod求模rem求余abs求绝对值在库ieee的程序包std_logic_arith中定义。,VHDL运算符连接运算符,SignalB:std_logic_vector(0to3);则这两个信号的属性值分别为:Aleft=7;Aright=0;Alow=0;Ahigh=7;Alength=8;Bleft=0;Bright=3;Blow=0;Bhigh=3;Blength=4;,left表示数组的左边界;right表示数组的右边界;low表示数组的下边界;high表示数组的上边界;length表示数组的长度。,(2)event属性:event属性,它的值为布尔型,如果刚好有事件发生在该属性所附着的信号上(即信号有变化),则其取值为Ture,否则为False。利用此属性可决定时钟信号的变化情况,即时钟是否发生。,2-4数据对象属性,(2)Event属性:例如:时钟边沿表示signalclk:instd_logic;则clkeventandclk=1表示时钟的上升沿。即时钟变化了,且其值为1。clkeventandclk=0表示时钟的下降沿。即时钟变化了,且其值为0。此外,还可利用两个函数来表示时钟的边沿。rising_edge(clk)表示时钟的上升沿falling_edge(clk)表示时钟的下降沿这两个函数分别在库ieee的程序包Std_logic_1164中定义。,2-4数据对象属性,并行语句一般处于进程(PROCESS)的外部。所有并行语句都是并行执行的,即与它们出现的先后次序无关。并行语句有三个特点:a.所有语句的执行是并行的;b.每条语句的执行和其所在的位置无关;c.并行语句的输出仅仅依赖于输入,没有其它的限制条件。,第三章并行赋值语句,第三章并行赋值语句,(1)直接赋值语句:=赋值运算符(2)条件式信号设置语句:When-Else(3)选择式信号设置语句:With-Select-When(4)Process(进程)语句(5)Block(块)语句(6)函数调用语句(后面章节讲)(7)Component(元件)例化语句(8)For-Generate语句Generic的使用,(1)直接赋值语句:=,直接赋值语句的格式:Signal_name0);结果信号A的每一位的值都为0。B0);信号对象的位数很多时,采用others来赋值很方便。,=示例,libraryieee;useieee.std_logic_1164.all;Entitytest1IsPort(a,b:instd_logic;c,d:outstd_logic);endtest1;architecturetest1_bodyoftest1isbegin同时执行d=aorb;c=aandb;endtest1_body;,输出仅仅依赖于输入,没有其它的限制条件。,每条语句的执行和其所在的位置无关。,(2)When-Else条件式信号设置语句,它的语法格式为:label:Signal_name=expression1Whenlogic_expression1Elseexpression2Whenlogic_expression2Elseexpressionn;例如:f=1whenx1=x2else0;,When-Else语句示例,Libraryieee;Useieee.std_logic_1164.all;Entityxor2isPort(x,y:instd_logic;z:outstd_logic);Endxor2;Architectureaofxor2isBeginz=1when(x=0andy=1)else1when(x=1andy=0)else0;Enda;,(3)With-Select-When选择式信号设置语句,label:WithexpressionSelectSignal_name=expressionWhenconstant_value,expressionWhenconstant_value;,With-Select-When示例,Libraryieee;Useieee.std_logic_1164.all;Entityxor2isPort(x,y:instd_logic;z:outstd_logic);Endxor2;Architectureaofxor2issignaltmp:std_logic_vector(1downto0);Begintmp=x,When-else和With-select-When语句的区别,(1)With-select-When语句中When后的constant_value必须是互不相同的;(2)而When-else语句中When后的logic_expression则不需要这样的严格条件;(3)When-else语句中When后的logic_expression的优先权次序为由先到后排列。,优先编码器示例,Libraryieee;Useieee.std_logic_1164.all;EntitypriorityisPort(r1,r2,r3:instd_logic;f:outstd_logic_vector(1downto0);Endpriority;ArchitectureaofpriorityisBeginf=01when(r1=1)else10when(r2=1)else11when(r3=1)else00;Enda;,Ifr1=1,f=”01”;Ifr2=1andr1/=1,f=”10”;Ifr3=1andr1/=1andr2/=1,f=”11”;如果三个输入都为0,f=”00”。,(4)Process语句,(1)一个结构体当中可以有多个Process语句,Process语句是同时执行的并行语句。(2)Process内的语句却是顺序执行的顺序语句。(3)多进程之间的信息通过信号对象来传递。Process语句的格式为:Processlabel:Process(Sensitivitylist)VariabledeclarationsBegin顺序语句;EndProcessProcesslabel;,(4)Process语句,敏感表(Sensitivitylist)包括进程的一些信号,当敏感表中的某个信号变化时进程才被激活,进程内的顺序语句被执行。当进程结束时,进程内的输出信号值被更新,进程进入等待(睡眠)状态,直到敏感表中的某一信号发生变化,进程被再次激活。对于上述电路,我们同样可以采用Process语句来进行描述。,Process语句示例,architecturem2ofexam1isSignaltmp:std_logic;beginprocessbegintmp=aandb;endprocess;d=tmp;processbegine=tmporc;endprocess;endm2;,(5)Block(块)语句,当我们设计一个比较复杂的电路时,为了使设计简单化,可以将其分为几个部分分别进行设计,每个部分设计完成后,再将其组合成我们需要的电路。这种方法称为模块化设计方法。这样,使得整个设计工作更加容易实现,同时程序代码的维护性、纠错性都能得到提高。采用模块化设计时,当设计一个模块时,我们就要用到Block语句。,语法格式:BlockLabel:Block数据对象定义部分BeginEndBlock;,(5)Block(块)语句,libraryieee;useieee.std_logic_1164.all;entityexam1isport(a,b,c:instd_logic;d,e:outstd_logic);endexam1;architecturem1ofexam1isbeginBlock_1:BlockBegind信号A1,元件信号B=信号B1,);注意!元件标号是必需的。,Component例化语句,Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntityfulladderisPort(Ci:instd_logic;a,b:instd_logic;s:outstd_logic;Co:outstd_logic);Endfulladder;Architecturem1offulladderisSignaltmp:std_logic_vector(1downto0);Begintmpx(0),b=y(0),s=sum(0),co=c(1);U2:fulladderPortmap(c(1),x(1),y(1),sum(1),c(2);U3:fulladderPortmap(c(2),x(2),y(2),sum(2),c(3);U4:fulladderPortmap(c(3),x(3),y(3),sum(3),c(4);Cout=c(4);Enda;,Component例化示例,For-Generate语句,For-Generate语句用于生成一组信号赋值或元件例化语句。语法格式:generate_label:-必须的forindex_variableInrangegeneratestatement;statement;endgenerate;,则上面的四位加法器可以这样来实现:其它相同,上面四条赋值语句可以这样来代替:Generate_label:ForiIn0to3GenerateBitadder:fulladderPortmap(c(i),x(i),y(i),sum(i),c(i+1);Endgenerate;,For-Generate语句,Generic语句,通过引入一个参数n使得我们设计的加法器更加具有通用性,参数n代表加法器中相加的位数,在VHDL中,这样的参数称为Generic(类属)。通常定义在实体描述和元件声明中。定义格式:Generic(参数名:数据类型:=表达式);例如:Generic(m:integer:=7);,Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntityadderisGeneric(n:integer:=4);Port(Cin:instd_logic;x,y:instd_logic_vector(n-1downto0);sum:outstd_logic_vector(n-1downto0);Cout:outstd_logic);Endadder;,Generic语句示例N位全加器,ArchitectureaofadderisSignalc:std_logic_vector(0ton);ComponentfulladderPort(ci,a,b:instd_logic;s,co:outstd_logic);Endcomponent;Beginc(0)=cin;Generate_label:ForiIn0ton-1GenerateBitadder:fulladderPortmap(c(i),x(i),y(i),sum(i),c(i+1);Endgenerate;Cout8)Portmap(cin1,x1,y1,sum1,cout1);Enda;-若元件声明时已经赋值,则Nadder:adderPortmap(cin1,x1,y1,sum1,cout1);,Genericmap(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(过程)调用语句,(1)Process语句,Process内的顺序语句可以是:Process-label:Process(Sensitivitylist)Variabledeclarations-变量声明BeginwaituntilstatementvariableassignmentstatementsifstatementscasestatementsProcedure调用语句EndProcess;,(2)If-Else语句,Ifexpression1Thenstatement1;statement;Elsifexpression2Thenstatement2;statement;Elsestatement3;statement;Endif;,语法格式:,If-Else语句示例,例如:IfSel=“01”thenf=x1;elsifSel=“10”thenfstatement2;statement;Whenothers=statement3;statement;Endcase;,语法格式:,Case-When语句示例,CaseSelIsWhen“00”=ffff-s=2ors=3ors=4PPnull;Endcase;,(5)For-Loop语句,For-Loop为循环语句,可以使其所包含的顺序语句被循环执行,它类似于并行语句中For-generate生成语句。语法格式为:loop_label:Forvariable_nameInrangeLoopStatement;Statement

温馨提示

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

评论

0/150

提交评论