的硬件描述语言VHDL编程基础.ppt_第1页
的硬件描述语言VHDL编程基础.ppt_第2页
的硬件描述语言VHDL编程基础.ppt_第3页
的硬件描述语言VHDL编程基础.ppt_第4页
的硬件描述语言VHDL编程基础.ppt_第5页
已阅读5页,还剩125页未读 继续免费阅读

下载本文档

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

文档简介

第四章 硬件描述语言VHDL 编程基础,本章首先介绍了VHDL的基本结构,使读者初步掌握VHDL的基础知识。最后通过大量的实例使读者进一步掌握使用VHDL的设计方法。,本章主要内容,第一节 概述,第二节 VHDL程序结构,第三节 VHDL的基本数据类型,第四节 VHDL的基本描述语句,第五节 子程序,第一节 概述,VHDL(Very high speed intergated circuit Hardware Description Language):非常高速集成电路的硬件描述语言。 20世纪80年代诞生于美国国防部的一项研究计划,目的是使电路的设计能够以文字的方式保存下来。 被列为IEEE1076标准,也成为工业界的标准。,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语言的编程经验,可以在一个较短的时间内很快的学习和掌握,Verilog HDL语言的系统抽象能力稍逊于VHDL,而对门级开关电路的描述能力则优于VHDL。,二、VHDL的优点,1. 支持层次化设计 2. 具有多层次描述系统硬件功能的能力 3. 具有丰富的仿真语句和库函数 4. VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。,VHDL的优点,5. 对设计的描述具有相对独立性,与硬件的结构无关 6.可以利用EDA工具进行逻辑综合和优化,并自动将VHDL描述转化为门级网表。 7. 具有可移植性,可以在不同的设计环境和系统平台中使用。 8. 具有良好的可读性。,三、VHDL与高级语言的区别,1.某些并行语句可以自动的重复执行,不需要用循环指令来保证。 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 IS BEGIN -结构体说明 y=NOT(a AND b); END rtl;,1.USE定义区,2.PACKAGE定义区,3.ENTITY定义区,4.ARCHITECTURE定义区,定义元件库,5.CONFIGURATION定义区,定义使用那些自定义元件库,定义电路实体的外观:I/O接口的规格,描述电路内部的逻辑功能,决定那一个architecture被使用,1. VHDL基本结构图,2. 实体说明,功能:描述设计模块的输入/输出信号或引脚,并给出设计模块与外界的接口。实体类似一个“黑盒”,实体描述了“黑盒”的输入输出口。 格式: ENTITY 实体名 IS GENERIC(类属表); PORT(端口表); END ENTITY 实体名,实 体 名,实体名实际上是器件名,最好根据相应的电路功能确定。如4位2进制计数器用counter4b;8位加法器用add8b;3/8译码器用ym_38。,实体名必须与文件名相同,否则无法编译。,实体名不能用工具库中定义好的元件名。,实体名不能用中文,也不能用数字开头。,类 属 表,类属表:用以将信息参数传递到实体。 类属表的一般格式为: GENERIC(常数名:数据类型:=设定值 ) GENERIC(awidth : INTEGER:=3; timex: time ); 其中:常数名由设计者确定;数据类型通常取INTEGER或time等;在表中提供时间参数、总线宽度等信息。,端口表:指明实体的输入、输出信号极其模式。 端口表的一般格式为: PORT(端口名:端口模式 数据类型 ) 端口模式:共四种: IN(输入)、 OUT(输出)、 INOUT(双向端口) 、 BUFFER(输出并向内部反馈),端 口 表,数据类型:VHDL作为一种强类型语言,必须对数据对象(常量、变量、信号)规定取值范围,即对传输或存储数据的类型作明确的界定。,实 体 举 例,ENTITY black_box IS Generic ( constant width : integer := 7;); PORT ( clk, rst: IN std_logic; d: IN std_logic_vector(width DOWNTO 0); q: OUT std_logic_vector(width DOWNTO 0); co: OUT std_logic); END black_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_logic_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结构体术语,说明语句:用于定义结构体中所用的数据对象和子程序,并对所引用的元件加以说明,但不能定义变量。 并行语句 并行语句有五种类型,可以把它们看成结构体的五种子结构。这五种语句结构本身是并行语句,但内部可能含有并行运行的逻辑描述语句或顺序运行的逻辑描述语句,如进程内部包含的即为顺序语句。 五种语句结构分别为块语句、进程语句、信号赋值语句、子程序调用语句和元件例化语句。,结构体结构图,实体和结构体之间的关系,Structure描述 描述该设计单元的硬件结构,即该硬件是如何构成的,类似于数字电路中的逻辑图描述. Date Flow描述 它是类似于寄存器传输级的方式描述数据的传输和变换,以规定设计中的各种寄存器形式为特征,然后在寄存器之间插入组合逻辑。与数字电路中的真值表描述相似。 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 is begin y=(a and (not s) or (b and s); end one;,Date Flow描述,Behavior Process描述,architecture one of mux21 is begin y=a when s=0 else b; end one;,结构体行为描述举例,2 X 8 Input AND gate: ENTITY black_box IS PORT ( a, b: IN std_logic_vector(7 DOWNTO 0); y: OUT std_logic_vector(7 DOWNTO 0); END black_box; ARCHITECTURE example OF black_box IS BEGIN y = a AND b; END example;,操作案例,1、操作题目:通过38译码器的设计实例,从整体结构上初步认识VHDL的基本结构和语句特点。 2、38译码器的电路图如图所示,有4个输入端(A0、A1、A2、EN),8个输出端(Y0Y7) 3、步骤:定义元件库、实体、结构体、编译、仿真。,返 回,第三节 VHDL的基本数据类型,一、数据对象,是数据类型的载体,共有三种形式的对象: Constant(常量) Variable(变量) Signal(信号) 对象的说明格式为: 对象类别 标识符表:类型标识:=初值,(1)常量声明,常量是全局量,在结构描述、程序包说明、实体说明、过程说明、函数调用说明和进程说明中使用。 例: constant WIDTH :INTEGER := 8; constant 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 :BIT; 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 IS PORT(a, b, c, d : IN Std_Logic; g : OUT Std_Logic); END simp; ARCHITECTURE logic OF simp IS SIGNAL e,f : Std_Logic; BEGIN e = 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(时间):取值范围与整数一致,一般用于仿真。 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 level 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(强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语言最基本的要素之一,是使用VHDL语言的基础。标识符是描述VHDL语言中端口、信号、常数、变量以及函数等名称的字符串。VHDL标识符书写规则如下: 1)使用的字符由26个英文字母、数字09以及下划线组成; 2)标识符必须以英文字母开始,不区分大小写; 3)不能以下划线结尾; 4)标识符中不能有空格; 5)标识符不能与VHDL的关键字重名。,四、运算符,(1)算术运算符,+ 加 * 乘方 减 MOD 求模 * 乘 REM 求余 / 除 ABS 求绝对值,(2)关系运算符,= 等于 /= 不等于 小于 = 小于或等于 大于 =大于或等于 其中=符号也用于信号的赋值操作,(3)逻辑运算符,AND 逻辑与 SLL 逻辑左移 OR 逻辑 SRL 逻辑右移 NAND 逻辑与非 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); 这个信号的各属性值如下: 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)类属性,用来生成一个限制性数据对象的范围。 例如:数据总线的范围 SIGNAL data_bus :std_logic_wector(15 DOWNTO 0); Data_busRANGE=15 DOWNTO 0; 注意:MAX+PLUS不支持该属性。,练 习,1、编写包含全加器的结构体代码。 2、编写3输入与非门的结构体代码。,ARCHITECTURE example1 OF Full_adder IS BEGIN sum= a XOR b XOR c; c = (a AND b)OR(b AND c)OR(a AND c); END example1;,ARCHITECTURE example2 OF and3 IS BEGIN 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顺序语句1 END IF,常用格式,2) IF 布尔表达式1 THEN 顺序语句1 ELSE 顺序语句2 END IF,3) IF 布尔表达式1 THEN 顺序语句1 ELSIF 布尔表达式2 THEN 顺序语句2 END IF,4) IF 布尔表达式1 THEN IF 布尔表达式2 THEN 顺序语句 END IF END IF,【例4-3】IF语句描述的判断程序(2选1),IF s = 0 THEN y= a0; ELSIF s =1THEN y= a1; END IF,练 习,用IF语句实现4选1,IF s= 00 THEN y= a; ELSIF s= 01 THEN y= b; ELSIF s= 10 THEN y= c; ELSE y= d; END IF;,操作案例,1、操作题目:通过四选一数据选择器设计实例,讲解顺序语句的语句特点。 2、四选一数据选择器的电路图:如图4-3,有7个输入端(A0、A1、D0、D1、D2、D3、S),1个输出端(Y) 3、步骤:分别用IF语句和CASE语句进行编程,然后编译、仿真。,2. CASE语句,CASE语句用于多分支判断结构,它以一个多值表达式为判断条件,依条件式的取值不同而实现多路分支。 格式为:CASE 表达式 IS WHEN 条件 =顺序语句; WHEN OTHERS =顺序语句; END CASE,使用CASE语句时应注意: 条件句的选择值应在表达式的取值范围内. 除非所有条件句中的选择值能完全覆盖case语句中表达式的取值,否则最后一个条件句中的选择必须用“others”表示. case语句中每一条件句的选择值只能出现一次,不能有相同选择值的条件语句出现. case语句执行中必须选中且只能选中所列条件语句中的一条.,【例4-4】case语句描述的判断程序,Process(s) Begin Case s Is WHEN“00“=dddd=0; -当s=其他时,d=0 End 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语句中,用来跳出当前循环。其格式为: NEXT 循环标号 WHEN条件; (5)EXIT语句:用来结束LOOP语句的执行。其格式为: EXIT 循环标号 WHEN条件;,利用LOOP语句可以简化同类顺序语句表达式.如: Signal a,b,c:std_logic_vector(1 to 3) For n IN 1 to 3 LOOP a(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语句可以排除一些不用的条件。,Process(s,a,b,c) Begin Case s Is WHEN“00“=dddNULL; End Case; End Process;,二、并行语句,并行语句与一般软件程序的最大区别就是在结构体中的执行都是同时进行的,既它们的执行顺序与语法的书写顺序无关。这种并行性是由硬件本身的并行性决定的,一旦电路接通电源,各部分就会按照事先设计好的方案同时工作。 并行语句主要有进程语句(PROCESS)、块语句( BLOCK )、并行信号赋值语句、生成语句( GENERATE )、元件例化语句、断言语句。,1. 进程语句,进程语句是一段复合语句,由一段程序构成,各个进程之间是并行进行的,而进程的内部语句都是顺序执行的。一个结构体中可以包括多个进程语句,多个进程之间依靠信号(SIGNAL)来传递。,进程语句,进程语句的格式如下: 标号: PROCESS(敏感信号表) 说明语句;-定义一些局部变量 BEGIN 顺序语句; END PROCESS 标号: ;,敏感信号表,进程赖以启动的敏感表。对于表中列出的任何信号的改变,都将启动进程,执行进程内相应顺序语句. 一些VHDL综合器,综合后对应进程的硬件系统对进程中的所有输入的信号都是敏感的,不论在源程序的进程中是否把所有的信号都列人敏感表中. 为了使软件仿真与综合后的硬件仿真对应起来,应当将进程中的所有输入信号都列入敏感表中.,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 IS BEGIN if_label: PROCESS(a, b, c, d, sel) BEGIN IF 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_label;,case_label: PROCESS(a, b, c, d, sel) BEGIN CASE sel IS WHEN “00“ =z z z z z = 0; END CASE; END PROCESS case_label; END logic;,进程语句举例,敏感表举例,if_ label: PROCESS(oe) BEGIN IF oe=1 THEN y = a; END IF; END PROCESS if_label;,敏感表举例,if_label: PROCESS(oe,a) BEGIN IF oe=1 THEN y = a; END IF; END PROCESS if_label;,进行进程设计时应注意以下问题: 1、进程为一个独立的无限循环语句。它只有两种状态:执行状态和等待状态。满足条件进入执行状态,当遇到end process语句后停止执行。 2、进程中的顺序语句具有明显的顺序/并行运行双重性。即。进程中的顺序语句具有并行执行的性质。如:Process(s,a,b,c) Begin Case s Is WHEN“00“=dddNULL; End Case; End Process;,3、进程必须由一个敏感信号表中定义的任一敏感信号的变化来启动,否则必须有一个显示的WAIT语句来激励。 4、进程语句本身是并行语句。即同一结构体中的不同进程是并行运行的,后者是根据敏感信号独立运行的。 5、信号是多个进程间的通信线。 6、在同一进程中只能放置一个含有时钟边沿检测语句的条件语句。,2. 块语句,块语句将结构体中的并行语句结合在一起,其主要目的是改善并行语句极其结构的可读性,一般用于较复杂的VHDL程序。 其格式如下: 块名称: BLOCK (表达式) 块声明项; BEGIN 并行语句; END BLOCK 块名称;,3. 并行信号赋值语句,(1)简单(并行)信号赋值语句 格式:赋值目标=表达式; 如q =b+c; (2)条件信号赋值语句 格式:赋值目标=表达式 WHEN 赋值条件 ELSE 表达式; 注意:由于条件测试的顺序性,第一句具有最高赋值优先级,第二句次之,以此类推。,ARCHITECTURE ar_6 OF fzh_1 IS BEGIN y= a WHEN q=00ELSE b WHEN q=01ELSE c WHEN q=10ELSE d ; END ar_6;,【例4-10】条件信号赋值语句的用法,(3)选择信号赋值语句 格式:WITH 选择表达式 SELECT 赋值目标=表达式 WHEN 选择值, 表达式 WHEN 选择值;,选择信号赋值语句不允许有条件重叠的现象,也不允许存在条件涵盖不全的情况。,注意:选择信号赋值语句本身不能在进程中应用,但其功能却与进程中的CASE语句的功能相似。 CASE语句的执行依赖于进程中敏感信号的改变而启动进程。选择信号语句中也有敏感量,即选择表达式 。当选择表达式 的值发生变化时,就将启动此语句对各子句的选择值进行测试对比,当发现有满足条件的子句的选择值时,就将此子句表达式中的值赋给赋值目标。,ARCHITECTURE ar_7 OF fzh_2 IS BEGIN WITH q SELECT y= a WHEN 00, -选择值用“,”结束 b WHEN 01, c WHEN 10, d WHEN OTHERS; END ar_7;,【例4-11】选择信号赋值语句的用法,4. 元件例化语句,把已经设计好的设计实体称为一个元件或一个模块,它可以被高层次的设计引用。引用时就会用到元件声明和元件例化语句。二者缺一不可。,COMPONENT 元件实体名 PORT (元件端口信息); END COMPONENT; 元件声明相当于对现成的设计实体进行封装,使其只留出外面的接口界面。,(1)元件声明,(2)元件例化,例化名:元件名 PORT MAP (端口列表) PORT MAP 是端口映射的意思;端口列表是把例化元件端口与连接实体端口连接起来。 端口列表的接口格式为: 例化元件端口=连接实体端口,接口格式有三种格式: 一、名字关联方式 即保留例化元件端口=部分,这时为例化元件端口名与连接实体端口名的关联方式,其在PORT MAP 中的位置可以是任意的。 二、位置关联方式 即省去例化元件端口=部分,在PORT MAP 中只列出当前系统中的连接实体端口名即可,但要求连接实体端口名的与例化元件端口定义中的端口名一一对应。 三、混合关联方式 即上述两种关联方式同时并存。,例4-13 元件例化设计4位加法器,LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_arith.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY add_4 IS PORT(x,y: IN std_logic_vector (3 DOWNTO 0); ci: IN std_logic; s: OUT std_logic_vector(3 DOWNTO 0); co: OUT std_logic; END add_4;,ARCHITECTURE ar_9 OF add_4 IS COMPONENT adde_1 PORT (x,y,ci: IN std_logic; sum,co: OUT std_logic); END COMPONENT; SIGNAL cm: std_logic _vector (3 DOWNTO 0); BEGIN yj0: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); END ar_9;,*一位加法器的描述* LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY add_1 IS PORT( x, IN std_logic; y: IN std_logic; ci: IN std_logic; sum: OUT std_logic; co: OUT std_logic; END add_1; ARCHITECTURE ar_10 OF add_1 IS BEGIN sum=x XOR y XOR ci; co=( x AND y )OR( x AND ci)OR( y AND ci); END ar_10;,练习:用D触发器构成4位移位寄存器,用例化语句进行设计。,LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY shifter IS PORT( din,clk: IN std_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);,练 习 答 案,BEGIN d(0)d(2), clk= clk, Q =d(3); U3:dff PORT MAP (D=d(3), clk= clk, Q =d(4); dout=d(4); END a;,练习:用元件例化语句设计如图所示电路。元件为2输入与非门。,LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY yf4 IS PORT(A,B,C,D: IN std_logic; Z: OUT std_logic); END yf4; ARCHITECTURE a OF yf4 IS COMPONENT yf2 PORT (A1,B1: IN std_logic; C1: OUT std_logic); END COMPONENT; SIGNAL X,Y: std_logic ;,练 习 答 案,BEGIN 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;,LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY yf2 IS PORT( A1,B1: IN std_logic; C1: OUT std_logic); END yf2; ARCHITECTURE b OF yf2 IS BEGIN C1 =A1 NAND B1; END b;,5. 生成语句,生成语句具有复制作用,可以生成与某个元件或设计单元电路完全相同的一组并行元件或设计单元电路结构。 格式1: 标号: FOR 循环变量 IN 取值范围 GENERATE 说明语句; BEGIN 并行语句; END GENERATE 标号;,格式2: 标号: IF 条件 GENERATE 说明语句; BEGIN 并行语句; END GENERATE 标号;,练习:用D触发器构成4位移位寄存器,用生成语句进行设计。,LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY shifter IS PORT( din,clk: IN std_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 (0 TO 4);,BEGIN d(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出错级别; 当判断条件为Fause时报告错误。,Note: 用在仿真时传递信息。 Warning: 用于非平常情形,仿真仍继续,结果不可预知。 Error: 仿真不能继续。 Failure: 致命错误,必须立即停止。,错误级别为四级:,LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_arith.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY rs_1 IS PORT (s,r: IN std_logic; q,nq : OUT std_logic); END rs_1; ARCHITECTURE ar_11 OF rs_1 IS BEGIN PROCESS VARIABLE blh_1:bit:=0; BEGIN ASSERT NOT(s=1AND r=1) REPORT“BOTH 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_1 WAIT ON r,s; END PROCESS; END ar_11;,返 回,第五节 子程序,子程序由一组顺序语句组成,是为了在程序中重复使用而设立的。 子程序不是一个独立的编译单位,只能置于实体或程序包中。 在结构体中定义的子程序对于该结构体来说是局部的,即不能被其它设计层次的结构体调用。如果要在其它结构体中调用同一个子程序,就需要把子程序定义到程序包中。,VHDL中的子程序有两类: 过程子函数:过程通过其接口返回0个或多个值。 函数子函数:函数直接返回单个值。 子程序包含两部分:即子程序声明和主体部分。 在程序包中声明子程序时,子程序声明必须要放在程序包声明中,子程序主体必须要放在程序包体中。,一、函数的定义与引用,函数语句的作用是输入若干参数,通过函数运算求值,最后返回直接一个值。 函数语句的格式为: FUNCTION 函数名 参数表 RETURN 类型; -函数头 FUNCTION 函数名 参数表 -函数体 RETURN 类型 IS 程序声明项; BEGIN 顺序语句; END 函数名;,函数头是程序包与函数的接口界面。如果要将一个函数组织成程序包入库,则必须定义函数头,且函数头应放在程序包的说明部分,而函数体应放在程序包的包体内。如果只在一个结构体中定义并调用函数,则只需定义函数体即可。 其中:函数表中为参数名、参数类别及数据类型,函数的参数为信号或常数,默认情况为常数;在RETURN后面的数据类型为函数返回值的类型;子程序声明项用来说明函数体内引用的对象和过程;顺序语句就是函数体,用来定义函数的功能。,LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY fun IS PORT (A: IN std_logic _Vector(0 TO 2); M : OUT std_logic _Vector(0 TO 2); END fun; 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) BEGIN M(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 art;,二、过程的定义与引用,过程的作用是传递信息,即通过参数进行内外的信息传递。其中参数需说明(信号、变量及常量)类别、类型及传递方向。 过程定义的格式为: PROCEDURE 过程名 参数声明 IS 子程序声明项; BEGIN 顺序语句; END PROCEDURE 过程名 ; 其中:参数声明指明了输入、输出端口的数目和类型。参数声明的语法格式为:参数名:方式 方式参数类型有inoutinoutbuffer 等四种。,过程的调用是一条语句,调用时通过其接口返回0个或多个值。 根据环境的不同,过程调用有两种方式,即顺序语句方式和并行语句方式。在一般的顺序语句自然执行过程中,一个过程被执行,则属于顺序语句方式;当某个过程处于并行语句环境中时,其过程体中定义的任一IN或INOUT的目标参量发生改变时,将启动过程的调用,这时的调用属于并行语句方式。,过程的调用,LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY fun IS PORT (A: IN std_logic _Vector(0 TO 2; M : OUT std_logic _Vector(0 TO 2); END fun; ARCHITECTURE art1 OF fun IS PROCEDURE sam1 (X,Y,Z: IN BIT; N:OUT BIT) IS BEGIN N:=(X AND Y) OR Z; END sam1;,过程应用实例,BEGIN sam1(A(0), A(1), A(2), N(0); sam1(A(2), A(0), A(1), N(1); sam1(A(1), A(2), A(0), N(2); M(0)= N(0); M(1)= N(1); M(2)= N(2); -等效于:M= N(2),三、子程序重载,子程序重载(Subprograms Overload)的特性使函数或过程子程序中,允许多个子程序具有相同的子程序名,但参数不同,以便在调用时分辨不同功能的子程序,使子程序输出不同的数据。决定引用子程序的因素如下: 1)子程序调用出现的参数个数; 2)调用中出现的参数类型; 3)子程序为函数时返回值的类型; 4)调用时参数采用名字关联方式时形参的名字。,注意: 子程序与进程不同,它不能从结构体的其余部分直接读取信号或向信号赋值,所有通信必须通过子程序的界面端口进行。子程序与元件例化也不同,当子程序被实体或另一个子程序调用时,综合后将嵌入其中;而不是像元件例化语句那样,产生一个新的设计层次。,第六节 库和程序包,库(Library):用于存放预先编译好的程序包(PACKAGE)和数据集合体。常用的库有IEEE、STD、WORK、用户库等。这些设计单元可用作其它VHDL描述的资源。用户编写的设计单元既可以访问多个设计库,又可以加入到设计库中,被其他单元所访问。 使用格式为: LIBRARY 库名称;,一、设计库,二、程序包,在VHDL中数据类型、常量及子程序在实体说明和结构体内定义,而这些数据类型、常量及子程序对其他设计实体是不可见的。为使它们对其他设计实体可见,VHDL提供了程序包(Package)。用程序包可定义一些公用的子程序、常量以及自定义数据类型等。各种VHDL编译系统都含有多个标准程序包,如Std-Logic-1164和Standard程序包。用户也可已自行设计程序包(保存到WORK下)。 程序包由两个独立的单元组成:程序包声明单元和程序包体单元构成。,(1)程序包声明单元的一般格式: PACKAGE 程序包名 IS 说明语句 END 程序包名; 其中说明语句为:类型定义、常量定义、子程序声明、信号声明及元件声明等。 (2)程序包体单元的一般格式: PACKAGE BODY 程序包名 IS 包体语句 END 程序包名;,PACKAGE fun IS SUBTY

温馨提示

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

评论

0/150

提交评论