《VHDL语言要素PPT课件》由会员分享,可在线阅读,更多相关《VHDL语言要素PPT课件(51页珍藏版)》请在金锄头文库上搜索。
1、5.3 VHDL语言要素语言要素 5.3.1 标识符Identifiers 标识符:取的各种名字。 如:实体、结构体、端口、信号、变量、常数、子程序或参数的名字。 由英文字母“a”到“z”、“A”到“Z”、数字“0”到“9”以及下划线“_”组成。 例:a%b_1、show-new-state等是非法标识符。 注意:1、不区分大小写;2、须以字母开头,如20040516错误: 3、下划线只能在中间,不能以它开头或结尾, 如DEcoder_和_ Decoder错 4、下划线不能连用, 如De_ _ coder错; 5、不能用关键词,如IN错; *6、取名最好有实际意义。 5.3.2 数据类型数据类
2、型Data Types VHDL作为一种强类型语言,任何一种数据对象(信号、变量、常数、函数及设定的各种参数)必须严格限定其类型和取值范围,相同类型才能相互传递。 VHDL的数据类型有: 标准库定义的数据类型: IEEE预定义标准逻辑位与矢量 用户自定义的数据类型 1、标准库定义的数据类型:、标准库定义的数据类型: 在标准库STANDARD库中定义,不需要用USE显式调用。 1)、位类型位类型BIT 取值范围是逻辑位1和0。 在VHDL中,逻辑位0和1的表达必须加单引号 BIT型可以参与逻辑运算或算术运算,其结果仍是位的数据类型。 2)、位矢量()、位矢量(Bit_vector): 是基于BI
3、T数据类型的数组, 必须注明宽度,即数组中的元素的个数和排列。 如:SIGNAL a:bit_vector(7 DOWNTO 0); SIGNAL b:bit_vector(0 TO 7);信号a、b的数据类型被定义为一个具有8位位宽的矢量或总线端口信号, a的最左位,即最高位是a(7),向右依次递减为a(6)、a(5)a(0)。 b的最左位,即最高位是b(0),向右依次递增为b(1)、b(2)b(7)。 赋值方式:赋值方式:a=”01010101”; *整体操作,值加双引号:*对其中的一位操作: a(0)=0;a(7)=1; *对其中的几位操作 :a(7 downto 1) y WHEN “
4、00”= ya0; a0; WHEN “01”= y WHEN “01”= ya1;a1; WHEN “10”= y WHEN “10”= ya2;a2; WHEN “11”= y WHEN “11”= ya3;a3; WHEN OTHERS =NULL; WHEN OTHERS =NULL; END CASE; END CASE; END PROCESS; END PROCESS;END archmux;END archmux;2 2位位std_logicstd_logic,每位有,每位有9 9种取值,种取值,2 2位有位有8181种取值。种取值。OTHERSOTHERS用于剩余取值用于剩余
5、取值的处理。的处理。3、用户自定义的数据类型、用户自定义的数据类型 除了上述一些标准的预定义数据类型外,如整数类型、Boolean类型、标准逻辑位类型Std_logic等,VHDL还允许用户自行定义新的数据类型。 由用户定义的数据类型可以有多种,如枚举类型(Enumeration Types)、整数类型(interger Types)、数组类型(Array Types)、记录类型(Record Types)、时间类型(Time Types)、实数类型(Real Types)等。1)枚举类型(Enumerated Types)枚举类型定义语法如下:TYPE 数据类型名 IS(枚举文字,枚举文字.
6、););如:TYPE color IS (red, green, yellow, blue);用户自定义的数据类型名,可在信号、变量定义时象STD_LOGIC一样使用。例:枚举类型的定义及使用:例:枚举类型的定义及使用: TYPE color IS (red, green, yellow, blue);TYPE level IS (0,1,z);SIGNAL b: level;VARIABLE a:color;a:=red;b 大于= 大于等于 小于= 小于等于3、逻辑操作符、逻辑操作符(Logic Operator) 共有7种基本逻辑操作符: AND(与)、 OR(或)、 NAND(与非)、
7、 NOR(或非), XOR(异或)、 XNOR(同或) NOT(取反)。 要求的操作数(操作对象)的数据类型有3种,即BIT、BOOLEAN和STD_LOGIC。 注意:注意:n n操作数数据类型和长度一致。n n两个以上的,需要使用括号将这些运算分组。如果操作符相同,且是AND、OR、XOR这三个算符中的一种,则不需使用括号;【例【例5-10】逻辑操作符使用注意事项:不加】逻辑操作符使用注意事项:不加括号的条件和数据类型、长度。括号的条件和数据类型、长度。 SIGNAL aSIGNAL a,b b,c c:STD_LOGIC_VECTOR(3 DOWNTO STD_LOGIC_VECTOR(
8、3 DOWNTO 0)0);SIGNAL dSIGNAL d,e e,f f,g g: STD_LOGIC_VECTOR (1 STD_LOGIC_VECTOR (1 DOWNTO 0)DOWNTO 0);SIGNAL hSIGNAL h,i i,j j,k k: STD_LOGIC STD_LOGIC;SIGNAL lSIGNAL l,mm,n n,o o,p p:BOOLEAN;BOOLEAN;a=b AND c;-b、c相与后向a赋值,a、b、c的数据类型同属4位长的位矢量d=e OR f OR g;-两个操作符相同且为AND、OR、XOR中1个,不需括号h=(i NAND j) NAN
9、D k;- NAND不属AND、OR、XOR,虽相同也要括号。l=(m XOR n) AND (o XOR p);-操作符不同,须加括号a=b AND e;-操作数b与e的位矢长度不一致,表达错误h=i OR l;-i的数据类型是位STD_LOGIC,而l是布尔量Boolean,表达错误【例5-11】例5-1的2选1多路数据选择器, Y=AS+BSARCHITECTURE One OF mux2la ISARCHITECTURE One OF mux2la IS BEGIN BEGIN y = (a AND (NOT s) OR (b AND S) y = (a AND (NOT s) OR
10、(b AND S) ;END ARCHITECTURE OneEND ARCHITECTURE One;4、连接操作符、连接操作符(Concatenation Operator)n n&-连接,将多个对象或矢量连接成维数更大的矢量。n n例:0&1 的结果为”01”。 o10&a(7 downto 1); - a右移1位给o1 o2=o1(6 downto 0) & 0; - o1左移1位给o2 o3=o1 & o2; - o1、o2合并 a=1&0& d(1)&1 ;-元素与元素并 置,并置后的数组长度为4 IF a&d=“101011” THEN-在IF条件句中可以使用并置符数据对象(数据
11、对象(Data Objects)VHDL常用的数据对象有: 信号 变量 常量 n n当表达式太长或为便于理解,可设中间信号n n SIGNALSIGNAL用于声明内部信号,而非外部信号(外部信号对应为IN,OUT,INOUT, BUFFERIN,OUT,INOUT, BUFFER)n n在其元件之间起互联作用,可以赋值给外部信号。n n信号是全局变量n n在实体说明、结构体描述和程序包说明中使用。 1、信号(、信号(SIGNAL)信号的定义格式如下:信号的定义格式如下: SIGNALSIGNAL信号名:数据类型:=初始值; 如:SIGNALSIGNAL count:std_logic_vect
12、or(3 DOWNTODOWNTO 0) :=”0000”; 注意:建议在结构体中用赋值语句完成对信号赋初值的任务,因为综合器往往会忽略信号声明时所赋的初值。 信号赋值语句语法格式:信号赋值语句语法格式: 目标信号名=表达式;如:q=count; ARCHITECTURE one OF mux21a IS SIGNAl d,e : BIT; BEGIN d = a AND (NOT s) ; e = b AND s ; y = d OR e ;END ARCHITECTURE one ;【例5-12】例5-1的2选1多路数据选择器, Y=AS+BS2变量(变量(VARIABLE)n n变量只在
13、给定的进程中用于声明局部值或用于子程序中,n n变量的赋值符号为“:=”。n n和信号不同,信号是实际的,是外输入,或者是内部的一个存储元件;而变量是虚的,仅仅是为书写方便而引入的一个名称,它常用在实现某种算法的赋值语句中。 变量定义格式如下:变量定义格式如下: VARIABLE 变量名:数据类型:=初始值;如:VARIABLE a: integer:=0;变量赋值语句的语法格式; 目标变量名:=表达式;如:a:=b+c; 3常量(常量(CONSTANT) n n常量是全局量,在结构体描述、程序包说明、实体说明、过程说明、函数调用说明和进程说明中使用。n n常量在设计描述中保持某一规定类型的特
14、定值不变。如利用它可设计不同模值的计数器,模值存于一常量中,对不同的设计,改变模值仅需改变此常量值即可。n n常量定义格式如下: CONSTANT 常数名:数据类型:=表达式;如:CONSTANT mod :integer:=6; 【例【例5-13】一位】一位BCD码的加法器。码的加法器。信号、变量及常量的定义及使用方法。信号、变量及常量的定义及使用方法。 思路:汇编语言十进制加法:加、比较、调整思路:汇编语言十进制加法:加、比较、调整ENTITY bcdadder IS PORT ( op1 , op2 : IN integer RANGE 0 TO 9; result : OUT inte
15、ger RANGE 0 TO 31 );END bcdadder;ARCHITECTUREARCHITECTURE behave behave OFOF bcdadder bcdadder ISIS CONSTANTCONSTANT adjustnum : adjustnum : integer : =integer : = 6; 6; SIGNAL SIGNAL binadd : binadd : integer RANGEinteger RANGE 0 0 TOTO 18; 18; BEGINBEGIN binadd binaddop1+op2; op1+op2; PROCESSPROCE
16、SS(binadd)(binadd) VARIABLEVARIABLE tmp : tmp : integerinteger : =: = 0; 0; BEGINBEGIN IFIF binaddbinadd9 9 THENTHEN tmp : = tmp : = adjustnum;adjustnum; ELSE ELSE tmp : = 0;tmp : = 0; END IFEND IF; ; result resultbinadd+tmp;binadd+tmp;END PROCESSEND PROCESS; ;ENDEND behave; behave; - -定义一整数型常量,值为定义
17、一整数型常量,值为6 6- -定义一个信号,以保存和定义一个信号,以保存和- -信号赋值信号赋值- -定义一变量,并赋初值为定义一变量,并赋初值为0 0- -变量赋值,立即起作用。变量赋值,立即起作用。4信号和变量的比较信号和变量的比较n n声明的形式不同: 信号为SIGNAL,变量为VARIABLE;n n声明的位置不同:信号声明在子程序,进程等外部,而变量声明在子程序,进程的内部。n n赋值起作用时刻不同:在进程中,信号赋值在进程结束时起作用,而变量赋值是立即起作用的。n n赋值符不同:信号赋值为“=”,变量赋值为“:=”。n n作用的范围不同。信号作用于整个结构体,可用于进程间传递信息,
18、而变量只能在进程内部起作用,达到实现某个算法的目的。 n n在VHDL设计中,可以使用信号和变量。考虑到信号的行为更接近于硬件,需要到所在进程结束时才会更新值,而变量值的改变是立即进行的,因此有可能影响设计的功能等因素,虽然使用变量可以增加仿真的速度,但还是推荐在对硬件进行描述时尽量采用信号。n n注意:如果在一个进程中多次为一个信号赋值时,只有最后一个值会起作用;而当为变量赋值时,变量值的改变是立即发生的。即变量将保持着当前值,直到被赋予新的值。 n n下面的例子分别进一步表明了使用信号和变量的区别。【例【例5-145-14】使用信号的情况】使用信号的情况LIBRARY ieee; ; EN
19、TITY xor_sig ISPORT (a , b , c : IN std_logic; x , y : OUT STD_LOGIC );END xor_sig;ARCHITECTURE sig_arch OF xor_sig IS SIGNAL d : std_logic; BEGINsig : PROCESS(a , b , c) BEGIN da; xc XOR d; db; yc XOR d; END PROCESS;END sig_arch;-ignored !-overrides !执行结果:x=cb,y=cb;【例【例5-15】使用变量的情况】使用变量的情况 ARCHITEC
20、TURE var_arch OF xor_var IS BEGIN PROCESS(a , b , c) VARIABLE d : std_logic; BEGIN d : = a; xc XOR d; d : = b; yc XOR d; END PROCESS;END var_arch;执行结果:x=ca,y=cb 5.3.5 VHDL的属性的属性 n n属性指的是关于实体、结构体、类型及信号的一些特性。n n有些属性对综合(设计)非常有用,如:数值类属性、函数类以有范围类属性等等。n n其引用的一般形式均为:对象属性。*1. 数值类属性数值类属性数值类属性返回数组、块或一般数据有关的值。
21、常用的有: left(左边界), right(右边界), low(下边界), high(上边界), length(数组长度)等。例:例:sdown: IN std_logic_vector(8 downto 0); sup: out std_logic_vector(0 to 8);这两个信号的各属性值如下: sdownleft=8;sdownright=0; sdownlow=0; sdownhigh=8; sdownlength=9; supleft=0; supright=8; suplow=0; suphigh=8; suplength=9; 2、函数类属性、函数类属性 n n信号属性
22、函数属于函数类属性,用来返回有关信号行为功能的信息。n n函数:信号event 返回值为布尔型。如果信号值有变化称发生事件,返回值为TRUE ,否则为False。n n时钟边沿表示: clkevent and clk=1 时钟clk的上升沿。 即时钟变化了,且其值为1(从0变1)。 clkevent and clk=0 时钟clk的下降沿。 即时钟变化了,且其值为0(从1变0)。预定义的时钟边沿函数:预定义的时钟边沿函数:n nrising_edge(clk) 时钟clk的上升沿 与clkevent and clk=1等效; falling_edge(clk) 时钟clk的下降沿 与clkevent and clk=0 等效。n nrising_edge()和falling_edge()是VHDL在IEEE库中标准程序包STD_LOGIC_1164内的预定义函数,这条语句只能用于标准逻辑位数据类型STD_LOGIC的信号*3. 范围类属性范围类属性n nRANGE 属性,其生成一个限制性数据对象的范围。n n如:SIGNAL data: std_logic_vector(15 DOWNTO 0);n n则dataRANGE=15 DOWNTO 0。n n注意:maxplusII不支持该属性。