资源预览内容
第1页 / 共136页
第2页 / 共136页
第3页 / 共136页
第4页 / 共136页
第5页 / 共136页
第6页 / 共136页
第7页 / 共136页
第8页 / 共136页
第9页 / 共136页
第10页 / 共136页
亲,该文档总共136页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
VHDL设计方法设计方法用VHDL语言实现可编程数字系统设计VHDL设计方法设计方法lVHDL概述lVHDL的设计单元lVHDL的基本语法结构第一部分第一部分VHDL 概述VHDL的含义的含义VHSIC (Very High Speed Integrated Circuit)HardwareDescriptionLanguageVHDL历史历史l1982年,年, 诞生于美国国防部赞助的诞生于美国国防部赞助的VHSIC项目项目l1987年底,年底,VHDL被被IEEE和美国国防部确认为标和美国国防部确认为标准硬件描述语言准硬件描述语言 ,即,即IEEE-1076(简称简称87版版) l1993年,年,IEEE对对VHDL进行了修订,公布了新版进行了修订,公布了新版本的本的VHDL,即即IEEE标准的标准的1076-1993(1164)版本)版本 l1996年,年,IEEE-1076.3成为成为VHDL综合标准综合标准VHDL特点特点l l与其他的硬件描述语言相比,与其他的硬件描述语言相比,与其他的硬件描述语言相比,与其他的硬件描述语言相比,VHDLVHDL具有更强的行为描述能具有更强的行为描述能具有更强的行为描述能具有更强的行为描述能力力力力 l lVHDLVHDL丰富的仿真语句和库函数,使得在设计的早期就能查丰富的仿真语句和库函数,使得在设计的早期就能查丰富的仿真语句和库函数,使得在设计的早期就能查丰富的仿真语句和库函数,使得在设计的早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟验设计系统的功能可行性,随时可对设计进行仿真模拟验设计系统的功能可行性,随时可对设计进行仿真模拟验设计系统的功能可行性,随时可对设计进行仿真模拟 l lVHDLVHDL语句的行为描述能力和程序结构决定了他具有支持大语句的行为描述能力和程序结构决定了他具有支持大语句的行为描述能力和程序结构决定了他具有支持大语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能规模设计的分解和已有设计的再利用功能规模设计的分解和已有设计的再利用功能规模设计的分解和已有设计的再利用功能l l对于用对于用对于用对于用VHDLVHDL完成的一个确定的设计,可以利用完成的一个确定的设计,可以利用完成的一个确定的设计,可以利用完成的一个确定的设计,可以利用EDAEDA工具进工具进工具进工具进行逻辑综合和优化,并自动的把行逻辑综合和优化,并自动的把行逻辑综合和优化,并自动的把行逻辑综合和优化,并自动的把VHDLVHDL描述设计转变成门级描述设计转变成门级描述设计转变成门级描述设计转变成门级网表网表网表网表l lVHDLVHDL对设计的描述具有相对独立性,设计者可以不懂硬件对设计的描述具有相对独立性,设计者可以不懂硬件对设计的描述具有相对独立性,设计者可以不懂硬件对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进的结构,也不必管理最终设计实现的目标器件是什么,而进的结构,也不必管理最终设计实现的目标器件是什么,而进的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计行独立的设计行独立的设计行独立的设计 VHDL与其他HDL比较lVHDL“告诉我你想要电路做什么,我给你提供能实现这个功能的硬件电路”lVerilog和VHDL类似lABEL、AHDL“告诉我你想要什么样的电路,我给你提供这样的电路”典典型型的的综综合合流流程程典典型型的的仿仿真真流流程程第二部分VHDL的设计单元VHDL的设计单元lEntity(实体实体)用来说明模型的外部输入输出特征用来说明模型的外部输入输出特征lArchitecture(构造体构造体)用来定义模型的内容和功能用来定义模型的内容和功能l每一个构造体必须有一个实体与它相对应,所每一个构造体必须有一个实体与它相对应,所以两者一般成对出现以两者一般成对出现实体实体l类似一个类似一个“黑盒黑盒”,实体描述了,实体描述了“黑盒黑盒”的输的输入输出口入输出口黑盒黑盒黑盒黑盒rstrstd7:0d7:0clkclkq7:0q7:0coco实体举例ENTITYENTITY black_box black_box ISIS GenericGeneric ( ( constantconstant width : width : integerinteger := 7 := 7;); );PORTPORT ( (clkclk, , rstrst: :ININstd_logicstd_logic; ;d:d:IN IN std_logic_vectorstd_logic_vector(width(width DOWNTODOWNTO 0);0);q:q:OUTOUT std_logic_vectorstd_logic_vector(width(width DOWNTODOWNTO 0);0);co:co:OUT OUT std_logicstd_logic); );ENDEND black_box; black_box;黑盒黑盒黑盒黑盒rstrstd7:0d7:0clkclkq7:0q7:0coco关键字关键字关键字关键字类属参量类属参量类属参量类属参量端口定义端口定义端口定义端口定义端口模式端口模式端口模式端口模式端口模式端口模式端口数端口数端口数端口数端口数端口数据类型据类型据类型据类型据类型据类型实体结束实体结束实体结束实体结束Genericl l类属参量类属参量一种端口界面常数,用来规定端口的大小、一种端口界面常数,用来规定端口的大小、实体中子元件的数目等实体中子元件的数目等l l与常数不同,常数只能从内部赋值而类属参量与常数不同,常数只能从内部赋值而类属参量可以由实体外部赋值可以由实体外部赋值l l数据类型通常取数据类型通常取Integer或或Timel l综合器仅支持数据类型为整数的类属值。综合器仅支持数据类型为整数的类属值。PORTSl l端口(端口(PORT)是实体的一部分是实体的一部分PORT 类似于器件的管脚,主要用于信号的传输类似于器件的管脚,主要用于信号的传输PORT 一般有一般有 Name, Mode, 和和 Typel l端口说明格式端口说明格式PORT(SIGNAL Name:Mode Type BUS:=表达式表达式 , )端口类型IN:数据只能从端口流入实体数据只能从端口流入实体OUT:数据只能从端口流出实体数据只能从端口流出实体INOUT:数据从端口流入或流出实体数据从端口流入或流出实体BUFFER:数据从端口流出实体,同时可被数据从端口流出实体,同时可被内部反馈内部反馈Entity数据类型数据类型l lBITBIT :位类型,其值只能为位类型,其值只能为位类型,其值只能为位类型,其值只能为 0 0或或或或 1 1l lBIT_VECTORBIT_VECTOR :位矢量类型,包含一组位类型位矢量类型,包含一组位类型位矢量类型,包含一组位类型位矢量类型,包含一组位类型l lBOOLEANBOOLEAN:布尔类型,其值可为布尔类型,其值可为布尔类型,其值可为布尔类型,其值可为 TRUE TRUE或或或或 FALSEFALSEl lINTEGERINTEGER:整型,范围为整型,范围为整型,范围为整型,范围为-214783647-214783647到到到到214783647214783647(2 23232),),),),综合时,要对范围加以限制。常用于循环语句的循环次数、综合时,要对范围加以限制。常用于循环语句的循环次数、综合时,要对范围加以限制。常用于循环语句的循环次数、综合时,要对范围加以限制。常用于循环语句的循环次数、常量、数学函数或模式仿真常量、数学函数或模式仿真常量、数学函数或模式仿真常量、数学函数或模式仿真l lNaturalNatural:自然数类型,整型的子类型,含零和正整数自然数类型,整型的子类型,含零和正整数自然数类型,整型的子类型,含零和正整数自然数类型,整型的子类型,含零和正整数l lPositivePositive:正整数类型,整型的子类型,含非零和非负整数正整数类型,整型的子类型,含非零和非负整数正整数类型,整型的子类型,含非零和非负整数正整数类型,整型的子类型,含非零和非负整数l lREALREAL:浮点类型,范围为:浮点类型,范围为:浮点类型,范围为:浮点类型,范围为:-1.0-1.0-1.0-1.0E38E38E38E38到到到到1.01.01.01.0E38E38E38E38很多综合器很多综合器很多综合器很多综合器不支持该类型不支持该类型不支持该类型不支持该类型数据类型数据类型l l枚举类型:枚举类型:枚举类型:枚举类型:用户定义的数据类型用户定义的数据类型用户定义的数据类型用户定义的数据类型例:例:例:例:TYPETYPE traffic_light traffic_light ISIS (red, yellow,green ) (red, yellow,green )TYPETYPE intint ISIS RANGERANGE 0 0 TOTO 100 100l l数组类型:数组类型:数组类型:数组类型:分一维数组和二维数组,限定性和非限定性数组分一维数组和二维数组,限定性和非限定性数组分一维数组和二维数组,限定性和非限定性数组分一维数组和二维数组,限定性和非限定性数组例:例:例:例:TYPETYPE Bit_Vector Bit_Vector IS ARRAYIS ARRAY ( (Natural RANGENatural RANGE) ) OF OF Bit; Bit;TYPE TYPE Word Word IS ARRARYIS ARRARY (31 (31 downtodownto 0) 0) OFOF Bit; Bit;l lSUBTYPESUBTYPE:子类型,一般用来对其父类型加以限制子类型,一般用来对其父类型加以限制子类型,一般用来对其父类型加以限制子类型,一般用来对其父类型加以限制例:例:例:例: SUBTYPESUBTYPE Std_Logic Std_Logic ISIS resolved Std_ resolved Std_UlogicUlogicl lTIMETIME:时间类型,范围和整型一样,表达时要包括数值和时间类型,范围和整型一样,表达时要包括数值和时间类型,范围和整型一样,表达时要包括数值和时间类型,范围和整型一样,表达时要包括数值和单位两部分。单位包括:单位两部分。单位包括:单位两部分。单位包括:单位两部分。单位包括:fs fs、psps、nsns、usus、msms、secsec、minmin、hrhr。一般用于仿真一般用于仿真一般用于仿真一般用于仿真数据类型数据类型l l记录类型记录类型记录类型记录类型TYPETYPE Month_Name Month_Name ISIS (Jan,(Jan,FabFab,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);TYPETYPE date date IS RECORDIS RECORDday : Integer RANGE 1 TO 31;day : Integer RANGE 1 TO 31;month : Month_Name;month : Month_Name;year : Integer RANGE 0 to 3000;year : Integer RANGE 0 to 3000;END RECORDEND RECORD; ;VARIABLE today : date;VARIABLE today : date;today : =(15, may, 1995);today : =(15, may, 1995);Std_Logic数据类型数据类型l lIEEE 1164中定义的一种数据类型,它包含中定义的一种数据类型,它包含9种取值种取值分别为:分别为:U未初始化未初始化用于仿真用于仿真X强未知强未知用于仿真用于仿真0强强0用于综合与仿真用于综合与仿真1强强1用于综合与仿真用于综合与仿真Z高阻高阻用于综合与仿真用于综合与仿真W弱未知弱未知用于仿真用于仿真L弱弱0用于综合与仿真用于综合与仿真H弱弱1用于综合与仿真用于综合与仿真_忽略忽略用于综合与仿真用于综合与仿真Std_Logic数据类型数据类型l l它是数字电路设计的工业标准逻辑类型它是数字电路设计的工业标准逻辑类型l l它增加了它增加了VHDL语言编程、综合和仿真的灵活性语言编程、综合和仿真的灵活性l l在多值逻辑系统中在多值逻辑系统中STD_LOGIC和和 STD_LOGIC_VECTOR 用于取代用于取代 BIT 和和 BIT_VECTOR l l若电路中有三态逻辑若电路中有三态逻辑(Z) 必须用必须用STD_LOGIC 和和 STD_LOGIC _VECTOR l l要使用这种类型代码中必须申明库和程序包说明语句要使用这种类型代码中必须申明库和程序包说明语句LIBRARY ieee;USE ieee.std_logic_1164.ALL;练习一l l编写包含以下内容的实体代码编写包含以下内容的实体代码端口端口 D 为为12位输入总线位输入总线 端口端口 OE 和和 CLK 都是都是1位输入位输入端口端口 AD 为为 12位双向总线位双向总线端口端口 A为为12位输出总线位输出总线端口端口 INT 是是1位输出位输出端口端口 AS 是一位输出同时被用作内部反馈是一位输出同时被用作内部反馈my_designd11:0oeclkad11:0a11:0intas练习一答案LIBRARY LIBRARY ieeeieee; ;USE USE ieeeieee.std_logic_1164.ALL;.std_logic_1164.ALL;ENTITY my_design IS PORT (ENTITY my_design IS PORT (d:d: IN IN std_logic_vector(11 DOWNTO 0); std_logic_vector(11 DOWNTO 0);oeoe, , clkclk: :IN IN std_logic; std_logic;ad:ad: INOUT INOUT std_logic_vector(11 DOWNTO 0); std_logic_vector(11 DOWNTO 0);a:a:OUT OUT std_logic_vector(11 DOWNTO 0); std_logic_vector(11 DOWNTO 0);intint: :OUT OUT std_logic; std_logic;as:as: BUFFER std_logic);BUFFER std_logic);END my_design;END my_design;my_designd11:0oeclkad11:0a11:0intas构造体构造体l l用来描述实体的内部结构和逻辑功能用来描述实体的内部结构和逻辑功能l l必须和实体(必须和实体(ENTITY)相联系相联系l l一个实体(一个实体(ENTITY)可以有多个构造体可以有多个构造体l l构造体的运行是并发的构造体的运行是并发的l l构造体描述方式包括:构造体描述方式包括:行为描述行为描述结构描述结构描述混合描述混合描述实体和构造体之间的关系Input 1Input nOutput 1Output n实体实体A AB BC CD DSelSelMUX_OutMUX_Out2 2构构造造体体结结构构图图构造体构造体说明语句说明语句功能描述语句功能描述语句块语句块语句进程语句进程语句信号赋值语句信号赋值语句子程序调用语句子程序调用语句元件例化语句元件例化语句由一系列并行执行语句构成由一系列并行执行语句构成由一系列并行执行语句构成由一系列并行执行语句构成由一系列并行执行语句构成由一系列并行执行语句构成的组合体,它的功能是将结构体中的组合体,它的功能是将结构体中的组合体,它的功能是将结构体中的组合体,它的功能是将结构体中的组合体,它的功能是将结构体中的组合体,它的功能是将结构体中的并行语句组成一个或多个子模块的并行语句组成一个或多个子模块的并行语句组成一个或多个子模块的并行语句组成一个或多个子模块的并行语句组成一个或多个子模块的并行语句组成一个或多个子模块 定义顺序语句模块,用以将定义顺序语句模块,用以将定义顺序语句模块,用以将定义顺序语句模块,用以将定义顺序语句模块,用以将定义顺序语句模块,用以将从外部获得的信号值,或内部的运从外部获得的信号值,或内部的运从外部获得的信号值,或内部的运从外部获得的信号值,或内部的运从外部获得的信号值,或内部的运从外部获得的信号值,或内部的运算数据向其它的信号进行赋值。算数据向其它的信号进行赋值。算数据向其它的信号进行赋值。算数据向其它的信号进行赋值。算数据向其它的信号进行赋值。算数据向其它的信号进行赋值。将设计实体内的处理结果将设计实体内的处理结果将设计实体内的处理结果将设计实体内的处理结果将设计实体内的处理结果将设计实体内的处理结果向定义的信号或界面端口进行赋向定义的信号或界面端口进行赋向定义的信号或界面端口进行赋向定义的信号或界面端口进行赋向定义的信号或界面端口进行赋向定义的信号或界面端口进行赋值值值值值值用以调用过程或函数,并用以调用过程或函数,并用以调用过程或函数,并用以调用过程或函数,并用以调用过程或函数,并用以调用过程或函数,并将获得的结果赋值于信号将获得的结果赋值于信号将获得的结果赋值于信号将获得的结果赋值于信号将获得的结果赋值于信号将获得的结果赋值于信号对其它的设计实体作元件对其它的设计实体作元件对其它的设计实体作元件对其它的设计实体作元件对其它的设计实体作元件对其它的设计实体作元件调用说明,并将此元件的端口与调用说明,并将此元件的端口与调用说明,并将此元件的端口与调用说明,并将此元件的端口与调用说明,并将此元件的端口与调用说明,并将此元件的端口与其它的元件、信号或高层次实体其它的元件、信号或高层次实体其它的元件、信号或高层次实体其它的元件、信号或高层次实体其它的元件、信号或高层次实体其它的元件、信号或高层次实体的界面端口进行连接。的界面端口进行连接。的界面端口进行连接。的界面端口进行连接。的界面端口进行连接。的界面端口进行连接。构造体构造体行为描述举例行为描述举例l l2 X 8 Input AND gate:ENTITY black_box IS PORT (a, b:INstd_logic_vector(7 DOWNTO 0);y:OUTstd_logic_vector(7 DOWNTO 0);END black_box;ARCHITECTURE example OF black_box ISBEGIN y = a AND b;END example;数据对象数据对象常数常数l l指在设计中不会变的值指在设计中不会变的值l l改善代码可读性,便于代码修改改善代码可读性,便于代码修改l l必须在程序包、实体、构造体或进程的说明区必须在程序包、实体、构造体或进程的说明区域加以说明域加以说明l l一般要赋一初始值一般要赋一初始值l l保留字保留字CONSTANT例:例:CONSTANTWidth : Integer :=8数据对象信号数据对象信号l l可代表连线、内连元件、或端口可代表连线、内连元件、或端口l l用用“=”来给信号赋值来给信号赋值l lSIGNALSIGNAL Count: Bit_Vector(3 downto 0);IF Rising_Edge(clk) THENCount=Count+1;END IF;l信号在信号在Package、Entity、Architecture 中声明中声明数据对象信号数据对象信号MUXREGSIGNALSIGNALSIGNALSIGNALSIGNALPROCESSPROCESS信号举例信号举例LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY simp ISPORT(a, b, c, d : IN Std_Logic;g : OUT Std_Logic);END simp;ARCHITECTURE logic OF simp ISSIGNAL e,f : Std_Logic;BEGINe = a or b;f=not(c or d);g =e and f;END logic;a ab bc cd dg gef f端口信号端口信号端口信号端口信号在构造体内声明在构造体内声明在构造体内声明在构造体内声明的内部连接信号的内部连接信号的内部连接信号的内部连接信号信号赋值信号赋值l lSIGNAL temp : Std_Logic_Vector (7 downto 0);l l整体赋值整体赋值:temp = “10101010”;temp = x”AA” ; l l逐位赋值逐位赋值:temp(7) = 1;l l多位赋值多位赋值:l ltemp (7 downto 4) = “1010”;多位赋值多位赋值多位赋值多位赋值用双引号用双引号用双引号用双引号逐位赋值逐位赋值逐位赋值逐位赋值用单引号用单引号用单引号用单引号赋值标志赋值标志赋值标志赋值标志数据对象数据对象变量变量l l仅用于仅用于进程进程和和子程序子程序l l必须在进程和子程序的说明性区域说明必须在进程和子程序的说明性区域说明l l不能表达连线和存储元件不能表达连线和存储元件l l保留字保留字VARIABLEVARIABLE tmp : Bit;tmp:=1;变量赋值变量赋值l l整体赋值:整体赋值:temp := “10101010”;temp := x”AA” ; l l逐位赋值逐位赋值:temp(7) := 1;l l多位赋值多位赋值temp (7 downto 4) := “1010”;多位赋值多位赋值多位赋值多位赋值用双引号用双引号用双引号用双引号逐位赋值逐位赋值逐位赋值逐位赋值用单引号用单引号用单引号用单引号赋值标志赋值标志赋值标志赋值标志信号和变量的作用范围信号和变量的作用范围ARCHITECTURESIGNAL 描述描述label1: PROCESS1VARIABLE 描述描述label2: PROCESS2VARIABLE 描述描述在进程的外面声明在进程的外面声明在进程的外面声明在进程的外面声明作用范围为全局作用范围为全局作用范围为全局作用范围为全局在进程内部说明在进程内部说明在进程内部说明在进程内部说明作用范围为进程内作用范围为进程内作用范围为进程内作用范围为进程内信号和变量的区别信号和变量的区别信号信号变量变量赋值符号赋值符号=:=功能功能电路的内部连接电路的内部连接内部数据交换内部数据交换作用范围作用范围 全局,进程和进程之间全局,进程和进程之间的通信的通信进程的内部进程的内部行为行为延迟一定时间后才赋值延迟一定时间后才赋值 立即赋值立即赋值算术运算符算术运算符运算符运算符功能功能运算符运算符功能功能+加加SLL逻辑左移逻辑左移-减减SRL逻辑右移逻辑右移*乘乘SLA算术左移算术左移/除除SRA算术右移算术右移*乘方乘方ROL逻辑循环左逻辑循环左移移MOD取模取模ROR逻辑循环右逻辑循环右移移REM取余取余ABS取绝对值取绝对值关系运算符关系运算符运算符运算符功能功能=等于等于/=不等于不等于小于小于大于大于=小于等于小于等于=大于等于大于等于逻辑运算符逻辑运算符运算符运算符功能功能AND与与OR或或NAND与非与非NOR或非或非XOR异或异或XNOR异或非异或非NOT非非其他运算符其他运算符运算符运算符功能功能+正正-负负&并置并置运算优先级运算优先级*ABSNOT*/MODREM+正正 -负负+-&SLL SLA SRL SRA ROLROR=ANDOR NANDNORXORXNOR高高低低运算重载运算重载l l若两信号类型不同,不能将一个信号的值赋给若两信号类型不同,不能将一个信号的值赋给另一信号另一信号l l数据转换必须要用运算重载数据转换必须要用运算重载l l一般可用一般可用IEEE .1164中的标准重载函数实现中的标准重载函数实现LIBRARY IEEE;USE IEEE_Std_Logic_1164.all;USE IEEE_Std_Logic_Arith.all;USE IEEE_Std_Logic_unsigned.allUSE IEEE_Std_Logic_signed.all并行语句并行语句并行语句并行语句1构构造造体体并行语句并行语句2并行语句并行语句3signalsignal并行语句并行语句l l VHDL语言与传统软件描述语言最大的不同语言与传统软件描述语言最大的不同l l有多种语句格式,包括:并行信号赋值语句、进程语有多种语句格式,包括:并行信号赋值语句、进程语句、块语句、条件信号赋值语句、元件例化语句、生句、块语句、条件信号赋值语句、元件例化语句、生成语句、并行过程调用语句成语句、并行过程调用语句l l各种并行语句在结构体中的执行是同步进行的,或者各种并行语句在结构体中的执行是同步进行的,或者说是并行运行的,其执行方式与书写的顺序无关。说是并行运行的,其执行方式与书写的顺序无关。l l在执行中,并行语句之间可以有信息往来,也可以是在执行中,并行语句之间可以有信息往来,也可以是互为独立、互不相关、异步运行的互为独立、互不相关、异步运行的(如多时钟情况如多时钟情况)。l l每一并行语句内部的语句运行方式可以有两种不同的每一并行语句内部的语句运行方式可以有两种不同的方式,即并行执行方式方式,即并行执行方式(如块语句如块语句)和顺序执行方式和顺序执行方式(如进程语句如进程语句)。布尔表达式布尔表达式l lVHDL支持所有的标准逻辑运算符支持所有的标准逻辑运算符l lAND, OR, NOT, XOR, XNOR, NANDl l例:例: x =(a AND NOT(s(1) AND NOT(s(0) OR(b AND NOT(s(1) AND s(0) OR(c AND s(1) AND NOT(s(0) OR (d AND s(1) AND s(0) ;y = a OR b OR c;a ax xmuxmuxc cb bd ds s2 2With_Select_Then选择信号选择信号语句语句l l所有的所有的“WHEN”子句必须是互斥的子句必须是互斥的l l一般用一般用 “When Others”来处理未考虑到的情况来处理未考虑到的情况l l只有一个参考信号和赋值符只有一个参考信号和赋值符 (=)l l每一子句结尾是逗号,最后一句是分号每一子句结尾是逗号,最后一句是分号WITH selection_signal SELECTsignal_name = value_1 WHEN value_a, value_2 WHEN value_b, . value_n WHEN value_n, value_x WHEN OTHERS;With_Select_Then语句举例语句举例LIBRARYLIBRARY ieeeieee; ;USEUSE ieeeieee.std_logic_1164.all;.std_logic_1164.all;ENTITYENTITY cmplcmpl_ _sigsig ISISPORTPORT ( a, b,c,d,s : IN STD_LOGIC; ( a, b,c,d,s : IN STD_LOGIC;x : OUT STD_LOGIC);x : OUT STD_LOGIC);ENDEND cmplcmpl_ _sigsig; ;ARCHITECTUREARCHITECTURE logic logic OFOF cmplcmpl_ _sigsig ISISBEGINBEGIN WITHWITH s s SELECTSELECT x =a x =a WHENWHEN “00”, “00”, b b WHENWHEN “01”, “01”, c c WHENWHEN “10”, “10”, d d WHEN OTHERSWHEN OTHERS; ;a ax xmuxmuxc cb bd ds s2 2 s s s 是是是是是是 Std_LogicStd_LogicStd_Logic数据类型数据类型数据类型数据类型数据类型数据类型。 其值包括其值包括其值包括其值包括其值包括其值包括0,1,0,1,0,1,XXX,Z,Z,Z等等等等等等加加加加加加OthersOthersOthers语句语句语句语句语句语句With_Select_Then语句举例语句举例l l每个每个WHEN子句可以包含多个条件子句可以包含多个条件:WITH s SELECT x = a WHEN ”000” | “001” | “010”, b WHEN 101 | 111, c WHEN OTHERS;表示或逻表示或逻表示或逻表示或逻表示或逻表示或逻辑辑辑辑辑辑When_Else选择选择信号信号语句语句l l根据指定条件对信号赋值,条件可以为任意表达式根据指定条件对信号赋值,条件可以为任意表达式l l根据条件的出现的先后次序隐含优先权根据条件的出现的先后次序隐含优先权l l最后一个最后一个 ELSE子句隐含了所有未列出的条件子句隐含了所有未列出的条件l l每一子句的结尾没有标点,只有最后一句有分号每一子句的结尾没有标点,只有最后一句有分号signal_name =signal_name =value_1 WHEN condition1 ELSEvalue_1 WHEN condition1 ELSE value_2 WHEN condition2 ELSEvalue_2 WHEN condition2 ELSE . value_n WHEN value_n WHEN conditionnconditionn ELSE ELSE value_x;value_x;When_Else语句举例语句举例x = a when (s = “00”) else b when (s = “01”) else c when (s = “10”) else d ;a ax xmuxmuxc cb bd ds s2 2隐含了优先权隐含了优先权隐含了优先权隐含了优先权隐含了所有未列出的条件隐含了所有未列出的条件隐含了所有未列出的条件隐含了所有未列出的条件When_Else语句举例语句举例 j = j = w when (a = 1) elsew when (a = 1) else x when (b = 1) elsex when (b = 1) else y when (c = 1) elsey when (c = 1) elsez when (d = 1) elsez when (d = 1) else0 ;0 ;允许有多个允许有多个允许有多个允许有多个允许有多个允许有多个控制信号控制信号控制信号控制信号控制信号控制信号进程语句进程语句l lVHDLVHDL中最重要的语句,具有并行和顺序行为的双重性中最重要的语句,具有并行和顺序行为的双重性中最重要的语句,具有并行和顺序行为的双重性中最重要的语句,具有并行和顺序行为的双重性l l进程和进程语句之间是并行关系进程和进程语句之间是并行关系进程和进程语句之间是并行关系进程和进程语句之间是并行关系l l进程内部是一组连续执行的顺序语句进程内部是一组连续执行的顺序语句进程内部是一组连续执行的顺序语句进程内部是一组连续执行的顺序语句l l进程语句与构造体中的其余部分进行信息交流是靠信号进程语句与构造体中的其余部分进行信息交流是靠信号进程语句与构造体中的其余部分进行信息交流是靠信号进程语句与构造体中的其余部分进行信息交流是靠信号完成的完成的完成的完成的l l基本格式:基本格式:基本格式:基本格式: 进程标号:进程标号:进程标号:进程标号: PROCESSPROCESS (信号敏感表)信号敏感表)信号敏感表)信号敏感表) ISIS说明区说明区说明区说明区BEGINBEGIN顺序语句顺序语句顺序语句顺序语句END PROCESSEND PROCESS 进程标号进程标号进程标号进程标号 ;进程语句进程语句PROCESS1PROCESSnsignalsignalA AR RC CHHI IT TE EC CT TU UR RE E一个构造体可以有一个构造体可以有一个构造体可以有一个构造体可以有多个进程语句多个进程语句多个进程语句多个进程语句进程和进程之进程和进程之进程和进程之进程和进程之间是并行的间是并行的间是并行的间是并行的进程和进程之进程和进程之进程和进程之进程和进程之间的数据交换间的数据交换间的数据交换间的数据交换通过信号完成通过信号完成通过信号完成通过信号完成进程内部是顺进程内部是顺进程内部是顺进程内部是顺序语句序语句序语句序语句信号敏感表信号敏感表l l进程赖以启动的敏感表。对于表中列出的任何进程赖以启动的敏感表。对于表中列出的任何信号的改变,都将启动进程,执行进程内相应信号的改变,都将启动进程,执行进程内相应顺序语句顺序语句l l一些一些VHDL综合器,综合后,对应进程的硬件综合器,综合后,对应进程的硬件系统对进程中的所有输入的信号都是敏感的,系统对进程中的所有输入的信号都是敏感的,不论在源程序的进程中是否把所有的信号都列不论在源程序的进程中是否把所有的信号都列人敏感表中人敏感表中l l为了使软件仿真与综合后的硬件仿真对应起来,为了使软件仿真与综合后的硬件仿真对应起来,应当将进程中的所有输人信号都列入敏感表中应当将进程中的所有输人信号都列入敏感表中顺序语句顺序语句l l每一条顺序语句的执行每一条顺序语句的执行(指仿真执行指仿真执行)顺序是与顺序是与它们的书写顺序基本一致的它们的书写顺序基本一致的l l顺序语句只能出现在进程顺序语句只能出现在进程(Process) 、函数、函数(Funcation)和过程(和过程(Procedure)中中l l顺序语句包括:赋值语句、流程控制语句、等顺序语句包括:赋值语句、流程控制语句、等待语句、子程序调用语句、返回语句、空操作待语句、子程序调用语句、返回语句、空操作语句语句LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY if_case IS PORT ( a, b, c, d : IN Std_Logic; sel : IN Std_Logic_Vector(1 downto 0); y, z : OUT Std_Logic);END if_case;ARCHITECTURE logic OF if_case ISBEGINif_label: PROCESS(a, b, c, d, sel)BEGINIF sel=00 THEN y = a;ELSIF sel=01 THEN y = b;ELSIF sel=10 THEN y = c;ELSE y z z z z z = 0;END CASE;END PROCESS case_label;END logic;进程语句举例两个进程是两个进程是并发的并发的进程的运行依进程的运行依赖于敏感表内赖于敏感表内参数的变化参数的变化敏感表举例latchlabellatchlabel: : PROCESSPROCESS( (oeoe) )BEGINBEGINIFIF oeoe=1 =1 THENTHEN y = a; y = a; END IFEND IF; ;END PROCESSEND PROCESS if_label; if_label;仿真结果错误仿真结果错误仿真结果错误仿真结果错误仿真结果错误仿真结果错误敏感表举例latchlabellatchlabel: : PROCESSPROCESS( (oeoe,a),a)BEGINBEGINIFIF oeoe=1 =1 THENTHEN y = a; y = a; END IFEND IF; ;END PROCESSEND PROCESS if_label; if_label;仿真结果正确仿真结果正确仿真结果正确仿真结果正确仿真结果正确仿真结果正确顺序赋值语句举例LIBRARY LIBRARY ieeeieee; ;USE USE ieeeieee.std_logic_1164.all;.std_logic_1164.all;ENTITY ttt1 IS PORTENTITY ttt1 IS PORT (en (en : in std_logic; : in std_logic; y y: OUT Std_Logic_vector(0 to 7);: OUT Std_Logic_vector(0 to 7);END ttt1;END ttt1;ARCHITECTURE logic OF ttt1 ISARCHITECTURE logic OF ttt1 ISSIGNAL s1,s2SIGNAL s1,s2:Std_logic;:Std_logic;SIGNAL t:Std_Logic_vector (0 to 7);SIGNAL t:Std_Logic_vector (0 to 7);BEGINBEGINPROCESS(s1,s2,en)PROCESS(s1,s2,en)Variable v1,v2:Std_logic;Variable v1,v2:Std_logic;BeginBeginif en=1 thenif en=1 thenV1:=1;V1:=1;V2:=1;V2:=1;s1=1;s1=1;s2=1;s2=1;t(0)=v1;t(0)=v1;t(1)=v2;t(1)=v2;t(2)=s1;t(2)=s1;t(3)=s2;t(3)=s2;v1:=0;v1:=0;v2:=0;v2:=0;s2=0;s2=0;t(4)=v1;t(4)=v1;t(5)=v2;t(5)=v2;t(6)=s1;t(6)=s1;t(7)=s2;t(7)=s2;end if;end if;End process;End process;y=t;y=t;end;end;顺序赋值语句举例警告警告警告警告顺序赋值语句举例ARCHITECTURE reg1 OF reg1 ISSIGNAL a, b : BIT;BEGINPROCESS (clk)BEGINIF rising_edge(clk) THENa = d;b = a;q = b;END IF;END PROCESS;END reg1;D DD DD DQQQQQQdabclkqD DQQdclkqD DD DQQQQdaclkqD DD DD DQQQQQQdabclkq顺序赋值语句举例ENTITY reg1 IS PORT ( d : in BIT; clk : in BIT; q : out BIT);END reg1;ARCHITECTURE reg1 OF reg1 ISSIGNAL a, b : BIT;BEGINPROCESS (clk)BEGINIF rising_edge(clk) THENa = d;b = a;END IF;END PROCESS;q = b;END reg1;并行赋值语句并行赋值语句并行赋值语句并行赋值语句D DD DD DQQQQQQdabclkqD DQQdclkqD DD DQQQQdaclkqD DD DQQQQdaclkq顺序赋值语句举例ENTITY reg1 IS PORT ( d : in BIT; clk : in BIT; q : out BIT);END reg1;ARCHITECTURE reg1 OF reg1 ISVARIABLE a, b : BIT;BEGINPROCESS (clk)BEGINIF rising_edge(clk) THENa = d;b = a;q = b;END IF;END PROCESS;END reg1;D DD DD DQQQQQQdabclkqD DQQdclkqD DD DQQQQdaclkqD DQQdclkq变量定义变量定义变量定义变量定义在时序电路中的变量赋值l变量在IF语句中被赋值,以用来表示随时钟的变化,不会产生触发器l变量只代表临时存储,不反映实际硬件l变量可用在表示一数据立即变化的表达式中,然后再将变量的值赋给信号IF_THEN_ELSE语句语句l l只能在进程内使用只能在进程内使用只能在进程内使用只能在进程内使用l l至少应有一个条件句,条件句必须由布尔表达式构成。至少应有一个条件句,条件句必须由布尔表达式构成。至少应有一个条件句,条件句必须由布尔表达式构成。至少应有一个条件句,条件句必须由布尔表达式构成。l l根据条件句产生的判断结果根据条件句产生的判断结果根据条件句产生的判断结果根据条件句产生的判断结果TRUETRUE或或或或FALSEFALSE,有条件地选择有条件地选择有条件地选择有条件地选择执行其后的顺序语句。执行其后的顺序语句。执行其后的顺序语句。执行其后的顺序语句。IF IF 条件句条件句条件句条件句 ThenThen 顺序语句顺序语句顺序语句顺序语句ENDIFENDIFIF IF 条件句条件句条件句条件句 THENTHEN 顺序语句顺序语句顺序语句顺序语句ELSEELSE 顺序语句顺序语句顺序语句顺序语句ENDIFENDIFIF IF 条件句条件句条件句条件句 ThenThen 顺序语句顺序语句顺序语句顺序语句 ELSIF ELSIF 条件句条件句条件句条件句 ThenThen 顺序语句顺序语句顺序语句顺序语句 ELSEELSE 顺序语句顺序语句顺序语句顺序语句ENDIFENDIFIF_THEN_ELSE语句语句 mux4_1: PROCESS (a, b, c, d, s) mux4_1: PROCESS (a, b, c, d, s)BEGINBEGIN IF s = “00” THEN x = a ;IF s = “00” THEN x = a ;ELSIF s = “01” THEN x = b ;ELSIF s = “01” THEN x = b ;ELSIF s = “10” THEN x = c ;ELSIF s = “10” THEN x = c ;ELSE x = d ;ELSE x = d ;END IF;END IF;END PROCESS mux4_1 ;END PROCESS mux4_1 ;必须在进必须在进必须在进必须在进程内使用程内使用程内使用程内使用IF_THEN_ELSE语句语句ex1: PROCESS (a, b)ex1: PROCESS (a, b)BEGINBEGIN IF a=1 THEN c=0; IF a=1 THEN c=0; - if a and b are- if a and b are END IF; END IF;- both 1 then- both 1 then IF b=1 THEN c=1; IF b=1 THEN c=1; - b has priority- b has priority END IF; END IF;- so c = 1;- so c = 1;END PROCESS ex1;END PROCESS ex1;ex2: PROCESS (a, b)ex2: PROCESS (a, b)BEGINBEGIN IF b=1 THEN c=1; IF b=1 THEN c=1; - if a and b are- if a and b are END IF; END IF; - both 1 then- both 1 then IF a=1 THEN c=0; IF a=1 THEN c=0; - a has priority- a has priority END IF; END IF; - so c = 0;- so c x x x x = d;END CASE;END PROCESS mux4_1;LOOP语句语句基本格式基本格式:LOOP标号标号:重复模式重复模式 LOOP顺序语句;顺序语句;END LOOP LOOP标号标号WHILE LOOP顺序语句顺序语句END LOOP;FOR IN LOOP顺序语句顺序语句END LOOP;LOOP标号标号: LOOP顺序语句顺序语句EXIT LOOP标号标号 ;END LOOP;NEXT LOOP标号标号 WHEN 语句语句LOOP语句示例语句示例LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;ENTITY shift4 ISPORT ( shft_lft : in std_logic;d_in : in std_logic_vector(3 downto 0);q_out: out std_logic_vector(7 downto 0);END shift4;ARCHITECTURE logic OF shift4 ISBEGINPROCESS(d_in, shft_lft)VARIABLE shft_var : std_logic_vector(7 DOWNTO 0);BEGINshft_var(7 downto 4) := 0000;shft_var(3 downto 0) := d_in;IF shft_lft = 1 THENFOR i IN 7 DOWNTO 4 LOOPshft_var(i) := shft_var(i-4);END LOOP;shft_var(3 downto 0) := “0000”;ELSE shft_var := shft_var;END IF;q_out = shft_var;END PROCESS;END logic;组合电路举例LIBRARYLIBRARY ieeeieee; ;USEUSE ieeeieee.std_logic_1164.ALL;.std_logic_1164.ALL;ENTITYENTITY compare compare IS PORTIS PORT ( (a, b: IN std_logic_vector(0 TO 3);a, b: IN std_logic_vector(0 TO 3);aeqbaeqb: OUT std_logic);: OUT std_logic);ENDEND compare; compare;ARCHITECTUREARCHITECTURE archcomparearchcompare OFOF compare compare ISISBEGINBEGINaeqbaeqb = 1 WHEN a = b ELSE 0; = 1 WHEN a = b ELSE 0;ENDEND archcomparearchcompare; ; aeqbaeqba(0 TO 3)a(0 TO 3)b(0 TO 3)b(0 TO 3)组合电路举例LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY compare IS PORT (a, b: IN std_logic_vector(0 TO 3);aeqb: OUT std_logic);END compare;ARCHITECTURE archcompare OF compare ISBEGINaeqb = NOT( (a(0) XOR b(0) OR (a(1) XOR b(1) OR (a(2) XOR b(2) OR (a(3) XOR b(3);END archcompare;组合电路举例ARCHITECTUREARCHITECTURE archcomparearchcompare OFOF compare compare ISISBEGINBEGINcomp: comp: PROCESSPROCESS (a, b) (a, b)BEGINBEGINIFIF a = b a = b THENTHENaeqbaeqb = 1; = 1;ELSEELSEaeqbaeqb = 0; = 0;END IFEND IF; ;END PROCESSEND PROCESS comp; comp;ENDEND archcomparearchcompare; ;组合电路举例ARCHITECTURE ARCHITECTURE archincompletearchincomplete OF incomplete IS OF incomplete IS BEGINBEGINimim_ _memmem: PROCESS (a,b): PROCESS (a,b)BEGINBEGINIF a = 1 THEN c = b;IF a = 1 THEN c = b;END IF;END IF;END PROCESS END PROCESS imim_ _memmem; ;END END archincompletearchincomplete; ;acb引入锁引入锁引入锁引入锁存效应存效应存效应存效应组合电路举例ARCHITECTURE archcomplete OF complete IS BEGINno_mem: PROCESS (a, b)BEGINIF a = 1 THEN c = b;ELSE c key key key key = none;END CASE; 时序电路举例LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY dff_a IS PORT ( d : in std_logic; clk : in std_logic; q : out std_logic);END dff_a;ARCHITECTURE behavior OF dff_a ISBEGINPROCESS (clk)BEGINIF clkevent and clk = 1 THEN q = d;END IF;END PROCESS;END behavior;CLKCLKCLKCLK置于敏感表内置于敏感表内置于敏感表内置于敏感表内可用可用可用可用Rising_edge(CLK)Rising_edge(CLK)Rising_edge(CLK)Rising_edge(CLK)代替代替代替代替没有没有没有没有ELSEELSEELSEELSE语句语句语句语句时序电路举例ARCHITECTURE behavior OF dff_clr ISBEGINPROCESS(clk, clr)BEGINIF clr = 0 THEN q = 0;ELSIF rising_edge(clk) THEN q = d;END IF;END PROCESS;END behavior;异步清零异步清零异步清零异步清零时序电路举例LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all; upcountupcount: PROCESS (: PROCESS (clkclk, , rstrst) )BEGINBEGINIF IF rstrst = 1 THEN count = x0 ; = 1 THEN count = x0 ;ELSIF rising_edge(ELSIF rising_edge(clkclk) THEN) THENIF load = 1 THEN count = data;IF load = 1 THEN count = data;ELSE count = count + 1;ELSE count = count + 1;END IF;END IF;END IF;END IF;END PROCESS END PROCESS upcountupcount; ;同步置数同步置数同步置数同步置数“+ + +”重载重载重载重载时序电路举例ARCHITECTURE logic OF count_a ISBEGINPROCESS(rst, clk)VARIABLE tmp_q : std_logic_vector(15 downto 0);BEGINIF rst = 0 THEN q = 0;ELSIF rising_edge(clk) THENIF updn = 1 THEN tmp_q := tmp_q + 1;ELSE tmp_q := tmp_q - 1;END IF;q = tmp_q;END IF;END PROCESS;END logic;信号传递信号传递信号传递信号传递三态电路举例ENTITY test_three IS PORT(ENTITY test_three IS PORT(oeoe : :IN std_logic;IN std_logic;datadata : :OUT std_logic_vector(0 to 7);OUT std_logic_vector(0 to 7);END test_three;END test_three;ARCHITECTUREARCHITECTURE archtest archtest_three OF test_three IS_three OF test_three ISBEGINBEGINPROCESS (PROCESS (oeoe) )BEGINBEGINIF (IF (oeoe=1) THEN=1) THEN data = 01100100;data = 01100100;ELSEELSEdata = ZZZZZZZZ; data = ZZZZZZZZ; END IF; END IF; END PROCESS;END PROCESS;ENDEND archtest archtest_three;_three;双向口举例ENTITY ldcnt IS PORT (clk, ld, oe: IN std_logic;count: INOUT std_logic_vector(7 DOWNTO 0);END ldcnt; ARCHITECTURE archldcnt OF ldcnt ISSIGNAL int_count: std_logic_vector(7 DOWNTO 0); BEGINcnt: PROCESS (clk)BEGINIF rising_edge(clk) THENIF ld=1 THEN int_count = count; ELSE int_count = int_count + 1;END IF;END IF;END PROCESS cnt ;双向口举例outen: PROCESS (oe, int_count) BEGINIF oe = 1 THEN count = int_count ; ELSE count Z) ; END IF ;END PROCESS outen;END archldcnt; 别别 名名l l标志一个以存在的数据对象标志一个以存在的数据对象l l引用别名等效于引用原始数据对象引用别名等效于引用原始数据对象l l给别名赋值等效于给原始数据赋值给别名赋值等效于给原始数据赋值l l常作为标识一组数据类型常作为标识一组数据类型l l保留字:保留字:ALIASALIAS Bank:Bit_Vector(0 to 3) IS Address(24 to 27);状态机设计RESET(asynchronous)REDTIMER1YELLOWGREENTIMER1TIMER2TIMER2Y=1G=1TIMER3TIMER3R=1二进制状态机编码l l状态机的每一个状态用二进制位来编码状态机的每一个状态用二进制位来编码例:实现例:实现4状态的状态机,其二进制编码可为状态的状态机,其二进制编码可为 状态状态1“00” 状态状态2“01”状态状态3“10”状态状态4“11”l l特点特点触发器使用较少,速度较慢,可能产生两位同时翻触发器使用较少,速度较慢,可能产生两位同时翻转的情况。如:转的情况。如:“01”“10”格雷码状态机编码l l格雷码编码每次仅一个状态位的值发生变化格雷码编码每次仅一个状态位的值发生变化 例:实现例:实现4状态的状态机,其格雷码编码可为状态的状态机,其格雷码编码可为 状态状态1“00” 状态状态2“01” 状态状态3“11” 状态状态4“10”l l特点特点触发器使用较少,速度较慢,不会产生两位同触发器使用较少,速度较慢,不会产生两位同时翻转的情况。当状态位的输出被异步应用时,时翻转的情况。当状态位的输出被异步应用时,格雷码编码是特别有益的格雷码编码是特别有益的ONE HOT状态机编码l lONE HOT的编码方案对每一个状态采用一个触发的编码方案对每一个状态采用一个触发器,即器,即4个状态的状态机需个状态的状态机需4个触发器。同一时间仅个触发器。同一时间仅1个状态位处于逻辑个状态位处于逻辑“l”电平电平例:实现例:实现4状态的状态机,其状态的状态机,其ONE HOT编码可为编码可为 状态状态1“0001” 状态状态2“0010” 状态状态3“0100” 状态状态4“1000”l l特点特点触发器使用较多,但逻辑简单,速度快触发器使用较多,但逻辑简单,速度快编码方式的选择l l根据状态机复杂程度根据状态机复杂程度状态特别多的系统只能采用状态特别多的系统只能采用2进制编码或格雷码编进制编码或格雷码编码码l l根据器件类型根据器件类型FPGA一般采用一般采用ONE HOT编码,编码,CPLD一般采用一般采用2进制编码或格雷码编码进制编码或格雷码编码l l 从非法状态中退出从非法状态中退出在选择编码方案时,必须考虑状态机可能进入在选择编码方案时,必须考虑状态机可能进入的潜在的非法状态数目。如果违反了状态位触发器的潜在的非法状态数目。如果违反了状态位触发器的建立或保持时间,又没有定义所有可能出现的状的建立或保持时间,又没有定义所有可能出现的状态,则你的设计会终止在非法状态上。态,则你的设计会终止在非法状态上。状态机设计状态机设计实体描述实体描述LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY state_machine IS PORT (clock, reset: IN std_logic;timer1, timer2, timer3: IN std_logic;r, y, g:OUT std_logic);END state_machine;状态机设计状态机设计方案一方案一ARCHITECTUREARCHITECTURE arch_1 arch_1 OF OF state_machine state_machine IS ISTYPETYPE traffic_states traffic_states ISIS (red, yellow, green); (red, yellow, green); SIGNALSIGNAL smsm: traffic_states;: traffic_states;BEGINBEGINfsmfsm: : PROCESSPROCESS (clock, reset) (clock, reset)BEGIN BEGIN IFIF reset = 1 reset = 1 THEN THEN smsm = red; red = IFIF timer1=1 timer1=1 THENTHEN smsm = green; green = IFIF timer2=1 timer2=1 THENTHEN smsm = yellow; yellow = IFIF timer3=1 timer3=1 THENTHEN sm sm = others = sm sm = red; = red;END CASEEND CASE; ;END IFEND IF; ; END PROCESSEND PROCESS fsm fsm; ;r = 1 r = 1 WHENWHEN ( (smsm = red) = red) ELSEELSE 0; 0;g = 1 g = 1 WHENWHEN ( (smsm = green) = green) ELSE ELSE 0; 0;y = 1 y = 1 WHENWHEN ( (smsm = yellow) = yellow) ELSEELSE 0; 0;ENDEND arch_1; arch_1;方案方案分析分析InputsNextStateLogicStateRegistersOutputLogicOutputsPresent StateNext Statetco状态机设计状态机设计方案二方案二ARCHITECTURE arch_2 OF state_machine ISTYPE traffic_states IS (red, yellow, green);SIGNAL sm: traffic_states;BEGINfsm: PROCESS (clock, reset) BEGIN IF reset = 1 THEN sm = red; r=1; g=0; y IF timer1=1 THEN sm = green; r=0; g=1; y=0; ELSE sm = red;r=1; g IF timer2=1 THEN sm = yellow; r=0; g=0; y=1; ELSE sm = green; r=0; g=1; y IF timer3=1 THEN sm = red; r=1; g=0; y=0;ELSE sm = yellow; r=0; g=0; y sm = red;END CASE;END IF;END PROCESS fsm;END arch_2;方案二方案二分析OutputsStateRegistersOutputLogicOutputRegistersInputsNextStateLogicPresent Statetco状状态态机机设设计计方方案案三三ARCHITECTURE arch_3 OF state_machine ISSIGNAL sm: std_logic_vector(2 DownTo 0) ;Constant red:std_logic_vector(2 DownTo 0) := ”100 ;Constant green: std_logic_vector(2 DownTo 0) := 010 ;Constant yellow: std_logic_vector(2 DownTo 0) := 001 ;BEGIN fsm: PROCESS (clock, reset)BEGIN IF reset = 1 THEN sm IF timer1=1 THEN sm = green; ELSE sm IF timer2=1 THEN sm = yellow; ELSE sm IF timer3=1 THEN sm = red; ELSE sm sm = red; END CASE; END IF; END PROCESS fsm; r = sm(2); g = sm(1); y = sm(0);END arch_3;方案三方案三分析StateRegistersOutputsInputsLogicStateStateredredgreengreenyellowyellowr r1 10 00 0g g0 01 10 0State EncodingState Encoding100100010010001001y y0 00 01 1VHDL 结构化设计基本单元 l lCOMPONENTsCOMPONENTs已已设计设计好的一个实体好的一个实体可被其它模块或高层模块引用可被其它模块或高层模块引用l lPACKAGEsPACKAGEs类似于库,使实体和结构体内的数据类型、类似于库,使实体和结构体内的数据类型、常量、子程序等对于其他设计单元可见,包括包常量、子程序等对于其他设计单元可见,包括包体单元和说明单元体单元和说明单元l lLIBRARIESLIBRARIES存放预先编译好的程序包和数据的集合体存放预先编译好的程序包和数据的集合体结构化设计的方法比较bselmux2to1accbmux2to1aselsymbolcomponentschematicentity/architecturelibrarypackagetop level schematictop level entity/architecturertoplevelqscbmux2to1aseltp层次化设计管理Your Design (VHDL)LIBRARY ieee;USE ieee.std_logic_1164.USE cypress.std_arith.allLibrary (Compiled)ieeeLibrary (Compiled)AlteraPackages (VHDL)Others (VHDL)std_logictypedefinitionsOthers (VHDL)overloadedoperatorsPackages (VHDL)std_logic_1164std_arithPackage 和Component 举例LIBRARY ieee; USE ieee.std_logic_1164.ALL; PACKAGE mymuxpkg ISCOMPONENT mux2to1 PORT (a, b, sel: IN std_logic; c: OUT std_logic); END COMPONENT;END mymuxpkg;LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY mux2to1 IS PORT (a, b, sel: IN std_logic; c: OUT std_logic);END mux2to1;ARCHITECTURE archmux2to1 OF mux2to1 ISBEGIN c i(2), b=r(0), sel=s, c=t(0);m1: mux2to1 PortMap (c=t(1), b=r(1), a=i(1), sel=s);i = p AND NOT q;END archtoplevel;第四部分第四部分在在MAXPLUS II中使用中使用VHDL输入方式输入方式Altera Altera VHDLVHDLlMax+Plus II 支持 VHDL87 和VHDL93lMax+Plus II 只提供这两个 IEEE 标准的子集l详细信息可参考Altera的VHDL手册VHDL语言输入单击单击图标图标VHDL语言输入l l建立建立VHDLVHDL源文件源文件VHDL语言输入l l将你的将你的 VHDL VHDL 文件保存位文件保存位 name.VHDname.VHD两个名字必须相同两个名字必须相同两个名字必须相同两个名字必须相同VHDL语言输入l l选择选择VHDLVHDL语言编码标准语言编码标准选择你想选择你想选择你想选择你想要的版本要的版本要的版本要的版本VHDL语言输入l编译VHDL文件VHDL语言输入关键词用蓝色显示关键词用蓝色显示关键词用蓝色显示关键词用蓝色显示打开此功能打开此功能打开此功能打开此功能VHDL语言输入选择单元选择单元选择单元选择单元选择颜色选择颜色选择颜色选择颜色编译错误定位定位错误定位错误定位错误定位错误错误位置错误位置错误位置错误位置选中错误信息选中错误信息选中错误信息选中错误信息 VHDL模板I forgot .If-then-elsecase-end caseloop-end loop?将这些代码修改成用户代码将这些代码修改成用户代码将这些代码修改成用户代码将这些代码修改成用户代码建立VHDL元件符号输入输入输入输入 VHDL VHDL 代码代码代码代码建立建立建立建立VHDLVHDL元件符号元件符号元件符号元件符号层次化设计方法进行项目顶层设计Use this symbol just as you use 7400第五部分第五部分将将VHDL代码实现到代码实现到EAB问题设计一个状态机用于从串行数据流中检测设计一个状态机用于从串行数据流中检测 “011011” 序列序列检测到该序列后输出为检测到该序列后输出为“1”MatchSerial_inclkVHDL State MachineVHDL代码library ieee;use ieee.std_logic_1164.all;package your_own_type istype t_state is (idle,state0,state01,state011, state0110,state01101, state011011);end your_own_type;library ieee;use ieee.std_logic_1164.all;use work.your_own_type.all;Entity stmh isport (clk, serial_in, reset : in std_logic; match : out std_logic);end stmh;architecture body_stmh of stmh issignal present_state : t_state;beginprocess(clk,serial_in, present_state)beginif (reset = 1) thenpresent_state if (serial_in = 1) then present_state = state011011; else present_state present_state present_state = idle;end case;end if;end if;end process;process(present_state)beginif (present_state = state011011) thenmatch = 1;elsematch if (serial_in = 0) then present_state = state0; else present_state if (serial_in = 1) then present_state = state01; else present_state if (serial_in = 1) then present_state = state011; else present_state if (serial_in = 0) then present_state = state0110; else present_state if (serial_in = 1) then present_state = state01101; else present_state if (serial_in = 0) then present_state = state0; else present_state = idle; end if;1010K10 EABK10 EAB能否实现该电路能否实现该电路l lInput - 4 input (OK)l lOutput - 4 output (OK)l l实现状态机所需查找表的位数实现状态机所需查找表的位数 2*4 * 4 = 64 bits = 2Kbits (OK)2*4 * 4 = 64 bits if (serial_in = 0) then next_state = state0; match = 0; else next_state = idle; match if (serial_in = 1) then next_state = state01; match = 0; else next_state = idle; match if (serial_in = 1) then next_state = state011; match = 0; else next_state = idle; match if (serial_in = 0) then next_state = state0110; match = 0; else next_state = idle; match if (serial_in = 1) then next_state = state01101; match = 0; else next_state = idle; match if (serial_in = 1) then next_state = state011011; match = 1; else next_state = idle; match next_state = idle; match next_state = idle; match = 0;end case;end if;end process;present_state = next_state;end body_stmh;编译结果举例编译结果修改VHDL代码component component stmhstmhport (port (clkclk, serial_in : in std_logic;, serial_in : in std_logic; present_state : in t_state; present_state : in t_state; next_state : out t_state; next_state : out t_state; match : out std_logic); match : out std_logic);end component;end component;signal t_state_signal t_state_bufferinbufferin, t_state_, t_state_bufferoutbufferout : t_state; : t_state;beginbegint_state_t_state_bufferinbufferin = t_state_ =clkclk,serial_in=serial_in,serial_in=serial_in,present_state=t_state_present_state=t_state_bufferinbufferin, , next_state=t_state_next_state=t_state_bufferoutbufferout, ,match=match);match=match);end body_end body_stmheabstmheab; ;library ieee;use ieee.std_logic_1164.all;package your_own_type istype t_state is (idle,state0,state01,state011, state0110,state01101, state011011);end your_own_type;library ieee;use ieee.std_logic_1164.all;use work.your_own_type.all;Entity stmheab isport (clk, serial_in : in std_logic; match : out std_logic);end stmheab;architecture body_stmheab of stmheab is修改后的代码if (clkevent and clk=1) thencase present_state is when idle = if (serial_in = 0) then next_state = state0; match = 0; else next_state = idle; match if (serial_in = 1) then next_state = state01; match = 0; else next_state = idle; match if (serial_in = 1) then next_state = state011; match = 0; else next_state = idle; match if (serial_in = 0) then next_state = state0110; match = 0; else next_state = idle; match if (serial_in = 1) then next_state = state01101; match = 0; else next_state = idle; match if (serial_in = 1) then next_state = state011011; match = 1; else next_state = idle; match next_state = idle; match next_state = idle; match = 0;end case;end if;end process;end body_stmh;编译结果第六部分
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号