VHDL与数字电路设计_第1页
VHDL与数字电路设计_第2页
VHDL与数字电路设计_第3页
VHDL与数字电路设计_第4页
VHDL与数字电路设计_第5页
已阅读5页,还剩301页未读 继续免费阅读

下载本文档

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

文档简介

VHDL与数字电路设计主讲:崔

北京工业大学电控学院电工电子中心2005年9月11精选2021版课件目录

概述第一章VHDL的程序结构和软件操作

第二章

数据类型与数据对象的定义第三章

并行赋值语句第四章顺序赋值语句第五章组合逻辑电路的设计第六章时序逻辑电路的设计第七章子程序、库和程序包第八章CPLD和FPGA的结构与工作原理第九章数字钟电路的设计

2精选2021版课件本节主要内容传统数字电路设计方法EDA设计方法PLD器件

PLD器件设计流程文本设计输入—VHDL程序设计3精选2021版课件数字电子技术的基本知识回顾组合逻辑电路

编码器、译码器、数据选择器、加法器、数值比较器等时序逻辑电路同步时序逻辑电路异步时序逻辑电路寄存器、移位寄存器、计数器、序列信号发生器4精选2021版课件一、传统设计方法(1)首先确定可用的元器件;(2)根据这些器件进行逻辑设计,完成各模块;(3)将各模块进行连接,最后形成系统;(4)而后经调试、测量观察整个系统是否达到规定的性能指标。传统的设计方法是基于中小规模集成电路器件进行设计(如74系列及其改进系列、CC4000系列、74HC系列等都属于通用型数字集成电路),而且是采用自底向上进行设计:5精选2021版课件EDA(ElectronicsDesignAutomation)即电子设计自动化技术,是利用计算机工作平台,从事电子系统和电路设计的一项技术。EDA技术为电子系统设计带来了这样的变化:(1)设计效率提高,设计周期缩短;(2)设计质量提高;(3)设计成本降低;(4)能更充分地发挥设计人员的创造性;(5)设计成果的重用性大大提高,省去了不必要的重复劳动。二、EDA设计方法

6精选2021版课件自顶向下的设计方法数字电路的EDA设计是基于PLD进行设计的,支持自顶向下的设计方法:(1)首先从系统设计入手,在顶层进行功能划分和结构设计;(2)然后再逐级设计底层的结构;(3)并在系统级采用仿真手段验证设计的正确性;(4)最后完成整个系统的设计,实现从设计、仿真、测试一体化。7精选2021版课件传统设计方法vsEDA设计方法

传统设计方法EDA设计方法自底向上手动设计软硬件分离原理图设计方式系统功能固定不易仿真难测试修改模块难移植共享设计周期长自顶向上自动设计打破软硬件屏障原理图、HDL等设计方式系统功能易改易仿真易测试修改模块可移植共享设计周期短8精选2021版课件三、PLD器件(一)出现的背景如果能把所设计的数字系统做成一片大规模集成电路,则不仅能减小电路的体积、重量、功耗,而且会使电路的可靠性大为提高。为某种专门用途而设计的集成电路叫做专用集成电路,即所谓的ASIC(ApplicationSpecificIntegratedCircuit的缩写)。

在用量不大的情况下,设计和制造这样的专用集成电路成本很高,而且设计、制造的周期也较长。

可编程逻辑器件的研制成功为解决上述问题提供了比较理想的途径。

9精选2021版课件(二)PLD概述PLD是可编程逻辑器件(ProgrammableLogicDevice)的英文缩写。可编程逻辑器件是一种数字集成电路的半成品,在其芯片上按一定排列方式集成了大量的逻辑门和触发器等基本逻辑元件。通过编程可以设置其逻辑功能。PLD编程:利用开发工具对PLD进行加工,即按设计要求将这些片内的元件连接起来,使之完成某个逻辑电路或系统的功能,成为一个专用集成电路(ASIC—ApplicationSpecificIntegratedCircuit)。

10精选2021版课件PLD开发系统PLD开发系统包括硬件和软件两部分。硬件部分:计算机、下载电缆或编程器;软件部分:集成开发系统。Altera公司:MaxplusⅡ、QuartusⅡXilinx公司:Foundation、ISELattice公司:SynarioSystem、ispEXPERTSystem11精选2021版课件四、PLD设计流程设计准备设计输入设计处理器件编程功能仿真时序仿真器件测试12精选2021版课件PLD设计准备在设计之前,首先要进行方案论证和器件选择等设计准备工作。设计者首先要根据任务要求,判断系统的可行性。系统的可行性要受到逻辑要求合理性、成本、开发条件、器件供应等方面的约束。若系统可行,则根据系统所完成的功能及复杂程度,对器件本身的资源和成本、工作速度及连线的可布性等方面进行权衡,选择合适的设计方案和合适的器件类型。13精选2021版课件设计输入将所设计的电路的逻辑功能按照开发系统要求的形式表达出来的过程称为设计输入。通常,设计输入有如下三种方式:(1)原理图输入方式适用于对系统及各部分电路很熟悉的场合。(2)硬件描述语言输入方式硬件描述语言是用文本方式描述设计,硬件描述语言有ABEL、AHDL、VHDL、Verilog等,其中VHDL和Verilog已成为IEEE标准。(3)波形输入方式14精选2021版课件设计处理逻辑优化把逻辑描述转变为最适合在器件中实现的形式,优化使设计所占用的资源最少。逻辑综合根据设计描述,对给定的硬件结构组件,最终获得门级电路甚至更底层的电路描述文件,即将多个模块化设计文件合并为一个网表文件。适配确定优化后的逻辑能否与器件中的宏单元和I/O单元适配。分割将大的设计分割为多个便于器件内部资源实现的逻辑小块的形式。15精选2021版课件设计校验设计校验过程包括功能仿真和时序仿真。

功能仿真时序仿真16精选2021版课件器件编程器件编程就是将开发系统生成的目标文件下载到可编程逻辑器件中,来定义内部模块的逻辑功能以及它们的相互连接关系。

两种编程方式:编程器下载电缆17精选2021版课件PLD开发系统PLD开发系统包括硬件和软件两部分。硬件部分:计算机、下载电缆或编程器;软件部分:集成开发系统。Altera公司:MaxplusⅡ、QuartusⅡXilinx公司:Foundation、ISELattice公司:SynarioSystem、ispEXPERTSystem18精选2021版课件设计举例设计内容:十进制计数器电路设计。PLD器件:ACEX1K系列的EP1K30QC208。开发系统:MAX+plusⅡ系统。编程方式:下载电缆。实验下载板19精选2021版课件设计过程1、设计输入VHDL演示12、逻辑验证演示23、设计处理引脚设定演示34、器件编程连接下载电缆演示41/23/202420三、PLD电路设计的特点1、设计简单,方便;2、电路系统可以集成在一片芯片上;3、电路设计不依赖于器件进行设计;4、电路系统很容易完善和升级。器件选择:(1)电路系统所完成的功能及复杂程度;(2)器件本身的资源和成本、性能参数、器件编程工艺等方面进行权衡。21精选2021版课件

VHDL是非常高速集成电路硬件描述语言(VeryHighspeedIntegratedCircuitHardwareDescriptionLanguage)的英文缩写。五、文本设计输入—VHDL程序设计语法和风格:(1)类似与现代高级编程语言,如C语言。(2)VHDL描述的是硬件,它包含许多硬件特有的结构。22精选2021版课件VHDL设计VS电路图设计VHDL与电路图设计电路的方式不同,和电路图设计方式相比:(1)易于修改;(2)设计能力更强;(3)VHDL语言很方便:独立于器件设计;相同的程序代码可以用于不同厂家生产的器件。

23精选2021版课件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程序24精选2021版课件VHDL程序的基本结构(1)LIBRARY和PACHAGE声明区;(2)ENTITY定义区;(3)ARCHITECTURE定义区;25精选2021版课件Library(库)是用于存放预先编译好的Package(程序包)。Package(程序包)中定义了基本的常数,数据类型,元件及子程序等。

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

Library

库名;

Use

库名.PACKAGE名.All;(1)LIBRARY和PACKAGE声明区26精选2021版课件

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

is

Port(a:

inbit;

b:inbit;c:outbit);End

实体名;(2)ENTITY定义区端口名数据类型端口模式27精选2021版课件端口模式(MODE)有以下几种类型:

IN;OUT;INOUT;BUFFER

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

INOUTBUFFERINOUT(2)ENTITY定义区28精选2021版课件(3)ARCHITECTURE定义区

实体的实现。即说明电路执行什么动作或实现功能。定义格式:

Architecture结构体名of实体名is

[声明语句;(内部信号、变量、常数,元件,子程序声明)]Begin并行描述语句;End结构体名;29精选2021版课件二输入与门电路设计范例

abc电路真值表abc00010001011130精选2021版课件二输入与门电路设计范例Librarystd;Usestd.standard.all;Entityand2is

Port(a:inbit;b:inbit;c:outbit);Endand2;--实体定义结束。

双减号--为VHDL程序的注释符,类似C语言中的//注释符。31精选2021版课件二输入与门电路设计范例ArchitectureNaofand2isBegin

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

EndNa;--结构体NaArchitectureNbofand2is

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

--结构体Nb32精选2021版课件第一章VHDL的程序结构和软件操作

1-1VHDL程序的基本结构1-2Max+plusⅡ的操作33精选2021版课件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程序34精选2021版课件1-1VHDL程序的基本结构(1)LIBRARY和PACHAGE声明区;(2)ENTITY定义区;(3)ARCHITECTURE定义区;(4)CONFIGURATION定义区。35精选2021版课件Library(库)是用于存放预先编译好的Package(程序包)。Package(程序包)中定义了基本的常数,数据类型,元件及子程序等。

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

Library

库名;

Use

库名.PACKAGE名.All;(1)LIBRARY和PACKAGE声明区36精选2021版课件

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

is

Port(a:

inbit;

b:inbit;c:outbit);End

实体名;(2)ENTITY定义区端口名数据类型端口模式37精选2021版课件(2)ENTITY定义区标识符的定义原则:(1)标识符由字母、数字和下划线组成,a7_;(2)在标识符不区分大小写,ab和AB是一样的;(3)第一个字符必须是字母,即a666;(4)不允许有两个连续的下划线,a__b错误;(5)末尾不能是下划线,mname_错误;(6)标识符不能和关键字相同,如Entity,is等。38精选2021版课件端口模式(MODE)有以下几种类型:

IN;OUT;INOUT;BUFFER

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

INOUTBUFFERINOUT(2)ENTITY定义区39精选2021版课件(3)ARCHITECTURE定义区

定义了实体的实现。即电路的具体描述,说明电路执行什么动作或实现功能。定义格式:

Architecture结构体名of实体名is

[声明语句;(内部信号、变量、常数,元件,子程序声明)]Begin并行描述语句;End结构体名;40精选2021版课件(4)CONFIGURATION定义区

一个完整VHDL电路设计必须有一个实体和对应的结构体,即实体和结构体对构成一个完整的VHDL设计。一个实体可对应一个结构体或多个结构体,即一个实体可以有不同的描述方式。作用:当实体有多个结构体时,系统默认实体选用最后一个结构体,利用CONFIGURATION语句可以任意选择采用哪一个结构体。

41精选2021版课件(4)CONFIGURATION定义区定义格式:Configuration配置名of实体名isfor选用的结构体名endfor;endconfiguration配置名;42精选2021版课件二输入与门电路设计范例

abc电路真值表abc00010001011143精选2021版课件二输入与门电路设计范例Librarystd;Usestd.standard.all;Entityand2is

Port(a:inbit;b:inbit;c:outbit);Endand2;--实体定义结束。

双减号--为VHDL程序的注释符,类似C语言中的//注释符。44精选2021版课件二输入与门电路设计范例ArchitectureNaofand2isBegin

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

EndNa;--结构体NaArchitectureNbofand2is

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

--结构体Nb45精选2021版课件二输入与门电路设计范例Configurations1ofand2isfornaendfor;endconfigurations1;--结构体配置结束。46精选2021版课件1-2Max+plusⅡ系统的操作

Max+plusⅡ开发工具是美国Altera公司自行设计的一种软件工具,其全称为MultipleArrayMatrixandProgrammableLogicUserSystem。它具有原理图输入和文本输入(采用硬件描述语言)两种输入手段,利用该工具所配备的编辑、编译、仿真、时序分析、芯片编程等功能,将设计电路图或电路描述程序变成基本的逻辑单元写入到可编程的芯片中(如CPLD或FPGA芯片),作成ASIC芯片。它是EDA设计中不可缺少的一种工具。

47精选2021版课件下面我们介绍利用Max+plusⅡ系统如何实现如下操作:(1)如何编写VHDL程序(使用TextEditor);(2)如何编译VHDL程序(使用Compiler);(3)如何仿真验证VHDL程序(使用WaveformEditor,Simulator);(4)如何进行芯片的时序分析(使用TimingAnalyzer);(5)如何安排芯片脚位(使用FloorplanEditor);(6)如何下载程序至芯片(使用Programmer)。1-2Max+plusⅡ系统的操作48精选2021版课件(1)如何编写VHDL程序a.打开文本编辑器;File/new/Texteditorfileb.编写VHDL程序;c.保存文件,<1>文件名和定义的实体名必须相同,<2>文件扩展名为VHD,<3>文件存盘的目录不应是根目录或桌面,建议存放在Max2work或Maxplus2目录,或其子目录。49精选2021版课件(2)如何编译VHDL程序a.打开需要编译的文件;b.设置工程到目前打开的文件;

File/Project/SetProjecttoCurrentFile,c.打开编译器;点击主菜单MAX+plusⅡ/Compiler选项。

d.选定VHDL源文件的版本;Interfaces/VHDLNetlistReaderSettings…

e.打开编译器进行编译。50精选2021版课件(3)如何仿真验证VHDL程序a.打开波形编辑器(WaveformEditor);b.确定仿真持续时间(File/EndTime);c.将输入输出端口名选入波形编辑器;d.编辑输入信号波形;e.保存仿真波形文件;f.打开仿真器MAX+plusⅡ\Simulator进行仿真。在仿真结束后打开仿真波形文件(点击右下角的OpenSCF按钮)即可以显示仿真结果。51精选2021版课件(4)如何进行芯片的时序分析a.选择要下载的器件型号;点击主菜单的Assign/Device项得到Device对话框。在DeviceFamily框中选择芯片系列,在Devices选择框下选择具体的芯片名,最后点击OK按钮。b.再编译一次;c.打开时序分析器(TimingAnalyzer);d.点击Start进行时序分析。52精选2021版课件(5)如何安排芯片脚位a.打开芯片脚位设置窗口;点击主菜单Assign/Pin/Location/Chip,出现脚位设置对话框;;b.将实体定义的端口名字和下载芯片的管脚进行具体对应;在NodeName框中输入我们定义的实体端口名字,然后在Pin列表选项框中输入下载芯片的管脚序号,再点击对话框右下角的Add按钮,将所有端口设置完成以后,点击Ok按钮,则实现实体端口和下载芯片的管脚的对应;

c.再编译一次,将生成可以下载的文件(And2.Sof)。53精选2021版课件(6)如何下载程序至芯片a.将下载电缆与计算机并口相连,然后给芯片通电;b.打开编程器Programmer;Options/HardwareSetup,在HardwareType选择ByteBlaster(MV)方式,则在ParallelPort处显示LPT1,单击OK钮返回Programmer窗口。

c.下载方式选择;d.选择下载的芯片类型和要下载的文件(选择JTAG/MutiDevicJTAGChainSetup)。e.点击Configure进行下载,将程序写入芯片中。54精选2021版课件第二章

数据类型与数据对象的定义2-1数据类型2-2数据对象的定义2-3信号运算符2-4信号属性55精选2021版课件2-1数据类型在VHDL程序中,我们经常会遇到这样的语句:SignalA:std_logic;VariableB:std_logic_vector(7downto0);ConstantC:integer;数据对象类型数据类型数据对象名56精选2021版课件

2-1-1逻辑数据类型

(1)布尔代数(Boolean)型;(2)位(Bit);(3)位数组类型(Bit_Vector)在std库的standard程序包中进行定义。typeBIT_VECTORisarray(NATURALrange<>)ofBIT;typeBITis(‘0’,‘1’);typeBOOLEANis(FALSE,TRUE);57精选2021版课件(4)标准逻辑型(Std_Logic);

TypeSTD_LOGICis(‘U’,

--Uninialized;未初始化

‘X’,

--Forcingunknown;浮接不定

‘0’,

--Forcing0;低电位

‘1’,

--Forcing1;高电位

‘Z’,

--HighImpedance;高阻抗

‘W’,

--WeakUnknown;弱浮接

‘L’,

--Weak0;弱低电位

‘H’,

--Weak1;弱高电位

‘-’,

--Don’tcare;不必理会);(5)标准逻辑数组类型(Std_Logic_vector);在ieee库的std_logic_1164程序包中定义。TYPEstd_logic_vectorISARRAY(NATURALRANGE<>)OFstd_logic;58精选2021版课件

2-1-2数值数据类型(1)整数(Integer);a.正整数(POSITIVE)b.自然数(NATURAL)在std库的standard程序包中进行定义。subtypePOSITIVEisrange1toINTEGER’High;TypeINTEGERisrange–2147483648to2147483647;subtypeNATURALisrange0toINTEGER’High;59精选2021版课件(2)实数(Real)(3)有符号数(Signed)无符号数(Unsigned)在ieee库的std_logic_arith程序包中定义。typeREALisrange–1.7E38to1.7E38;typeUNSIGNEDisarray(NATURALrange<>)ofSTD_LOGIC;typeSIGNEDisarray(NATURALrange<>)ofSTD_LOGIC;SIGNED

的最高位为符号位,其余位为数值位,数值位为补码形式。如:符号数”1001”表示-7。60精选2021版课件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<='1'whena<belse'0';endm1;当定义成无符号类型时,若a<=”1000”,b=’0001’,即a=8,b=1则结果c=’0’;当定义成有符号类型时,若a<=”1000”,b=’0001’,则a=-8,b=1,则结果c=’1’。61精选2021版课件

2-1-3列举和数组数据类型

(1)列举数据类型(EnumeratedTypes)定义格式:Type列举名称is(元素1,元素2,…);(2)数组数据类型(ArrayTypes)定义格式:Type数组名称isArray(range<>)of数据类型;62精选2021版课件2-1-4数据类型的转换在VHDL语言里,不同类型的数据信号之间不能互相赋值。当需要不同类型数据之间传递信息时,就需要类型转换函数将其中的一种类型数据转换为另一中数据类型后,再进行信号的传递。例如:SignalY:Std_logic_vector(7downto0);

SignalX:Integerrange0to255;Y<=CONV_STD_LOGIC_VECTOR(X,8);转换函数有两个参数,被转换的对象和转换后的位数。

63精选2021版课件常用的数据类型转换函数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中定义64精选2021版课件2-2数据对象的定义常用的数据对象有三种:常数(Constant)信号(Signal)变量(Variable)

65精选2021版课件2-2-1常数的定义(1)将数据对象定义为常数,一方面希望该数据对象的值不会被改变;另一方面,为了提高程序的可读性。(2)常数为全局量。(3)常数在程序包说明、实体说明、结构体描述、过程说明、函数调用中使用。(4)常数的定义格式:Constant

常数名:数据类型:=常数值;

如:ConstantD1:Integer:=3;注意!常数定义的同时进行赋初值。66精选2021版课件常数的应用示例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;67精选2021版课件2-2-2信号的定义(1)“信号”数据对象,代表电路内部信号或连接线路,其在元件之间起互连作用。注意!信号定义的时候尽管可以直接赋初值,但系统往往忽略。建议信号对象定义后再进行赋值。(2)信号为全局量。(3)在实体说明、结构体描述和程序包说明中使用。(4)信号的定义格式:Signal信号名:数据类型;(5)信号赋值的语法格式为:信号名<=表达式;如:SignalS1:Std_logic_vector(3Downto0);S1<=“0000”;68精选2021版课件2-2-3变量的定义(1)“变量”数据对象,它用于对中间数据的临时存储,并不一定代表电路的某一组件。注意!变量定义的时候尽管可以直接赋初值,但系统往往忽略。建议变量对象定义后再进行赋值。(2)变量为局部量。(3)仅限于进程(Process)或子程序中使用。(4)变量的定义格式:Variable变量名:数据类型;

(5)变量赋值的语法格式为:目标信号值:=表达式;如:VariableS1:Std_logic_vector(3Downto0);S1:=“0000”;69精选2021版课件libraryieee;useieee.std_logic_1164.all;entitybcvisport(a,b,c:instd_logic;x,y:outstd_logic);endbcv;architecturem2ofbcvisbeginprocess(a,b,c)variabled:std_logic;begin

d:=a;x<=cxord;

d:=b;y<=cxord;endprocess;endm2;ABCXY例一结果:x<=cxorb,y<=cxorbx<=cxora,y<=cxorbarchitecturem1ofbcvissignald:std_logic;beginprocess(a,b,c)begin

d<=a;

--ignoredx<=cxord;

d<=b;y<=cxord;endprocess;endm1;70精选2021版课件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;beginifcp'eventandcp='1'thend<=ip;op<=d;e:=ip;oq<=e;endif;endprocess;endm1;例二D触发器在进程中,信号赋值只有在过程结束时起作用,而变量赋值是立即进行的。71精选2021版课件2-2-4信号和变量的比较(1)信号和变量的对应关系不同:信号代表电路内部信号或连接线路;而变量则不是。(2)信号和变量声明的位置不同:信号声明在子程序、进程的外部;而变量声明在子程序、进程的内部。(3)信号为全局量,而变量只在定义它的域中才可见。因此,变量不能在两个进程之间传递信息。(4)在一个进程中多次为一个信号赋值时,只有最后一个值会起作用;而变量则不同,每次赋值都会改变它的值。(5)赋值不同。在进程中,信号赋值只有在进程结束时起作用,而变量赋值是立即进行的。而且赋值符号不同:信号赋值为“<=”,变量赋值为“:=”。72精选2021版课件Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;一位BCD码的加法器Entitybcdadderis

Port(a,b:instd_logic_vector(3downto0);result:outstd_logic_vector(4downto0));Endbcdadder;ArchitectureNaofbcdadderis

constantadjnum:integer:=6;--常数定义signalbinadd:std_logic_vector(4downto0);--信号

Beginbinadd<=a+b;--两数相加process(binadd)--对两数和进行处理variabletmp:integerrange0to6;--变量定义beginifbinadd>9thentmp:=adjnum;elsetmp:=0;endif;result<=binadd+tmp;endprocess;EndNa;73精选2021版课件

2-3信号运算符

VHDL提供了四种类型运算符号:逻辑运算符关系运算符算术运算符连接运算符74精选2021版课件VHDL运算符——逻辑运算符

and逻辑与

or 逻辑或

nand 与非

nor或非

xor异或

xnor 同或

not 逻辑非上述逻辑运算在库ieee的程序包std_logic_1164中定义。

75精选2021版课件VHDL运算符——关系运算符

= 等于

/= 不等于

< 小于

<= 小于或等于

> 大于

>= 大于或等于

注:其中‘<=’操作符也用于表示信号的赋值操作。上述运算在库ieee的程序包std_logic_arith中定义。76精选2021版课件VHDL运算符——算术运算符

+ 加

- 减

* 乘

/ 除

** 乘方

mod 求模

rem 求余

abs 求绝对值

在库ieee的程序包std_logic_arith中定义。

77精选2021版课件VHDL运算符——连接运算符

& 连接符,将两个数据对象或矢量连接成维数更大的矢量,它可给代码书写带来方便。例如:vabc=a&b&c;如果a=‘1’,b=‘0’,c=‘1’,则vabc=“101”。78精选2021版课件(1)数值类属性:(数组类型的数据对象)数值类属性有‘left,‘right,‘low,‘high,‘length。其中用符号“‘”隔开对象名及其属性。left表示数组的左边界;right表示数组的右边界;low表示数组的下边界;high表示数组的上边界;length表示数组的长度。2-4数据对象属性79精选2021版课件如: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;left表示数组的左边界;right表示数组的右边界;low表示数组的下边界;high表示数组的上边界;length表示数组的长度。80精选2021版课件(2)‘event属性:‘event属性,它的值为布尔型,如果刚好有事件发生在该属性所附着的信号上(即信号有变化),则其取值为Ture,否则为False。利用此属性可决定时钟信号的变化情况,即时钟是否发生。

2-4数据对象属性81精选2021版课件(2)‘Event属性:例如:时钟边沿表示

signalclk:in

std_logic;

则clk’event

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

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

falling_edge(clk)表示时钟的下降沿这两个函数分别在库ieee的程序包Std_logic_1164中定义。2-4数据对象属性82精选2021版课件并行语句一般处于进程(PROCESS)的外部。所有并行语句都是并行执行的,即与它们出现的先后次序无关。并行语句有三个特点:a.所有语句的执行是并行的;b.每条语句的执行和其所在的位置无关;c.并行语句的输出仅仅依赖于输入,没有其它的限制条件。第三章

并行赋值语句

83精选2021版课件第三章

并行赋值语句(1)直接赋值语句:<=赋值运算符(2)条件式信号设置语句:When-Else(3)选择式信号设置语句:With-Select-When(4)Process(进程)语句(5)Block(块)语句(6)函数调用语句(后面章节讲)(7)Component(元件)例化语句(8)For-Generate语句Generic的使用84精选2021版课件(1)直接赋值语句:<=直接赋值语句的格式:Signal_name<=expression;如:SignalA,B:std_logic_vector(7downto0);A<=”0000000”;B<=”1000000”;我们也可以这样赋值:A<=(others=>’0’);结果信号A的每一位的值都为0。B<=(‘1’,others=>’0’);信号对象的位数很多时,采用others来赋值很方便。85精选2021版课件<=示例libraryieee;useieee.std_logic_1164.all;Entitytest1IsPort(a,b:instd_logic;c,d:outstd_logic);endtest1;architecturetest1_bodyoftest1isbegin

同时执行d<=aorb;

c<=aandb;endtest1_body;输出仅仅依赖于输入,没有其它的限制条件。

每条语句的执行和其所在的位置无关。

ABCD86精选2021版课件(2)When-Else条件式信号设置语句它的语法格式为:[label:]Signal_name<=expression1Whenlogic_expression1Else{expression2Whenlogic_expression2Else}expressionn;例如:f<=’1’whenx1=x2else‘0’;87精选2021版课件When-Else语句示例Libraryieee;Useieee.std_logic_1164.all;Entityxor2isPort(x,y:instd_logic;z:outstd_logic);Endxor2;Architectureaofxor2isBeginz<='1'when(x='0'andy='1')else'1'when(x='1'andy='0')else'0';Enda;ZXY88精选2021版课件(3)With-Select-When选择式信号设置语句[label:]WithexpressionSelectSignal_name<=expressionWhenconstant_value{,{expressionWhenconstant_value};89精选2021版课件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&y;WithtmpSelectz<=‘1’when“01”,--注意结束为“,”不是“;”'1'when"10",'0'whenothers;Enda;ZXY90精选2021版课件When-else和With-select-When语句的区别

(1)With-select-When语句中When后的constant_value必须是互不相同的;(2)而When-else语句中When后的logic_expression则不需要这样的严格条件;(3)When-else语句中When后的logic_expression的优先权次序为由先到后排列。91精选2021版课件优先编码器示例Libraryieee;Useieee.std_logic_1164.all;EntitypriorityisPort(r1,r2,r3:instd_logic;f:outstd_logic_vector(1downto0));Endpriority;ArchitectureaofpriorityisBeginf<=‘01'when(r1='1')else'10'when(r2='1')else'11'when(r3='1')else'00';Enda;Ifr1=’1’,f=”01”;Ifr2=’1’andr1/=’1’,f=”10”;Ifr3=’1’andr1/=’1’andr2/=’1’,f=”11”;如果三个输入都为0,f=”00”。r1r3r2f92精选2021版课件(4)Process语句(1)一个结构体当中可以有多个Process语句,Process语句是同时执行的并行语句。(2)Process内的语句却是顺序执行的顺序语句。(3)多进程之间的信息通过信号对象来传递。Process语句的格式为:[Processlabel:]Process[(Sensitivitylist)][Variabledeclarations]Begin顺序语句;EndProcess[Processlabel];

93精选2021版课件(4)Process语句敏感表(Sensitivitylist)包括进程的一些信号,当敏感表中的某个信号变化时进程才被激活,进程内的顺序语句被执行。当进程结束时,进程内的输出信号值被更新,进程进入等待(睡眠)状态,直到敏感表中的某一信号发生变化,进程被再次激活。对于上述电路,我们同样可以采用Process语句来进行描述。94精选2021版课件Process语句示例architecturem2ofexam1isSignaltmp:std_logic;beginprocessbegintmp<=aandb;endprocess;d<=tmp;processbegine<=tmporc;endprocess;endm2;ABDCE95精选2021版课件(5)Block(块)语句

当我们设计一个比较复杂的电路时,为了使设计简单化,可以将其分为几个部分分别进行设计,每个部分设计完成后,再将其组合成我们需要的电路。这种方法称为模块化设计方法。这样,使得整个设计工作更加容易实现,同时程序代码的维护性、纠错性都能得到提高。采用模块化设计时,当设计一个模块时,我们就要用到Block语句。96精选2021版课件语法格式:BlockLabel:Block[数据对象定义部分]Begin<BlockStatementPart>EndBlock;(5)Block(块)语句

97精选2021版课件libraryieee;useieee.std_logic_1164.all;entityexam1isport(a,b,c:instd_logic;d,e:outstd_logic);endexam1;architecturem1ofexam1isbeginBlock_1:BlockBegind<=aandb;endblock;Block_2:BlockBegine<=(aandb)orc;endblock;endm1;ABDCEBlock语句示例98精选2021版课件Component(元件)例化语句

(1)Block语句可以使VHDL程序更加模块化、功能化。但这样的做法要求在同一程序中,若是重复使用时,必须重写一次。Block语句解决了这样的重复编写问题。(2)元件也是完整的VHDL设计,作为底层设计,通过元件声明,使之可在其他模块中被调用。(3)元件声明可放在程序包中,也可在某个设计的结构体中声明。

99精选2021版课件语法格式:Component元件名Port(端口定义);--同元件实现时的实体的port部分EndComponent;元件例化指元件的调用,它的语法格式为:Label:

元件名PortMap(端口映射);Component(元件)例化语句

100精选2021版课件元件例化时端口映射或关联有两种方式:a.位置对应方式直接由输入信号和元件信号的对应位置进行映射。即:元件标号:元件名PortMap(信号A1,信号B1,…);b.名字直接对应我们使用=>映射符号进行输入信号和元件信号之间的映射,那么位置可以不对应。即:

元件标号:元件名PortMap(元件信号A=>信号A1,元件信号B=>信号B1,…);注意!元件标号是必需的。Component例化语句

101精选2021版课件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);Begintmp<=('0'&a)+b+ci;s<=tmp(0);co<=tmp(1);Endm1;一位全加器

CibasCo102精选2021版课件Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntityadderisPort(Cin:instd_logic;x,y:instd_logic_vector(3downto0);sum:outstd_logic_vector(3downto0);Cout:outstd_logic);Endadder;四位加法器103精选2021版课件ArchitectureaofadderisSignalc:std_logic_vector(0to4);ComponentfulladderPort(ci,a,b:instd_logic;s,co:outstd_logic);endcomponent;Beginc(0)<=cin;U1:fulladderPortmap(c(0),x(0),y(0),sum(0),c(1));--U1:fulladderPortmap(ci=>c(0),a=>x(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例化示例

104精选2021版课件For-Generate语句For-Generate语句用于生成一组信号赋值或元件例化语句。语法格式:generate_label:

--必须的forindex_variableInrangegenerate

statement;[statement;]endgenerate;105精选2021版课件则上面的四位加法器可以这样来实现:其它相同,上面四条赋值语句可以这样来代替:Generate_label:ForiIn0to3GenerateBitadder:fulladderPortmap(c(i),x(i),y(i),sum(i),c(i+1));Endgenerate;For-Generate语句106精选2021版课件Generic语句

通过引入一个参数n使得我们设计的加法器更加具有通用性,参数n代表加法器中相加的位数,在VHDL中,这样的参数称为Generic(类属)。

通常定义在实体描述和元件声明中。

定义格式:Generic(参数名:数据类型[:=表达式]);例如:Generic(m:integer:=7);107精选2021版课件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位全加器108精选2021版课件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;Cout<=c(n);Enda;109精选2021版课件Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntitynadderisPort(Cin1:instd_logic;x1,y1:instd_logic_vector(7downto0);Sum1:outstd_logic_vector(7downto0);Cout1:outstd_logic);Endnadder;带Generic的元件例化—N位全加器110精选2021版课件ArchitectureaofnadderisComponentadderGeneric(n:integer);--也可在此进行影射Generic(n:integer:=8);Port(cin:instd_logic;x,y:instd_logic_vector(n-1downto0);sum:outstd_logic_vector(n-1downto0);cout:outstd_logic);endcomponent;BeginNadder:adderGenericmap(n=>8)Portmap(cin1,x1,y1,sum1,cout1);Enda;

--若元件声明时已经赋值,则Nadder:adderPortmap(cin1,x1,y1,sum1,cout1);Genericmap(8)111精选2021版课件(1)顺序语句每一条语句的执行都是顺序进行的。如同高级编程语言中的命令执行方式,一次一条命令,按书写顺序由上而下执行。(2)顺序语句只能出现在进程和子程序内部。(3)由于顺序语句的次序很重要,因此,顺序语句要与并行语句分割开,这可以通过Process语句来实现。Process语句出现在结构体中,它将其内部的语句进行封装。第四章顺序赋值语句顺序语句有三个特点:a.所有语句的执行是顺序进行的;b.每条语句的执行和其所在的位置有关;c.顺序语句的输出不仅依赖于输入,而且还受位置的影响。112精选2021版课件第四章顺序语句(1)Process语句

(2)If-Else语句

(3)Case-When语句

(4)Null语句

(5)For-Loop语句

(6)Waituntil语句

(7)变量赋值语句

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

113精选2021版课件(1)Process语句Process内的顺序语句可以是:[Process-label:]Process[(Sensitivitylist)][Variabledeclarations]--变量声明Begin[waituntilstatement][variableassignmentstatements][ifstatements][casestatements][Procedure调用语句]EndProcess;114精选2021版课件(2)If-Else语句Ifexpression1Then

statement1;[statement;][Elsifexpression2Then

温馨提示

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

评论

0/150

提交评论