版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第九章 VHDL程序基础n9.1 VHDL程序结构n9.2 VHDL的语言元素n9.3 VHDL的基本描述语句n9.4 VHDL结构体的三种描述方法n9.5 有限状态机的设计硬件描述语言VHDLVHDL的英文全称是VHSIC (Very High Speed Integrated Circuits) Hardware Description Language。于1983年由美国国防部提出,由IEEE 进一步发展,并在1987年12月作为IEEE-STD-1076标准公布发行, 1993年被更新为IEEE-STD-1164-1993,目前已被广泛应用。1995年我国技术监督局制定的CAD通用技术
2、规范推荐VHDL作为我国电子设计自动化硬件描述语言的国家标准。至此,VHDL在我国迅速普及,现在已成为从事硬件电路设计开发人员所必须掌握 的一门 技术。硬件描述语言VHDL的特点1、支持自顶向下的设计方法2、系统硬件描述能力强行为描述、数据流描述、结构描述。3、系统仿真能力强4、工艺无关性初学者如何学好初学者如何学好VHDLVHDL1 1、掌握时钟的概念。、掌握时钟的概念。2 2、注意、注意VHDLVHDL编程与软件编程的差别。编程与软件编程的差别。3 3、语法学习贵精不贵多,靠练不靠背。、语法学习贵精不贵多,靠练不靠背。4 4、注意、注意VHDLVHDL语句的可综合性。语句的可综合性。n9.
3、1.1 VHDL程序基本结构例1 一个2输入的与门的逻辑描述LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY and2 ISPORT(a,b: IN STD_LOGIC; y : OUT STD_LOGIC);END and2;ARCHITECTURE and2x OF and2 ISBEGINy=a AND b;END and2x;实体部分实体部分结构体部分结构体部分库库(Library)包包(Package)实体实体 Entity 结构体结构体Architecture 配置配置Configuration 存放已编译的实体、结构体、包集合和配
4、置存放已编译的实体、结构体、包集合和配置存放各设计模块能共享的数据类型、常数、存放各设计模块能共享的数据类型、常数、子程序等。子程序等。定义电路的输入定义电路的输入/输出接口输出接口描述电路内部的功能。描述电路内部的功能。决定哪一个结构体被使用。决定哪一个结构体被使用。VHDL程序基本结构VHDL中常用的资源库为IEEE库。 IEEE库: 常用的资源库。IEEE库中的三个重要的包集合:STD_LOGIC_1164STD_LOGIC_ARITH(算术运算库)、STD_LOGIC_UNSIGNED等 库(LIBRARY)库说明语句的语法形式为: LIBRARY 库名; -说明使用什么库 USE 库
5、名.程序包名.项目名;-说明使用库中哪个程序包及 包集合中的项目;库和程序包的用法LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; WORK库:库:WORK库是现行作业库。设计者所描述的库是现行作业库。设计者所描述的VHDL语句不需要任何说明,将都存放在语句不需要任何说明,将都存放在WORK库中。库中。WORK库对库对所有设计都是隐含可见的,因此在使用该库时无需进行任何说所有设计都是隐含可见的,因此在使用该库时无需进行任何说明。明。一点注意
6、:要求:设计文件不能直接存放在根目录下,必须建立一个英文文件夹,系统自动将其视为work库。实体的一般格式为:ENTITY 实体名 IS类属参数说明;端口说明;END; 实体名必须与文件名相同。 ENTITY、IS、END是VHDL的关键字(保留字)。 实体名、端口名等均应为符合VHDL命名规则的标识符。 端口:指实体中的每一个I/O信号,其功能对应于电路 图符号的一个引脚。端口说明则是对一个实体的一组端口的定义,即对基本设计实体与外部接口的描述。端口是设计实体和外部环境动态通信的通道。实体(ENTITY)ENTITY and2 IS END and2;端口说明的一般格式为: PORT(端口名
7、,端口名:端口模式 数据类型; 端口名,端口名:端口模式 数据类型); 端口模式用来说明数据传输通过该端口的方向。端口模式有以下几类: IN(输入):仅允许数据流进入端口。主要用于时钟输入、控制输入、单向数据输入。 OUT(输出):仅允许数据流由实体内部流出端口。该模式通常用于终端计数一类的输出,不能用于反馈。 BUFFER(缓冲):该模式允许数据流出该实体和作为内部反馈时用,但不允许作为双向端口使用。 INOUT(双向):可以允许数据流入或流出该实体。该模式也允许用于内部反馈。如果端口模式没有指定,则该端口处于缺省模式为:IN 。数据类型原则上可以是任何标准的数据类型和用户自定义类型。ini
8、ninoutoutbufferinoutmodemode模式及其信号源模式及其信号源补充说明:补充说明:在端口说明时,可将几个同样方向、同样数据类在端口说明时,可将几个同样方向、同样数据类型的端口放在同一说明语句里。型的端口放在同一说明语句里。最后一条端口说明语句后不加分号;最后一条端口说明语句后不加分号;PORT (a,b: IN STD_LOGIC; y : OUT STD_LOGIC);ENTITY add4 ISPORT(a, b: IN STD_LOGIC_VECTOR(3 downto 0); Ci: IN STD_LOGIC; Sum: OUT STD_LOGIC_VECTOR(
9、3 downto 0); Co: OUT STD_LOGIC);END add4;add4a3.0b3.0Sum3.0CiCo例例3 3: 四位加法器实体说明程序四位加法器实体说明程序结构体的一般格式如下:ARCHITECTURE 结构体名 OF 实体名 IS结构体说明部分;BEGIN并发处理语句;END 结构体名; 实体名必须与实体声明部分所取的名字相同; 而结构体名可由设计者自由选择;ARCHITECTURE and2x OF and2 ISBEGINy=a AND b;END and2x;结构体(ARCHITECTURE )结构体的一般格式如下:ARCHITECTURE 结构体名 OF
10、实体名 IS结构体说明部分;BEGIN并发处理语句;END 结构体名; 2) 结构体说明是指对结构体需要使用的信号、常数、数据类 型和函数进行定义和说明。声明语句所声明的内容只能用于该结构体中,若希望在其他的实体或结构体中引用这些定义,则须用包声明(PACKAGE).3) 并发处理语句位于BEGIN和END之间,这些语句具体地描述了构造体的行为。并发处理语句是功能描述的核心部分,也是变化最丰富的部分。并发处理语句块语句块语句(BLOCK)进程语句进程语句(PROCESS)信号赋值语句信号赋值语句子程序调用子程序调用:调用过程调用过程(PROCEDURE)和函数和函数(FUNCTION)元件例化
11、语句(元件例化语句(COMPONENT)配置的基本格式为: CONFIGURATION 配置名 OF 实体名 IS配置说明; END 配置名; 配置语句描述了层与层之间的连接关系,以及实体与构造体之间的连接关系。设计者可以利用配置语句选择不同的构造体,使其与要设计的实体相对应;在仿真某一个实体时,可以利用配置选择不同的构造体进行性能对比实验,以得到性能最佳的构造体。配置配置(CONFIGURATION) 配置语句根据不同情况,其说明语句有简有繁。最简单的缺省配置格式为: CONFIGURATION 配置名 OF 实体名 IS FOR 选配结构体名 END FOR; END 配置名; 例4:加入
12、了配置的4位等值比较器设计文件LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY comp4 IS PORT(a, b: IN STD_LOGIC_VECTOR(3 downto 0); y: OUT STD_LOGIC);END comp4;-结构体结构体 1:ARCHITECTURE behavior OF comp4 ISBEGINComp: PROCESS(a, b) BEGIN IF a=b THEN y=1; ELSE y=0; END IF; END PROCESS comp;END behavior;-结构体结构体 2:ARCHITE
13、CTURE dataflow OF comp4 ISBEGIN y=1 WHEN(a=b) ELSE 0;END dataflow;-结构体结构体 3:ARCHITECTURE structural OF comp4 IS COMPONENT xnor2 PORT(in1, in2: IN STD_LOGIC; Out: OUT STD_LOGIC); END COMPONENT; COMPONENT and4 PORT(in1, in2, in3, in4: IN STD_LOGIC; Out: OUT STD-LOGIC); END COMPONENT; SIGNAL s: STD_LOG
14、IC_VECTOR(0 to 3);BEGIN u0: xnor2 PORT MAP(a(0),b(0),s(0); u1: xnor2 PORT MAP(a(1),b(1),s(1); u2: xnor2 PORT MAP(a(2),b(2),s(2); u3: xnor2 PORT MAP(a(3),b(3),s(3); u4: and4 PORT MAP(s(0),s(1),s(2),s(3),y);END structural;-配置 :CONFIGURATION comp4_con OF comp4 IS FOR behavior END FOR;END comp4_con;ys0b
15、0a0b1a1b2a2b3a3s1s2s3abu0u1u3u2u44位等值比较器9.2 VHDL的语言元素9.2.1 标识符标识符 由英文字母、数字以及下划线字符组成,且: 第一个字符必须是英文字母; 最后一个字符不能是下划线; 不允许连续两个下划线; 在标识符中大、小写字母是等效的。 VHDL中的注释文字一律为2个连续的连接线“-”,可以出现在任一语句后面,也可以出现在独立行; VHDL的保留字(关键字)不能用于标识符;例如:如下标识符是合法的:例如:如下标识符是合法的: tx_clk Three_state_Enable sel7D HIT_1124 如下标识符是非法的:如下标识符是非法的
16、: _ tx_clk -标识符必须起始于英文字母 8B10B -标识符必须起始于英文字母 large#number -只能是英文字母、数字、下划线 link_ _bar -不能有连续两个下划线 select -关键字(保留字)不能用于标识符 rx_clk_ -最后字符不能是下划线9.2.2 数据对象 在VHDL中,数据对象是可以赋予一个值的客体。常用的数据对象为常量、变量和信号,在使用前必须给予定义。 常量(CONSTANT) 常量是指那些在设计描述中不会变化的值。常量说明的一般格式如下: CONSTANT 常量名,常量名:数据类型 := 取值; 例如:例如: CONSTANT width:
17、integer : = 8 变量(VARIABLE) 变量是暂存数据的量。变量说明的语法格式是: VARIABLE 变量名,变量名:数据类型 :=初始值; 例如:VARIABLE count: INTEGER RANGE 0 TO 99 : =0 变量只用于进程和子程序,它是一个局部量。变量必须在进程或子程序的说明性区域加以说明。 变量的初始值赋值只在仿真时有用,而在综合时无用;变量赋值语句格式为: 目标变量名 := 表达式; 赋值语句中的表达式必须与目标变量具有相同的数据类型。赋值语句中的表达式必须与目标变量具有相同的数据类型。变量赋值是立即生效,不存在延时行为。变量常用在实现某种运算的赋变
18、量赋值是立即生效,不存在延时行为。变量常用在实现某种运算的赋值语句中。值语句中。 信号(SIGNAL) 信号是电子电路内部硬件实体相互连接的抽象表示。信号能够代表连线,也可内连元件,端口也是信号。信号说明的语法格式为: SIGNAL 信号名,信号名 :数据类型 :=初始值; 例如: SIGNAL count: BIT_VECTOR(3 downto 0); 信号包括I/O引脚信号以及IC内部缓冲信号,有硬件电路与 之对应,故信号之间的传递有实际的附加延时。 信号通常在构造体、包集合和实体中说明;信号不能在 进程中说明(但可以在进程中使用)。信号赋值语句格式为: 目标信号名 = 表达式; 赋值语
19、句中的表达式必须与目标信号具有相同的数据类型。声明形式与赋值符号不同;声明形式与赋值符号不同;有效域不同。信号可在结构体、进程外定义;而变量有效域不同。信号可在结构体、进程外定义;而变量在进程内定义。即:在进程内定义。即:变量变量是一个局部量,只能用于进是一个局部量,只能用于进程或子程序中;程或子程序中;信号信号是一个全局量,它可以用来进行是一个全局量,它可以用来进行进程之间的通信。进程之间的通信。信号赋值信号赋值可以出现在进程中,也可以直接出现在结构可以出现在进程中,也可以直接出现在结构体中,但它们的体中,但它们的运行含义运行含义不同:不同:前者前者属顺序信号赋值,属顺序信号赋值,此时的赋值
20、操作要视进程是否已被启动;此时的赋值操作要视进程是否已被启动;后者后者属并行属并行信号赋值,其赋值操作是各自独立并行发生的。信号赋值,其赋值操作是各自独立并行发生的。 4. 在进程中在进程中变量和信号的赋值形式与操作过程不同变量和信号的赋值形式与操作过程不同: 在变量的赋值语句中在变量的赋值语句中,该语句一旦被执行,其值立即被赋,该语句一旦被执行,其值立即被赋予变量。在执行下一条语句时,该变量的值即为上一句新赋的予变量。在执行下一条语句时,该变量的值即为上一句新赋的值。值。 在信号的赋值语句中在信号的赋值语句中,该语句即使被执行,其值不会使信,该语句即使被执行,其值不会使信号立即发生代入,在下
21、一条语句执行时,仍使用原来的信号值。号立即发生代入,在下一条语句执行时,仍使用原来的信号值。直到进程结束之后,所有信号赋值的实际代入才顺序进行处理。直到进程结束之后,所有信号赋值的实际代入才顺序进行处理。因此,实际代入过程和赋值语句的执行是分开进行的。如例因此,实际代入过程和赋值语句的执行是分开进行的。如例1212所示。所示。5、可在不同的进程中读取一个信号,可在不同的进程中读取一个信号,但不能在不同的进程中但不能在不同的进程中对同一个信号进行赋值。对同一个信号进行赋值。6 6、在同一进程中对同一信号进行多次赋值操作时,、在同一进程中对同一信号进行多次赋值操作时,只有最后只有最后一次会生效。一
22、次会生效。例例12 12 信号和变量值代入的区别举例信号和变量值代入的区别举例 PROCESS (a,b,c,d)BEGIN d=a; x=b+d; d=c; y=b+d; END PROCESS;结果:结果:x=b+c; y=b+c;PROCESS (a,b,c)VARIABLE d:std_logic_vector(3 downto 0);BEGIN d:=a; x=b+d; d:=c; y=b+d;END PROCESS;结果:结果: x=b+a;y=b+c;当进程运行时,信号赋值将自当进程运行时,信号赋值将自上而下顺序执行,但第一项赋上而下顺序执行,但第一项赋值操作并不会发生,这是因为
23、值操作并不会发生,这是因为信号赋值是在进程结束时才起信号赋值是在进程结束时才起作用。因为在进程结束更新时,作用。因为在进程结束更新时,d d的最后一个赋值为的最后一个赋值为c c ,因此执,因此执行结果为该式。行结果为该式。9.2.3 数据类型 VHDL是一种是一种类型型很强的语言类型型很强的语言。 VHDL中只有相同数据类型的量,中只有相同数据类型的量, 才能相互之间发生作用。才能相互之间发生作用。VHDL预定义数据类型n整数(整数(INTEGER):):取值范围为取值范围为 (2311)(2311)。)。variable a: integer range 255 to 255;布尔量(布尔
24、量( Boolean ):取值为取值为TURE 、FALSE; 用于逻辑用于逻辑(关系)运算。(关系)运算。n位位(BIT):只有两种取值,即只有两种取值,即0和和1,可用于描述信号的取值,可用于描述信号的取值.n位矢量位矢量(BIT_VECTOR):是用双引号括起来的一组数据,是用双引号括起来的一组数据,每位只有两种取值:每位只有两种取值:0 和和 1。在其前面可加以数制标记,。在其前面可加以数制标记,如如X(16进制)、进制)、B(2进制、默认)、进制、默认)、O(8进制)等。位进制)等。位矢量常用于表示总线的状态。矢量常用于表示总线的状态。Data=O“15”Data=B“1101”SI
25、GNAL a: BIT_VECTOR(0 TO 3);SIGNAL a: BIT_VECTOR(3 DOWNTO0);Real(实数)。取值范围为(实数)。取值范围为 1.0E+38 +1.0E+38。由于实数运。由于实数运算需要大量的资源,因此综合工具常常并不支持实数类型。算需要大量的资源,因此综合工具常常并不支持实数类型。Time(时间)。时间的取值范围从(时间)。时间的取值范围从 (2311)到()到(2311)。时间)。时间由整数值、一个以上空格以及时间单位组成。常用的时间单位有:由整数值、一个以上空格以及时间单位组成。常用的时间单位有:fs、ns、s、ms、s、min、hr等。时间是
26、一个具有量纲的数据,故只能用等。时间是一个具有量纲的数据,故只能用于指定时间延时和仿真过程,而综合器并不支持。于指定时间延时和仿真过程,而综合器并不支持。Natural(自然数)和(自然数)和Positive(正整数)。是整数类型的子类型。自(正整数)。是整数类型的子类型。自然数取值范围为然数取值范围为0 (2311);正整数是大于);正整数是大于0的整数。的整数。Severity Level(错误等级)。错误等级分为:(错误等级)。错误等级分为:NOTE(注意注意)、WARNING(警告)、(警告)、ERROR(出错)、(出错)、FAILURE(失败)四级,用(失败)四级,用于提示系统的错误
27、等级。于提示系统的错误等级。 只用于仿真。只用于仿真。Character(字符)。是用单引号括起来的一个字母、数字、(字符)。是用单引号括起来的一个字母、数字、空格或一些特殊字符(如空格或一些特殊字符(如$、%等)。等)。字符区分大、小字符区分大、小写字母写字母。String(字符串)。是用双引号括起来的一个字符序列。(字符串)。是用双引号括起来的一个字符序列。字字符串区分大、小写字母。符串区分大、小写字母。常用于程序的提示和结果说明等。常用于程序的提示和结果说明等。IEEE预定义标准逻辑位(STD_LOGIC)和矢量(STD_LOGIC_VECTOR)TYPE STD_LOGIC ISU,
28、-未初始化的X , -不定态0 , -01 , -1Z , -高阻态W , -弱信号不定态L , -弱信号0H , -弱信号1_ , -不可能情况(可忽略值)不可能情况(可忽略值)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;2. 用户自定义数据类型 VHDL允许用户自己定义数据类型。 自定义数据类型说明语句的一般格式是:TYPE 数据类型名 ,数据类型名 IS 数据类型定义 of 基本数据类型;常用的用户自定义数据类型主要有: (1)枚举(Enumerated)类型。 通过列举某类变量所有可能的取值来加以定义。对这些取值,一般使用自然语言中有相应含义的单词
29、或字符序列来代表,以便于阅读和理解。 枚举类型定义的格式为:TYPE 数据类型名 IS (元素1,元素2,); TYPE m_state IS (s1,s2,s3,s4,s5);SIGNAL present_state, next_state: m_state;在程序包在程序包STD_LOGIC_1164STD_LOGIC_1164中对中对STD_LOGICSTD_LOGIC的定义为的定义为TYPE STD_LOGIC IS ( U ,X ,0 ,1 ,Z ,W ,L ,H ,_ ); (2 2) 数组(数组(ARRAYARRAY)类型。)类型。 又称为向量,是多个相同类型又称为向量,是多个相
30、同类型的数据集合。它可以是二维的和多维的。的数据集合。它可以是二维的和多维的。 数组类型定义的格式为数组类型定义的格式为: TYPE 数组名数组名 IS ARRAY (范围)(范围) OF 元素数据类型名;元素数据类型名; TYPE m IS ARRAY (7 downto 0) OF STD_LOGIC; TYPE count1 IS ARRAY ( STD_LOGIC _ DOWNTO U ) OF INTEGER; (3) (3) 纪录纪录(RECORD)(RECORD)类型类型: : 是多个不同类型的数据集合。是多个不同类型的数据集合。 纪录类型定义的格式为纪录类型定义的格式为:TYP
31、E 数据类型名数据类型名 IS RECORD元素名:元素名: 数据类型名;数据类型名;元素名:元素名: 数据类型名;数据类型名; END RECORD;(4 4)时间()时间(TIMETIME)类型(物理类型)。)类型(物理类型)。表示时间的数据类型,表示时间的数据类型, 在仿真时是必不可少的。在仿真时是必不可少的。 时间类型定义的一般格式为:时间类型定义的一般格式为:TYPE 数据类型名数据类型名 IS 范围;范围;UNITS 基本单位;基本单位; 单位;单位;END UNITS; 例如:在例如:在STANDARD程序包中定义的时间,如下:程序包中定义的时间,如下: TYPE time IS
32、 range 1e18 TO 1e18;UNITS fs; ps=1000fs; ns=1000ps; s=1000ns; ms=1000s; set=1000ms; min=60set; hr=60min;END UNITS; 这里的基本单位是“fs”。时间是物理类型的数据,当然对容量、阻抗值也可以做定义。(5 5) 子类型(子类型(SUBTYPESUBTYPE)。)。是由是由typetype所定义的原数据类型的所定义的原数据类型的一个子集。它只是在基本数据类型的基础上作了些约束,但是一个子集。它只是在基本数据类型的基础上作了些约束,但是没有定义新的数据类型。没有定义新的数据类型。子类型定义
33、的一般格式为:子类型定义的一般格式为: SUBTYPE 子类型名 IS 基本数据类型名 约束范围; SUBTYPE digit IS INTEGER range 0 to 9;SUBTYPE digit2 IS std_logic_vector(0 to 9); Subtype digit3 is array (0 to 9) of integer;3. 数据类型的转换数据类型的转换 在VHDL程序中,不同类型的对象不能代入,因此要进行类型转换。类型转换的方法有:(1 1)类型标记法。)类型标记法。用类型名称来实现关系密切的标量类型用类型名称来实现关系密切的标量类型之间的转换。之间的转换。 例
34、如:VARIABLE x:INTEGER;VARIABLE y:REAL; 使用类型标记(即类型名)实现类型转换时,可采用赋值使用类型标记(即类型名)实现类型转换时,可采用赋值语句:语句:x :=INTEGER(y); y :=REAL(x)。(2 2)类型函数法。)类型函数法。 CONV_INTEGER ( ):将STD_LOGIC_VECTOR类型转换成INTEGER类型。CONV_STD_LOGIC_VECTOR( ):将将INTEGER类型、类型、UNSIGNED类型或类型或 SIGNED类型转换成类型转换成STD_LOGIC_VECTOR类型。类型。TO_BIT ( ):将将STD_
35、LOGIC类型转换成类型转换成BIT类型。类型。TO_BIT_VECTOR( ):将将STD_LOGIC_VECTOR类型转换类型转换BIT_VECTOR 类型。类型。TO_STD_LOGIC( ):将将BIT类型转换成类型转换成STD_LOGIC类型。类型。TO_STD_LOGIC_VECTOR( ): 将将BIT_VECTOR类型转换成类型转换成 STD_LOGIC_VECTOR类型。类型。 其中,第其中,第1 1个函数由个函数由STD_LOGIC_UNSIGNEDSTD_LOGIC_UNSIGNED程序包定义,第程序包定义,第2 2个函数由个函数由 STD_LOGIC_ARITHSTD_
36、LOGIC_ARITH定义,其余均由定义,其余均由STD_LOGIC_1164STD_LOGIC_1164定义。引用前必须先定义。引用前必须先 打打开库和相应的程序包。开库和相应的程序包。 例题:用转换函数语句设计一个译码电路。d0.2Q0.7Entity decoder1 is port( input: in std_logic_vector(0 to 2); output: out std_logic_vector(7 downto 0);End decoder1; Architecture behave of decoder1 is begin process(input) begin
37、output(conv_integer(input)=1; end process;End behave;Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;9.2.4 运算符与操作符n关于括号关于括号:表达式中如果一串运算中的算符相:表达式中如果一串运算中的算符相同,且是同,且是AND,OR,XORAND,OR,XOR中的一种,则不需使用括中的一种,则不需使用括号;如果一串运算中的算符不同或有这三种算号;如果一串运算中的算符不同或有这三种算符之外的算符,则必须使用括号。符之外的算符,则必须使用括号。
38、n操作数的操作数的数据类型数据类型必须是操作符所规定的数据必须是操作符所规定的数据类型。类型。n严格遵循在基本操作符间操作数是严格遵循在基本操作符间操作数是同数据类型同数据类型的规则。的规则。n注意运算符的注意运算符的优先级别优先级别;见讲义。;见讲义。(1)算术运算符算术运算符算术运算符含义含义备注备注+加加一般情况下,一般情况下,“+”号两边只能是号两边只能是integer;nStd_logic_vector+ Std_logic_vector;nStd_logic_vector+integer;1)Std_logic_vector + Std_logic;-减减同上同上*乘乘一般情况下,
39、一般情况下,“*”号两边只能是号两边只能是integer;nStd_logic_vector* Std_logic_vector1)Integer*integer;/除除Maxplus要求要求/右边的数为右边的数为2的的n次幂。次幂。*乘方乘方Maxplus不支持不支持mod求模求模Maxplus不支持不支持rem求余求余Maxplus不支持不支持abs求绝对值求绝对值Maxplus不支持不支持Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;(2 2)关系运算符:)关系运算符:它包括:= 、/=
40、、= 、= 。v其作用是将其作用是将相同数据类型相同数据类型的数据对象进行数值比较或关系排序判断,的数据对象进行数值比较或关系排序判断,并将结果以并将结果以boolean类型表示。类型表示。v和和/=的操作对象可以是任意数据类型;但其余运算符的操作对象则的操作对象可以是任意数据类型;但其余运算符的操作对象则仅限于整数或一维数组。仅限于整数或一维数组。v注意小于等于和赋值符号的区分。注意小于等于和赋值符号的区分。(3 3)逻辑运算符:)逻辑运算符:包括一元逻辑运算符和二元逻辑运算符。包括一元逻辑运算符和二元逻辑运算符。 一元逻辑运算符包括:一元逻辑运算符包括:NOT 。 二元逻辑运算符包括:二元
41、逻辑运算符包括:AND、OR、NAND、NOR、XOR、XNOR。v逻辑运算符的操作对象为逻辑运算符的操作对象为boolean,bit,std_logic;v也可以是也可以是bit_vector,std_logic_vector,但必须位宽要相同;且数组间的但必须位宽要相同;且数组间的运算必须按位进行;运算必须按位进行;vNot的优先级别最高,但其它逻辑运算符的优先级别最低;建议使用的优先级别最高,但其它逻辑运算符的优先级别最低;建议使用括号。括号。Signal a,b,c: std_logic_vector(3 downto 0);Signal d,e,f,g:std_logic_vecto
42、r(1 downto 0);Signal h, I,j,k:std_logic;Signal L,m,n,o,p:boolean;a=b and c; d=e or f or g; h=(I nand j) nand k; L=(m xor n) and (o xor p);h=I and j or k;a=b and e;h=I or L;(4 4)并置运算符:)并置运算符:&(连接),用于将多个位或数组连(连接),用于将多个位或数组连接成为新的位矢量。接成为新的位矢量。 例如:例如:DBUS=D0& &D1& &D2& &D3;即;即
43、DBUS=(D0,D1,D2,D3)。)。例:设计一个例:设计一个4位全加器。位全加器。ADDER4.VHDA3.0CINB3.0S3.0COLibrary ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity adder4 is port( cin: in std_logic; a: in std_logic_vector(3 downto 0); b: in std_logic_vector(3 downto 0); s: out std_logic_vector(3 downto 0); co: o
44、ut std_logic);End adder4;Architecture behav of adder4 is Signal so: std_logic_vector(4 downto 0);Signal aa,bb: std_logic_vector(4 downto 0);BeginAa=0 & a;Bb=0& b;So=aa+bb+cin;S=so(3 downto 0);Cox),它可以在较多的位赋值中它可以在较多的位赋值中作省略化的赋值。如作省略化的赋值。如Signal d,e : std_logic_vector(7 downto 0);d0);e1,4=1,ot
45、hers=0);2.2.5 属性(Attributes)属性是指语言中某个项目的特性。预定义属性描述语属性是指语言中某个项目的特性。预定义属性描述语句是一个预定义函数,其格式为:句是一个预定义函数,其格式为:属性测试项目名属性测试项目名属性标示符属性标示符综合器支持的属性有:综合器支持的属性有:left, right, high, low, range, reverse_range, length, event, stable.1、EVENT 例如:CLKEVENT AND CLK=12、LEFT, RIGHT, HIGH, LOW例如:TYPE num IS ARRAY RANGE 7 DO
46、WNTO 0; VARIABLE i1,i2,i3,i4: INTEGER; BEGIN i1:=num LEFT; -i1取得num的左边界值 7 i2:=num RIGHT; -i2取得num的右边界值 0 i3:=num HIGH; -i3取得num的上限值 7 i4:=num LOW; -i4取得num的下限值 03、LENGTH 例如:TYPE num IS ARRAY RANGE 7 DOWNTO 0; VARIABLE M: INTEGER; BEGIN M:= num LENGTH;4、RANGE 和REVERSE_RANGE 例如:SIGNAL S: STD_LOGIC_VE
47、CTOR(0 TO 7) FOR I in srange loop 或 FOR I in sreverse_range loopFor I in 0 to 7 loopFor I in 7 downto 0 loopl9.3.2 VHDL结构体的基本子结构 在规模较大的电路设计中,整个电路将被分成若干个相对在规模较大的电路设计中,整个电路将被分成若干个相对独立的模块来描述。这样,一个结构体可以用几个子结构,即独立的模块来描述。这样,一个结构体可以用几个子结构,即相对独立的几个模块来构成。相对独立的几个模块来构成。VHDL语言有以下语言有以下3种形式的子种形式的子结构描述语句:结构描述语句: B
48、LOCK 语句结构语句结构 PROCESS 语句结构语句结构 SUBPROGRAMS 结构结构l2.1.2.2 进程( PROCESS ) PROCESSPROCESS语句是语句是VHDLVHDL语言中最重要的语句之语言中最重要的语句之一,特点如下:一,特点如下:v进程本身是一种并发处理语句,在一个构造进程本身是一种并发处理语句,在一个构造体中多个体中多个 PROCESSPROCESS语句可以同时并发运行,但语句可以同时并发运行,但其内部则为顺序语句其内部则为顺序语句;v进程只有在特定的时刻才会被激活执行。进程只有在特定的时刻才会被激活执行。进程语句的语法格式进程语句的语法格式1 1: 进程名
49、: PROCESS (敏感信号表敏感信号表)进程说明语句;进程说明语句; BEGIN顺序描述语句;顺序描述语句; END PROCESS 进程名进程名; 进程语句的语法格式进程语句的语法格式2 2: 进程名: PROCESS 进程说明语句;进程说明语句; BEGIN WAIL UNTIL(激活进程的条件激活进程的条件);顺序描述语句;顺序描述语句; END PROCESS 进程名进程名; 例9 利用PROCESS语句设计与非门电路。nandx: PROCESS (a, b)BEGINy=a NAND b;END PROCESS nandx; 进程标号不是必需的;进程标号不是必需的; 敏感信号表
50、所标明的信号是用来敏感信号表所标明的信号是用来启动进程启动进程的。若无敏感信号时,则通过的。若无敏感信号时,则通过WAIT语句来实现。语句来实现。WAIT UNTIL 条件表达式条件表达式;PROCESS语句声明部分定义的量只适用于本进程。最常在此处定义的是变语句声明部分定义的量只适用于本进程。最常在此处定义的是变量。因为信号是全局量。量。因为信号是全局量。 PROCESS内部各语句之间内部各语句之间是顺序关系是顺序关系 。在系统仿真时,在系统仿真时, PROCESS语句语句是按书写顺序一条一条向下执行的。而不象是按书写顺序一条一条向下执行的。而不象BLOCK中的语句可以并行执行。中的语句可以
51、并行执行。系统上电系统上电进程挂起进程挂起敏感信号发生敏感信号发生变化?变化?敏感信号发生敏感信号发生变化?变化?顺序语句顺序语句1进程挂起进程挂起顺序语句顺序语句1顺序语句顺序语句n顺序语句顺序语句nNNYY进程进程1 1进程进程2 2进程的工作原理示意图进程的工作原理示意图进程可用来描述组合逻辑,也可以用来描述时序逻进程可用来描述组合逻辑,也可以用来描述时序逻辑。辑。时钟沿的时钟沿的VHDL描述:描述:CLK: IN STD_LOGIC;上升沿描述:上升沿描述:CLKEVENT AND CLK=1 或者或者RISING_EDGE(CLK)下降沿描述:下降沿描述:CLKEVENT AND C
52、LK=0 或者或者falling_edge(CLK)一个进程不可同时对时钟上、下沿敏感。一个进程不可同时对时钟上、下沿敏感。PROCESS(CLK)BEGINIF rising_edge(clk) THENELSIF falling_edge(clk) THENPROCESS(CLK)BEGINIF rising_edge(clk) THENELSE例题:2分频电路(fenpin2.vhd)clkoutclkinarchitecture behav of fenpin2 issignal q: std_logic;beginprocess(clkin)beginif rising_edge(c
53、lkin)thenq=not q;end if;end process;clkout=q;end behav;library ieee;use ieee.std_logic_1164.all;entity fenpin2 is port(clkin: in std_logic; clkout: out std_logic);end fenpin2;architecture behav of fenpin2 isbeginprocess(clkin)beginif rising_edge(clkin)thenclkout=not clkin;end if;end process;end beha
54、v;例题:计数器例题:计数器(count10.vhd)(count10.vhd)library ieee;use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;entity count10 is port(clk: in std_logic; q: buffer std_logic_vector(0 to 3);end count10;Architecture behav of count10 isbeginprocess(clk)begin if rising_edge(clk) then if q=1001 then q=0
55、000; else q=q+1; end if; end if;end process;end behav; 9.3 VHDL的基本描述语句 n9.3.1 9.3.1 顺序描述语句顺序描述语句n9.3.2 9.3.2 并发描述语句并发描述语句VhdlVhdl程序设计中两大基本描述语句系列:程序设计中两大基本描述语句系列:9.3.1 顺序描述语句n信号信号代入语句代入语句 n变量变量赋值语句赋值语句nWAIT语句语句nIF语句语句nCASE语句语句nLOOP语句语句nNEXT语句语句nEXIT语句语句nRETURN语句语句nNULL语句语句顺序语句的特点是:每一条顺序语句的执行顺序是与它们的书顺
56、序语句的特点是:每一条顺序语句的执行顺序是与它们的书写顺序基本一致的。写顺序基本一致的。顺序语句只能出现在进程和子程序中。顺序语句只能出现在进程和子程序中。变量赋值语句格式为:变量赋值语句格式为: 目标变量名目标变量名 := 表达式;表达式;信号赋值语句格式为:信号赋值语句格式为: 目标信号名目标信号名 = 表达式;表达式;Library ieee;Use ieee.std_logic_1164.all;Entity test_signal isPort(clr, clk: in std_logic; q1,q2: out integer range 0 to 9);End test_sign
57、al;1、赋值语句(signal , variable) 将一个值或表达式的运算结果传递给某一数据对象。Test_signal.vhdArchitecture test of test_signal isSignal A,B: integer range 0 to 9;BeginProcess(clk,clr)Variable c: integer range 0 to 9;BeginIf clr=1 thenA=0; B=2; C:=0;Elsif rising_edge(clk) then c:=c+1; A=c+1;B=A+2;END IF;END PROCESS;Q1=A; Q2=B;
58、 END TEST;几种赋值形式1、标识符赋值、标识符赋值Variable a: std_logic;Signal c: std_logic_vector(0 to 3); a:=1;C=“0001”;2、数组元素赋值:数组名(下标)、数组元素赋值:数组名(下标)C(1)=0;C(1 to 2)=“00”;C(3 downto 2)=“10”WAIT语句有以下四种形式: WAIT -无限等待无限等待 WAIT ON 敏感信号表;敏感信号表; -敏感信号量变化,进程启动敏感信号量变化,进程启动 WAIT UNTIL 条件表达式;条件表达式; -表达式成立时,进程启动表达式成立时,进程启动 WAI
59、T FOR 时间表达式;时间表达式; -时间到,进程启动时间到,进程启动2、WAIT语句例:IF(a=1)THENc=b;END IF;3、IF 语句qnq QD CdclkARCHITECTURE rtl OF dff ISBEGINPROCESS (clk)BEGINIF (clkevent and clk=1) THEN q=d;END IF;END PROCESS ;END rtl;例例2 设计设计D触发器。触发器。ARCHITECTURE rtl OF mux2_1 ISBEGINPROCESS(a,b,sel)BEGINIF (sel=1) THENc=a;ELSEc=b;END
60、IF; END PROCESS;END rtl;例3 设计2选1的数据选择器。selc例4 设计4选1的多路选择器d0d1d2d3selyENTITY mux4_1 IS PORT(d : IN STD_LOGIC_VECTOR(3 DOWNTO 0); sel : IN STD_LOGIC_VECTOR(1 DOWNTO 0); y : OUT STD_LOGIC);END mux4_1;ARCHITECTURE rtl OF mux4_1 ISBEGINPROCESS (d, sel)BEGINIF (sel=00) THEN y=d(0);ELSIF (sel=01) THEN y=d(1);ELSIF (sel=10) THEN y=d(2);ELS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 济宁学院《编译原理》2021-2022学年第一学期期末试卷
- 全新网络安全防护体系构建合同20243篇
- 二零二四年度虚拟现实技术研发与转让合同:技术研发方与使用方之间的虚拟现实技术研发和转让协议2篇
- 二零二四年云计算服务订阅合同3篇
- 科学计算语言Julia及MWORKS实践 课件 18-离散数据图与数据分布图
- 玖贝医疗咨询公司
- 《文旅新媒体运营》高职全套教学课件
- 通讯行业培训相关
- 肿瘤护理病例讨论
- 二零二四年度服装品牌代理经营权转让协议3篇
- 2024-2029年中国细胞与基因治疗(CGT)行业市场发展分析及前景趋势与投资研究报告
- 严重精神障碍患者家属护理教育
- 医疗不良事件报告制度及流程
- 高校人事处长年度个人述职报告
- 商业银行贷款风险提示
- 生涯发展报告
- 鲁科版综合实践活动五年级上册全册教案
- 青岛版科学五年级上册全册练习题(含答案)
- 桌面运维方案
- 超速和疲劳驾驶安全教育
- 糖料甘蔗糖度试验方法
评论
0/150
提交评论