《第三讲数据类型课件.ppt》由会员分享,可在线阅读,更多相关《第三讲数据类型课件.ppt(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第三讲数据类型1第1页,此课件共51页哦指在IEEE 1076和IEEE 1164标准中预先定义的一系列数据类型,可以在包集/库中找到。std库的standard包集:BIT、BOOLEAN、INTEGER、REAL数据类型;ieee库的std_logic_1164包集:STD_LOGIC、STD_ULOGIC数据类型;ieee库的std_logic_arith包集:SIGNED、UNSIGNED数据类型;数据类型转换函数conv_integer(p),conv_unsigned(p,b)等;ieee库的std_logic_signed和std_logic_unsigned包集:一些函数,将S
2、TD_LOGIC_VECTOR类型数据进行类似SIGNED、UNSIGNED类型数据的运算;3.1 预定义的数据类型预定义的数据类型2第2页,此课件共51页哦1)1)BIT(位,表示一位的信号值,位值为0或1)和BIT_VECTOR(位矢量,表示一组位数据)。声明:SIGNALX:BIT;SIGNALY:BIT_VECTOR(3DOWNTO0);SIGNALW:BIT_VECTOR(0DOWNTO3);注意:最高位MSB(MostSignificantBit)的顺序!赋值:X=1;-单引号!Y=“1001”;-双引号!3第3页,此课件共51页哦2)2)STD_LOGICSTD_LOGIC和和S
3、TD_LOGIC_VECTORSTD_LOGIC_VECTOR:这两者是IEEE1164标准中引入的8逻辑值系统。std_logic_vector类型是由std_logic构成的数组。定义如下:typestd_logic_vectorisarray(naturalrange)ofstd_logic;赋值的原则:相同位宽,相同数据类型。定义8种数字逻辑值的原因:由std_logic类型代替bit类型可以完成电子系统的精确模拟,并可实现常见的三态总线电路。4第4页,此课件共51页哦两个或以上数字逻辑电路的输出端连接到同一个节点时(称为“线与”现象!),节点的电平该如何取值?典型案例:总线!1 1E
4、N1ENAY11 1EN2ENBY21 1EN3ENCY3总总 线线 驱动能力强的电路可以将节点电平强行拉高或拉低,因此需建立多值逻辑系统加以细分。节点的电平取值取决于:两者或多者当前的输出电平值;两者的驱动能力强弱。X:强不确定值;W:弱不确定值;0:强0;L:弱0;1:强1;H:弱1;Z:高阻态(三态缓冲器,常用于总线设计)-:不可能出现的情况5第5页,此课件共51页哦8逻辑值系统数值关系表逻辑值系统数值关系表数值关系归纳:数值关系归纳:X或或-与其它数值连接时,最终电平取值均为与其它数值连接时,最终电平取值均为X;Z与其它数值连接时,最终电平取值均为其它数值;与其它数值连接时,最终电平取
5、值均为其它数值;与与X类似,类似,W与与L/H数值连接时,最终电平取值均为数值连接时,最终电平取值均为W;0与与1、L与与H连接时,最终电平取值分别为连接时,最终电平取值分别为X、W;多个输出连接到同一个节点上时,节点的电平取值:6第6页,此课件共51页哦STD_LOGIC_VECTOR类型数据的算术运算操作类型数据的算术运算操作类型数据的算术运算操作类型数据的算术运算操作vSTD_LOGIC_VECTOR类型数据不能直接进行算术运算。通过声明ieee库中的std_signed和std_logic_unsigned这两个包集,该类型数据即可进行算术运算。v例:LIBRARY ieee;USE
6、ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;signal a,b:IN STD_LOGIC_VECTOR(7 DOWNTO 0);signal c:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);c=a+b;7第7页,此课件共51页哦3)STD_ULOGIC和和STD_ULOGIC_VECTOR:比STD_LOGIC类型多引入了一个逻辑值U,代表初始不定值。但没有指定两个STD_ULOGIC信号连接到同一个节点上发生冲突后的逻辑值,因此要避免两个输出信号直接进行连接的情况。8第8页,此课件共51页哦4)布尔类
7、型()布尔类型(boolean)布尔量具有两种状态:false 和true 常用于逻辑函数,如相等(=)、比较()等中作逻辑比较。如,bit 值转化成boolean 值:boolean_var:=(bit_var=1);5)字符()字符(CHARACTER):用单引号将字符括起来。variable character_var:character;.Character_var:=A;9第9页,此课件共51页哦6 6)整数()整数(integerinteger)integer表示所有正的和负的整数。硬件实现时,利用32位的位矢量来表示。可实现的整数范围为:-(231-1)to(231-1)VHDL
8、综合器要求对具体的整数作出范围限定,否则无法综合成硬件电路。如:signals:integerrange0to15;信号s的取值范围是0-15,可用4位二进制数表示,因此s将被综合成由四条信号线构成的信号。10第10页,此课件共51页哦7 7)自然数()自然数(naturalnatural)和正整数()和正整数(positivepositive)natural是integer的子类型,表示非负整数。positive是integer的子类型,表示正整数。定义如下:subtypenaturalisintegerrange0tointegerhigh;subtypepositiveisinteger
9、range1tointegerhigh;11第11页,此课件共51页哦8)实数()实数(REAL)或称浮点数取值范围:-1.0E38-+1.0E38 实数类型仅能用于VHDL仿真器,一般综合器不支持。9)物理量字符()物理量字符(Physical literal):时间、电压等,可以仿真,但不可综合(即综合库中没有直接可以调用的器件)。由整数和物理单位组成如:55 ms,20 ns12第12页,此课件共51页哦10)SIGNED(有符号数)和UNSIGNED(无符号数):ieee库std_logic_arith包集中定义的数据类型,只能表示大于等于0的数,能够支持算术运算、比较运算,但不支持逻
10、辑运算。只有在代码开始部分声明ieee库中的包集std_logic_arith,才能使用有符号数和无符号数。有符号数和无符号数的语法结构与STD_LOGIC_VECTOR相似,与整数不同,例如:SIGNAL X:SIGNED(7 DOWNTO 0);SIGNAL Y:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL Z:INTEGER RANGE 0 TO 255;13第13页,此课件共51页哦v例:例:signed和和unsigned数数的合法与非法的合法与非法操作操作:library ieee;use ieee.std_logic_1164.all;use ieee.
11、std_logic_arith.all;-必须声明该包集必须声明该包集才能使用才能使用signed和和unsigned数数。signal a,b:IN SIGNED(7 DOWNTO 0);signal x:OUT SIGNED(7 DOWNTO 0);x=a+b;-合法(支持算术运算)x=a AND b;-非法(不支持逻辑运算)14第14页,此课件共51页哦v例:例:STD_LOGIC_VECTOR的合法与非法操的合法与非法操作作:library ieee;use ieee.std_logic_1164.all;-不必声明其它包集不必声明其它包集。signal a,b:IN std_logi
12、c_vector(7 DOWNTO 0);signal x:OUT std_logic_vector(7 DOWNTO 0);x=a+b;-非法(不支持算术运算)x=a AND b;-合法(支持逻辑运算)-注意:如果声明std_logic_signed和std_logic_unsigned两个包集,则STD_LOGIC_VECTOR类型的数据也可以进行算术运算。15第15页,此课件共51页哦v例:例:STD_LOGIC_VECTOR的合法与非法操的合法与非法操作作:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsig
13、ned.all;signal a,b:IN std_logic_vector(7 DOWNTO 0);signal x:OUT std_logic_vector(7 DOWNTO 0);x=a+b;-合法(支持算术运算)x=a AND b;-合法(支持逻辑运算)16第16页,此课件共51页哦3.2 用户定义的数据类型用户定义的数据类型用类型定义语句TYPE实现用户自定义数据类型。TYPE语句格式:例:type byte is array(7 downto 0)of bit;variable addend:byte;type week is(sun,mon,tue,wed,thu,fri,sat
14、);type 数据类型名 is 数据类型定义 of 基本数据类型;可选17第17页,此课件共51页哦1 1)用户定义的)用户定义的整数类型整数类型用户定义的整数类型是标准包中整数类型的子范围。格式:例:typemy_naturalisrange0to9;-用户定义的自然数类型;typemy_integerisrange-3to3;-用户定义的整数类型;type 类型名称 is range 整数范围;18第18页,此课件共51页哦2 2)枚举()枚举(enumeratedenumerated)类型)类型枚举该类型的所有可能的值。格式:如:typemy_logicis(0,1,Z);typesta
15、teis(idle,forward,backward,stop);-常用于有限状态机的定义。typecoloris(blue,green,yellow,red);variablehue:color;hue:=blue;typebit_vectorisarray(naturalrange)ofBIT;-range表示数据取值范围没有约束,naturalrange表示数据值约束在自然数范围内。type 类型名称 is (枚举文字,枚举文字);19第19页,此课件共51页哦枚举类型的编码:综合器自动实现枚举类型元素的编码,一般将第一个枚举量(最左边)编码为0,以后的依次加1。编码用位矢量表示,位矢量
16、的长度将取所需表达的所有枚举元素的最小值。如:type color is(blue,green,yellow,red);编码为:blue=“00”;green=“01”;yellow=“10”;red=“11”;20第20页,此课件共51页哦3.33.3子类型子类型子类型是已定义的类型或子类型的一个子集。格式:例:bit_vector类型定义如下:typebit_vectorisarray(naturalrange)ofbit;如设计中只用16bit;可定义子类型如下:subtypemy_vectorisbit_vector(0to15);注:子类型与基(父)类型具有相同的操作符和子程序。可以
17、直接进行赋值操作。subtype 子类型名 is 数据类型名范围;21第21页,此课件共51页哦SUBTYPE语句格式:例:subtype digits is integer range 0 to 9;由subtype 语句定义的数据类型称为子类型。subtype 子类型名 is 基本数据类型 约束范围;22第22页,此课件共51页哦3.4 数组(数组(ARRAY)数组是将相同数据类型的数据集合在一起形成的一种新的数据类型。可以是1D、2D或1D*1D,更高维数的数组往往是不可综合(即综合库中没有直接可以调用的器件)的。数组的结构:00 1 0 0 00 1 0 0 01 1 0 1 00 1
18、 1 0 00 10001 101001100a.标量标量b.1D数组数组 矢量矢量c.1D*1D矢量数组矢量数组 d.2D 二维标量数组二维标量数组23第23页,此课件共51页哦type type_name is array(specification)of data_type;VHDL中预定义的数据类型仅包括标量类型(单个位)和矢量类型(一维数组)两类,并没有预定义2D和1D*1D数组,用户可以自定义。定义的语法如下:数组类型对signal/variable/constant的声明的语法如下:signal(constant/variable)signal_name:type_name:=i
19、nitial_value;可选24第24页,此课件共51页哦例子:一种定义1D*1D数组的方法:TYPE row IS ARRAY(7 DOWNTO 0)OF STD_LOGIC;-1D数组;TYPE matrix IS ARRAY(0 TO 3)OF row;-1D*1D数组,矢量数组;SIGNAL x:matrix;-声明是1D*1D信号另一种定义1D*1D数组的方法:TYPE matrix IS ARRAY(0 TO 3)OF STD_LOGIC_VECTOR(7 DOWNTO 0);二维数组的定义方法:TYPE matrix2D IS ARRAY(0 TO 3,7 DOWNTO 0)O
20、F STD_LOGIC;矢量标量25第25页,此课件共51页哦例:数组的初始化:CONSTANT X:vector_array:=(”0011”,”1100”,”0101”);-常用于指令或数据ROM设计中。signal Y:vector_array2:=(1,0,0,1);variable Z:vector_array3:=(0,1,1,0),(1,0,1,1);例:合法与非法的数组赋值:TYPE row IS ARRAY(7 DOWNTO 0)OF STD_LOGIC;TYPE array1 IS ARRAY(0 TO 3)OF row;TYPE array2 IS ARRAY(0 TO
21、3)OF STD_LOGIC_VECTOR(7 DOWNTO 0);TYPE array3 IS ARRAY(0 TO 3,7 DOWNTO 0)OF STD_LOGIC;26第26页,此课件共51页哦SIGNAL x:row;SIGNAL y:array1;SIGNAL v:array2;SIGNAL w:array3;-x=v(1);-非法,类型不匹配,x是row类型,而v(1)是STD_LOGIC_VECTOR类型的。x=w(2);-非法,w必须带两个索引值;x=w(2,2 DOWNTO 0);-非法,X是row类型的,而右侧是std_logic类型的。v(0)=w(2,2 DOWNTO
22、 0);-非法,v(0)是std_logic_ vector类型的,右侧是std_logic类型的,数据类型不匹配。w(1,5 DOWNTO 1)=v(2)(4 DOWNTO 0);-非法,类型不匹配。27第27页,此课件共51页哦3.5 端口数组端口数组端口数组端口数组,例:例:例:例:-包集包集-library ieee;use ieee.std_logic_1164.all;-PACKAGE my_data_types IS TYPE vector_array IS ARRAY(NATURAL RANGE)OF STD_LOGIC_VECTOR(7 DOWNTO 0);END my_da
23、ta_types;-主代码主代码-library ieee;use ieee.std_logic_1164.all;use work.my_data_types.all;-用户定义的包集用户定义的包集-ENTITY mux IS PORT(inp:IN vector_array(0 TO 3);.);END mux;.ENTITY中不允许使用TYPE进行类型定义,须在包集中自定义。28第28页,此课件共51页哦-包集包集-library ieee;use ieee.std_logic_1164.all;-PACKAGE my_data_types IS CONSTANT b:INTEGER:=
24、7;TYPE vector_array IS ARRAY(NATURAL RANGE)OF STD_LOGIC_VECTOR(b DOWNTO 0);END my_data_types;-包含常量的声明29第29页,此课件共51页哦3.6 记录类型记录类型记录是不同类型的名称域的集合,而ARRAY只能包含相同类型的数据。格式如下:访问记录体元素的方式:记录体名.元素名type 记录类型名 is record 元素名:数据类型名;元素名:数据类型名;end record;30第30页,此课件共51页哦例:constant len:integer:=8;subtype byte_vec is bi
25、t_vector(len-1 downto 0);type byte_and_ix is record byte:byte_vec;ix:integer range 0 to len;end record;signal x,y,z:byte_and_ix;signal data:byte_vec;signal num:integer;.x.byte=“11110000”;x.ix=2;data=y.byte;num=y.ix;z=x;31第31页,此课件共51页哦3.7 数据类型转换数据类型转换VHDL是一种强类型语言,不同类型的数据对象必须经过类型转换,才能相互操作。两种实现数据类型转换的常
26、见方法:1)写一段专用于数据类型转换的VHDL代码2)调用包集中预定义的数据类型转换函数,如包集std_logic_1164。32第32页,此课件共51页哦例:不同类型数据的合法与非法操作 TYPE long IS INTEGER RANGE-100 TO+100;TYPE short IS INTEGER RANGE-10 TO+10;SIGNAL x:short;SIGNAL y:long;y=2*x+5;-非法(数据类型不匹配,虽然都是INTEGER的子类型!)y=long(2*x+5);-合法(运算结果已经强制转换成long类型。)33第33页,此课件共51页哦ieee.std_log
27、ic_arith中提供了多种中提供了多种数据类型转换函数数据类型转换函数:不包括std_logic_vector类型,如有需要,须使用std_logic_unsigned/signed包集34第34页,此课件共51页哦例:数据类型转换例:数据类型转换library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;.signal a:IN unsigned(7 DOWNTO 0);signal b:IN unsigned(7 DOWNTO 0);signal y:OUT std_logic_vector(7 DOWNTO
28、 0);.y=CONV_STD_LOGIC_VECTOR(a+b),8);35第35页,此课件共51页哦3.8 可综合可综合的数据类型的数据类型 数据类型数据类型 可综合的数值可综合的数值BIT,BIT_VECTOR 0,1STD_LOGIC,STD_LOGIC_VECTOR X,0,1,Z,不是全部的8值都可综合的;另,在不需要X,Z两种取值时可用BIT类型混用。STD_ULOGIC,STD_ULOGIC_VECTORX,0,1,Z,不是全部的8值都可综合的;另,在不需要X,Z两种取值时可用BIT类型混用。BOOLEAN True,FalseNATURAL /UNSIGNED 0到+2 14
29、7 483 647INTEGER /SIGNED -2 147 483 647到+2 147 483 647用户自定义整型 INTEGER的子集用户自定义枚举类型 根据用户自定义进行编码得到SUBTYPE 任何预定义或用户自定义类型的子集ARRAY 上述任一种类型数据的集合RECORD 上述多种类型数据的集合36第36页,此课件共51页哦v例子:常用数据类型的声明与赋值例子:常用数据类型的声明与赋值signal a:BIT;signal b:BIT_VECTOR(7 DOWNTO 0);signal c:STD_LOGIC;signal d:STD_LOGIC_VECTOR(7 DOWNTO
30、0);signal e:INTEGER RANGE 0 TO 255;a=b(5);a=c;b(0)=a;b=d;类型不匹配c=d(5);e=b;d(0)=c;e=d;b0,1=1,OTHERS=1);C=Z;37第37页,此课件共51页哦例子:例子:单个位和位矢量单个位和位矢量ENTITY and2 IS PORT(a,b:IN BIT;x:OUT BIT);END and2;architecture and2 of and2 isBEGIN x=a AND b;END and2;ENTITY and2 IS PORT(a,b:in bit_vector(0 TO 3);x:out bit_
31、vector(0 TO 3);END and2;architecture and2 of and2 isBEGIN x=a AND b;END and2;38第38页,此课件共51页哦abxa(0)b(0)x(0)a(1)b(1)x(1)a(2)b(2)x(2)a(3)b(3)x(3)39第39页,此课件共51页哦例子:例子:4位加法器位加法器library ieee;use ieee.std_logic_1164.all;use iee.std_logic_arith.all;entity adder1 is port(a,b:in signed(3 downto 0);sum:out si
32、gned(4 downto 0);end adder1;architecture adder1 of adder1 isbegin sum=a+b;end adder1;library ieee;use ieee.std_logic_1164.all;use iee.std_logic_arith.all;entity adder2 is port(a,b:in signed(3 downto 0);sum:out integer range-16 to 15);end adder2;architecture adder2 of adder2 isbegin sum=conv_integer(
33、a+b);end adder2;+a(3:0)b(3:0)sum(4:0)4位加法器位加法器40第40页,此课件共51页哦补充:补充:VHDL文字规则文字规则1、数字型文字1)整数文字:十进制整数如:5,678,156E2(=15600),45_234_287(=45234287)2)实数文字:带小数的十进制数如:23.34,2.0,44.99E-2(=0.4499)8_867_551.23_909(8867551.23909)41第41页,此课件共51页哦3)以数制基数表示的文字格式:如:10#170#(=170)2#1111_1110#(=254)16#E#E1(=2#1110_0000#
34、=224)或:(=1416=224)16#F.01#E+2 (=(15+1/(1616)1616=3841.00)基数#数字文字#E指数42第42页,此课件共51页哦4)物理量文字如:60 s、100 m、177 mA 注:整数可综合实现;实数一般不可综合实现;物理量不可综合实现;43第43页,此课件共51页哦2、字符串型文字(文字串和数字串)按字符个数多少分为:字符:用单引号引起来的ASCII字符,可以是数值,也可以是符号或字母。如:A,*,Z 字符串:用双引号引起来的一维字符数组44第44页,此课件共51页哦字符串分为:1)文字字符串:“文字”如:“ERROR”,“XXXXXXXX”,“Z
35、ZZZZZZZ”,-必须是大写“X”,“BOTH S AND Q EQUAL TO L”。45第45页,此课件共51页哦数位字符串:称为位矢量,代表二进制、八进制、十六进制的数组。其位矢量的长度为等值的二进制数的位数。格式:其中基数符号有三种:B:二进制基数符号。O:八进制基数符号,每一个八进制数代表一个3位的二进制数。基数符号“数值”46第46页,此课件共51页哦X:十六进制基数符号,每一个十六进制数代表一个4位的二进制数。如:B“1_1101_1110”:二进制数数组,长度为9 O“34”:八进制数数组,长度为6 X“1AB”:十六进制数数组,长度为12 47第47页,此课件共51页哦基本
36、标识符的要求(87标准):以英文字母开头;不连续使用下划线“_”;不以下划线“_”结尾;由26个大小写英文字母、数字0-9及下划线“_”组成的字符串。标识符标识符定义常数、变量、信号、端口、子程序或参数的名字。48第48页,此课件共51页哦基本标识符中的英文字母不分大小写;VHDL的保留字不能作为标识符使用。合法标识符_Decoder_1、2FFT、Sig_#N、Not-Ack、ALL_RST_、data_BUS、return、entitymy_counter、Decoder_1、FFT、Sig_N、Not_Ack、State0、entity1不合法标识符49第49页,此课件共51页哦扩展标识
37、符(93标准):以反斜杠来界定,免去了87标准中基本标识符的一些限制。可以以数字打头,允许使用VHDL保留字,区分字母大小写等。如:74LS163、Sig_#N、entity、ENTITY注释符号:“-”,而不是“/”50第50页,此课件共51页哦第3章课后思考题1、VHDL中有哪些基本数据类型?有哪些是可以综合的数据类型?2、理解STD_LOGIC和STD_LOGIC_VECTOR的8值逻辑系统。3、包集中定义的数据类型转换函数。4、表达式c=a+b 中,a、b和c的数据类型都是std_logic_vector,是否能直接进行加法运算?说明原因和解决方法。作业:3.4、3.551第51页,此课件共51页哦