04可编程逻辑电路技术VHDL语言要素4hr_第1页
04可编程逻辑电路技术VHDL语言要素4hr_第2页
04可编程逻辑电路技术VHDL语言要素4hr_第3页
04可编程逻辑电路技术VHDL语言要素4hr_第4页
04可编程逻辑电路技术VHDL语言要素4hr_第5页
已阅读5页,还剩96页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、主要内容n4.1 VHDL程序设计约定n4.2 VHDL数据对象n4.3 VHDL数据类型n4.4 数据类型转换n4.5 VHDL运算操作符n4.6 VHDL文字规则第第4章章 VHDL语言要素语言要素1主要内容n4.1 VHDL程序设计约定n4.2 VHDL数据对象n4.3 VHDL数据类型n4.4 数据类型转换n4.5 VHDL运算操作符n4.6 VHDL文字规则第第4章章 VHDL语言要素语言要素24.1VHDL程序设计约定程序设计约定每条VHDL语句由一个分号结束;对于VHDL编译器和综合器,文字大小写不加区分;注释使用双横线“-”,不参加编译和综合; 为便于阅读与调试,使用层次缩进格

2、式,同一层次的对齐,低层次比高层次缩进两个字符;MAX+plusII要求程序文件名必须与实体名一致,建议各源程序文件名均与其实体名一致。3主要内容n4.1 VHDL程序设计约定n4.2 VHDL数据对象n4.3 VHDL数据类型n4.4 数据类型转换n4.5 VHDL运算操作符n4.6 VHDL文字规则第第4章章 VHDL语言要素语言要素4 VHDL数据对象(Data Objects) 用于接受不同数据的赋值。四种:常量、变量、信号和文件。1. 常量(CONSTANT) 常量指在设计实体中不会发生变化的值。一但被赋值后就不能再改变。格式:CONSTANT常数名:数据类型:=表达式CONSTAN

3、TVcc:REAL:=5.0;CONSTANTDALY:TIME:=100ns;CONSTANTFBUS:BIT_VECTOR:=”0101”;4.2 VHDL数据对象数据对象赋值应与数据类型一致!赋值应与数据类型一致!5 常量的可视性规则:可在程序包、实体说明、结构体和进程的说明区域进行说明,其。n 在程序包中定义的常量,具有最大的全局化特征,凡调用此程序包的所有设计实体均可使用;n 若定义在实体中,其有效范围为该实体对应的所有结构体;n 若定义在某结构体,只能用于该结构体内部语句;n 若定义在一个进程,则该常量只能用于该进程中。4.2 VHDL数据对象数据对象62 2变量变量(VARIAB

4、LE)(VARIABLE) 变量是一个局部量,主要用于对中间数据的局部存储。(1) 变量的定义语法格式 VARIABLE 变量名:数据类型:=初始值; 例: VARIABLE A:INTEGER; -定义A为整数型变量 VARIABLE B,C:INTEGER:=2; -定义B和C为整型变 -量,初始值为2 VARIABLE count:INTEGER RANGE 0 TO 255:=10; 4.2 VHDL数据对象数据对象7(2)变量赋值 赋值语句的格式: VARIABLE x,y : REAL ; VARIABLE a: BIT_VECTOR( 0 TO 7 ) ; x := 100.0

5、; - 实数赋值, x是实数变量 y := 1.5+x ; - 运算表达式赋值, y 也是实数变量 a (3 TO 6) := ( 1,1,0,1) ; - 段赋值,注意赋值格式4.2 VHDL数据对象数据对象 目标变量名 := 表达式 8(3)变量使用的注意事项: 变量只能在进程语句、过程语句和函数语句的说明区域中进行说明和使用; 变量不能将信息带出对它作出定义的当前设计单元,若要带出,只能将其赋值给相同类型的信号; 变量的赋值是立即发生,不存在延时,不支持变量附加延时语句。 目标变量可以是单值变量或数组型变量; 表达式与目标变量数据类型相同,可以是运算表达式,也可是一个数值; 变量常用在实

6、现某种算法的赋值语句中。4.2 VHDL数据对象数据对象9例:例:Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity sync is port(clk : in std_logic; irq : out std_logic);End sync;Architecture rtl of sync is signal temp : integer;Begin Label1: process Variable counter : integer :=0; Begin Wait until clk

7、=1; counter:=counter+1; temp=counter; End process; label2 : process Begin Wait until clk=1; If(temp=15) then irq=0; Else irq=1; End if; End process;End rtl;4.2 VHDL数据对象数据对象10说明:n根据输入时钟clk,产生周期为16倍的中断信号irq,中断信号宽度为1个时钟周期;n进程Lable1用来计数,当clk发生变化且为1时启动该进程,执行counter的加1操作;n进程Label2产生中断信号irq,当计数器temp计满16个时钟

8、周期,将irq置0并持续1个时钟周期;n counter为进程Label1的变量,不能在Label2中使用。在结构体中定义一个信号temp,将变量counter的值赋给它,将其值带出进程Label1。4.2 VHDL数据对象数据对象11程序仿真结果:4.2 VHDL数据对象数据对象123. 信号(SIGNAL) 信号是实体间动态交换数据的手段,(1)信号的描述格式 SIGNAL 信号名:数据类型=初始值; 信号初始值的设置不是必需的,而且初始值仅在 VHDL 的 。4.2 VHDL数据对象数据对象13例:例: signal clock : std_logic :=0 ; signal rese

9、t : std_logic :=1 ; signal data_bus : std_logic_vector(7 downto 0) : = (others =1) ; signal address_bus : std_logic_vector (7 downto 0) ;4.2 VHDL数据对象数据对象信号的赋值语句表达式如下:信号的赋值语句表达式如下:目标信号名目标信号名 = 表达式表达式 ; x = 9 ; z = x AFTER 5ns ;14(2)信号使用注意信号初始化时采用“:=”,程序中信号值的代入将采用代入符“=”。信号可以连续赋值,其值在设计实体中可以改变,这一点与常量不同。

10、当没有被赋初值时,默认取该类型的最左值或最小值。如:前面的第4个信号没指定初始值,则信号address_bus取默认值“UUUUUUUU”,93版的“std_logic”有9种值:U(未初始化)、X(强未知)、0(强0)、1(强1)、Z(高阻)、W(弱未知)、L(弱0)、H(弱1)、-(任意项)。4.2 VHDL数据对象数据对象154.2 VHDL数据对象数据对象(3)信号说明的位置n信号可以在程序包、实体说明部分、结构体的说明区域中进行说明,进程和子程序不许定义信号;n程序包中说明的信号可由任何实体、结构体所引用;在实体说明中定义的信号在该实体的任何结构体中引用;在结构体中说明的信号只能被该

11、结构体内部语句引用。n端口只是一种附加了数据流动的方向的隐性信号,输出端口不能读入数据,输入端口不能被赋值,信号可以看成是实体内部的“端口”,无数据流动方向。16 需要特别注意的是,在进程中,只能将信号列入敏感表,而不能将变量列入敏感表,这是因为只有信号才能把进程外的信息带入进程内部。 目标信号获得传入的数据要经历延时过程。综合器在综合过程中将略去所设的延时值,在综合后的功能仿真中,信号或变量间的延时是看成零延时的,但为了给信息传输的先后作出符合逻辑的排序,将自动设置一个小的延时量,即所谓的延时量 (VHDL模拟器的最小分辩时间)。4.2 VHDL数据对象数据对象17(4)信号与变量的区别:

12、信号和变量都可以被连续地赋值。信号赋值:信号名=表达式;变量赋值:变量 :表达式;允许两者之间互相赋值,但要保证两者类型一致; 信号赋值有一定延迟,变量赋值无延迟; 信号除当前值外还有许多相关值,如历史信息等,变量只有当前值; 信号在程序包、实体说明和结构体说明部分定义,信号在程序包、实体说明和结构体说明部分定义,可以是多个进程的全局信号,而变量只在定义它的可以是多个进程的全局信号,而变量只在定义它的过程、函数和进程中可见过程、函数和进程中可见; 信号可看作硬件连线,变量无此对应关系。 4.2 VHDL数据对象数据对象18 label1:processlabel1:processVariabl

13、e a, b :=integer;Variable a, b :=integer;BeginBegin wait until wait until clkclk=1;=1; a:=10; a:=10; b:=20; b:=20; a:=b; a:=b; b:=a; b:=a;End process;End process; signal a,b:integer;label2:process(a,b)Variable a, b :=integer;Begin a=10; b=20; wait for 10ns; a=b; b=a; wait for 10ns;End process;4.2 VH

14、DL数据对象数据对象19说明:(1)进程label1,其结果为:a=20,b=20;(2)对进程label2,执行第1和第2条赋值语句后,a和b并没有直接得到初值,而在wait for 10 ns语句后,信号a为10,b为20; 在执行第3条赋值语句后,由于信号赋值有延迟,a的值并没有立即变化;紧接着执行第4条语句,此时a的值仍为10; 在执行完wait for 10 ns这一语句后,信号a和b的赋值语句生效。 因此该进程的结果是:a=20,b=10。4.2 VHDL数据对象数据对象20下面分析用不同的语句描述下面分析用不同的语句描述4选选1多路选择器的多路选择器的VHDL程序。程序。例:例:

15、4-1多路选择器(采用变量赋值)多路选择器(采用变量赋值)Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity mux4_var is port( d0 : in std_logic_vector(7 downto 0); d1 : in std_logic_vector(7 downto 0); d2 : in std_logic_vector(7 downto 0); d3 : in std_logic_vector(7 downto 0); s0 : in std_logic ; s

16、1 : in std_logic ; q : out std_logic_vector(7 downto 0); int : out integer range 0 to 3 );End entity mux4_var;4.2 VHDL数据对象数据对象21Architecture behave of mux4_var isBegin label1 : process(d0,d1,d2,d3,s0,s1) variable tmp : integer range 0 to 3; begin tmp:= 0; if(s0=1) then tmp:=tmp+1; end if; if(s1=1) t

17、hen tmp:=tmp+2; end if; int q q q q=d3; end case;end process label1;End behave;4.2 VHDL数据对象数据对象22程序仿真结果:4.2 VHDL数据对象数据对象23例:例:41多路选择器(采用信号赋值)多路选择器(采用信号赋值)Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity mux4_sig is port( d0 : in std_logic_vector(7 downto 0); d1 : in st

18、d_logic_vector(7 downto 0); d2 : in std_logic_vector(7 downto 0); d3 : in std_logic_vector(7 downto 0); s0 : in std_logic ; s1 : in std_logic ; q : out std_logic_vector(7 downto 0); int : out integer range 0 to 3 );End entity mux4_sig;4.2 VHDL数据对象数据对象24Architecture behave of mux4_sig is siganl tmp :

19、 integer range 0 to 3;Begin label1 : process(d0,d1,d2,d3,s0,s1) begin tmp= 0; if(s0=1) then tmp=tmp+1; end if; if(s1=1) then tmp=tmp+2; end if; int q q q qb的结果便是布尔量,综合器将其变为0或1信号值。 TYPEBOOLEANIS(FALSE,TRUE);4.3 VHDL数据类型数据类型33(2)位(BIT)数据类型位数据类型也属于枚举型,取值只能是1或0。BIT类型的数据对象(变量、信号等)可参与逻辑运算,其结果仍然是BIT型。TYPEB

20、ITIS(0,1);(3)位矢量(BIT_VECTOR)数据类型位矢量是基于BIT数据类型的数组,使用位矢量必须注明位宽,即数组中的元素个数和排列. TYPE BIT_VECTOR IS ARRAY (Natural Range ) OF BIT ;例如:例如:SIGNAL a : BIT_VECTOR (7 DOWNTO 0);4.3 VHDL数据类型数据类型344.3 VHDL数据类型数据类型(4)字符(CHARACTER)数据类型字符通常用单引号括起来,对,如B不同于b;35(5)字符串(STRING)数据类型是字符数据类型的一个非约束型数组,或称为字符串数组,必须用双引号标明,如: V

21、ARIABLE string_var : STRING (1 TO 7 ) ; string_var := a b c d4.3 VHDL数据类型数据类型36(6)整数(INTEGER)数据类型 包括正整数、负整数和零,可进行加 、减、乘、除等算术运算; 取值范围-(231-1)(231-1),-2147483647 2147483647,用 32 位有符号二进制数表示; 仿真器将 INTEGER 类型作为有符号数处理,而综合器则作为无符号数处理,且要求用 Range子句限定范围, 然后决定所需二进制数的位数。4.3 VHDL数据类型数据类型37如: SIGNAL : INTEGER RANG

22、E 0 TO 15 ; constant max : integer :=128; signal number : integer range 0 to 255; variable int8 : integer range 255 to 255;定义整数的取值范围是015共16个值,因此被综合成的总线信号。0 -十进制整数十进制整数2#11010010# -二进制整数二进制整数8#720# -八进制整数八进制整数 16#D2# -十六进制整数十六进制整数4.3 VHDL数据类型数据类型38(7) 自然数(NATURAL)和正整数(POSITIVE)n 自然数和正整数都是。n 自然数0(231-

23、1);正整数1(231-1);n 定义如下: SUBTYPE NATURAL IS INTEGER RANGE SUBTYPE NATURAL IS INTEGER RANGE 0 TO INTEGERHIGH ;0 TO INTEGERHIGH ; SUBTYPE POSITIVE IS INTEGER RANGE SUBTYPE POSITIVE IS INTEGER RANGE 1 TO INTEGERHIGH ;1 TO INTEGERHIGH ;4.3 VHDL数据类型数据类型39(8) 实数(REAL)数据类型n 实数的取值范围为-1.0E381.0E38;n 通常仅能在 VHDL

24、仿真器中使用,综合器不支持实数;n 书写时一定要有小数,例:1.0 1.0 十进制浮点数十进制浮点数 659.333333 659.333333 十进制浮点数十进制浮点数 = 65_9.333_333= 65_9.333_3338#43.6#e+4 8#43.6#e+4 八进制浮点数八进制浮点数 43.6E 4 43.6E 4 十进制浮点数十进制浮点数4.3 VHDL数据类型数据类型40(9) 时间(TIME)数据类型 VHDL 中的预定义物理类型,完整的时间类型包括整数和物理量单位两部分,整数和单位之间至少留一个空格,如:55 ms,20 ns 4.3 VHDL数据类型数据类型41(10)

25、错误等级(SEVERITY LEVEL) 仿真器中,错误等级用来指示设计系统的四种工作状态 : NOTE(注意) WARNING(警告)ERROR(出错) FAILURE(失败) 这四种值来提示当前的工作情况,其定义如下:TYPE TYPE severity_levelseverity_level IS (note, warning, error, failure) ; IS (note, warning, error, failure) ;4.3 VHDL数据类型数据类型422、IEEE预定义标准逻辑位与矢量 在IEEE库的程序包STD_LOGIC_1164中,定义了标准逻辑位STD_LOG

26、IC 和标准逻辑矢量STD_LOGIC_VECTOR两个重要的数据类型。 (1) 标准逻辑位(STD_LOGIC)数据类型 TYPE STD_LOGIC IS (U,X,0,1,Z,W,L,H,-);U-未初始化的,X-强未知的,0-强0,1-强1,Z-高阻态,W-弱未知的,L-弱0,H-弱1,-忽略。 4.3 VHDL数据类型数据类型43 由于标准逻辑位数据类型的多值性 在编程时应当特别注意,在条件语句中如果未考虑到所有可能的取值情况,综合器可能会插入不希望的锁存器; 在程序中使用此数据类型前,需加入下面的语句: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.A

27、LL; STD_LOGIC 型数据能够在数字器件中实现的只有、0、1和 Z四种值,高阻态和忽略态可用于三态的描述,这九种值对于行为仿真都有重要意义。 4.3 VHDL数据类型数据类型44(2) 标准逻辑矢量(STD_LOGIC_VECTOR)数据类型 TYPE STD_LOGIC_VECTOR IS ARRAY (NATURAL RANGE) OF STD_LOGIC; STD_LOGIC_VECTOR数据类型是定义在STD_LOGIC_1164程序包中的标准一维数组,数组中 的 每 一 个 元 素 的 数 据 类 型 都 是 标 准 逻 辑 位STD_LOGIC。 使用时必须严格考虑位矢的宽

28、度,的矢量间才能进行赋值。4.3 VHDL数据类型数据类型453、其它预定义标准数据类型 Synopsys 公司在IEEE库中加入的STD_LOGIC_ARITH程序包中定义了如下的数据类型:无符号型(UNSIGNED)有符号型(SIGNED)小整型(SMALL_INT) 在使用之前加入下面的语句: LIBRARY IEEE ;LIBRARY IEEE ; USE IEEE.STD_LOIGC_ARITH.ALL USE IEEE.STD_LOIGC_ARITH.ALL ;4.3 VHDL数据类型数据类型46(1)无符号数据类型(UNSIGNED) TYPE UNSIGNED IS array

29、 (NATURAL range ) OF STD_LOGIC ; UNSIGNED 数据类型代表一个无符号的数值,在综合器中这个数值被解释为一个二进制数,其最左位是最高位。例如十进制的8可以作如下表示: UNSIGNED(1000) 例:VARIABLE var : UNSIGNED(0 TO 10) ; 不能用UNSIGNED定义负数! 4.3 VHDL数据类型数据类型47(2)有符号数据类型(SIGNED TYPE) SIGNED 数据类型表示一个有符号的数值,综合器将其解释为补码,此数的最高位是符号位。例: VARIABLE var SIGNED(0 TO 10) ; 其中变量var 有

30、11位,最左位 var(0)是符号位。4.3 VHDL数据类型数据类型484、用户自定义数据类型 VHDL允许用户自行定义新的数据类型,如枚举类型(ENUMERATION TYPE)、整数类型(INTEGER TYPE)、数组类型(ARRAY TYPE)、记录类型(RECORD TYPE)、时间类型(TIME TYPE)、实数类型(REAL TYPE)等。 用户自定义数据类型是用类型定义语句TYPE和子类型定义语句SUBTYPE实现的。4.3 VHDL数据类型数据类型494.3 VHDL数据类型数据类型u TYPE语句用法 TYPE语句语法结构如下: TYPE 数据类型名 IS 数据类型定义

31、OF 基本数据类型 Type 数据类型名 IS 数据类型定义 数据类型名由设计者自定; 数据类型定义部分用来描述表达方式和表达内容; 关键词OF后的基本数据类型是指数据类型所定义的元素的基本数据类型, 一般取预定义数据类型如BIT,STD_LOGIC或 INTEGER等。504.3 VHDL数据类型数据类型例如:TYPE st1 IS ARRAY ( 0 TO 15 ) OF STD_LOGIC ;TYPE st1 IS ARRAY ( 0 TO 15 ) OF STD_LOGIC ;TYPE week IS (sun TYPE week IS (sun monmon tuetue wed w

32、ed thuthu frifri sat) ; sat) ;TYPE TYPE bytbyt IS STD_LOGIC(15 DOWNTO 0) ;- IS STD_LOGIC(15 DOWNTO 0) ;-错误错误 st1是一个具有16个元素的数组型数据类型; week是由一组文字表示的,每一文字都代表一个具体的数值,如可令 sun = 1010 ; 第三句定义的方式是错误的,TYPE 定义的数据类型应该是一种全新的即 VHDL 预定义库中未被定义过的数据类型,这里的 STD_LOGIC已被定义为标准位了。514.3 VHDL数据类型数据类型u SUBTYPE 语句用法 子类型 SUBTYP

33、E 只是由 TYPE 所定义的原数据类型的一个子集,它满足原数据类型的所有约束条件,原数据类型称为基本数据类型。 SUBTYPE 子类型名 IS 基本数据类型 RANGE 约束范围 子类型只在基本数据类型上作一些约束,并没有定义新的数据类型,这是与TYPE 最大的不同; 基本数据类型必须是TYPE定义过的数据类型,包括VHDL预定义程序包中定义过的类型 。524.3 VHDL数据类型数据类型例:SUBTYPE digits IS INTEGER RANGESUBTYPE digits IS INTEGER RANGE(0 to 90 to 9); ;SUBTYPE dig1 IS STD_LO

34、GIC_VECTOR(7 DOWNTO 0);SUBTYPE dig1 IS STD_LOGIC_VECTOR(7 DOWNTO 0);SUBTYPE dig3 IS ARRAY(7 DOWNTO 0) of STD_LOGIC;SUBTYPE dig3 IS ARRAY(7 DOWNTO 0) of STD_LOGIC; - 错误不能用来定义一种新的数据类型 由于子类型与其基本数据类型属同一数据类型,因此属于子类型的和属于基本数据类型的数据对象间可以直接进行赋值,不必进行数据类型的转换。534.3 VHDL数据类型数据类型(1)枚举类型 枚举数据类型是用文字符号来表示一组二进制数。例如,状态

35、机的每一状态在实际电路中是以二进制数位的组合来表示的,但为了更于阅读、编译,往往将状态用文字符号来代表。例如: TYPE TYPE m_statem_state IS ( state1,state2,state3,state4,state5 ) ; IS ( state1,state2,state3,state4,state5 ) ; SIGNAL SIGNAL present_statepresent_state, , next_statenext_state : : m_statem_state ; ; 信号 present_state 和 next_state 的数据类型为 m_stat

36、e,它们的取值范围从 state1 state5 共五种 。而这些状态代表五组不同的二进制数值。544.3 VHDL数据类型数据类型BIT、布尔量、字符及STD_LOGIC等都是程序包中定义的枚举数据类型。如BIT的取值是文字0和1,与数字0和1不一样,不能进行数学运算,它们只代表一个数据对象的两种可能的取值方向。在综合过程中将转化成二进制代码,当然枚举类型也可以直接用数值来定义,但必须使用单引号TYPE my_logic IS (1, Z ,U, 0 ) ;SIGNAL s1 : my_logic ; s1 = Z ; TYPE STD_LOGIC IS ( U, X, 0 , 1 ,Z,

37、W,L , H - ) ; SIGNAL sig : STD_LOGIC ; sig = Z ;554.3 VHDL数据类型数据类型 在综合过程中,枚举类型文字元素的编码通常是自动的,一般将第一个枚举量(最左边的量)编码为 0,以后的依次加 1。位矢的长度将取决于状态数。如五个状态的位矢长度应该为3 ,编码默认值:state1 = 000state2 = 001 state3 =010 state4 =011 state5 = 100 于是state1 state2 state3 state4 state5 ,编码方式因综合器及综合控制方式不同而不同,编码顺序也可以人为设置 。564.3 VH

38、DL数据类型数据类型(2) 整数类型和实数类型 这两种数据类型取值范围太大,无法综合,必须由用户根据需要重新定义,限定取值范围 。 VHDL 仿真器通常将整数或实数类型作为有符号数处理,编码方法是: 负数 编码为二进制补码 正数 编码为二进制原码 编码的位数取决于用户定义的数值的最大值。 数据类型定义 综合结果TYPE num2 IS range 10 to 100 - 7TYPE num2 IS range 10 to 100 - 7位二进制原码位二进制原码TYPE num3 IS range -100 to 100 - 8TYPE num3 IS range -100 to 100 - 8

39、位二进制补码位二进制补码SUBTYPE num4 IS num3 RANGE 0 to 6- 3SUBTYPE num4 IS num3 RANGE 0 to 6- 3位二进制原码位二进制原码574.3 VHDL数据类型数据类型(3) 数组类型 数组类型属复合类型,是将一组元素集合在一起,作为一个数据对象来处理。 数组可以是一维(每个元素只有一个下标)数组或多维数组(每个元素有多个下标) VHDL 仿真器支持多维数组,但综合器只支持一维数组。 两种不同类型的数组:限定性数组和非限定性数组,限定性数组下标的取值范围在定义时就被确定了,而非限定性数组下标的取值范围留待随后确定。584.3 VHDL

40、数据类型数据类型限定性数组TYPE数组名ISARRAY(数组范围)OF数据类型;数组名是新定义的限定性数组类型的名称;数组范围明确指出数组元素的定义数量和排序方式,以整数来表示其数组的下标;数据类型即指数组各元素的数据类型。示例:TYPEstbISARRAY(7DOWNTO0)ofSTD_LOGIC;这个数组类型的名称是stb,它有8个元素,它的下标排序是76543210各元素的排序是stb(7),stb(6)stb(0)。594.3 VHDL数据类型数据类型通常所用的数组一般不超过二维或是三维。例:44二维数组定义:Type matrix is array (0 to 3,0 to 3) o

41、f bit;Constant rommatrix : matrix :=( (0, 1, 0, 0), (0, 1, 0, 0), (0, 1, 0, 0), (0, 1, 0, 0), );matrix被定义为44的数组;常量rommatrix的数据类型被定义为数组类型matrix,并赋予了初始值。二维数组常常用于建立真值表。604.3 VHDL数据类型数据类型非限定性数组定义时不说明数组下标的取值范围,定义数据对象时再确定该数组下标范围取值。TYPE数组名ISARRAY(数组下标名RANGE)OF数据类型;符号“”是下标范围待定符号,中间不能有空格。TYPE Bit_Vector IS A

42、rray (Natural Range ) OF BIT; VARIABLE va: Bit_Vector (1 to 6) - 取值范围定在取值范围定在 1- 6TYPE Log_4_Vector IS ARRAY (NATURAL RANGE , POSITIVE RANGE) OF Log_4 ;VARIABLE L4_Object : Log_4_Vector (0 TO 7,1 TO 2)614.3 VHDL数据类型数据类型(4)记录类型 记录类型与数组类型都是数组;区别是: 数组类型:对象元素都是相同的数据类型; 记录类型:对象元素是不同的数据类型; 定义记录类型的语句格式如下:

43、TYPE 记录类型名 IS RECORD 元素名 : 元素数据类型1 ; 元素名 : 元素数据类型2 ; . END RECORD 记录类型名; 624.3 VHDL数据类型数据类型例如: TYPE RegName IS (AX,BX,CX,DX) ; TYPE Operation IS RECORD Mnemonic : STRING (1 TO 10) ; OpCode : BIT_VECTOR(3 DOWNTO 0) ; Op1 Op2 Res : RegName ; END record ;63 物理类型:综合器不支持物理类型的数据,如时间类型,这些类型只能用于仿真过程; 浮点型,如R

44、EAL型; Aceess型,综合器不支持存取型结构,因为不存在这样对应的硬件结构; File型,综合器不支持磁盘文件型,硬件对应的文件仅为RAM和 ROM 4.3 VHDL数据类型数据类型64主要内容n4.1 VHDL程序设计约定n4.2 VHDL数据对象n4.3 VHDL数据类型n4.4 数据类型转换n4.5 VHDL运算操作符n4.6 VHDL文字规则第第4章章 VHDL语言要素语言要素654.4 数据类型转换数据类型转换 由于VHDL 是一种强类型语言,在对某一数据类型的变量、信号和常量赋值时,类型必须一致。 在相互操作时,如果类型不一致,则需要使用。 两种方法:数据类型转换函数、直接类

45、型转换方式。661、数据类型转换函数函数说明STD_LOGIC_1164包包1.TO_STDLOGICVECTOR(A)2.TO_BITVECTOR(A)3.TO_LOGIC(A)4.TO_BIT(A)1. 由由 B I T _ V E C T O R 转 换 成转 换 成STD_LOGIC_VECTOR2. 由由STD_LOGIC_VECTOR转换成转换成BIT_VECTOR3. 由由BIT转换成转换成STD_LOGIC4. 由由STD_LOGIC转换成转换成BIT STD_LOGIC_ARITH包包1.CONV_STD_LOGIC_VECTOR(A,位长)2.CONV_INTEGER(A)

46、1. 由由INTEGER,UNSIGNED和和SIGNED转换成转换成STD_LOGIC_VECTOR2.由由UNSIGNED和和SIGNED转换成转换成INTEGER STD_LOGIC_UNSIGNED包包1.CONV_INTEGER1. 由由STD_LOGIC_VECTOR转换成转换成INTEGER 4.4 数据类型转换数据类型转换674.4 数据类型转换数据类型转换library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity decoder38 is port (qin: in std_l

47、ogic_vector(2 downto 0 ); qout: out std_logic_vector(7 downto 0);end entity decoder38;architecture code1 of decoder38 is begin process(q1)3to8例:例:3-8译码器的译码器的VHDL描述对比描述对比(1)一般的描述方法)一般的描述方法684.4 数据类型转换数据类型转换variable temp : std_logic_vector(7 downto 0); begin case q1 is when 000 = temp := 00000001; whe

48、n 001 = temp := 00000010; when 010 = temp := 00000100; when 011 = temp := 00001000; when 100 = temp := 00010000; when 101 = temp := 00100000; when 110 = temp := 01000000; when 111 = temp := 10000000; end case; qo = temp; end process;end architecture code1;694.4 数据类型转换数据类型转换(2)利用CONV_INTEGER( )完成LIBR

49、ARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY decoder3to8 IS PORT ( input: IN STD_LOGIC_VECTOR (2 DOWNTO 0); output: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END decoder3to8;ARCHITECTURE behave OF decoder3to8 IS BEGIN PROCESS (input) BEGIN output 0); output(CONV_INTEGER(input)

50、 = 1; END PROCESS; END behave; 704.4数据类型转换数据类型转换2、直接类型转换方式 某些情况可以直接利用进行数据类型间的转换,语句格式是: 数据类型标识符 ( 表达式 ) VARIABLE Data_Calc,Param_Calc : INTEGER ; . Data_Calc := INTEGER(74.94 * REAL(Param_Calc) ) ;714.4数据类型转换数据类型转换 直接类型转换限于关联性较大的数据类型间,规则:n 所有的抽象数字类型 (如整型,浮点型)可使用直接转换,浮点数转换为整数时,结果是最接近的整数;n 若两个数组维数相同,且元

51、素是接近类型或者在各自的下标范围内是接近类型,则该两个数组是非常关联类型;n 枚举型不能被转换;n 若类型标识符所指的是非限定数组,则将被转换的数组下标去掉,成为非限定数组;若所指的是限定性数组,则转换后的下标范围与该限定性数组下标范围相同,元素的值等价于原数组中的元素值。72主要内容n4.1 VHDL程序设计约定n4.2 VHDL数据对象n4.3 VHDL数据类型n4.4 数据类型转换n4.5 VHDL运算操作符n4.6 VHDL文字规则第第4章章 VHDL语言要素语言要素73u VHDL的各种表达式由操作数和操作符组成,操作数是各种运算的对象,而操作符则规定运算方式。u VHDL有4类基本

52、操作符:算术操作符(Arithmetic Operator)关系操作符(Relational Operator)逻辑操作符(Logical Operator)符号操作符(Sign Operator)。u 此外还有重载操作符(Overloading Operator) ,对基本操作符作了重新定义。u操作数的数据类型必须与操作符要求类型一致;4.5 VHDL运算操作符运算操作符741、算数操作符4.5 VHDL运算操作符运算操作符754.5 VHDL运算操作符运算操作符算术操作符可以分为如下几类:764.5 VHDL运算操作符运算操作符(1)求和操作符n 求和操作符包括加减操作符和并置操作符;n

53、加减操作符的运算规则与常规加减法一致;n VHDL规定其操作数的数据类型是整数 ;n 并置运算符主要用于位、位矢量的连接,并置操作前后的长度应一致;例:例: signal a,b,c : std_logic; signal q : std_logic_vector(2 downto 0); q= a&b&c ;774.5 VHDL运算操作符运算操作符注意:位连接除用并置运算符“&”外,还有其它方法:n用并置运算符表示:q=a&a&b&c;n采用聚合的方法进行位的连接:q=(a,a,b,c);n采用指定位的脚标进行位的连接:qa,2=a,1=b,0=c);n用others进行连接:qb,0=c,

54、others=a);Others放在最后。放在最后。784.5 VHDL运算操作符运算操作符(2)求积操作符n 求积操作符包括 * 、 / 、 MOD和 RED。 乘与除的数据类型是整数和实数(包括浮点数) 。n (A rem B)取余后的符号与A相同,绝对值小于B的绝对值。 (A mod B)取模后的符号与B相同,绝对值小于B的绝对值。n 从优化综合、节省资源的角度,最好不用乘除操作符 ,算术运算几乎都可用加法来完成。7 rem 2=1 7 rem (-2)=1 -7 rem 2= -1 -7 rem (-2)= -1 7 mod 2=1 7 mod(-2)= -1 7 mod 2=1 -7

55、 mod(-2)= -1794.5 VHDL运算操作符运算操作符(3)混合操作符包括乘方“*”,“ABS”。它们的操作数一般为整数类型。VHDL综合器要求乘方操作的底数必须为2。注意 MAX+plus II不支持混合操作符“ABS”和“*” !804.5 VHDL运算操作符运算操作符(4)移位操作符n移位操作符SLL、SRL、SLA、SRA、ROL和ROR都是VHDL93标准新增运算符。n标准规定其操作数的数据类型是一维数组,并要求其元素必须是BIT或BOOLEAN类型,移位的位数为整数。n在EDA工具所附的程序包中重载了移位操作符以支持STD_LOGIC_VECTOR及INTEGER等类型。

56、语句格式:语句格式: 标识符标识符 移位操作符移位操作符 移位位数移位位数 ;814.5 VHDL运算操作符运算操作符补零补零补零补零补首位补首位( (逻辑逻辑左移左移) )( (逻辑逻辑右移右移) )( (算术算术左移左移) )824.5 VHDL运算操作符运算操作符补首位补首位循环循环循环循环(算术算术右移右移)(循环循环左移左移)(循环循环右移右移)834.5 VHDL运算操作符运算操作符2、关系操作符、关系操作符 等于和不等于操作符的操作对象可以是 VHDL 中的任何数据类型构成的操作数; , 和 = 称为排序操作符,两个数组的排序判断是通过从左至右逐一对元素进行比较,例如位矢(101

57、1)判为大于(101011);84注意:在VHDL中的关系运算符与软件高级语言中的关系运算符使用方法完全一样;关系运算符两边的数据类型,运算符的运算结果为boolean类型,即true或false;运算符=、/=适用于所有已定义的数据类型;和完全相同,要根据上下文关系判断该符号是关系运算符还是代入符。4.5 VHDL运算操作符运算操作符854.5 VHDL运算操作符运算操作符3、逻辑操作符 七种基本逻辑操作符 ,可构成组合逻辑电路;86运算符左右的数据类型必须相同。要求的数据类型为bit、boolean和std_logic三种,操作数若为一维数组,则必须为bit_vector或std_logi

58、c_vector。若有两个以上的算符时,通常使用括号来解决优先级问题,但如果算符相同、且是and/or/xor的其中一种,则无需括号。如:AandBandCandDAand(BorC)4.5 VHDL运算操作符运算操作符874.5 VHDL运算操作符运算操作符 对于数组型数据对象的相互作用是按位进行的.LIBRARY IEEEUSE IEEE.STD_LOGIC_1164.ALL ;ENTITY log_ops_2 IS port ( a,b : in std_logic_vector(0 to 3) ; output : out std_logic_vector (0 to3) ) ;END

59、 logical_ops_2 ;Architecture example of log_ops_2 isBegin output = a AND b ;End Architecture example ;884.5 VHDL运算操作符运算操作符(4)符号操作符n符号操作符“+”和“-”的操作数只有一个;n操作数的数据类型是整数;n“+”对操作数不做任何改变,“-”对原操作数取负,使用时需要括号,如:z:=x*(-y);894.5 VHDL运算操作符运算操作符5、操作符重载 基本操作符对数据类型做了各种限制,为了方便各种不同数据类型间的运算操作,VHDL允许用户对原有基本操作符重新定义,赋予新的

60、含义或功能,这就是重载操作符,定义这种操作符的函数称为重载函数。 如程序包std_logic_unsigned中就重载了多种运算操作符。906、操作符优先级 操作符 *、ABS 和 NOT 运算级别最高,在算式中被最优先执行,除 NOT 以外的逻辑操作符的优先级别最低,编程中应注意括号的正确应用。4.5 VHDL运算操作符运算操作符91主要内容n4.1 VHDL程序设计约定n4.2 VHDL数据对象n4.3 VHDL数据类型n4.4 数据类型转换n4.5 VHDL运算操作符n4.6 VHDL文字规则第第4章章 VHDL语言要素语言要素924.6 VHDL文字规则文字规则1、注释注释在VHDL中

温馨提示

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

评论

0/150

提交评论