收藏 分享(赏)

第4章__VHDL设计入门.ppt

上传人:j35w19 文档编号:8833575 上传时间:2019-07-14 格式:PPT 页数:144 大小:1.38MB
下载 相关 举报
第4章__VHDL设计入门.ppt_第1页
第1页 / 共144页
第4章__VHDL设计入门.ppt_第2页
第2页 / 共144页
第4章__VHDL设计入门.ppt_第3页
第3页 / 共144页
第4章__VHDL设计入门.ppt_第4页
第4页 / 共144页
第4章__VHDL设计入门.ppt_第5页
第5页 / 共144页
点击查看更多>>
资源描述

1、EDA技术与VHDL实用教程,第4章 VHDL设计入门,EDA技术与VHDL实用教程, 要求 掌握VHDL语言的基本知识和运用VHDL语言分析、设计逻辑电路的基本方法。 知识点 理解Quartus II的HDL输入法 理解VHDL程序的基本结构 理解VHDL程序的顺序结构 理解VHDL程序的并行结构 理解VHDL程序的语言要素 重点和难点 Quartus II的HDL输入法 VHDL程序的顺序结构 VHDL程序的并行结构,EDA技术与VHDL实用教程,引 言,HDL文本输入设计法是Quartus II的另一个重要输入设计法,本书主要介绍VHDL文本输入设计法。本章讨论VHDL文本输入设计法的基

2、本知识,在第五章再对VHDL文本输入设计法作进一步的深入讨论。本章先介绍VHDL文本输入设计法的文件建立、文件编辑、文件编译和文件仿真方法,然后再依次介绍VHDL程序的基本结构、顺序结构和并行结构,最后对VHDL程序的语言要素作一个总结。,EDA技术与VHDL实用教程,第4章 VHDL设计入门,EDA技术与VHDL实用教程,41 Quartus II的HDL输入法,HDL输入法是Quartus II的常用输入法,有AHDL、VHDL和Verilog HDL三种语言,本书主要介绍VHDL语言。下面以7段数码显示译码器设计为例介绍Quartus II的VHDL文件的输入编辑和编译仿真方法。,EDA

3、技术与VHDL实用教程,一、输入编辑VHDL文件(实际操作) 1 建立工程项目 2 建立VHDL文件 3 编辑VHDL文件 二、编译仿真VHDL文件 1编译VHDL文件 2仿真VHDL文件,EDA技术与VHDL实用教程,EDA技术与VHDL实用教程,仿真结果如图 :,EDA技术与VHDL实用教程,一个完整的VHDL语言程序通常包含库(Library)和程序包(Package)声明、实体(Entity)声明、构造体(Architecture)和配置(Configuration)等部分。,42 VHDL程序的基本结构,EDA技术与VHDL实用教程,一、库、程序包1库与程序包的概念 程序包(pack

4、age)是预先定义或设计好的数据类型、子程序和各种设计实体的集合;而库(Library)则是用来存储已经完成的程序包等VHDL设计与数据的仓库。库和程序包的引用声明放在设计文件的最前面。,EDA技术与VHDL实用教程,EDA技术与VHDL实用教程,(3)ASIC矢量库 : 各公司提供的ASIC逻辑门库。 (4)WORK 库: 为现行作业库,存放设计者的VHDL语言程序,是用户自己的库。使用时不需显式声明,但必需在根目录下建立一个文件夹作为用户项目目录,这目录将被综合器默认为WORK 库,但WORK 库并不以这个文件夹的名字为名字,它的名字是WORK。 (5)用户自定义库: 用户自己定义的库。,

5、3、程序包的定义PACKAGE 程序包名 IS 程序包首说明语句;ENDPACKAGE 程序包名;PACKAGE BODY 程序包名 IS 程序包体说明语句; END PACKAGE BODY 包集合名;重点提示程序包体为可选项,程序包首与程序包体名字应相同;,4、库与程序包的使用除WORK、STD库外,其他库与程序包使用前首先要声明。格式如下:LIBRARY 库名;USE 库名.程序包名.项目名;USE 库名.程序包名.ALL;最后的一个USE语句中的ALL表示使用这个程序包中的所有资源。,例如:LIBRARY ALTERA;USE ALTERA.MAXPLUS2.ALL;LIBRARY I

6、EEEE;USE IEEE.STD_LOGIC_1164.ALL; 库说明的作用范围从实体开始到其所属构造体、配置为止。使用下面语句使用用户定义的程序包;USE work.包名.项目名;USE work.包名.ALL;,二、实体实体(ENTITY)VHDL程序的主体,包括实体声明和结构体两部分。实体声明部分描述所设计的电路与外部电路的接口,指定其输入/输出端口或引脚,而结构体则用来规定所设计电路的内部结构和输入与输出引脚间的逻辑关系。,实体声明格式是:,ENTITY 实体名 IS GENERIC(类属表);-类属参数声明PROT(端口表);-端口声明 END ENTITY 实体名;,1、类属参

7、数声明,放在端口声明之前,指定所设计电路所用到的类属参数,如矢量位数、时间单位等,主要在进行考虑一般性的设计时用到,通过改变这些类属参数可适应不同情况要求。例如:GENERIC(n:POSITIVE:=8);-声明一个类属参数。,2、端口声明,描述所设计的电路与外部电路的接口,指定其输入/输出端口或引脚。其格式如下:,PORT(端口名: 端口方向 端口数据类型;端口名: 端口方向 端口数据类型);,下面是一个实体声明的例子: ENTITY and_n IS GENERIC(n:POSITIVE:=8);-声明一个类属参数。PORT(a:IN BIT_VECTOR(n-1) DOWNTO 0);

8、-bit为位数据类型,f:OUT BIT);-只有0和1两个值,bit_vector是位矢量。 END and_n;,三、结构体,结构体则用来规定所设计电路的内部结构和输入输出引脚间的逻辑关系。其格式如下:,ARCHITECTURE 结构体名 OF 实体名 IS 声明语句 BEGIN 功能描述语句 END ARCHITECTURE 结构体名;,1、结构体内的声明语句结构体的声明部分用来声明只能用于所设计电路内部的常数、数据类型、信号、元件和子程序。这些声明只能用于这个结构体中。2、功能描述语句的类型(1)进程语句,其内部为顺序语句。(2)并行过程调用语句(3)并行的信号赋值语句包括简单信号赋值

9、语句、条件信号赋值语句和选择信号赋值语句。,(4)元件例化语句 (5)生成语句下面是一个实体与结构体的具体例子:ENTITY adder IS PORT(op1,op2: IN UNSIGNED(7 downto 0);Result : OUT INTEGER);END adder;ARCHITECTURE maxpld OF adder IS BEGIN Result =CONV_INTEGER(op1+op2);END maxpld;,四、 配置,一个实体可有几个结构体。配置是在一个实体有几个结构体时,用来为实体指定特定的情况下使用哪个特定的结构体。在仿真时可利用配置为实体选择不同的结构体

10、。其格式如下:,CONFIGURATION 配置名 OF 实体名 IS FOR 结构体名END FOR; END CONFIGURATION 配置名;,4.3 VHDL程序的顺序结构,VHDL的基本描述语句有顺序语句(Sequential Statements)和并行语句(Concurrent Statements)。顺序语句的特点是:其中每一条语句在行为仿真是的执行顺序都是按照它们的书写顺序。而并行语句的特点则是:各个并行语句在行为仿真时的执行是同步进行的,其执行顺序与书写顺序无关。,顺序语句只能出现在进程(Process)、函数(Function)和过程(Procedure)中。进程语句是

11、常用的顺序语句。其本身是并行语句。但其内部的语句却是顺序语句。常见的顺序语句有赋值语句、IF语句、CASE语句、LOOP语句,还有一些其他不太常用的顺序语句。本节主要介绍常见的顺序语句,而对其他不常用的顺序语句只做简单介绍。,一、赋值语句,赋值语句分变量赋值语句和信号赋值语句。其用途是将一个值或者表达式的运算结果传递给一个变量、信号或者由它们组成的数组。变量赋值和信号赋值的区别是变量赋值时间延迟为零而信号赋值一定存在时间延迟。,1、变量赋值语句 例4.1A:=9;B:=7;Z:=X+Y;其中A、B和Z都是变量, :=表示给变量赋值。 变量赋值语句的格式是:,目标变量:=赋值源表达式;,2、信号

12、赋值语句 例4.2A=3; B(3 TO 4)=C(1 TO 2);其中A为信号,B则为数组型信号,=表示给信号赋值。 信号赋值信号语句的格式是:,目标信号=赋值源表达式;,VHDL规定赋值目标与赋值源的数据类型必需严格一致。,二、IF语句,IF语句即条件语句,是VHDL语言中常用的流程控制语句。IF语句有多种格式。 例4.3LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY multi_2 ISPORT(s,d0,d1:IN STD_LOGIC;-标准逻辑位数据类型,有九种逻辑值y:OUT STD_LOGIC);END multi_2;,ARCHI

13、TECTURE a OF multi_2 ISBEGIN y=(NOT s AND d0) OR (s AND d1);PROCESS(s,d0,d1)BEGIN -进程语句开始IF (s=0) THENy=d0; -条件成立时执行此顺序语句ELSEy=d1; -条件不成立时执行此顺序语句END IF; -条件语句结束END PROCESS; -进程语句结束 END a;,其仿真波形如下图示:,以上例子是一个数据选择器,其中所用IF语句的格式是IF的最基本的格式,即二选一控制格式。IF语句的格式一:,IF 条件 THEN顺序语句;ELSE顺序语句;END IF;,有时语句中缺少ELSE部分,则

14、成为另一种格式,即门闩控制格式。,例 4.4 LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY dff1 ISPORT(data_in :IN std_logic;clock:IN std_logic;data_out:OUT std_logic);END dff1; ARCHITECTURE behv OF dff1 ISBEGIN PROCESS(data_in,clock),BEGINIF(clock=1and clockevent)THENdata_out=data_in ; END IF;END PROCESS; END behv; 其仿

15、真波形如下图示,这是一个D触发器。,IF语句的格式二:,IF 条件 THEN 顺序语句;END IF;,重点提示使用无ELSE部分的一类IF语句时,Quartus在综合设计文件时,会生成一个含有一定数量寄存器的结构,例如上例的D触发器描述。,例4.5LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY encoder ISPORT(inv:IN std_logic_vector(7 downto 0);y:OUT std_logic_vector(2 downto 0);END encoder;ARCHITECTURE rt1 OF encoder I

16、SBEGIN PROCESS(inv),BEGINIF inv(7)=1 then y=”111”;ELSIF inv(6)=1 then y=”110”;ELSIF inv(5)=1 then y=”101”;ELSIF inv(4)=1 then y=”100”;ELSIF inv(3)=1 then y=”011”;ELSIF inv(2)=1 then y=”010”;ELSIF inv(1)=1 then y=”001”;ELSIF inv(0)=1 then y=”000”;ELSE y=”000”;END IF ;END PROCESS; END rt1;,其仿真波形如下图,以上

17、例子为8-3优先编码器。其真值如表4-1:表4-1 8-3优先编码器真值表,在以上例子中,有多种选择条件,其中IF语句的格式为多选择控制格式。 IF语句的格式三:,IF 条件1 THEN 顺序语句1;ELSIF 条件2 THEN 顺序语句2;ELSE顺序语句n;END IF ;,多选择控制格式其实又可分为有和无ELSE部分两种,上例是有ELSE部分的一种。,重点提示在描述组合逻辑电路时,一般要使用有ELSE部分的一类IF 语句,而不要使用无ELSE部分的一类IF语句。否则,Quartus在综合设计文件时,会生成一个含有一定数量寄存器的结构,增加电路复杂度。而在描述时序逻辑电路时则经常使用无EL

18、SE部分的一类IF语句。 课堂活动观察以上两个例子的真值表,思考真值表有何种特点的电路能更方便地使用IF语句来描述?,三、CASE语句,CASE语句即选择语句,它根据表达式的值,从多项顺序语句中选择满足条件的一项来执行。CASE语句也是VHDL语句的常用流程控制语句。,例4.6LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY demulti_4v ISPORT( d: IN STD_LOGIC;s: IN STD_LOGIC_VECTOR(1 DOWNTO 0);y0,y1,y2,y3: OUT STD_LOGIC);END demulti_4v;

19、,ARCHITECTURE a OF demulti_4v ISBEGIN PROCESS(s,d) BEGINCASE s IS WHEN “00”= y0 y0 y0 y0=0;y1=0;y2=0;y3=d;END CASE;END PROCESS;END a;,其仿真波形如下图示:,这是一个1-4分配器,注意信号S为STD_LOGIC _VECTOR数据类型,其可能取值不止4种,因为STD_LOGIC数据类型有九种取值。故上例中存在WHEN OTHERS 这一项。,下表为分配器的真值表,从上例可以看出,CASE 语句的格式与电路的真值表相对应。,CASE语句的格式:,CASE 表达式 I

20、S WHEN 选择值=顺序语句;WHEN 选择值=顺序语句; WHEN OTHERS=顺序语句;END CASE;,重点提示 CASE语句的格式与所描写的电路的真值表具有对应性。,例 4.7,其仿真波形如图:,这个VHDL程序描述的电路的真值如右表:,课堂活动 真值表具有何种特点的电路更适合使用CASE语句描述? 重点提示 从真值表出发,有VHDL语言描述数字电路是VHDL电路设计的基本问题类型,对于输入信号不是很多的时候,综合运用IF语句和CASE语句几基本能够解决组合逻辑电路的描述问题。掌握了这一类电路的设计方法,复杂的数字电路的设计就好解决了。,四、LOOP语句,LOOP语句是VHDL语

21、言的循环语句。对于效简单的数字电路,综合运用前三种VHDL语句,基本就可以解决电路描述的问题。但在进行效复杂VHDL设计中,设计人员会遇到某些重复操作,在这种情况下,可使用VHDL语言的LOOP语句。 LOOP语句有三种格式:即FOR_LOOP语句、WHILE_LOOP语句和由NEXT、EXIT控制的LOOP语句。,1、FOR_LOOP语句例 4.8,其仿真波形如下图:,这是一个判断8位输入数据是否含有0的VHDL描述。以后将会介绍,由于信号赋值具有延时性,不能用F代替上例中temp_F的位置。其中temp_f是进程内部的变量,它赋值不具有延时性。另外,它不能在进程外的结构体中声明,是一个局部

22、变量。循环后,将temp_f的值赋了信号f以便将值带出进程。,总结上例,FOR_LOOP语句的格式为:,标号: FOR 循环变量 IN 范围 LOOP 顺序语句组;END LOOP标号;,格式中的循环变量无须在结构体内定义,其值在每次循环中都发生变化,而IN后的范围则表示循环变量在循环过程中依次取值的范围。,2、WHILE_LOOP语句,例 4.9,其仿真波形如图:,这是使用WHILE_LOOP语句的判断8位输入数据是否有0的VHDL描述。,从这个例子可看出WHILE_LOOP语句的格式是:,标号: WHILE 循环控制条件 LOOP 顺序语句组;END LOOP标号;,格式中的循环控制条件可

23、是任意布尔表达式。条件为真时,继续循环,否则,跳出循环。,3、有NEXT、EXIT控制的LOOP语句,其格式是:,标号: LOOP顺序语句组;END LOOP标号;,在这种LOOP语句的顺序语句组中,一般存在下面将要介绍的NEXT、EXIT等控制语句,其循环方式由在顺序语句组中引入的NEXT、EXIT等控制语句所决定。,五、其他顺序语句简介,1、NEXT语句在上述LOOP语句中的NEXT语句用来跳出本次循环,其书写格式为:,NEXT 标号: WHEN条件;,NEXT语句执行时将停止本次迭代,而转入下一次新的迭代。NEXT后跟的“标号”表明下一次迭代的起始位置,而“WHEN 条件”则表明NEXT

24、语句执行的条件。如果NEXT语句后面无“标号”,则表示新的一次循环从LOOP语句的起始位置开始;如果NEXT语句后面既无“标号”也无“WHEN 条件”说明,执行到该语句时,无条件地跳出本次循环,从LOOP语句的起始位置开始下一次循环。,2、EXIT语句在LOOP语句中的EXIT语句用来跳出整个循环,其写格式为:,EXIT标号 WHEN 条件;,3、WAIT语句以后要介绍的进程或过程有两种状态:执行和挂起;当进程执行到WAIT语句时将被挂起,并等待条件满足时进程再次被执行。,有4种WAIT语句方式:,(1)WAIT;(2)WAIT ON 敏感信号表;(3)WAIT UNTIL 条件表达式;(4)

25、WAIT FOR 时间表达式(不可综合)。,4、NULL语句NULL语句表示没有动作发生。NULL语句有在CASE语句中可覆盖所有可能的条件。其格式为:,NULL;,4.4 VHDL程序的并行结构,并行结构是数字电路特有的硬件结构之一,VHDL的并行语句能方便地描写实际数字电路的并行结构及串行结构。VHDL的并行语句是VHDL语言与传统的计算机软件语言最显著的区别之一。各种并行语句并列于结构体当中并且是并发执行的,其执行顺序与书写顺序无关。同一个结构体内的不同并行语句之间可通过信号来交换信息。但因各语句的输入并非一定同时变化,故各并行语句并非一定同时更新输出信号。,结构体中常用的并行语句有:进

26、程(process)语句、并行信号赋值语句、元件例化语句、生成语句和快语句等,本节介绍除块语句以外的所有上述并行语句,而块语句则在后面有关章节再做介绍。,一、进程(process)语句,进程语句是VHDL设计中用得最多的语句之一,进程语句本身是并行语句,其内部却是由顺序语句组成。一个结构内可以包含多个进程语句,多个进程之间是并发执行的,多个进程语句间可通过信号来交换信息。进程语句的格式有两种。,格式1:,进程标号:PROCESS(敏感信号表)进程声明部分: -说明用于该进程的常量,变量和子程序BEGIN顺序语句;END PROCESS进程标号;,此格式有敏感信号表,其内部不允许存在WAIT语句

27、。,格式2:,进程标号:PROCESS进程声明部分:-说明用于该进程的常量,变量和子程序BEGINWAIT语句;顺序语句;END PROCESS进程语句;,进程语句是最常用的并行语句,既可以用来描述组合逻辑电路,又可以描述时序电路,是VHDL程序设计中应用最多也是最能体现硬件描述语言特点的一种语句。进程语句的主要特点归纳如下:(1) 同一结构体中的各个进程之间是并发执行的,并且都可以使用实体说明和结构体中所定义的信号;而同一进程内部的语句则必需是顺序语句。,(2) 为启动进程,进程语句中必须至少包含一个敏感信号或包含一个WAIT语句,但是在一个进程中不能同时存在敏感信号和WAIT语句。(3)

28、一个结构体中的各个进程之间可以通过信号来进行通信,进程的声明部分不能定义信号,但可以定义进程的内部变量。(4) 在进程内部信号赋值是有时间延迟的,在同一个进程中对同一个信号多次赋值是,起作用的是最后一次条件成立的赋值;而在进程内部变量赋值是无时间延迟的,在同一进程中对同一个变量多次赋值时,每次都立即起作用。,例4.13,其仿真波形如下图示:,这是一个用两个进程描写的具有50%输出占空比的可控分频电路。,二、并行信号赋值语句,与循环语句中的循环信号赋值语句、IF语句和CASE语句相应,VHDL的并行语句中有三种并行信号赋值语句:简单信号赋值语句、条件信号赋值语句和选择信号赋值语句。 这三种赋值语

29、句都是给目标信号赋值,并且相当与一条缩写的进程语句,每当所有的输入信号之一发生变化时,都会立即启动相关赋值操作。,1、简单信号赋值语句,并行的简单信号赋值语句对应与循序信号赋值语句,其格式和使用方法与循序信号赋值语句相似,不同的是,它是并行语句,能够出现在结构体中。其实它相当于一条缩写的仅包含一条循序信号赋值语句的进程语句。,例4.17,这是一个不同类型数据的加/减法器电路。其中表达式(0&A)和(0&b)是通过&连接符将8个分量的矢量a和b连接从而变成能给y1赋值的9个分量的矢量。signed (d)与unsigned则只直接利用VHDL的类型转换语句进行数据类型间的转换,分别见d转换成si

30、gned和unsigned数据类型。,从以上例子可以看出,简单信号赋值语句的格式为:,赋值目标信号=表达式;,式中的赋值目标必须是信号,赋值表达式必须与赋值目标的数据类型一致。在同一个结构体内的多个并行信号赋值语句是并行的,起顺序并不重要,在任意一个语句的表达式中的信号发生变化时,这个并行语句即执行。,ENTITY exa1 IS PORT(a,b,c,d : IN bit;y: OUT bit);END exa1;ARCHITECTURE a OF exa1 ISSIGNAL x: bit;BEGINy=(a AND b) OR x;x=c XOR d;END a;,例4.18,上题代码描写

31、的电路原理图如下图示:,重点提示 从上可以看出,结构体内的一个并行语句为电路的一个模块,而同一个结构体内的多个并行语句则构成具有多个模块的一个电路整体。其中不同模块之间通过具有相同名字的信号交换信息(相连)。,2、条件信号赋值语句,与顺序语句中的IF语句相似,并行的条件信号赋值语句根据不同的可能条件,为目标信号选择不同的赋值表达式,它相当于一条缩写的仅包含一条给单个信号赋值的IF 语句的进程语句。当然,在IF语句中,不同的可能条件下执行的顺序语句不一定是给同一单个信号赋不同的值,而可能是别的顺序语句,但并行的条件信号赋值语句只能对应于在不同的可能条件下执行的,给同一个单个信号赋不同的值的IF语

32、句。,例 4.19,其仿真波形如下图示:,这是用条件信号赋值语句描写的74XX138电路。其仿真结果与用顺序IF 语句描写一样。,从以上例子可以看出,条件信号赋值语句的格式如下:,赋值目标=表达式1 WHEN 赋值条件1 ELSE表达式2 WHEN 赋值条件2 ELSE表达式n WHEN 赋值条件n;,条件信号赋值语句是一种并行信号赋值语句,执行该语句时首先要进行条件判断,然后再进行信号赋值操作。,使用条件信号赋值语句时,应该注意以下几点:,(1) 对条件进行判断是有顺序的,位置靠前的条件具有较高的优先级,只有不满足本条件的时候才会去判断下一个条件。(2) 条件表达式的结果为布尔类型数值。(3

33、) 最后一个表达式后面可不含有WHEN句子。(4)条件信号赋值语句允许有条件重叠现象。,例 4.20,其仿真波形如下图示:,这是用条件信号赋值语句描述的七段译码器电路,注意其中七段LED编号与一般不同。,3、选择信号赋值语句,与顺序语句中的CASE语句相似,并行的选择信号赋值语句根据选择表达式的不同值,给目标信号选择不同的赋值表达式,它相当于一条缩写的仅包含一条给单个信号赋值的CASE语句的进程语句。并行的选择信号赋值语句只能对应与在不同的选择表达式的值下,执行给同一个单个信号赋不同的值的CASE语句。,例 4.22,其仿真波形如图:,这是用选择信号赋值语句描写的74XX138电路。其仿真结果

34、与用顺序IF 语句或用条件信号赋值语句描写的74XX138电路一样。,从以上例子可以看出,选择信号赋值语句的格式如下:,WITH 选择表达式 SELECT赋值目标信号=表达式1 WHEN 选择值1,表达式2 WHEN 选择值2, 表达式n WHEN 选择值n;,使用选择信号赋值语句时,应该注意以下几点:(1) 对选择条件的测试是同时进行的,测试完所有条件后再根据测试的结果进行赋值。语句将对所有的选择条件进行判断,而没有优先级之分,因此不允许有选择条件重叠的情况。(2) 每一个表达式后面都含有WHEN子句。(3) 选择条件不允许出现函盖不全的情况。,三、元件例化语句,元件例化语句是并行语句,它们

35、在结构体内出现的顺序并不重要,另外,元件可多次被实例化,但每次例化必须有一个唯一的例化名。,元件声明语句(COMPONET)格式如下:,COMPONET 元件名 ISGENERIC(类属表): -类属参数声明PORT(端口表); -端口声明-与该元件源程序实体中相应部分相同END COMPONET元件名;,元件例化语句(PORT MAP)格式如下:,例化名在同一个结构体中必须是唯一的,元件必须与componet语句中的引用元件名相一致。元件端口名与实例连接端口名的关联方式有两种:(1)位置关联:就是被调用的元件端口说明中端口信号的书写顺序及位置和PORT MAP语句中实例端口信号的书写顺序及位

36、置一一对应。,例化名:元件名 PORT MAP (端口名=连接端口名,);,(2)名字关联:就是用被调用的元件的端口名称赋予实例实际端口信号。在一个元件例化语句中不同的端口可使用不同的关联方式。元件例化语句为VHDL提供了一种自上而下的设计方法,在VHDL设计中经常使用。,四、生成语句需要复制或者有条件地选择并行语句时,可使用并行的生成语句。生成语句有两种:,1、FOR生成语句FOR生成语句常常用来进行重复结构的描述,格式如下:,标号: FOR 循环变量 IN 取值范围 GENERATE 块声明;BEGIN并行语句;END GENERATE 标号;,例4.25,执行:,可以观察到此电路的原理图

37、,如下:,2、IF生成语句,在需要设计有条件的并行语句时,可使用IF生成语句。IF生成语句的格式如下:,标号 IF 条件表达式 GENERATE块声明;BEGIN并行语句;END GENERATE标号;,例4.27 -以下代码为一文件,以顶层实体名shftreg8_1 为文件名,shftreg8_1 .vhd。,其仿真波形如图:,执行TOOLS=RTL Viewer,打开RTL电路观察可看到此电路的RTL原理图4-53,可见此电路是8位左移寄存器。,4.5 VHDL程序的语言要素总结,在前面的章节中,出现了许多VHDL语言的表识符、数据对象和数据类型等VHDL程序的语言要素。本节做一个较为系统

38、的总结。VHDL是一种强类型语言,只有当操作数和结果的类型按照一组规则匹配时,VHDL语言中的操作和赋值才是合法的。VHDL语言不允许不同类型的数据在表达式中自由组合。,一、文字语法,1、数字文字(1) 默认整数文字: 默认整数都是十进制的数,由数字和下划线组成。例如:5, 678, 0, 156E2(=15600).(2) 默认实数文字: 默认实数也都是十进制的数,由数字、小数点和下划线组成。例如:1.335, 1.0, 44.99E-2(=0.4499), 88_670_551.45._909(=88670551.453909).,(3) 以数制基数表示的文字:下面是使用数制基数表示的文字

39、的例子;Signal d1,d2,d3:integer range 0 to 255;d1=10170; -(十进制表示,等于十进制170)d2=16FE; -(十六进制表示,等于十进制254)d3=21111_1110;-(二进制表示,等于十进制254)(4) 物理量文字例如:60s(60秒),100m(100米),k(千欧姆)。,2、字符文字,(1) 字符 字符是用单引号括起来的字符,例如: D,E,a,f,4,_等等。(2) 文字字符串 文字字符串用双引号括起来的一维字符数组。例如:“cdda”, “after”,“BB$CC”等等。(3) 数值字符串 数值字符串就是数字矢量,其格式及例

40、子如下:,数制基数符号“数值字符串”,B“11110001”-二进制数数组,在字符串中的每一个数表示二进制位0或1,在字符串中的每位表示一个Bit。 O“156”-八进制数数组,在字符串中的每一个数代表一个八进制数,即代表一个3位(Bit)的二进制数。 X“AD10”-十六进制数数组,在字符串中的每一个数代表一个十六进制数,即一个4位的二进制数。,3、标识符,标识符是用户给常量、变量、信号、端口、子程序或参数等定义的名字。VHDL基本标识符的书写需遵循如下规则:(1) 有效的字符:包括26个大小写英文字母,数字09以及下划线“_”。(2) 任何标识符必须以英文字母开头。(3) 下划线必须是单个

41、的,且其前后都必须有英文字母或数字。(4) 标识符中的英文字母不分大小写。,(5) 不能使用VHDL定义的保留字,也称关键字。例如:WHEN、IF 等等,VHDL定义的保留字见后页的表4-5。例如:合法的标识符:ADD,FFT,AND_4,max2uc 非法的标识符:21A,_OR,and_4,a-b VHDL93标准支持扩展标识符,用反斜括号括起来,允许以数字开头,使用空格及以上的下划线。例如:74LS00,DOWNTO等等。,表4-5 VHDL保留字列表,4、下标名,下标名用于指示数组型变量或信号的某一元素。其格式为:,标识符(表达式),其中的标识符必须是数组型的变量或信号的名字,表达式所

42、代表的值必须是数组下标范围的一个值,这个将对应数组中的一个元素。如果这个表达式是一个可计算的值,则此操作数可很容易地进行综合。如果是不可计算的,则只能在特定的情况下综合。,下面是使用下标的例子: SIGNAL a, b: BIT_VECTOR(0 TO 3); SIGNAL m: INTEGER RANGE 0 TO 3; SIGNAL x,y: BIT; x=a(m);-不可计算型下标表示 y=b(3);-可计算型下标表示,5、段名,段名是多个下标名的组合,其格式为:,标识符(表达式 方向 表达式),其中的方向包括: TO -表示下标序号由低到高; DOWNTO -表示下标序号由高到低; 下

43、面是使用段名的例子: SIGNAL a,b: bit_vector(0 to 3); SIGNAL m: integer range 4 downto 0;,二、数据对象,VHDL数据对象(Data Objects)是用来存放各类数据的容器,有变量、信号和常量。变量和信号相当于门与门之间的连线及其连线上的信号值;常量相当于电路中的恒定电平,如GND或VCC。信号具有传输时间延迟,而变量没有;变量是只能存在于进程、子程序内部的局部信息载体,而信号则可作为模块间的信号载体。变量的设置有时只是一种过渡,最后要靠信号来把信息传出进程或子程序。,重点提示VHDL仿真器允许变量和信号设置初始值,但VHDL

44、综合器并不会把这些信息综合进去,这是因为实际的FPGA/CPLD芯片在上电后并不能确保其初始状态的取值。,1、变量,变量(VARIABLE)是局部量,只能在进程、函数和过程中声明并使用,用来存放临时数据,没有物理意义,要使其在整个结构体内有效,应转换为信号或声明为共享变量。在使用变量的进程、函数和过程中,变量的值将随变量赋值语句的执行而立即改变。变量声明的格式是:,VARIABLE 变量名:数据类型:=初始值;,例如: VARIABLE cnt: NATURAL:=3;VARIABLE x: bit:=1;,变量赋值的格式是:,:=两边目标变量和表达式和表达式应具有相同的数据类型。下面是一个使

45、用变量的例子:VARIABLE a,b:std_logic_vector(6 downto 0);VARIABLE y,z: integer range 0 to 15;y:=2; z:=3+y; a:=b;a(3 downto 0) := b(4 downto 1);,目标变量:= 表达式;,2、信号,信号(signal)是描述硬件系统中类似连接线的数据对象。信号不能在进程、函数和过程中内声明但可使用。在进程或子程序内部,信号赋值是有时间延迟的,在同一个进程或子程序内部中对同一个信号多次赋值,但起作用的是最后一次有效的赋值。在结构体内的并行语句结构中,不允许对同一目标信号进行多次赋值。,信号

46、声明的格式:,SIGNAL 信号名: 数据类型:=初始值;,例如: SIGNAL a,b: std_logic;SIGNAL u: bit:=1;信号赋值的格式是:,目标信号=表达式;,=两边的目标信号和表达式应具有相同的数据类型。,下面是一个使用信号的例子:SIGNAL a,b,c,x,y:INTEGER RANGE 0 TO 15;PROCESS(a,b,c)BEGINy=a+b; z=c+a; y=c;END PROCESS;在上面进程中,对y的第一次赋值不会发生,起作用的是对y的最后一次赋值,故y被赋值c。,3、常量,常量(constant)用来存储某种指定类型的特定数值。常量在仿真前

47、赋值,仿真过程中常量不能改变。对于子程序中声明的常量,在每次调用子程序时赋值。常量声明的格式是:,CONSTANT 常量名: 数据类型:=初始值;,例如:CONSTANT Vcc: REAL:=5.0;CONSTANT n: NATURAL:=3;在程序包中声明的常量为全局量;在实际说明部分声明的常量可以被该实体的任何结构体引用,在结构体或块中声明的常量能被该结构体或块内部任何语句使用,包括被进程语句或子程序使用;在进程或子程序说明中声明的常量只能在该进程或子程序中使用。,三、数据类型,(一)VHDL数据类型分类:1、VHDL的四大类数据类型(1) 标量类型(Scalar):具有具体大小数值的

48、数据类型。包括枚举(Enumeration)、整数(Integer)、浮点数(Float)和物理(Physical)。(2) 复合类型(Composite):又分为由相同类型的元素组成的数组类型和由不同类型的元素组成的记录类型。,(3)存取类型(Access):提供对给定类型的对象存取数据类型。(4)文件类型(File):提供对包含一系列给定类型的数据对象的存取的数据类型。2、预定义数据类型和用户自定义数据类型以上数据类型又可分为在VHDL标准库STD中的程序包所有包含的预定义数据类型和用户自定义数据类型。,3、子类型,所谓子类型是在预定义或用户定义中,通过对某一数据类型作一些范围限制而形成的

49、一种新的数据类型。子类型定义的一般格式为:,SUBTYPE 子类型名 IS 数据类型名 范围;,子类型可以是对其父类型施加限制条件,也可以是简单地对其父类型重新起个名字,而没有增加任何新的意义。,(二)预定义数据类型与IEEE库中所定义的数据类型,1、预定义数据类型在VHDL标准库STD中的程序包STANDARD中预定义了一系列常用的数据类型,称预定义数据类型。使用这些数据类型不必显示写出所引用的库与程序包的引用声明。,(1) 位(BIT)预定义枚举类型BIT称为位数据类型,只有0和1两种值,代表电平的高低。(2) 布尔量(BOOLEAN)预定义枚举类型BOOLEAN称布尔量数据类型,只有两种取值,FALSE和TURE。没有数值的含义,不能进行算术运算。(3) 错误等级(SEVERITY_LEVEL),

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报