《新的硬件描述语言VHDL编程基础.ppt》由会员分享,可在线阅读,更多相关《新的硬件描述语言VHDL编程基础.ppt(130页珍藏版)》请在三一办公上搜索。
1、第四章 硬件描述语言VHDL编程基础,本章首先介绍了VHDL的基本结构,使读者初步掌握VHDL的基础知识。最后通过大量的实例使读者进一步掌握使用VHDL的设计方法。,本章主要内容,第一节 概述,第二节 VHDL程序结构,第三节 VHDL的基本数据类型,第四节 VHDL的基本描述语句,第五节 子程序,第一节 概述,VHDL(Very high speed intergated circuit Hardware Description Language):非常高速集成电路的硬件描述语言。20世纪80年代诞生于美国国防部的一项研究计划,目的是使电路的设计能够以文字的方式保存下来。被列为IEEE107
2、6标准,也成为工业界的标准。,1.VHDL简介,2Verilog HDL语言简介,Verilog HDL它是在C语言的基础上发展起来的,由GDA(Gateway Design Automation)公司创造的,1989年cadence公司收购了GDA公司,使得Verilog HDL成为了该公司的独家专利。1990年Cadence公司公开发表了Verilog HDL,并成立LVI组织以促进Verilog HDL成为IEEE标准,即IEEE Standard 1364-1995。Verilog HDL的最大特点就是易学易用,如果有C语言的编程经验,可以在一个较短的时间内很快的学习和掌握,Veril
3、og HDL语言的系统抽象能力稍逊于VHDL,而对门级开关电路的描述能力则优于VHDL。,二、VHDL的优点,1.支持层次化设计 2.具有多层次描述系统硬件功能的能力 3.具有丰富的仿真语句和库函数 4.VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。,VHDL的优点,5.对设计的描述具有相对独立性,与硬件的结构无关 6.可以利用EDA工具进行逻辑综合和优化,并自动将VHDL描述转化为门级网表。7.具有可移植性,可以在不同的设计环境和系统平台中使用。8.具有良好的可读性。,三、VHDL与高级语言的区别,1.某些并行语句可以自动的重复执行,不需要用循环
4、指令来保证。2.VHDL中的许多语句不是按排列顺序执行的,而是可以同时执行的(VHDL的并行性)。,返 回,第二节 VHDL程序结构,一、VHDL的基本结构,ENTITY nand_2 IS-定义一个实体PORT(a,b:IN STD_LOGIC;-描述输入输出 y:OUT STD_LOGIC);-信号END nand_2;,LIBRARY IEEE;-IEEE库说明USE IEEE.STD_Logic_1164.ALL;-自定义元件库,ARCHITECTURE rtl OF nand_2 ISBEGIN-结构体说明y=NOT(a AND b);END rtl;,1.USE定义区,2.PACK
5、AGE定义区,3.ENTITY定义区,4.ARCHITECTURE定义区,定义元件库,5.CONFIGURATION定义区,定义使用那些自定义元件库,定义电路实体的外观:I/O接口的规格,描述电路内部的逻辑功能,决定那一个architecture被使用,1.VHDL基本结构图,2.实体说明,功能:描述设计模块的输入/输出信号或引脚,并给出设计模块与外界的接口。实体类似一个“黑盒”,实体描述了“黑盒”的输入输出口。格式:ENTITY实体名ISGENERIC(类属表);PORT(端口表);END ENTITY 实体名,实 体 名,实体名实际上是器件名,最好根据相应的电路功能确定。如4位2进制计数器
6、用counter4b;8位加法器用add8b;3/8译码器用ym_38。,实体名必须与文件名相同,否则无法编译。,实体名不能用工具库中定义好的元件名。,实体名不能用中文,也不能用数字开头。,类 属 表,类属表:用以将信息参数传递到实体。类属表的一般格式为:GENERIC(常数名:数据类型:=设定值)GENERIC(awidth:INTEGER:=3;timex:time);其中:常数名由设计者确定;数据类型通常取INTEGER或time等;在表中提供时间参数、总线宽度等信息。,端口表:指明实体的输入、输出信号极其模式。端口表的一般格式为:PORT(端口名:端口模式数据类型)端口模式:共四种:I
7、N(输入)、OUT(输出)、INOUT(双向端口)、BUFFER(输出并向内部反馈),端 口 表,数据类型:VHDL作为一种强类型语言,必须对数据对象(常量、变量、信号)规定取值范围,即对传输或存储数据的类型作明确的界定。,实 体 举 例,ENTITY black_box IS Generic(constant width:integer:=7;);PORT(clk,rst:INstd_logic;d:IN std_logic_vector(width DOWNTO 0);q:OUTstd_logic_vector(width DOWNTO 0);co:OUT std_logic);END b
8、lack_box;,练 习 一,编写包含以下内容的实体代码端口 D 为12位输入总线 端口 OE 和 CLK 都是1位输入端口 AD 为 12位双向总线端口 A为12位输出总线端口 INT 是1位输出端口 AS 是一位输出同时被用作内部反馈,练习一答案,LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY my_design IS PORT(d:IN std_logic_vector(11 DOWNTO 0);oe,clk:IN std_logic;ad:INOUT std_logic_vector(11 DOWNTO 0);a:OUT std_log
9、ic_vector(11 DOWNTO 0);int:OUT std_logic;as:BUFFER std_logic);END my_design;,练 习,1、编写包含全加器的实体代码。2、编写4选1数据选择器的实体代码。,3.结构体,结构体:通过若干并行语句来描述设计实体的逻辑功能(行为描述)或内部电路结构(结构描述),从而建立设计实体输出与输入之间的关系。一个设计实体可以有多个结构体。格式:ARCHITECTURE 结构体名 OF 实体名 IS 说明语句;BEGIN 并行语句;END ARCHITECTURE 结构体名;,VHDL结构体术语,说明语句:用于定义结构体中所用的数据对象和
10、子程序,并对所引用的元件加以说明,但不能定义变量。并行语句 并行语句有五种类型,可以把它们看成结构体的五种子结构。这五种语句结构本身是并行语句,但内部可能含有并行运行的逻辑描述语句或顺序运行的逻辑描述语句,如进程内部包含的即为顺序语句。五种语句结构分别为块语句、进程语句、信号赋值语句、子程序调用语句和元件例化语句。,结构体结构图,实体和结构体之间的关系,Structure描述 描述该设计单元的硬件结构,即该硬件是如何构成的,类似于数字电路中的逻辑图描述.Date Flow描述 它是类似于寄存器传输级的方式描述数据的传输和变换,以规定设计中的各种寄存器形式为特征,然后在寄存器之间插入组合逻辑。与
11、数字电路中的真值表描述相似。Behavior Process描述 只描述所希望电路的功能或者电路行为(输入输出间转换的行为),而没有指明或涉及实现这些行为的硬件结构。与数字电路中的逻辑表达式描述相似。,结构体的三种描述形式,architecture one of mux21 is signal d,e:bit;begin d=a and(not)s;e=b and s;y=d or e;end one;,Structure描述,architecture one of mux21 isbegin y=(a and(not s)or(b and s);end one;,Date Flow描述,Be
12、havior Process描述,architecture one of mux21 isbegin y=a when s=0 else b;end one;,结构体行为描述举例,2 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;,操作案例,1、操作题目:通过38
13、译码器的设计实例,从整体结构上初步认识VHDL的基本结构和语句特点。2、38译码器的电路图如图所示,有4个输入端(A0、A1、A2、EN),8个输出端(Y0Y7)3、步骤:定义元件库、实体、结构体、编译、仿真。,返 回,第三节 VHDL的基本数据类型,一、数据对象,是数据类型的载体,共有三种形式的对象:Constant(常量)Variable(变量)Signal(信号)对象的说明格式为:对象类别 标识符表:类型标识:=初值,(1)常量声明,常量是全局量,在结构描述、程序包说明、实体说明、过程说明、函数调用说明和进程说明中使用。例:constant WIDTH:INTEGER:=8;consta
14、nt X:NEW_BIT:=X;,(2)变量声明,定义了给定类型的变量名称。例:variable A,B:BIT;variable INIT:NEW_BIT,变量赋值,整体赋值:temp:=“10101010”;temp:=x”AA”;逐位赋值:temp(7):=1;多位赋值temp(7 downto 4):=“1010”;,(3)信号声明,信号可以将结构体中分离的并行语句连接起来,并且通过端口其他模块与该设计内的连接起来。信号为器件内部节点信号,数据的进出不像端口信号那样受限制,不必定义其端口模式。定义信号的目的是为了在设计电路时使用该信号。用“=”来给信号赋值 例:signal A,B:B
15、IT;signal INIT:INTEGE:=-1,信号赋值,SIGNAL temp:Std_Logic_Vector(7 downto 0);整体赋值:temp=“10101010”;temp=x”AA”;逐位赋值:temp(7)=1;多位赋值:temp(7 downto 4)=“1010”;,信号举例,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
16、:Std_Logic;BEGINe=a or b;f=not(c or d);g=e and f;END logic;,信号和变量的作用范围,信号和变量的区别,二、数据类型,1.标准定义的数据类型 不必用USE说明而直接使用。1)Boolean(布尔量):取值为FALSE和TRUE。2)Character(字符):使用时用单引号括起来,如:A。3)String(字符串):使用时用双引号括起来,如:111000101。4)Integer(整数):范围在-(231-1)(231-1)5)Real(实数):范围在-1.0E+38+1.0E+38,6)Bit(位):取值为0或1.7)Time(时间):
17、取值范围与整数一致,一般用于仿真。8)Bit_vector(位矢量):基于BIT数据类型的数组。使用时必需注明宽度。9)Natural(自然数)和Positive(正整数):是整数的一个子类型。10)Severity level(错误等级):用来设计系统的工作状态。有四种状态值:NOTE(注意)、WARNING(警告)、ERROR(错误)、FAILURE(失败)。,2.用户自定义的数据类型,1)Enumerated Types(枚举类型)格式如下:TYPE 数据类型名 IS(枚举文字,枚举文字);例如:TYPE color IS(red,green,yellow,blue);TYPE leve
18、l IS(0,1,Z);2)Integer Types(整数类型)和 Real Types(实数类型)格式为:TYPE 数据类型名 IS RANGE 约束范围;例如:TYPE int IS RANGE-10 TO 10;3)Array Types(数组类型)格式如下:TYPE 数据类型名 IS ARRAY(索引范围)OF类型名称;例如:TYPE a IS ARRAY(integer0 TO 9)OF std_logic,3.IEEE预定义标准逻辑位与矢量,在IEEE的程序包中std_logic_1164中定义了两个重要的数据类型。1)std_logic:工业标准的逻辑类型。取值为0(强0)、1
19、(强1)、Z(高阻态)、X(强未知的)。2)std_logic_vector:工业标准的逻辑类型。std_logic的组合。注意:使用这两种数据时,程序中必须声明:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL,Std_Logic数据类型,IEEE std_logic_ 1164中定义的一种数据类型,它包含9种取值分别为:U未初始化用于仿真 X强未知用于仿真 0强0用于综合与仿真 1强1用于综合与仿真 Z高阻用于综合与仿真 W弱未知用于仿真 L弱0用于综合与仿真 H弱1用于综合与仿真 _忽略用于综合与仿真,三、标识符,标识符是VHDL语言最基本的要素之一,是使
20、用VHDL语言的基础。标识符是描述VHDL语言中端口、信号、常数、变量以及函数等名称的字符串。VHDL标识符书写规则如下:1)使用的字符由26个英文字母、数字09以及下划线组成;2)标识符必须以英文字母开始,不区分大小写;3)不能以下划线结尾;4)标识符中不能有空格;5)标识符不能与VHDL的关键字重名。,四、运算符,(1)算术运算符,+加*乘方 减 MOD 求模*乘 REM 求余/除 ABS 求绝对值,(2)关系运算符,=等于/=不等于 小于=小于或等于 大于=大于或等于其中=符号也用于信号的赋值操作,(3)逻辑运算符,AND 逻辑与 SLL 逻辑左移OR 逻辑SRL 逻辑右移NAND 逻辑
21、与非 SLA 算术左移NOR 逻辑或非 SRA 算术右移XOR 逻辑异或 ROR 逻辑循环右移NOT 逻辑非 ROL 逻辑循环左移,五、VHDL属性,VHDL属性(Attribute)是指实体、结构体、类型及信号的一些表现特征。一般需要了解VHDL中的数值类属性、函数类属性以及范围类属性。其引用的一般形式均为:对象属性。,1数值类属性,数值类属性可用于返回数组、块或一般数据的有关属性。如左边界(left)、右边界(right)、下边界(low)、上边界(high)和数组长度(length)。例如:sdown:IN std_logic_vector(8 DOWNTO 0);这个信号的各属性值如下
22、:sdownleft=8;sdownright=0;sdownlow=0;sdownhigh=8;sdownlength=9;,2函数类属性,函数类属性用来返回有关信号行为功能的信息。如信号属性函数:event,它的值为布尔型,如果刚好有事件发生在该属性所附着的信号上(即信号有变化),则其取值为True,否则为False。利用此属性可决定时钟边沿是否有效,即时钟是否发生。例如:时钟边沿表示SIGNAL clk:IN std_logic则:clkevent AND clk=1,表示时钟的上升沿。clkevent AND clk=0,表示时钟的下降沿。,3范围类属性,范围(RANGE)类属性,用来
23、生成一个限制性数据对象的范围。例如:数据总线的范围SIGNAL data_bus:std_logic_wector(15 DOWNTO 0);Data_busRANGE=15 DOWNTO 0;注意:MAX+PLUS不支持该属性。,练 习,1、编写包含全加器的结构体代码。2、编写3输入与非门的结构体代码。,ARCHITECTURE example1 OF Full_adder ISBEGIN sum=a XOR b XOR c;c=(a AND b)OR(b AND c)OR(a AND c);END example1;,ARCHITECTURE example2 OF and3 ISBEGI
24、N y=a AND b AND c;END example2;,练 习 答 案,返 回,第四节 VHDL的基本描述语句,一、顺序语句,1.IF语句,顺序语句用于进程过程或函数之中,为算法描述提供了IF 语句、CASE语句、LOOP语句。,可以用于实现两种或两种以上的条件分支判断。格式为:IF 布尔表达式1 THEN 顺序语句1 ELSIF 布尔表达式2 THEN 顺序语句2 END IF,1)IF 布尔表达式1 THEN顺序语句1END IF,常用格式,2)IF 布尔表达式1 THEN顺序语句1ELSE顺序语句2END IF,3)IF 布尔表达式1 THEN顺序语句1ELSIF 布尔表达式2
25、THEN顺序语句2 END IF,4)IF 布尔表达式1 THENIF 布尔表达式2 THEN顺序语句 END IFEND IF,【例4-3】IF语句描述的判断程序(2选1),IFs=0THENy=a0;ELSIFs=1THENy=a1;ENDIF,练 习,用IF语句实现4选1,IF s=00 THEN y=a;ELSIF s=01THEN y=b;ELSIF s=10THEN y=c;ELSE y=d;END IF;,操作案例,1、操作题目:通过四选一数据选择器设计实例,讲解顺序语句的语句特点。2、四选一数据选择器的电路图:如图4-3,有7个输入端(A0、A1、D0、D1、D2、D3、S),
26、1个输出端(Y)3、步骤:分别用IF语句和CASE语句进行编程,然后编译、仿真。,2.CASE语句,CASE语句用于多分支判断结构,它以一个多值表达式为判断条件,依条件式的取值不同而实现多路分支。格式为:CASE 表达式 ISWHEN 条件=顺序语句;WHEN OTHERS=顺序语句;END CASE,使用CASE语句时应注意:条件句的选择值应在表达式的取值范围内.除非所有条件句中的选择值能完全覆盖case语句中表达式的取值,否则最后一个条件句中的选择必须用“others”表示.case语句中每一条件句的选择值只能出现一次,不能有相同选择值的条件语句出现.case语句执行中必须选中且只能选中所
27、列条件语句中的一条.,【例4-4】case语句描述的判断程序,Process(s)BeginCase s IsWHEN00=dddd=0;-当s=其他时,d=0End Case;,课后练习,用case语句实现3-8译码器,3.LOOP语句,用于循环控制,与LOOP有关的五种语法其格式如下:(1)循环标号:LOOP 顺序语句;END LOOP 循环标号;(2)标号:FOR 循环变量 IN 循环次数范围 LOOP 顺序语句;END LOOP 循环标号;(3)循环标号:WHILE 条件 LOOP 顺序语句;END LOOP 循环标号;,(4)NEXT语句:在LOOP语句中,用来跳出当前循环。其格式为
28、:NEXT 循环标号 WHEN条件;(5)EXIT语句:用来结束LOOP语句的执行。其格式为:EXIT 循环标号 WHEN条件;,利用LOOP语句可以简化同类顺序语句表达式.如:Signal a,b,c:std_logic_vector(1 to 3)For n IN 1 to 3 LOOPa(n)=b(n)AND c(n)END LOOP等效于:a(1)=b(1)AND c(1)a(2)=b(2)AND c(2)a(3)=b(3)AND c(3),4NULL语句,NULL是一条空语句,执行该语句使程序走到下一条语句。例4-6是用VHDL描述3路数据选择的程序,使用NULL语句可以排除一些不用
29、的条件。,Process(s,a,b,c)BeginCase s Is WHEN00=dddNULL;End Case;End Process;,二、并行语句,并行语句与一般软件程序的最大区别就是在结构体中的执行都是同时进行的,既它们的执行顺序与语法的书写顺序无关。这种并行性是由硬件本身的并行性决定的,一旦电路接通电源,各部分就会按照事先设计好的方案同时工作。并行语句主要有进程语句(PROCESS)、块语句(BLOCK)、并行信号赋值语句、生成语句(GENERATE)、元件例化语句、断言语句。,1.进程语句,进程语句是一段复合语句,由一段程序构成,各个进程之间是并行进行的,而进程的内部语句都是
30、顺序执行的。一个结构体中可以包括多个进程语句,多个进程之间依靠信号(SIGNAL)来传递。,进程语句,进程语句的格式如下:标号:PROCESS(敏感信号表)说明语句;-定义一些局部变量BEGIN顺序语句;END PROCESS 标号:;,敏感信号表,进程赖以启动的敏感表。对于表中列出的任何信号的改变,都将启动进程,执行进程内相应顺序语句.一些VHDL综合器,综合后对应进程的硬件系统对进程中的所有输入的信号都是敏感的,不论在源程序的进程中是否把所有的信号都列人敏感表中.为了使软件仿真与综合后的硬件仿真对应起来,应当将进程中的所有输入信号都列入敏感表中.,LIBRARY ieee;USE ieee
31、.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=d;END IF;END PROCESS if_labe
32、l;,case_label:PROCESS(a,b,c,d,sel)BEGINCASE sel ISWHEN 00=z z z z z=0;END CASE;END PROCESS case_label;END logic;,进程语句举例,敏感表举例,if_ label:PROCESS(oe)BEGINIF oe=1 THEN y=a;END IF;END PROCESS if_label;,敏感表举例,if_label:PROCESS(oe,a)BEGINIF oe=1 THEN y=a;END IF;END PROCESS if_label;,进行进程设计时应注意以下问题:1、进程为一个独
33、立的无限循环语句。它只有两种状态:执行状态和等待状态。满足条件进入执行状态,当遇到end process语句后停止执行。2、进程中的顺序语句具有明显的顺序/并行运行双重性。即。进程中的顺序语句具有并行执行的性质。如:Process(s,a,b,c)BeginCase s Is WHEN00=dddNULL;End Case;End Process;,3、进程必须由一个敏感信号表中定义的任一敏感信号的变化来启动,否则必须有一个显示的WAIT语句来激励。4、进程语句本身是并行语句。即同一结构体中的不同进程是并行运行的,后者是根据敏感信号独立运行的。5、信号是多个进程间的通信线。6、在同一进程中只能
34、放置一个含有时钟边沿检测语句的条件语句。,2.块语句,块语句将结构体中的并行语句结合在一起,其主要目的是改善并行语句极其结构的可读性,一般用于较复杂的VHDL程序。其格式如下:块名称:BLOCK(表达式)块声明项;BEGIN并行语句;END BLOCK 块名称;,3.并行信号赋值语句,(1)简单(并行)信号赋值语句格式:赋值目标=表达式;如q=b+c;(2)条件信号赋值语句 格式:赋值目标=表达式 WHEN 赋值条件 ELSE 表达式;注意:由于条件测试的顺序性,第一句具有最高赋值优先级,第二句次之,以此类推。,ARCHITECTURE ar_6 OF fzh_1 ISBEGINy=aWHEN
35、q=00ELSE bWHENq=01ELSE cWHENq=10ELSE d;ENDar_6;,【例4-10】条件信号赋值语句的用法,(3)选择信号赋值语句 格式:WITH 选择表达式 SELECT 赋值目标=表达式 WHEN 选择值,表达式 WHEN 选择值;,选择信号赋值语句不允许有条件重叠的现象,也不允许存在条件涵盖不全的情况。,注意:选择信号赋值语句本身不能在进程中应用,但其功能却与进程中的CASE语句的功能相似。CASE语句的执行依赖于进程中敏感信号的改变而启动进程。选择信号语句中也有敏感量,即选择表达式。当选择表达式 的值发生变化时,就将启动此语句对各子句的选择值进行测试对比,当发
36、现有满足条件的子句的选择值时,就将此子句表达式中的值赋给赋值目标。,ARCHITECTURE ar_7 OF fzh_2 ISBEGINWITH qSELECTy=a WHEN00,-选择值用“,”结束 b WHEN01,c WHEN10,d WHEN OTHERS;ENDar_7;,【例4-11】选择信号赋值语句的用法,4.元件例化语句,把已经设计好的设计实体称为一个元件或一个模块,它可以被高层次的设计引用。引用时就会用到元件声明和元件例化语句。二者缺一不可。,COMPONENT 元件实体名PORT(元件端口信息);END COMPONENT;元件声明相当于对现成的设计实体进行封装,使其只留
37、出外面的接口界面。,(1)元件声明,(2)元件例化,例化名:元件名 PORT MAP(端口列表)PORT MAP 是端口映射的意思;端口列表是把例化元件端口与连接实体端口连接起来。端口列表的接口格式为:例化元件端口=连接实体端口,接口格式有三种格式:一、名字关联方式 即保留例化元件端口=部分,这时为例化元件端口名与连接实体端口名的关联方式,其在PORT MAP 中的位置可以是任意的。二、位置关联方式 即省去例化元件端口=部分,在PORT MAP 中只列出当前系统中的连接实体端口名即可,但要求连接实体端口名的与例化元件端口定义中的端口名一一对应。三、混合关联方式 即上述两种关联方式同时并存。,例
38、4-13 元件例化设计4位加法器,LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_arith.ALL;USEieee.std_logic_unsigned.ALL;ENTITY add_4 ISPORT(x,y:IN std_logic_vector(3 DOWNTO 0);ci:INstd_logic;s:OUTstd_logic_vector(3 DOWNTO 0);co:OUTstd_logic;END add_4;,ARCHITECTUREar_9OF add_4 IS COMPONENT adde_1 PORT(x,y
39、,ci:IN std_logic;sum,co:OUT std_logic);END COMPONENT;SIGNAL cm:std_logic _vector(3 DOWNTO 0);BEGINyj0:adde_1 PORT MAP(x(0),y(0),ci,s(0),cm(1);yj1:adde_1 PORT MAP(x=x(1),y=y(1),ci=cm(1),sum=s(1),co=cm(2);yj2:adde_1 PORT MAP(x(2),y(2),cm(2),sum=s(2),co=cm(3);yj3:adde_1 PORT MAP(x(3),y(3),cm(3),s(3),co
40、);ENDar_9;,*一位加法器的描述*LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITY add_1 ISPORT(x,INstd_logic;y:INstd_logic;ci:INstd_logic;sum:OUT std_logic;co:OUT std_logic;END add_1;ARCHITECTURE ar_10 OF add_1 ISBEGINsum=x XOR y XOR ci;co=(x AND y)OR(x AND ci)OR(y AND ci);END ar_10;,练习:用D触发器构成4位移位寄存器,用例化语句进行设计。,L
41、IBRARYieee;USEieee.std_logic_1164.ALL;ENTITY shifter ISPORT(din,clk:INstd_logic;dout:OUT std_logic);END shifter;ARCHITECTURE a OF shifter IS COMPONENT dff PORT(D,clk:IN std_logic;Q:OUT std_logic);END COMPONENT;SIGNAL d:std_logic _vector(4 DOWNTO 0);,练 习 答 案,BEGINd(0)d(2),clk=clk,Q=d(3);U3:dff PORT M
42、AP(D=d(3),clk=clk,Q=d(4);dout=d(4);END a;,练习:用元件例化语句设计如图所示电路。元件为2输入与非门。,LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITY yf4 ISPORT(A,B,C,D:INstd_logic;Z:OUT std_logic);END yf4;ARCHITECTUREa OF yf4 IS COMPONENT yf2 PORT(A1,B1:IN std_logic;C1:OUT std_logic);END COMPONENT;SIGNAL X,Y:std_logic;,练 习 答 案,BE
43、GIN U1:yf2 PORT MAP(A,B,X);U2:yf2 PORT MAP(C,D,Y);U3:yf2 PORT MAP(A1=X,C1=Z,B1=Y);END a;,LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITY yf2 ISPORT(A1,B1:INstd_logic;C1:OUT std_logic);END yf2;ARCHITECTUREb OF yf2 ISBEGIN C1=A1 NAND B1;END b;,5.生成语句,生成语句具有复制作用,可以生成与某个元件或设计单元电路完全相同的一组并行元件或设计单元电路结构。格式1:标
44、号:FOR 循环变量 IN 取值范围 GENERATE 说明语句;BEGIN 并行语句;END GENERATE标号;,格式2:标号:IF 条件 GENERATE 说明语句;BEGIN 并行语句;END GENERATE标号;,练习:用D触发器构成4位移位寄存器,用生成语句进行设计。,LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITY shifter ISPORT(din,clk:INstd_logic;dout:OUT std_logic);END shifter;ARCHITECTUREa OF shifter IS COMPONENT dff PO
45、RT(D,clk:IN std_logic;Q:OUT std_logic);END COMPONENT;SIGNAL d:std_logic _vector(0 TO 4);,BEGINd(0)=din;G:For i IN 0 TO 3 GENERATE U:dff PORT MAP(d(i),clk,d(i+1);END GENERATE G;dout=d(4);END a;,6.断言语句,断言语句是面向仿真的语句,综合器通常忽略此语句。并行断言语句等价一个进程语句,但不作任何操作,仅用于判断某一条件是否成立。格式为:ASSERT 条件 REPORT报告信息SEVERITY出错级别;当判
46、断条件为Fause时报告错误。,Note:用在仿真时传递信息。Warning:用于非平常情形,仿真仍继续,结果不可预知。Error:仿真不能继续。Failure:致命错误,必须立即停止。,错误级别为四级:,LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_arith.ALL;USEieee.std_logic_unsigned.ALL;ENTITYrs_1ISPORT(s,r:IN std_logic;q,nq:OUT std_logic);ENDrs_1;ARCHITECTURE ar_11 OF rs_1 ISBEGINPRO
47、CESSVARIABLE blh_1:bit:=0;BEGINASSERT NOT(s=1AND r=1)REPORTBOTH s AND r EQUAL TO1!“SEVERITY ERROR;,IF s=0AND r=0 THEN blh_1:=blh_1;ELSIF s=0AND r=1THEN blh_1:=0;ELSE blh_1:=1;END IF;q=blh_1 after 2 ns;nq=NOT blh_1WAIT ON r,s;END PROCESS;END ar_11;,返 回,第五节 子程序,子程序由一组顺序语句组成,是为了在程序中重复使用而设立的。子程序不是一个独立的编
48、译单位,只能置于实体或程序包中。在结构体中定义的子程序对于该结构体来说是局部的,即不能被其它设计层次的结构体调用。如果要在其它结构体中调用同一个子程序,就需要把子程序定义到程序包中。,VHDL中的子程序有两类:过程子函数:过程通过其接口返回0个或多个值。函数子函数:函数直接返回单个值。子程序包含两部分:即子程序声明和主体部分。在程序包中声明子程序时,子程序声明必须要放在程序包声明中,子程序主体必须要放在程序包体中。,一、函数的定义与引用,函数语句的作用是输入若干参数,通过函数运算求值,最后返回直接一个值。函数语句的格式为:FUNCTION 函数名 参数表RETURN 类型;-函数头FUNCTI
49、ON 函数名 参数表-函数体RETURN 类型 IS 程序声明项;BEGIN 顺序语句;END 函数名;,函数头是程序包与函数的接口界面。如果要将一个函数组织成程序包入库,则必须定义函数头,且函数头应放在程序包的说明部分,而函数体应放在程序包的包体内。如果只在一个结构体中定义并调用函数,则只需定义函数体即可。其中:函数表中为参数名、参数类别及数据类型,函数的参数为信号或常数,默认情况为常数;在RETURN后面的数据类型为函数返回值的类型;子程序声明项用来说明函数体内引用的对象和过程;顺序语句就是函数体,用来定义函数的功能。,LIBRARYieee;USEieee.std_logic_1164.
50、ALL;ENTITYfunISPORT(A:IN std_logic _Vector(0 TO 2);M:OUT std_logic _Vector(0 TO 2);ENDfun;ARCHITECTURE art OF fun IS FUNDTION sam(X,Y,Z:BIT)RETURN BIT IS BEGIN RETURN(X AND Y)OR Z;END sam;,函数应用实例,PROCESS(A)BEGINM(0)=sam(A(0),A(1),A(2);M(1)=sam(A(2),A(0),A(1);M(2)=sam(A(1),A(2),A(0);END PROCESS;END a