《EDA技术教程课件-第五章-VHDL设计初步》由会员分享,可在线阅读,更多相关《EDA技术教程课件-第五章-VHDL设计初步(182页珍藏版)》请在金锄头文库上搜索。
1、EDAEDA技术技术第第 5 章章 HDL文本输入设计 HDL: VHDL Verilog Able VeryhighspeedintegratedHardwareDescriptionLanguage(VHDL)是IEEE、工业标准硬件描述语言用语言的方式而非图形等方式描述硬件电路容易修改容易保存特别适合于设计的电路有:复杂组合逻辑电路,如:译码器、编码器、加减法器、多路选择器、地址译码器.状态机 VHDL的功能和标准的功能和标准VHDL描述输入端口输出端口电路的行为和功能VHDL有两个标准:IEEEStd1076-1987(calledVHDL1987)IEEEStd1076-1993(c
2、alledVHDL1993)5.1 VHDL程序的基本结构程序的基本结构n一、一、VHDL设计实体的组成设计实体的组成库和程序包(Library、package)-打开本设计使用的库和程序包实体(Entity)-说明本设计实体的外部端口 结构体( Architecture)-描 述 本 设 计 实 体 的 内 部 结 构 和行为配置(Configuration)-指定实体希望配置的结构体【例5-1.1】ENTITYmux21aISPORT(a,b:INBIT;s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGINy=aW
3、HENs=0ELSEb;ENDARCHITECTUREone;实体结构体 5-1.1 多路选择器多路选择器VHDL描述描述图图5-1 mux21a实体实体图图5-2 mux21a结构体结构体2选选1多路选择器的多路选择器的VHDL描述描述 2选选1多路选择器的多路选择器的VHDL描述描述【例例5-1.2】 ENTITY mux21a IS PORT ( a, b : IN BIT; s : IN BIT; y : OUT BIT ); END ENTITY mux21a;ARCHITECTURE one OF mux21a IS SIGNAL d,e : BIT; BEGINd = a AND
4、 (NOT S) ;e = b AND s ;y = d OR e ; END ARCHITECTURE one ;【例【例5-1.3】 . . . ARCHITECTURE one OF mux21a IS BEGIN y = (a AND (NOT s) OR (b AND s) ; END ARCHITECTURE one;图图5-3 mux21a功能时序波形功能时序波形8n 二、实体功能描述二、实体功能描述 n 实实体体的的功功能能对一个电路元件或电路系统的外部接口进行描述,实体反映了本电路与其他电路之间的连接关系,可以看成一个电路符号。n1、实体的语句格式n实体描述语句通常包括引导语
5、句、结束语句、类属表和端口表四部分,如表5.1.1所示。n表5.1.1实体描述语句的格式n名称内容n引导语句ENTITY实体名ISn类属表GENERIC();n端口表PORT();n结束语句END实体名;是一种端口界面常数,常以一种说明形式放在实体或结构体的是一种端口界面常数,常以一种说明形式放在实体或结构体的说明部分,类属值可以由设计实体外部赋值,通过类属参数的重新说明部分,类属值可以由设计实体外部赋值,通过类属参数的重新设定可以改变一个设计实体的内部电路和规模。类属参数以关键词设定可以改变一个设计实体的内部电路和规模。类属参数以关键词GENERIC引导的类属表给出,表中提供时间参数或总线宽
6、度等信引导的类属表给出,表中提供时间参数或总线宽度等信息。息。 类属说明的书写格式是:类属说明的书写格式是: GENERIC(常数名:数据类型:设定值常数名:数据类型:设定值 常数名:数据类型:设定值);常数名:数据类型:设定值);例例5-2 ENTITY body IS GENERIC(n: INTEGER);); PORT(a: IN STD_LOGIC_VECTOR(n-1 DOWNTO 0); b: OUT STD_LOGIC); END body;类 属 参 数 端端 口口 模模 式式 INOUTINOUTBUFFER 数据类型数据类型 表表5.1.3 几种基本的数据类型几种基本的数
7、据类型类型取值范围特点位类型BIT0和1由IEEE中的标准程序包STANDARD定义,能表示二值逻辑信号位矢量BIT_VECTORBIT的数组由IEEE标准程序包STANDARD定义,能表示多位二值逻辑信号逻辑位STD_LOGIC具有9个不同状态;未初始化状态记为U,强未知值记为X,强逻辑0记为0,强逻辑1记为1,高阻态Z,弱不定值W弱逻辑0记为L,弱逻辑1记为H,不定状态记为-由STD_LOGIC_1164程序包定义,能表示二值或9值逻辑,在数字电路中常出现的只有0,1,Z和-四种表表5.1.3 几种基本的数据类型几种基本的数据类型类型取值范围特点逻辑位矢量STD_LOGIC_VECTOR是
8、STD_LOGIC的数组由STD_LOGIC_1164程序包定义,能表示多位STD_LOGIC信号,如总线信号整数类型INTEGER正整数,负整数和零,POSITIVE(正整数)是其中的一个子集;NATURAL(自然数)也是一个子集,含正整数和0整数的书写不加引号,而位和逻辑位要加单引号。数组要加双引号;整数的取值范围是32位有符号数,即2147893647布尔类型BOOLEANFALSE和TRUE用于逻辑操作或条件判断,在VHDL仿真器中FALSE和TRUE也用0和1表示,但不是数值a: IN BIT; b: OUT STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL
9、 C: STD_LOGIC_VECTOR(1 TO 4); SIGNAL d: BIT_VECTOR (3 DOWNTO 0);三、结构体(三、结构体(ARCHITECTUREARCHITECTURE)说明说明1、结构体的功能与格式、结构体的功能与格式 结构体承担的具体任务是:结构体承担的具体任务是: 定定义义结结构构体体中中的的各各项项内内部部使使用用元元素素,如如数数据据类类型型(TYPE)、常常数数( CONSTANT) 、 信信 号号 ( SIGNAL) 、 元元 件件 ( COMPONENT) 、 过过 程程(POCEDURE)等;等; 通过通过VHDL语句描述实体所要求的具体行为和
10、逻辑功能;语句描述实体所要求的具体行为和逻辑功能; 描述各元件之间的连接。描述各元件之间的连接。 结构体的语句书写格式如下:结构体的语句书写格式如下:Architectrue 结构体名结构体名 OF 实体名实体名 IS定义语句;定义语句; -并非一定有,视具体情况而定并非一定有,视具体情况而定BEGIN功能描述语句;功能描述语句; END 结构体名;结构体名;描述方式定义特点行为描述表示输入与输出信号之间的转换行为,不含电路结构方面的信息,只强调电路的行为和功能。行为描述主要是对设计对象进行数学建模,描述程序大量采用算术运算、关系运算、惯性延时、传输延时等语句结构体中的过程语句属于典型的行为描
11、述VHDL语言具有较强的行为仿真和综合能力,是EDA技术发展的基础数据流描述以并行赋值语句为基础,当语句中的任一输入信号值发生变化时,激活赋值语句,使信息从所描述的结构中“流出”。这种描述方式称为数据流方式,又称为寄存器转换层次描述(RTL)以规定设计中的各种寄存器形式为特征,并在各寄存器之间插入组合逻辑,能描述组合逻辑和时序逻辑既可以用功能描述的RTL方式,也可用与硬件一一对应的方式基于并行赋值语句实现结构描述调用低层设计模块或门级电路,过端口连接实现设计要求。类似于实际的硬件电路连接主要应用VHDL中的例化语句和生成语句完成各种简单电路到复杂电路的演变2、结构体的三种描述方式例5-3用行为
12、描述方式设计的全加器LIBRARYIEEE;-库说明USEIEEE.STD_LOGIC_1164.ALL;ENTITYonebitadderIS-实体说明PORT(x,y,cin:INBIT;-端口信号定义Sum,count:OUTBIT);ENDonebitadder;ARCHITECTUREbehaviorOFonebitadderIS-结构说明BEGINPROCESS(x,y,cin)BEGINsum=xXORyXORcin;count=(xANDy)OR(xXORy)ANDcin);ENDPROCESS;ENDbehavior;例5-4用RTL描述方式设计的2选1数据选择器ARCHIT
13、ECTURErtlOFmux2ISBEGINy=input(a)WHENsel=1ELSEInput(b);ENDrtl例5-5用结构描述方式设计的R-S触发器ENTITYrsffISPORT(set,reset:INBIT)q,qbar:INOUTBIT);ENDrsff;ARCHITECTUREnetlistOFrsffISCOMPONENTnand2-元件说明PORT(a,b:INBIT;c:OUTBIT);ENDCOMPONENF;BEGINU1: nand2 PORT MAP (set, qbar, q); -用位置关联实现元件端口名和系统端口 的连接U2:nand2PORTMAP(
14、q,reset,qbar);ENDentlist;表5.1.5结构体中的三种子结构方式比较子结构名称语句格式特点块语句结构块结构名:BLOCK端口说明类属说明BEGIN并行语句ENDBLOCK块结构名;将一个结构体划分为几个模块,恰当的分块有利于程序的移植、排措、仿真及程序阅读每个块的端口和类属参数说明只对块结构内部有效块结构中的语句是并行的,与书写顺序无关进程语句结构进程名:PROCESS(每感信号表)IS进程说明BEGIN顺序描述语句ENDPROCESS进程名;敏感信号表通常要求将进程中所有输入信号都放在敏感信号表中敏感信号中的某一个发生变化即启动执行一遍,然后进入等待状态,下一次敏感信号
15、变化再次启动一个结构中可包含多个进程,各进程之间是并行的,而各进程中的语句是顺序语句;进程说明部分说明进程所需的局部环境,进程名可要可不要。子程序语句结构分过程语句和函数语句PROCEDURE过程名(参数1;参数2;)IS定义语句;-定义变量等BEGIN顺序处理语句;-过程语句END过程名;FUNCTION函数名(参数1;参数2;)RETURN数据类型IS定义语句;BEGIN顺序处理语句;RETURN返回变量名;END函数名;能被主程序反复调用并能将处理结果传送到主程序的程序模块,子程序分为过程语句(Procedure)和函数(Function)两种过程语句中的参数包括输入和输出信号。每次调用
16、前,应将初始值传递到输入参数中,执行结束后应将输出输入参数传送到调用者的信号或变量中与进程语句相同的是,子程序模块也是用顺序语句完成定义和算法;但程序不能象进程那样,从本结构体的并行语句或进程语句中直接读取信号值以及向信号赋值子程序中的参数说明是局部的,只能用于子程序体内例5-6使用块语句结构的程序实例2位二进制计数器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcounter2ISPORT(clk:INSTD_LOGIC;q1,q2:OUTSTD-LOGIC);ENDcounter2;A
17、RCHITECTUREarch_counter2OFcounter2ISSIGNALcount:STD_LOGIC_VECTOR(1DOWNTO0);BEGINCounter:BLOCK;BEGINProcess(clk)beginIF(clkeventANDclk=1)THENIFcount=11THENcount=00;ELSEcount=count+1; ENDIF;ENDIF;q1=count(1); q0decoddecoddecoddecodNULL;ENDCASE;decoder_out=decod;ENDdecoder;表5.1.62位二进制译码器真值表codedecoder_
18、out000001010010100100111000例5-9函数定义和调用举例LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYfuncISPORT(a:INSTD_LOGIC_VECTOR(0to2);m:OUTSTD_LOGIC_VECTOR(0to2);ENDENTITYfunc;ARCHITECTUREdemoOFfuncISFUNCTIONsam(x,y,z:STD_LOGIC)RETURNSTD_LOGICISBEGINRETURN(xANDy)ORz;Endsam;BEGINPROCESS(a)BEGINm(0)=sam(a(0),a(1
19、),a(2);m(1)=sam(a(2),a(0),a(1);m(2)=sam(a(1),a(2),a(0);ENDPROCESS;ENDARCHITECTUREdemo;5.1.2 寄存器描述及其寄存器描述及其VHDL语言现象语言现象D触发器的触发器的VHDL描述描述LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL ; ENTITY DFF1 IS PORT (CLK : IN STD_LOGIC ; D : IN STD_LOGIC ; Q : OUT STD_LOGIC ); END ; ARCHITECTURE bhv OF DFF1 IS SIGNA
20、L Q1 : STD_LOGIC ; -类似于在芯片内 部定义一个数据的暂存节点 BEGIN D触发器触发器BEGIN PROCESS (CLK) BEGIN IF CLKEVENT AND CLK = 1 THEN Q1 = D ; END IF; Q = Q1 ; -将内部的暂存数据向端口输出 End PROCESS ; END bhv;比较用5种不同语句的D触发器VHDL程序Entitytest1isport(clk,d:inbit;q:outbit);endtest1;architecturebodyoftest1issignalq1:bit;beginprocess(clk)begi
21、nifclk=1ANDclklast_value=0thenq1=d;endif;q=q1;endprocess;endtest1_body;LIBRARYIEEE;USEIEEE.std_logic_1164.all;Entitytest1isport(clk,d:inbit;q:outbit);endtest1;architecturebodyoftest1isbeginprocess(clk,d)beginifrising_edge(clk)thenq=d;endif;endprocess;endtest1_body;Entity test1 isport (clk : in bit;
22、d : in bit; q : out bit);end test1;architecture body of test1 issignal q1 : bit ;beginprocess (clk)begin if (clk = 1) then q1 = d; end if; q = q1 ;end process;end body;Entity test1 isport (clk : in bit; d : in bit; q : out bit);end test1;architecture body of test1 issignal q1 : bit ;beginprocess (cl
23、k,d)begin if (clk = 0) then q1 = d; end if; q = q1 ;end process;end body; 5.1.3 VHDL中的程序库,包和配置中的程序库,包和配置一、VHDL库库-用来存放预先已设计好的程序包、数据集合体、元件的仓库库中存放的信息供用户进行VHDL设计时调用,如果在完成一项VHDL设计需要用到库中的某一个程序包时,在设计实体前使用USE语句打开这一程序包。而综合过程中,综合器检测到VHDL源程序中的库文件时则将源文件读入.1、常用的库资源一类是资源库,库中存放常规元件、标准模块、预定义数据类型等,有些是被IEEE确定为标准的,如IE
24、EE库中的STD_LOGIC_1164程序包。一类是设计库,例如存放用户设计和定义的某些元件和程序包的Work库。程序库由若干程序包构成,程序包又包含若干子程序,子程又涉及若干基本设计单元。VHDL设计中常用的有IEEE库、STD库、Work和ASIC库表5.1.6VHDL中常用库的特点库的名称包含的程序包特点IEEE库STD_LOGIC_1164该程序包是IEEE标准的最常用的程序包。STD_LOGIC_ARITH该程包扩展了UNSIGNED、SIGNED、SMALL-INT三种数据类型,以及相关类型的算术运算符,比较操作函数,还有数据类型转换函数。STD_LOGIC_UNSIGNEDSTD
25、_LOGIC_SIGNED此两种程序包重载了用于INTEGER、STD_LOGIC和STD_LOGIC_VECTOR三种数据类型进行混合运算的运算符,还定义了STD_LOGIC_VECTOR类型到整数型的转换函数;此两程序包的区别是,前者定义的运算符不考虑符号而后者是有符号运算。STD库STANDARD(标准程序包)TEXTIO(文件输入输出程序包)符合VHDL语言标准的库,定义了一些基本的数据类型、子类型和函数,在VHDL环境中可随时调用其中的内容。TEXTIO程序包仅供仿真用,使用时需加USESTD_TEXTIO.ALL语句在VHDL的编译和综合过程中,每项设计都会自动将STD库包含进去。
26、ASIC库面向ASIC码的资源库,由VHDL工具厂商提供,是一种面向门级仿真的逻辑门库每个逻辑门对应一个设计实体;使用时有必要进行说明。WORK库用户自编VHDL程序的工作库存放用户设计和定义的设计单元和程序包;使用时不必作说明二、包集合 打包后的程序将VHDL设计中常用的一些诸如信号定义、常数定义、数据类型、元件、函数和过程定义等内容集合在一起形成一个程序包,即所谓“打包”,供设计者在使用中调用PACKAGE包集合名IS说明语句;说明语句ENDBODY;END包集合名;包首包体PACKAGEBODY包集合名ISPACKAGEoneIS-程序包首,名字为oneSUBTYPEsegmentsIS
27、BIT_VECTOR(0TO6);-包体开始定义子类型segmentsTYPEbcdISintegerRANGE0TO9;-定义数据bcd的范围是09ENDone;-程序包结束USEWORK.one.ALL;-WORK库默认是打开的,这里只指明所用的包ENTITYdecoderISPORT(input:inbcd;drive:outsegments);ENDdecoder;ARCHITECTUREsimpleOFdecoderIS例5-10程序包定义和应用举例BEGINWITHinputSELECT-用选择信号赋值语句实现译码drive=B1111110WHEN0;B0110000WHEN1;
28、B1101101WHEN2;B1111001WHEN3;B0110011WHEN4;B1011011WHEN5;B1011111WHEN6;B1110000WHEN7;B1111111WHEN8;B1111011WHEN9;B0000000WHENOTHERS;ENDsimple;三、配置(configuration)两种情况:一种是为一个具有两个或两个以上结构体的设计实体指定一个结构体。因为一个设计实体中,应该是一个实体对应一个结构体,但有时为了比较各种算法编写的不同结构体的性能,在一个实体后面带有几个结构体,这时可以用配置语句指定一个结构体。另一种情况是为例化语句的各种元件实体配置结构体,
29、例如一个与非门的设计中,一个实体对应着两个以不同逻辑描述实现的结构体,通过配置语句指定其中的一个作为仿真应用的结构体。CONFIGURATION配置名OF实体名IS配置说明END配置名; 配置语句的格式是:例5-11配置语句应用举例ENTITYnandISPORT(a:INSTD_LOGIC;b:INSTD_LOGIC;c:OUTSTD_LOGIC);ENDENTITYnand;ARCHITECTUREoneOFnandIS-one是实体nand的一个结构体BEGINENDARCHITECTUREone;ARCHITECTUREtwoOFnandIS_two是实体nand的另一个结构体BEGI
30、Nc=1WHEN(a=0)AND(b=0)ELSE1WHEN(a=0)AND(b=1)ELSE1WHEN(a=1)AND(b=0)ELSE0WHEN(a=1)AND(b=1)ELSE0;ENDARCHITECTUREtwo;CONFIGURATIONsecondOFnandIS -用配置语句指定two为nand实际结构体FORtwoENDFOR;ENDsecond;c=NOT(aANDb);CONFIGURATIONfirstOFnandIS-用配置语句指定one为nand的实际结构体FORoneENDFOR;ENDfirst;5.2 VHDL语言的基本要素语言的基本要素5.2.1 VHDL的
31、字符规则类型 书 写 规 则 示 例数字数字包括十进制整数,实数和用数制基数表示的数;十进制整数直接书写,整数后面的零写成指数形式,数字之间可加间隔符以提高可读性; 实数也是十进制数,但带小数点;0,8,18;123E2即12300;12_345_67即1234567;1.0,1.23,12_34.56_78即1234.5678;12.98E-2即0.1298; 用数制基数表示的数由五部分组成,即用十进制数表示的数制基数、分隔符#、数、指数隔离符#、指数部分(是0则省略);254表示成16进制数是16#FE#;表示成二进制数是2#111_1110#;表示成八进制数是8#376#;表示成十进制数
32、是10#254#;字符串 字符是能用ASICII码表示的数字、字母或符号,加单引号;如10,+,*,a,$等; 字符串是字符的一维数组,加双引号。字符串分为数字字符串和文字字符串,数字字符串中要加表示计数体制的基数,“B”为二进制,“O”为八进制、“X”为16进制;如“ERROR”;B“1_11_001”是5位的二进制数组;X“ADE”是16进制数组,位长3位;O“567”是8进制数组,位长3位;标识符表示常数、变量、信号、端口、子程序或参数的名字,有效字符包括全部大小写英文字母且不区分大小写,数字09及单一下划线,且下划线只能放在字母或数字之间,使用标识符还有下列规则:应以英文字母开关;允许
33、包含图形符号如回车符、换行符、空格符;不能使用VHDL中的关键字; 标识符的下标加括号表示;State0;date_1;SIGNAL;b(3); 5.2.2 数据类型数据类型 1、预定义数据类型类型 特点整数类Integer包括正整数、负整数和0,其中正整数(positive)和0又叫自然数(Natural);能使用预定义的操作符,如“+”、“-”、“*”、“/”等进行算术运算,但不能用于逻辑运算; 取值范围是-(231-1)+(231-1),并要求用Range子句规定限定范围;实数类Real 包括整数、小数和0,取值范围为-1.0E38+1.0E38,VHDL的仿真器能支持实数类型,但综合器
34、不支持;字符类character用字母和符号表示的数据类型,书写时加单引号,一般不分大小写,但加引号后的大小写有区别如A不同于a;将多个字符组合则为字符串,书写时加双引号,加引号后的大小写有区别;布尔类Boolean布尔类数据有False和Ture两种状态,在VHDL综合中则变为1和0; 不属于数值,不能用于运算,只能通过关系运算符获得;1、预定义数据类型位类型Bit表示取值为1和0的数据对象,如变量、信号等 位类型数据可参予逻辑运算;位矢量Bit_Vector位类型数据的一维数组,使用时应注明位宽;如SIGNALa:BIT_VECTOR(7TO0);时间类Time表示时间的数据类型,常用于系
35、统仿真; 书写格式中应注明数值和单位,如15ms,书写时数值与单位间空一格,小于秒的时间单位依次为毫秒(ms)、微秒(us)、纳秒(ns)、皮秒(ps)、飞秒(fs)逻辑位STD_LOGIC位数据类型BIT的扩展,共定义了9种逻辑状态,编程时应注意除0和1外的其他七种逻辑值对程序功能的影响。 由IEEE标准的STD_LOGIC_1164程序包定义,应用时必须用USE语句打开此程序包。逻辑位矢量 标准逻辑位矢量记为STD_LOGIC_VECTOR,是标准逻辑位的一维数组,使用时应注意位宽。2.自定义数据类型 数据类型 特点 定义格式枚举类型(Enumerated)用文字、符号表示的一组实际的二进
36、制数,如定义数据名为ST的数据是ST0,ST1,ST2,ST3,其编码默认为00,01,10,11。TYPE类型名IS(元素);例如TYPEstIS(st0,st1,st2,st3);整数与实数型(Integer、Real)与普通代数的整数、实数相同,预定义程序包中也有这两种类型,根据需要重新定义并限定其取值范围,以便能被综合器接受以提高PLD的利用率。TYPE类型名IS类型定义范围;例如TYPEdigitISINTEGERRANGE0TO9;数组型(Array)将相同数据类型的元素集合为一维数组或多维数组,但综合器只支持一维数组。若定义语句的范围一项缺省,则为整数类型。TYPE类型名ISAR
37、RY范围OF原类型名;例如TYPEwordISARRY(1TO8)OFSTD_LOGIC;即word有8个元素分别为word(1)word(8)2.自定义数据类型记录型(Recode)记录型数据是一个数组,这个数组中的元素由不同的数据类型元素构成。记录型数据用于总线,通讯协议等。TYPE类 型 名 ISRECODE元素名:数据类型名ENDRECODE;例如TYPE bank ISRECODEaddr:STD_LOGIC_VECTOR(7DOWN0);ro:INTEGER;ENDRECODE;时间类型(Time)表示时间的数据类型,定义语句中指明基本时间单位为“fs”,以及由“fs”向上的各单元
38、之间的换算关系。除时间外,其他物理量如电压电容、电阻等也可以根据定义时间的格式进行定义。TYPE数据类型IS范围;UNITS基本单位;单位;ENDUNITS;例如:TYPE time ISRANGE0TO10000;UNITSfs;ps=1000fs;ns=1000ps;us=1000ns;ENDUNITS; 5.2.3 VHDL的数据对象的数据对象VHDL的数据对象分为三类,常量(constant)、变量(variable)信号(signal)。总体来说,三者都用于传递数据或接受数据赋值,在最终实现的硬件电路中,信号和变量相当于连线及连线上数据值;常量 是一个固定不变的数据值,如VCC、GN
39、D等,常量只能取一个值,信号和变量却可以取多个不同的值。 常量定义的一般表达格式是:CONSTANT 常数名:数据类型 := 表达式;例如 CONSTANT data: STD_LOGIC_VECTOR:=0110“上式的意思是data是常数0110,其数据类型为标准位矢量型。常量语句定义的适应范围有实体、结构体、程序包、块、进程和子程序。如果在一个设计实体中定义,则有效范围是这个设计实体的结构体,如果在设计实体的某一部分定义,则有效范围只是所定义的这部分电路,例如一个进程语句中,则有效范围只在这个进程中。 在VHDL具体设计中,变量和信号有不同的特点、不同的赋值符号,适应范围也有着明显的区别
40、。 表5.2.4对信号和变量进行了比较。 数据对象数据对象 DATA OBJECTS6.3.1 常数(常数(CONSTANT)6.3.2 变量(变量(VARIABLE)6.3.3 信号(信号(SIGNAL)1. 常数(常数(CONSTANT)2. 变量(变量(VARIABLE)3. 信号(信号(SIGNAL)常数定义的一般表述:常数定义的一般表述: CONSTANT 常数名:数据类型常数名:数据类型 := 表达式表达式 ;定义变量的一般表述:定义变量的一般表述: VARIABLE 变量名变量名 : 数据类型数据类型 := 初始值初始值 ; 定义定义 格式:格式: SIGNAL 信号名:信号名:
41、 数据类型数据类型 = 初始值初始值 ;表5.2.4信号和变量赋值语句比较比较内容 信号(signal)变量(variable)定义及赋值语句格式SIGNAL信号名:数据类型=-赋值符例:SIGNALa,b,y:INTEGER;y=a*b;VARIABLE变量名:数据类型:=-赋值符VARIABLEa,b:STD_LOGIC;a:=b;特点上式将数据a和b的乘积值传递给数据对象y,VHDL设计实体内的数据传递和端口数据的读写均由赋值语句实现;信号类似于连接线,实现各并行模块间的信息交流。信号具有全局特征,若在某一设计实体中定义,则该设计实体的任何结构体均能获得该信号的赋值,若在某一结构体中定义
42、,赋值能在本结构中的各模块之间例如各进程之间传递信息。信号赋值具有延时性,即信号赋值不是立即发生,而是发生在一个进程的结束;信号用作电路的数据连接通道,综合后与硬件结构对应。信号和端口概念是一致的,但无方向说明。上式将数据b的值赋给变量对象a,变量主要用在进程中作临时数据存储单元。变量具有局部特征,如果在某一进程或子程序中定义,则不能在此进程或子程序以外获得此变量值。而且变量的定义仅限于进程或子程序中。变量的赋值具有即时性,即赋值后立即产生。变量在综合后不对应硬件结构,只作为临时的、过渡的、局部的数据存储单元。适应范围实体、结构体和程序包中均可定义在进程或子程序中定义例5-12使用了变量赋值的
43、VHDL实例LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff3ISPORT(CLK,d1:INSTD_LOGIC;Q1:OUTSTD_LOGIC);END;ARCHITECTUREbhvOFdff3ISBEGINPROCESS(CLK)VARIABLEQQ:STD_LOGIC;BEGINIFCLKEVENTANDCLK=1THENQQ:=d1;ENDIF;Q1=QQ;ENDPROCESS;Endbhv;例5-13使用了信号赋值的VHDL实例LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff3ISPOR
44、T(CLK,d1:INSTD_LOGIC;Q1:OUTSTD_LOGIC);END;ARCHITECTUREbhvOFdff3ISSIGNALQQ:STD_LOGIC;BEGINPROCESS(CLK)BEGINIFCLKEVENTANDCLK=1THENQQ=d1;ENDIF;Q1=QQ;ENDPROCESS;ENDbhv; 5.3 VHDL的操作符的操作符表5.3.1VHDL中使用的主要操作符优先级顺序运算作符类型操作符功能操作数类型低高逻辑运算符AND逻辑与BIT、BOOLEAN、STD_LOGICOR逻辑或BIT、BOOLEAN、STD_LOGICNAND逻辑与非BIT、BOOLEAN
45、、STD_LOGICNOR逻辑或非BIT、BOOLEAN、STD_LOGICXOR逻辑异或BIT、BOOLEAN、STD_LOGICNOT*取反BIT、BOOLEAN、STD_LOGIC关系运算符=等号任何类型/=不等于任何类型大于枚举、整数型及对应的一维数组=大于等于枚举、整数型及对应的一维数组算术运算符+加枚举、整数型及对应的一维数组-减枚举、整数型及对应的一维数组&并置一维数组正、负运算符+正整数-负整数算术运算符*乘整数、实数/除整数、实数MOD求模整数REM取余整数*指数整数ABS取绝对值整数 5.3.1 逻辑操作符逻辑操作符(1)逻辑操作符所要求的数据类型是BIT、BOOLEAN、
46、STD_LOGIC三种以及BIT和STD_LOGIC相应的数组类型;对数组类型操作时除了操作符两边的数据类型相同外,还应保证数位相等。(2)一个表达式中出现两个以上的运算符号,应使用括号对运算进行分组。如果一个等式中重复应用了AND、OR、XOR三个算符中的一个则不要加括号。例如:y1 AND y2 AND y3; -AND是三种算符之一,不必加括号 (a OR b) AND c; -不是一个运算符重复应用,应加括号 d=a AND b OR c; -用了两种运符未加括号,错误(3)逻辑运算符除NOT外,其余操作符的优先级是各类运算符中最低的,但NOT与*乘方)、ABS(取绝对值)一样,同处于
47、最高优先级。 5.3.2 算术运算符算术运算符1、求和操作符+(加)、-(减)、&(并置)2、求积运算*(乘)、/(除)、MOD(取模)、REM(取余)3、混合操作*(乘方)、ABS(取绝对值)4、符号操作+(正)、-(负)例5-14并置符应用实例SIGNALf:STD_LOGIC_VECTOR(5DOWNTO0);SIGNALa,b:STD_LOGIC_VECTOR(2DOWNTO0);SIGNALc,d,e:STD_LOGIC;a=c&d&e;-单个元素并置为长度3位的数组f=a&b;-数组与数组并置成为长度6位的数组例5-15用加法运算实现位长4位的加法器LIBRARYIEEE;USEI
48、EEE.STD_LOGIC_UNSIGNED.ALL;ENTITYadder4BISPORT(cin:INSTD_LOGIC;a;b:INSTD_LOGIC_VECTOR(3DOWNTO0);s:OUTSTD_LOGIC_VECTOR(3DOWNTO0);cout:OUTSTD_LOGIC);ENDadder4B;ARCHITECTUREbehavOFadder4BISSIGNAL:sint:STD_LOGIC_VECTOR(4DOWNTO0);SIGNAL:aa,bb:STD_LOGIC_VECTOR(4DOWNTO0);BEGINaa=0&a;bb=0&b;-a、b4位数据变成aa、bb的
49、5位数sint=aa+bb+cin;s=sint(3NOWNTO0);cout=sint(4);ENDbehav; 5.3.3 关系运算符关系运算符1.关系操作符的作用将同类型的数据作大小比较或作排序判断,其结果以Boolean数据类型表示。应用时,操作符两边的数类型应相同,但位数可不同。2等号和不等号的操作数可为任何数据类型,例如两个数m1和m2的类型相同且数值大小一样,则可判断m1和m2相等的结果为Ture,而m1/=m2的结果为False。34种关系运算符、=为排序符号,允许使用的操作数类型为整数或整数的一维数组。4排序判断是将操作数从左至右逐位比较后得出结论的,若两操作数的位数不相等可
50、能产生错误结论,如 “101”和 “1001”比 较 到 左 起 第 3位 时 会 认 为“101”“1001”的错误结论,这时将操作数定义数据类型STD_LOGIC_ARITH中的为Unsigned则能得到正确结论。如:UNSIGNED1UNSIGNED011的比较结果为TRUE。 5.4 VHDL的基本语句解析的基本语句解析 顺序语句(sequentialstatements) 特点-语句的执行(指仿真)按书写顺序进行,应用范围只能是进程和子程序。 并行语句(concurrentstatements)又称并发语句 并行语句-执行是同步进行的,与语句书写顺序无关。并行语句执行中,各语句之间的
51、关系可能是相互独立的,但也可能存在信息交流5.4.1 顺序语句(顺序语句(sequential statements)1 赋值语句2条件语句(IF) 3 条件语句(CASE)5 循环控制语句(NEXT)4 循环语句(LOOP) 6 循环控制语句(EXIT) 7 等待语句(WAIT)信号赋值语句信号赋值语句变量赋值语句变量赋值语句赋值目标赋值符号赋值源赋值语句的作用将一个数值或一个表达式的运算结果传递到某一数据对象,以实现设计实体内部的数据传送以及端口外部数据的读写。赋值语句包含赋值源、赋值目标和赋值符三要素。要求赋值源和赋值目标的数据类型必须相同。根据赋值对象的不同,赋值语句分为:信号赋值和变
52、量赋值两种,信号赋值-具有延时性、全局性,赋值符用(=)表示。变量赋值-具有即时性、局部性,且定义只限于进程和子程序中,变量赋值符是(:=)一、赋值语句IF一种顺序语句是应用很广的语句,属于流程控制语句之一,除此之外,流程控制语句还有LOOP、NEXT、EXIT语句。IF条件语句,分为4种语句格式,见表5.4.1。二、条件语句(IF)表5.4.1条件语句的功能和格式 语句格式 功能及特点IF条件THEN(1)顺序语句ENDIF;IF语句是根据满足条件的情况确定执行哪些语句,而条件可以是一个或多个。格式(1)是一种不完全条件语句,满足条件则执行顺序语句,否则跳过顺序语句直至结束IF语句的执行。I
53、F条件THEN顺序语句(2)ELSE顺序语句ENDIF; 具有分支功能的IF语句,若条件成立执第一顺序语句,不成立执行第二顺序语句,总要执行其中一条后才到结束。IF条件1THEN顺序语句1ELSIF条件2THEN(3)顺序语句2ELSE顺序语句nENDIF;具有多重判断条件的IF语句,当条件1成立时执行顺序语句1,只有当前面的条件不成立时才判断后面的条件以决定是否执行下一个顺序语句,依次进行,直至执行最后一个顺序语句IF条件1THENIF条件2THEN(4)ENDIF;ENDIF;多重嵌套的IF语句,能实现时序电路,组合电路和混合电路。这时只有多个条件同时满足才能执行其中的顺序语句,而结束语句
54、应与条件语句对应。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcoderISPORT(din:INSTD_LOGIC_VECTOR(9DOWNTO0);output:OUTSTD_LOGIC_VECTOR(3DOWNTO0);ENDcoder;ARCHITECTUREbehavOFcoderISBEGINPROCESS(din)BEGINIF(din(9)=0)THENoutput=1001;ELSIF(din(8)=0)THENoutput=1000;ELSIF(din(7)=0)THENoutput=0111;ELSIF(din(6)=0)TH
55、ENoutput=0110;ELSIF(din(5)=0)THENoutput=0101;ELSIF(din(4)=0)THENoutput=0100”;ELSIF(dif(3)=0)THENutput=“0011”;ELSIF(din(2)=0)THENoutput=“0010”;ELSIF(din(1)=0)THENoutput=0001;ELSEoutput顺序语句;WHEN条件选择值=顺序语句;ENDCASE;其中,符号=没有实际操作意义,相当于THENCASE语句是根据条件选择值与条件表达式的值相同时,决定执行的顺序语句中的哪一项。条件表达式的值为整数或枚举型的值以及相应的数组形式。
56、CASE语句只能放在进程语句中应用。CASE语句中的条件语句无顺序之分,是相互独立的。CASE语句的每一条件选择值不能超出条件表达式的范围,每个选择值只能出现一次,即不能有相同选择值的条件语句。若CASE语句中的选择值不能复盖条件表达式的值,则用“OTHERS”作为最后一个条件取值。“OTHERS”的选择值只能出现一次。每次执行中必须选中而且只能选中条件语句中的一条。 CASE语句的执行过程中,各条件句是独立的,更接近于并行方式,不象IF语句那样是将条件按顺序逐项比较。综合后的硬件电路比IF语句所耗的资源要多。三、条件语句(CASE)表5.4.4Loop语句的特点和语句格式格式一:标号:FOR
57、循环变量IN循环次数范围Loop顺序语句ENDLoop标号;格式二:标号:WHILE条件LOOP顺序语句;ENDLOOP标号;循环语句根据设定的循环变量或条件,多次循环执行一组顺序语句,语句中的循环变量属于一个临时变量,由Loop语句自动定义,不能与语句中的其他标识符同名。循环次数从初值开始,每执行一次则增加1,直至达到循环次数范围指定的最大值。循环语句有两种格式,格式二是条件循环语句,条件成立则循环执行顺序语句,不成立则结束Loop语句。四、循环语句(LOOP)循环语句的功能是:将其所包含的一组顺序语句循环执行,执行次数由循环参数决定。例5-18用VHDL描述的8位奇偶校验电路LIBRARY
58、IEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYp_checkISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDp_check;ARCHITECTUREoptOFp_checkISSIGNALtmp:STD_LOGIC;BEGINPROCESS(a)Variabletemp:std_logic;BEGINtemp:=0;FORnIN0TO7LOOP-循环语句,循环变量为n,次数是07,此循环语句作为进程语句中的顺序语句使用temp:=tempXORa(n);ENDLOOP;tmp=temp;ENDPRO
59、CESS;y=tmp;ENDopt;五、循环控制语句(NEXT)循环控制语句NEXT一般嵌套在LOOP语句中,控制程序执行顺序有条件或无条件的转向。表5.4.5说明了NEXT语句的特点和格式 格式 特点格式一:NEXT标号WHEN条件;-如果条件成立,则执行NEXT语句,跳转到标号指定语句,否则继续向下执行格式二:NEXT;-执行到NEXT语句时,无条件终止向下执行,跳转到LOOP语句处开始下一个循环格式三:NEXTLOOP标号;-执行到NEXT语句时,终止向下执行,跳转到LOOP标号语句处开始下一次循NEXT语句常嵌套在LOOP语句的顺序语句中,NEXT语句的功能是控制LOOP语句中的顺序语
60、句终止往下执行而跳转到LOOP语句的起始位置。而这种终止是有条件的,WHEN后紧跟的是条件句。另外还有一种不带条件的转向控制语句,除了不含条件外,其余特点与上相同。例5-19NEXT语句应用示例L1:FORcetIN1TO8LOOP-循环语句,循环变量是cet,循环次数是18S1:a(cet):=0NEXTWHEN(b=c);-条件转向控制语句,若b=c则跳转到L1语句将cet加1后再执行S1语句,否则执行S2语句S2:a(cet+8):=0;ENDLOOPL1; 六、循环控制语句(EXIT)EXIT语句也是嵌套在LOOP语句中用于控制LOOP语句的转向,其语句格式和功能都十分相似。EXIT也
61、有三种格式:EXIT-格式1EXITLOOP标号-格式2EXITLOOP标号条件表达式-格式3EXIT语句和NEXT语句,在功能上有何差别?从前面的实例中已知NEXT语句的跳转方向是LOOP标号指定的语句,在没有LOOP标号时则跳转到当前LOOP语句的循环起点。而EXIT的跳转方向则不同,当执行到EXIT语句时会完全跳出循环,即跳转到LOOP循环语句的结束处。可见这两种跳转控制语句的差别在于跳转的方向不一样,NEXT语句是跳转至LOOP语句起点,而EXIT是跳转至LOOP语句的终点。【例【例5-20】SIGNAL a, b : STD_LOGIC_VECTOR (1 DOWNTO 0);SIG
62、NAL a_less_then_b : Boolean;. a_less_then_b = FALSE ; - 设初始值设初始值 FOR i IN 1 DOWNTO 0 LOOP IF (a(i)=1 AND b(i)=0) THEN a_less_then_b b EXIT ; ELSIF (a(i)=0 AND b(i)=1) THEN a_less_then_b = TRUE ; - a 实参表达式,形参名=实参表达式);-形参名即对被调用过程(函数)已作说明的参数名,实参表达式是一个标识符或具体数值,是当前调用中形参的接受体。两者的对关应关系分为位置关联和名字关联两种,而位置关联法可省
63、去形参名。在VHDL的结构体、程序包中允许调用子程序,子程序的调用属于顺序语句。在VHDL综合中,调用子程序会产生一个相应的硬件电路,类似于元件例化语句的作用,但元件例化产生的是一个新的设计层次,而子程序调用产生的电路只是当前层次的一部分。调用语句的执行完成下述三个功能:将实参值赋给被调用子程序的形参;执行过程或函数;将过程中的形参值返回给对应的实参。返回RETURN;-无条件返回,只能用于过程RETURN表达式;-只能用函数,返回时给出一个函数返回值返回语句的功能是结束子程序的执行,无条件跳转到子程序的结束处END返回语句只能用于子程序体中。返回语句有两种格式。表5.4.7子程序的定义和调用
64、语句格式及特点说明1.函数(FUNTION)定义语句中所要求的参数都是输入形式的信号或常数,调用时主程序将这些参数替代为主程序所要求的参数进行运算。(1.)函数与过程不同的是,要给出一个返回值,并且指明返回值的数据类型。(2.)子程序的应用包括“子程序定义”和“调用”两个方面,定义中又常包含返回语句。FUNCTION opt (a, b, opr :STD_LOGIC) RETURN STD_LOGIC IS 【例【例5-21】 BEGIN IF (opr =1) THEN RETURN (a AND b); ELSE RETURN (a OR b) ; END IF ; END FUNCTI
65、ON opt ;一个调用过程的语句格式如下:过程名过程名(形参名形参名= = 实参表达式实参表达式 , 形参名形参名= = 实参表达式实参表达式) ) ;过程的调用将分别完成以下三个步骤:(1)将)将IN和和INOUT模式的实参值赋给欲调模式的实参值赋给欲调用用的过程中与它们对应的形参;的过程中与它们对应的形参;(2)执行这个过程;)执行这个过程;(3)将过程中)将过程中IN和和INOUT模式的形参模式的形参值返回给对应的实参。值返回给对应的实参。2 2、过程调用、过程调用九九 返回语句返回语句(RETURN)RETURN; - 第一种语句格式第一种语句格式RETURN 表达式;表达式; -
66、第二种语句格式第二种语句格式【例【例5-21】PROCEDURE rs (SIGNAL s , r : IN STD_LOGIC ; SIGNAL q , nq : INOUT STD_LOGIC) IS BEGIN IF ( s =1 AND r =1) THEN REPORT Forbidden state : s and r are quual to 1; RETURN ; ELSEq = sAND nq AFTER 5ns ;nq data(high) THEN - 检测数据检测数据temp := data(low) ; data(low) := data(high); data(hi
67、gh) := temp ; END IF ; END swap ; - 过程过程swap定义结束定义结束 VARIABLE my_array : data_array ;- 在本进程中定义变量在本进程中定义变量my_arraBEGIN - 进程开始进程开始 my_array := in_array ; - 将输入值读入变量将输入值读入变量swap(my_array, 1, 2); - my_array、1、2是对应于是对应于data、low、high的实参的实参 swap(my_array, 2, 3); - 位置关联法调用,位置关联法调用, 第第2、第、第3元素交换元素交换 swap(my_
68、array, 1, 2); - 位置关联法调用,位置关联法调用, 第第1、第、第2元素再次交换元素再次交换 out_array y THEN tmp := x; x := y; y := tmp; END IF;END sort2;BEGIN va := a; vb := b; vc := c; vd := d; sort2(va, vc); sort2(vb, vd); sort2(va, vb); sort2(vc, vd); sort2(vb, vc); ra = va ; rb = vb; rc = vc; rd tmp := rega AND regb ; WHEN 101 = tm
69、p := rega OR regb ; WHEN 110 = tmp := NOT rega ; WHEN OTHERS = NULL ;END CASE ; 空操作语句的语句格式如下:空操作语句的语句格式如下: NULL;十十 空操作语句空操作语句(NULL) 5.4.2 并行语句(并行语句(Concurrent statements)并行语句,又称为并发语句1.结构体中各并行语句是同步执行的,与语句在结构体中书写的顺序位置无关。2.同一结构体中的各并行语句之间可以是相互独立的,也可以相互发生信息交流。3.在一条并行语句内部可能嵌套几条其他语句,这些嵌套的语句可能是并行执行,也可能是顺序执行
70、。1 1、并行信号赋值语句(、并行信号赋值语句(Concurrent Signal AssignmentsConcurrent Signal Assignments)。)。2 2、进程语句、进程语句( (Process Statements)Process Statements)。3 3、块语句、块语句( (Block Statements)Block Statements)。4 4、条件信号赋值语句、条件信号赋值语句( (Selected Signal Assignments)Selected Signal Assignments)。5 5、元件例化语句、元件例化语句( (Component
71、 Instantiations)Component Instantiations),其中包括类属配置语句其中包括类属配置语句6 6、生成语句、生成语句( (Generate Statements)Generate Statements)。7 7、并行过程调用语句、并行过程调用语句( (Concurrent Procedure Calls)Concurrent Procedure Calls)。结构体中的并行语句主要有七种:。表5.4.8PROCESS的特点一、进程语句(PROCESS)语句格式特点进程标号:PROCESS(敏感信号表)IS说明部分BEGIN顺序语句;END PROCESS进程标
72、号;-其中,标号可省去由PROCESS引导,ENDPROCESS结束,中间为顺序语句,描述相对独立的行为。同一结构体中,可含有多个进程语句,各进程语句为并行关系,而每个进程语句本身包含有顺序语句。VHDL的所有合法顺序语句都应放在进程语句中使用。进程必须设有敏感信号,由敏感信号的变化启动进程执行,执行完一遍后进入等待状态,由下一次敏感信号的变化才会再次启动执行。每一进程均可存、取实体和本结构体中所定义的信号,各进程之间也通过信号传送数据 PROCESS 组成组成PROCESS语句结构语句结构进程说明进程说明顺序描述语句顺序描述语句信号赋值语句变量赋值语句进程启动语句子程序调用语句顺序描述语句进
73、程跳出语句敏感信号参数表敏感信号参数表例5-24用进程语句设计一个D触发器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff1ISPORT(CLK:INSTD_LOGIC;d:INSTD_LOGIC;Q:OUTSTD_LOGIC);END;ARCHITECTUREbhvOFdff1ISSIGNALQ1:STD_LOGIC;-类似于在芯片内部定义一个数据的暂存节点BEGINPROCESS(CLK)BEGINIFCLKEVENTANDCLK=1-检测CLK的上升沿THENQ1=d;ENDIF;Q=Q1;-将内部的暂存数据向端口输出ENDPROCESS
74、;ENDbhv;二、并行赋值语句(CONCURRENTASSIGNMENTS)1。赋值目标必须是信号而不是变量。2。每条并行赋值语句都相当于缩写的进程语句,其中涉及的信号都相当于敏感信号,一旦发生变化则启动赋值语句的执行,而且这种启动是独立于其他语句的。3。并行赋值语句可以直接出现在结构体中。 并行赋值语句的三种不同格式1 1。简单信号赋值语句。简单信号赋值语句赋值目标赋值目标 = 表达式表达式2. 2. 条件信号赋条件信号赋 值语句值语句赋值目标赋值目标 = 表达式表达式 WHEN 赋值条件赋值条件 ELSE 表达式表达式 WHEN 赋值条件赋值条件 ELSE . 表达式表达式3. 3. 选
75、择信号赋值语句选择信号赋值语句WITH 选择表达式选择表达式 SELECT 赋值目标信号赋值目标信号 =表达式表达式 WHEN 选择值选择值表达式表达式 WHEN 选择值选择值 .表达式表达式 WHEN 选择值;选择值;种类简单信号赋值语句条件信号赋值语句选择信号赋值语句特点 简 单赋值语句可作为并行语句单独出现在结构体中,也可以作为顺序语句出现在进程语句中。 语句的执行由表达式中的信号变化启动 根据不同的条件选择表达式中的一个赋给目标信号,满足条件则立即赋值,可见,测试条件带有顺序优先级。 最后一句不带条件,即前述条件均不满足时执行最后一句。 语句功能与IF语句类似,不同之处是语句一定要用到
76、ELSE,而IF语句可采用多个条件语句嵌套。 由条件句中的信号变化启动程序执行,条件不能重叠。 该语句不能用在进程语句中。 以同一表达式的不同取值为条件将多个表达式的值赋给目标信号,功能类似CASE语句; 语句的执行由 WITH 引出的选择表达式的值发生变化启动语句执行; 对各子句条件的测试是同时进行的,不象条件赋值语句那样按书写顺序测试。 不允许有条件涵盖不全和重叠现象。 每一子句后面均有 逗号,最后一句是分号。例5-26用用VHDL设计一个四选一的数据选择器,当条件sel为代码00时,将d0的值赋给q,当条件sel为01时,将d1的值赋给q,如果sel的值不满足所有的值则将q置为高阻态之。
77、(1)用条件信号赋值语句实现上述功能的四选一数据选择器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(d0,d1,d2,d3,a,b:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux4;ARCHITECTURErtlOFmux4ISSIGNALsel:STD_LOGIC_VECTOR(1DOWNTO0);BEGINsel=b&a;-将a、b并置为赋值条件selq=d0WHENsel=00ELSE-当赋值条件为00时,d0赋给qd1WHENsel=01ELSEd2WHENsel=10ELSEd3WHENsel=1
78、1ELSEz;-当赋值条件不是上述四种情况时将q置为zENDrtl;(2)用选择信号赋值语句实现上述功能的四选一数据选择器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(d0,d1,d2,d3,a,b:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux4;ARCHITECTUREbehaveOFmux4ISSIGNALsel:STD-LOGIC-UECTORY(1DOWNTO0);BEGINsel=b&a-WITHselSELECT-选择信号代入语句q=d0WHEN00,d1WHEN01,d2WHEN10,d3W
79、HEN11,zWHENOTHERS;ENDbehave;格 式特 点块标号:Block说明部分(接口、类属说明BEGIN并发处理语句ENDBLOCK标号名;*结尾的标号不是必须有的BLOCK为并行语句,结构体中的各BLOCK语句是并行的,每个BLOCK语句中包含的语句也是并行的;块说明部分主要用于信号的映射和参数的定义,常用的语句是GENERIC语句、GENERIC MAP语句、PORT语句和PORTMAP语句;每个块都可以象一个独立的设计实体那样定义局部信号,如定义、常数、元件、类属、数据类型、子程序等。这种定义只对当前块有效。1.复杂的设计实体,程序长,阅读不便。可利用块语句将设计实体划分
80、成几个模块2.某些模块仍然复杂,可进行下一层次的分块,即用块结构嵌套。3.块语句的使用不影响综合结果,也就是说,块语句是不执行的。分块的目的主要是改善并行语句的结构和可读性。 三、块语句(BLOCKSTATEMENTS)例5-27BLOCK语句应用程序实例BLOCK语句进行了三重嵌套。各BLOCK语句都设置了信号说明。在不同层次的块中定义了同名字的信号,这时,内层块能使用外层块所定义的信号,而外层块却不能使用内层块中定义的信号。阅读本程序可以清楚显示出信号的有效范围。.B1:BLOCK-定义块B1SIGNALs1:BIT;-在块B1中定义s1BEGINs1=aANDb;-向B1中的s1赋值B2
81、:BLOCK-定义块B2嵌套于块B1中SIGNALs2:BIT;-在块B2中定义s2BEGINs2=cANDd;-向B2中的s2赋值B3:BLOCKBEGINz=s2;-s2来自块B2ENDBLOCKB3;ENDBLOCKB2;y 连接端口名,连接端口名,.) ;特点1例化语句调用的元件来源可以是用户自编的设计实体、元件库中的元件以及用其他语言设计的设计实体。2例化语句分成两部分。第一部分是元件定义,由类属表指明被调元件的端口数据类型和参数,由端口名表指明对外连接的各端口名。例化部分则指明被调元件与当前设计实体的连接。3连接方式分为两种:名字关联:这种方式中,元件端口名和关联符号都必须存在,每
82、条连线用关联符指明,关联符=的左边是元件端口名,右边是对应的连接端口名。位置关联:这种方式中,元件端口名和关联符均可省略,只要在PORTMAP子句中列出当前系统的连接端口名即可,但连接端口中各端口的名字与元件端口中的名字应一一对应。LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_adder IS PORT (a,b : IN STD_LOGIC; co, so : OUT STD_LOGIC); END ENTITY h_adder; ARCHITECTURE fh1 OF h_adder IBEGIN so = (a OR b)AND(
83、a NAND b); co = NOT( a NAND b); END ARCHITECTURE fh1; * 1位二进制位二进制半加器半加器 5-30全加器的VHDL描述1位二进制全加器位二进制全加器内部端口外部端口端口连线标号:标号: FOR 循环变量循环变量 IN 取值范围取值范围 GENERATE 说明说明 BEGIN 并行语句并行语句 END GENERATE 标号标号 ;标号:标号: IF 条件条件GENERATE 说明说明 Begin 并行语句并行语句 END GENERATE 标号标号 ;表达式表达式 TO 表达式表达式 ; - 递增方式,如递增方式,如1 TO 5表达式表达式
84、 DOWNTO 表达式表达式 ; - 递减方式,如递减方式,如5 DOWNTO 1六、生成语句(GENERATESTATEMENTS 例如将8个D触发器连接成8位数据寄存器74LS273。VHDL的生成语句就是解决类似的问题,即将已经设计好的同一元件多次复制而生成新的较复杂的电路。利用Generate语句能大大简化特 点1生成语句分两种格式,两种格式仅第一子句不相同,即表示两种不同的生成方式,其中一种是FOR语句,另一种是IF语句。2第二子句为说明部分,对元件的数据类型、数据对象、子程序作局部说明。若将元件例化语句作生成语句中的“并行语句”部分,则例化语句中的元件说明部分就是生成语句的说明部分
85、。3FOR型生成语句主要用在那些由多个完全相同结构组成的电路,IF型生成语句主要用在那些由相同元件组成但相互连接有差异的情况。若多个相同元件有规则连接但电路前端和后端不规则的可采用两种形式组合应用。4并行语句部分实现基本单元的复制和相互连接,常用的语句有元件例化语句、进程语句、块语句、并行过程调用和赋值语句,还可用生成语句嵌套。5程序执行时,生成语句中的循环变量在取值范围里自动递增或递减,类似于LOOP语句,可见生成语句具有顺序性,但综合后的电路却是并行的。例5-316位二进制计数器设计例5-326位二进制计数器设计LIBRARYIEEE;-该设计实体完成一个D独发器USEIEEE.STD_L
86、OGIC_1164.ALL;ENTITYd_ffISPORT(d,clk:INSTD_LOGIC;q:OUTSTD_LOGIC;nq:OUTSTD_LOGIC;)ENDENTITYd_ff;ARCHITECTUREa_rs_ffOFd_ffISBEGINbin_p_rs_ff:PROCESS(clk)-将时钟信号CLK作为敏感信号BEGINIFclk=1ANDclkEVENTTHEN-检测时钟信号的上升沿q=d;nq=NOTd;PROCEDUREadder(SIGNALa,b:INSTD_LOGIC;ENDIF;ENDPROCESS;ENDARCHITECTUREa_rs_ff;LIBRARY
87、IEEE; -该设计实体完成6位串行二进制计数器USEIEEE.STD_LOGIC_1164.ALL;ENTITYcntbinISGENERIC(n:INTEGER:=6); -类属参数,n为整数6PORT(q:OUTSTD_LOGIC_VECTOR(0TOn-1);-q为q0q5,即6个位计数器输出in_1:INSTD_LOGIC); -第一位的输入计数脉冲ENDENTITYcnt_bin;ARCHITECTUREbehvOFcnt_binISCOMPONENTd_ff-例化语句的元件定义PORT(d,clk:INSTD_LOGIC;q,Nq:OUTSTD_LOGIC);ENDCOMPONE
88、NTd_ff;SIGNALs:STD_LOGIC_VECTOR(0TOn);-设6位计数器的脉冲输入端为S(0)S(6),其中S(6)只作最后一位计数器的D端信号BEGINs(0)=in_1;-将输入时钟in_1作为第一位计数器输入S(0)q_1:FORiIN0TOn-1GENERAT-生成语句,循环变量i的取值范围是05dff:d_ffPORTMAP(s(i+1),s(i),q(i),s(i+1);-生成语句中的并行语句,说明元件d_ff在当前结构体中如何连接ENDGENERATE;ENDARCHITECTUREbehv;格式特点过程名(关联参数);并行过程调用语句由过程语句和调用语句 两
89、部 分 组 成 。 其 中 , 过 程 语 句 由procedure引导,调用语句由“过程名”引导。并行过程调用语句能作为并行语句直接用在结构体、块语句中,常用来产生几个并行工作的、实现相同功能的电路,这样得到的程序结构简练。 七、并行过程调用语句(CONCURRENTPROCEDURECALLS)下面的一段程序简要说明了并行调用过程语句的用法。首先定义了一个具有半加器功能的过程。然后在并行语句以及进程语句中分别调用这个过程。例5-33SIGNALsum:OUTSTD_LOGIC);过程定义,过程名为adderadder(a1,b1,sum1);-并行过程调用-a1、b1、sum1为对应于a、
90、b、sum的关联参量名PROCESS(c1,c2);-进程语句,其中的顺序语句应用过程调用BEGINAdder(c1,c2,s1);-顺序过程调用,c1、c2、s1为对应于a、b、sum的关联参量名ENDPROCESS; VHDL设计的基本概念和语句小节设计的基本概念和语句小节数据类型信号赋值符条件比较符 延时实体结构体端口定义端口模式逻辑操作符IF条件语句并行条件语句进程语句顺序语句并行语句文件取名文件存盘综合复习【例5-34】 用用VHDL设计设计7段段16进制译码器进制译码器用用CASE语句完成真值表的功能语句完成真值表的功能向向7段数码段数码管输出信号,管输出信号,最高位控制最高位控制
91、小数点小数点注意,此语句必须加入注意,此语句必须加入4位加法位加法计数器计数器7段译码器段译码器8位总线输出位总线输出信信号号输输出出1. D触发器触发器VHDL描述的语言现象说明描述的语言现象说明BIT数据类型定义:TYPE BIT IS(0,1);TYPE BIT IS(0,1);STD_LOGIC数据类型定义:TYPE STD_LOGIC IS (U,X,0,1,Z,W,L,H,-);TYPE STD_LOGIC IS (U,X,0,1,Z,W,L,H,-);STD_LOGIC所定义的9种数据的含义是:UU表示未初始化的;表示未初始化的; XX表示强未知的;表示强未知的; 0 0表示强逻
92、表示强逻辑辑0 0; 1 1表示强逻辑表示强逻辑1 1; ZZ表示高阻态;表示高阻态; W W 表示弱未知的;表示弱未知的; LL表示弱逻辑表示弱逻辑0 0; HH表示弱逻辑表示弱逻辑1 1; -表示忽略。表示忽略。3. 3. SIGNALSIGNAL信号定义和数据对象信号定义和数据对象 【例5-35】ARCHITECTURE bhv OF DFF1 IS BEGIN PROCESS (CLK) BEGIN IF CLKEVENT AND CLK = 1 THEN Q = D ; END IF; END PROCESS ;END;2.使用库和程序包的一般定义表式是: LIBRARY LIBRA
93、RY ; USE USE .ALL ; ALL ; 4. 4. 上升沿检测表式和信号属性函数上升沿检测表式和信号属性函数EVENTEVENT关键词EVENT是信号属性,VHDL通过以下表式来测定某信号的跳变边沿: EVENTEVENT 实现时序电路的实现时序电路的VHDL不同表达方式不同表达方式【例【例5-38】.PROCESS (CLK) BEGINIF CLKEVENT AND (CLK=1) AND (CLKLAST_VALUE=0) THEN Q = D ; -确保确保CLK的变化是一次上升沿的跳变的变化是一次上升沿的跳变 END IF; END PROCESS ;【例【例5-39】.
94、PROCESS (CLK) BEGINIF CLK=1 AND CLKLAST_VALUE=0 THEN Q = D ; END IF; END PROCESS ; 实现时序电路的实现时序电路的VHDL不同表达方式不同表达方式【例【例5-40】LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL ;ENTITY DFF3 IS PORT (CLK : IN STD_LOGIC ; D : IN STD_LOGIC ; Q : OUT STD_LOGIC ); END ; ARCHITECTURE bhv OF DFF3 IS SIGNAL Q1 : STD_LOG
95、IC; BEGIN PROCESS (CLK) BEGIN IF rising_edge(CLK) - CLK的数据类型必须是的数据类型必须是STD_LOGIC THEN Q1 = D ; END IF; Q = Q1 ; END PROCESS ; END ; 实现时序电路的实现时序电路的VHDL不同表达方式不同表达方式【例5-41】 . PROCESS BEGIN wait until CLK = 1 ; -利用利用wait语句语句 Q = D ; END PROCESS;【例5-42】. PROCESS (CLK) BEGIN IF CLK = 1 THEN Q = D ; -利用进程的
96、启动特性产生对利用进程的启动特性产生对CLK的边沿检测的边沿检测 END IF; END PROCESS ;【例5-43】. PROCESS (CLK,D) BEGIN IF CLK = 1 -电平触发型寄存器电平触发型寄存器 THEN Q = D ; END IF; END PROCESS ; 实现时序电路的实现时序电路的VHDL不同表达方式不同表达方式图图5-7 边沿型触发器时序波形边沿型触发器时序波形图图5-8 电平触发型寄存器的时序波形电平触发型寄存器的时序波形8. 异步时序电异步时序电路设计路设计 . ARCHITECTURE bhv OF MULTI_DFF IS SIGNAL Q
97、1,Q2 : STD_LOGIC; BEGINPRO1: PROCESS (CLK) BEGIN IF CLKEVENT AND CLK=1 THEN Q1 = NOT (Q2 OR A); END IF; END PROCESS ;PRO2:PROCESS (Q1) BEGIN IF Q1EVENT AND Q1=1 THEN Q2 = D; END IF; QQ a2,b=a3,s=s0,y=tmp); u2 : MUX21A PORT MAP(a=a1,b=tmp,s=s1,y=outy); END ARCHITECTURE BHV ;实验实验5-1 简单组合电路的设计简单组合电路的设计
98、对对上上例例分分别别进进行行编编译译、综综合合、仿仿真真。并并对对其其仿仿真真波波形形(图图5-23)作作出出分分析析说明。说明。图图5-23 仿真波形仿真波形实验实验5-1 简单组合电路的设计简单组合电路的设计(4) 实实验验内内容容3:引引脚脚锁锁定定以以及及硬硬件件下下载载测测试试。若若目目标标器器件件是是EPF10K10,用用键键1(PIO0,引引脚脚号号为为5)控控制制s0;用用键键2(PIO1,引引脚脚号号为为6)控控制制s1;a3、a2和和a1分分别别接接clock5(引引脚脚号号为为83)、clock0(引引脚脚号号为为2)和和clock2(引引脚脚号号为为43);输输出出信信
99、号号outy仍仍接接扬扬声声器器spker(引引脚脚号号为为3)。通通过过短短路路帽帽选选择择clock0接接256Hz信信号号,clock5接接1024Hz,clock2接接8Hz信号。最后进行编译、下载和硬件测试实验信号。最后进行编译、下载和硬件测试实验。实实 验验 实验实验5-1 简单组合电路的设计简单组合电路的设计图图5-24 实验实验5-1引脚锁定引脚锁定实验实验5-1 简单组合电路的设计简单组合电路的设计(5) 实实验验报报告告:根根据据以以上上的的实实验验内内容容写写出出实实验验报报告告,包包括括程程序序设设计计、软软件件编编译译、仿仿真真分分析析、硬硬件件测测试试和和详详细细实
100、实验验过过程程;给出程序分析报告、仿真波形图及其分析报告。给出程序分析报告、仿真波形图及其分析报告。(6) 附附加加内内容容:根根据据本本实实验验以以上上提提出出的的各各项项实实验验内内容容和和实实验要求,设计验要求,设计1位全加器。位全加器。完完成成全全加加器器的的设设计计,包包括括仿仿真真和和硬硬件件测测试试。实实验验要要求求分分别别仿仿真真测测试试底底层层硬硬件件或或门门和和半半加加器器,最最后后完完成成顶顶层层文文件件全全加加器器的的设设计计和和测测试试,给给出出设设计计原原程程序序,程程序序分分析析报报告告、仿仿真真波波形形图及其分析报告。图及其分析报告。实验实验5-2 简单时序电路
101、的设计简单时序电路的设计(1) 实实验验目目的的:熟熟悉悉VHDL文文本本设设计计过过程程,学学习习简简单单时时序序电电路的设计、仿真和硬件测试。路的设计、仿真和硬件测试。(2) 实实验验内内容容1:根根据据实实验验步步骤骤和和要要求求,设设计计触触发发器器,给给出出程序设计、软件编译、仿真分析、硬件测试及详细实验过程。程序设计、软件编译、仿真分析、硬件测试及详细实验过程。(3) 实实验验内内容容2:根根据据实实验验步步骤骤和和要要求求,设设计计锁锁存存器器,同同样样给给出出程程序序设设计计、软软件件编编译译、仿仿真真分分析析、硬硬件件测测试试及及详详细细实实验验过程。过程。(4) 实实验验报
102、报告告:分分析析比比较较实实验验内内容容1和和2的的仿仿真真和和实实测测结结果果,说明这两种电路的异同点,给出实验报告。说明这两种电路的异同点,给出实验报告。实验实验5-2 含异步清含异步清0和同步时钟使能的和同步时钟使能的4位加法计数器位加法计数器(3)实验内容)实验内容1:对例对例5-45进行编辑、编译、综合、适配、仿真。进行编辑、编译、综合、适配、仿真。说明例说明例5-45各语句的作用,详细描述示例的功能特点,给出其所有各语句的作用,详细描述示例的功能特点,给出其所有信号的时序仿真波形信号的时序仿真波形。【例【例5-45】LIBRARY IEEE;USE IEEE.STD_LOGIC_1
103、164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4B IS PORT (CLK : IN STD_LOGIC; RST : IN STD_LOGIC; ENA : IN STD_LOGIC; OUTY : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT : OUT STD_LOGIC ); END CNT4B;ARCHITECTURE behav OF CNT4B IS SIGNAL CQI : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL CQI : STD_LOGIC_VECTOR(
104、3 DOWNTO 0);BEGINP_REG: PROCESS(CLK, RST, ENA) BEGIN IF RST = 1 THEN CQI = 0000; ELSIF CLKEVENT AND CLK = 1 THEN IF ENA = 1 THEN CQI = CQI + 1; ELSE CQI = 0000; END IF; END IF; OUTY = CQI ; END PROCESS P_REG ; COUT = CQI(0) AND CQI(1) AND CQI(2) AND CQI(3); -进进位输出位输出END behav;BEGINP_REG: PROCESS(CLK
105、, RST, ENA) BEGIN IF RST = 1 THEN CQI = 0000; ELSIF CLKEVENT AND CLK = 1 THEN IF ENA = 1 THEN CQI = CQI + 1; ELSE CQI = 0000; END IF; END IF; OUTY = CQI ; END PROCESS P_REG ; COUT LED7S LED7S LED7S LED7S LED7S LED7S LED7S LED7S LED7S LED7S NULL ; END CASE ; END PROCESS ; END ;(4)实验内容)实验内容2:将例将例5-46改
106、成改成16进制进制7段译码器重复以段译码器重复以上实验。上实验。(5)思考题:)思考题:讨论语句讨论语句WHEN OTHERS=NULL的作用。的作用。对于不同的对于不同的VHDL综合器,此句是否具有相同含义和功能综合器,此句是否具有相同含义和功能?(6)附加实验内容:)附加实验内容:用例化语句按图用例化语句按图5-22的方式,以例的方式,以例5-45和例和例5-46为底层元件,完成顶层文件设计,并重复以上为底层元件,完成顶层文件设计,并重复以上实验过程。注意图实验过程。注意图5-22中的中的tmp是是4位总线,位总线,led是是7位总线。位总线。对于引脚锁定和实验,建议选电路模式对于引脚锁定
107、和实验,建议选电路模式6,用数码,用数码8显示译显示译码输出,用键码输出,用键3作为时钟输入(每按作为时钟输入(每按2次键为次键为1个时钟脉冲)个时钟脉冲),或直接接时钟信号,或直接接时钟信号clock0。(7)实验报告:实验报告:根据以上的实验内容写出实验报告,包根据以上的实验内容写出实验报告,包括程序设计、软件编译、仿真分析、硬件测试和实验过程;括程序设计、软件编译、仿真分析、硬件测试和实验过程;设计程序、程序分析报告、仿真波形图及其分析报告。设计程序、程序分析报告、仿真波形图及其分析报告。图图5-22 计数器和译码器连接电路的顶层文件原理图计数器和译码器连接电路的顶层文件原理图实验实验5
108、-3 数控分频器的设计数控分频器的设计(1)实验目的:)实验目的:学习数控分频器的设计、分析和测试方法。学习数控分频器的设计、分析和测试方法。(2)实验原理:)实验原理:数控分频器的功能就是当在输入端给定不同输入数据时,将对数控分频器的功能就是当在输入端给定不同输入数据时,将对输入的时钟信号有不同的分频比,例输入的时钟信号有不同的分频比,例5-47的数控分频器就是用计数值可并行预置的数控分频器就是用计数值可并行预置的加法计数器设计完成的,方法是将计数溢出位与预置数加载输入信号相接即可。的加法计数器设计完成的,方法是将计数溢出位与预置数加载输入信号相接即可。(3)实验内容)实验内容1:根据图根据
109、图5-23的波形提示,分析例的波形提示,分析例5-47中的各语句功能、设计中的各语句功能、设计原理、逻辑功能,并详述进程原理、逻辑功能,并详述进程P_REG和和P_DIV的作用。的作用。图图5-23 当给出不同输入值当给出不同输入值D时,时,FOUT输出不同频率(输出不同频率(CLK周期周期=50ns)实验实验5-3 数控分频器的设计数控分频器的设计(4)实验内容)实验内容2:输入不同的输入不同的CLK频率和预置值频率和预置值D,给出如例给出如例5-47的时序波形。的时序波形。(5)实验内容)实验内容3:在实验系统上硬件验证例在实验系统上硬件验证例5-47的功能。如果目标器件是的功能。如果目标
110、器件是EPF10K10,建议选实验电路模式建议选实验电路模式1,键,键2/键键1(PIO7-PIO0)负责输入负责输入8位预置位预置数数D;CLK由由clock0输入,频率可选输入,频率可选65536Hz或更高(确保分频后落在音频范围)或更高(确保分频后落在音频范围);输出;输出FOUT接扬声器(接扬声器(SPKER:PIN3)。)。编译下载后进行硬件测试:改变键编译下载后进行硬件测试:改变键2/键键1的输入值,可听到不同音调的声音。的输入值,可听到不同音调的声音。(6)实验附加内容:)实验附加内容:将例将例5-47扩展成扩展成16位分频器,并提出此项设计的数项实用位分频器,并提出此项设计的数
111、项实用示例,如示例,如PWM的设计等。的设计等。(7)思考题:)思考题:怎样利用怎样利用2个例个例5-47给出的模块设计一个电路,给出的模块设计一个电路,使其输出方波的正使其输出方波的正负脉宽的宽度分别由两个负脉宽的宽度分别由两个8位输入数据控制?位输入数据控制?(8)实验报告:)实验报告:根据以上的要求,将实验项目分析设计,仿真和测试写入实验根据以上的要求,将实验项目分析设计,仿真和测试写入实验报告。报告。【例例 5-47】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY PULSE
112、 IS PORT ( CLK : IN STD_LOGIC; D : IN STD_LOGIC_VECTOR(7 DOWNTO 0); FOUT : OUT STD_LOGIC ); END ;ARCHITECTURE one OF PULSE IS SIGNAL FULL : STD_LOGIC;BEGIN P_REG: PROCESS(CLK) VARIABLE CNT8 : STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN IF CLKEVENT AND CLK = 1 THEN IF CNT8 = 11111111 THEN CNT8 := D; -当当CNT8计
113、数计满时,输入数据计数计满时,输入数据D被同被同步预置给计数器步预置给计数器CNT8 FULL = 0; -且输出溢出标志信号且输出溢出标志信号FULL为低电平为低电平 END IF; END IF; END PROCESS P_REG ; P_DIV: PROCESS(FULL) VARIABLE CNT2 : STD_LOGIC; BEGIN IF FULLEVENT AND FULL = 1 THEN CNT2 := NOT CNT2; -如果溢出标志信号如果溢出标志信号FULL为高电平,为高电平,D触发器输出取反触发器输出取反 IF CNT2 = 1 THEN FOUT = 1; EL
114、SE FOUT = 0; END IF; END IF; END PROCESS P_DIV ;END; 实验实验5-4 4位十进制频率计位十进制频率计设计设计(1)实验目的:)实验目的:设计设计4位十进制频率计,学习较复杂的数字系统设位十进制频率计,学习较复杂的数字系统设计方法。计方法。(2)实验原理:)实验原理:根据频率的定义和频率测量的基本原理,测定信根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为号的频率必须有一个脉宽为1秒的输入信号脉冲计数允许的信号;秒的输入信号脉冲计数允许的信号;1秒计数结束后,计数值锁入锁存器的锁存信号并为下一测频计数周秒计数结束后,计数值锁入
115、锁存器的锁存信号并为下一测频计数周期作准备的计数器清期作准备的计数器清0信号。这信号。这3个信号可以由一个测频控制信号发个信号可以由一个测频控制信号发生器产生,即图生器产生,即图5-24中的中的TESTCTL。 设计要求是:TESTCTL的计数使能信号CNT_EN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制。当CNT_EN高电平时,允许计数;低电平时停止计数,并保持其所计的脉冲数。在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前1秒钟的计数值锁存进各锁存器REG4B中,并由外部的7段译码器译出,显示计数值。设置锁存器的好处是数据显示稳
116、定,不会由于周期性的清0信号而不断闪烁。锁存信号后,必须有一清0信号RST_CNT对计数器进行清零,为下1秒的计数操作作准备。其工作时序如图5-24。【例【例 5-48】LIBRARY IEEE; -测频控制器测频控制器USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY TESTCTL IS PORT ( CLKK : IN STD_LOGIC; - 1Hz CNT_EN,RST_CNT,LOAD : OUT STD_LOGIC); END TESTCTL;ARCHITECTURE behav OF TESTCT
117、L IS SIGNAL DIV2CLK : STD_LOGIC;BEGIN PROCESS( CLKK ) BEGIN IF CLKKEVENT AND CLKK = 1 THEN DIV2CLK = NOT DIV2CLK; END IF; END PROCESS; PROCESS (CLKK, DIV2CLK) BEGIN IF CLKK=0 AND Div2CLK=0 THEN RST_CNT = 1; ELSE RST_CNT = 0; END IF; END PROCESS; LOAD = NOT DIV2CLK ; CNT_EN = DIV2CLK;END behav;【例【例5-
118、49】LIBRARY IEEE; -4位锁存器位锁存器USE IEEE.STD_LOGIC_1164.ALL;ENTITY REG4B IS PORT ( LOAD : IN STD_LOGIC; DIN : IN STD_LOGIC_VECTOR(3 DOWNTO 0); DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );END REG4B;ARCHITECTURE behav OF REG4B ISBEGIN PROCESS(LOAD, DIN) BEGIN IF LOADEVENT AND LOAD=1 THEN DOUT=DIN;-时钟到来时,锁时钟到来时,锁存输入数据存输入数据 END IF; END PROCESS; END behav;图图5-24 4位十位十进制频率计顶进制频率计顶层文件原理图层文件原理图图图5-25 频率计测频控制器频率计测频控制器TESTCTL测控时序图测控时序图