VHDL语言数据类型及相互转换
- 格式:docx
- 大小:13.36 KB
- 文档页数:9
标准数据类型
1,整数(INTEGER)
范围:-46
2,实数(REAL)
范围:(综合器不支持)
书写时一定要有小数•
3,位(BIT)
在数字系统中,信号经常用位值表示,位值用带单引号的'1'和'0'来表示标准数据类型
4,位矢量(BIT_VECTOR)
位矢量是用双引号括起来的一组位数据
"010101"
5,布尔量(BOOLEAN)
只有"真”和"假”两个状态,可以进行关系运算
6,字符(CHARACTER)
字符量通常用单引号括起来,对大小写敏感
明确说明1是字符时:CHARACTER'('1')
标准数据类型
7,字符串(STRING)
字符串是双引号括起来的由字母,数字或@,%,$组成的一串字符.区分大小写"laksdklakld" "10"
8,时间(TIME)
时间的单位:fs,ps,ns,ms,sec,min,hr
例:10 ns
整数数值和单位之间应有空格标准数据类型
9,错误等级(SEVERITY LEVEL)
在VHDL仿真器中,错误等级用来表示系统的状态,它共有4种:
NOTE注意)
WARNING警告)
ERROR错误)
FAILURE(失败)
标准数据类型
10,自然数(NATURAL)正整数(POSITIVE)
自然数是整数的一个子类型,包括0和正整数;正整数也是整数的一个子类型
只能是正整数数据除定义类型外,有时还需要定义约束范围•
INTEGER RANGE 100 DOWNTO 0
BIT_ VECTOR (3 DOWNTO 0)
REAL RANGE TO
IEEE定义的逻辑位与矢量
在IEEE |的程序包std_logic_1164 中定义了两个非常重要的数据类型:
1 ,std_logic
取值:0,1,Z,X,W,L,H
Z:高阻X:不定W:弱信号不定
L:弱信号0 H:弱信号1
2,Std_logic_vector
注意
1,在使用"std_logic" 和"std」ogic_vector" 时,在程序中必须声明库及程序包说明语句,即
LIBRARY ieee和这两句在程序中必不可少.
2,std_logic 有多个取值,与BIT不同,在编程时应特别注意,需要考虑全所有情况
用户自定义的数据类型
1,枚举类型
格式:TYPE数据类型名IS(元素,元素,…);
TYPE STD_LOGIC IS
(U';X;0';V;Z':W:L:H';-y;
TYPE week IS (Su n,Mo n,Tue,wed,Thu,Fri,Sat);
TYPE color IS (red,gree n,yellow,blue)
TYPE lift_state IS
(stop on 1,doorpee n, doorclose, doorwait1, doorwait2, doorwait3,
doorwait4, doorwait5,up,dow n, stop)
枚举类型的声明
TYPE color IS (red,gree n, yellow,blue);
VARIABLE A:COLOR;
SIGNAL B:COLOR;
A:=RED;
B<=YELLOW;
TYPE lever IS ('0','1','z');
SIGNAL V:lever;
V<='1';
用户自定义的数据类型
2,整数(INTEGER)
格式:TYPE数据类型名IS数据类型定义约束范围
例TYPE digit IS INTEGER RANGE 0 TO 9
VARIABLE A:DIGIT;
A:=5;
A:=28;
用户自定义的数据类型
3,实数(REAL)
格式:TYPE数据类型名IS数据类型定义约束范围TYPE current IS REAL RANGE -1E4 TO 1E4 VARIABLE A:CURRENT;
A:=1E3;
A:=1E10;
用户自定义的数据类型
4,数组(ARRAY)
格式:TYPE数据类型名IS ARRAY范围OF原数据类型名例:TYPE word IS ARRAY (1 TO 8) OF STD_LOGIC; TYPE word IS ARRAY (INTEGER 1 TO 8) OF STD_LOGIC; 数组常在总线,ROM和RAM中使用.
用户自定义的数据类型
5,记录(RECODE)类型
将不同的数据类型放在一块,就是记录类型数据
格式:TYPE记录类型名IS RECORD
元素名:数据类型名;
元素名:数据类型名;
END RECORD S录类型名];
记录(RECODE)类型
例:TYPE ba nk IS RECORD
addrO: STD_LOGIC_VECTOR(7 DOWNTO 0);
addr1: STD_LOGIC_VECTOR(7 DOWNTO 0);
END RECORD;
记录(RECODE)类型
例:CONSTANT LEN:i nteger:=100;
TYPE array logic IS ARRAY (99 dow nto 0)OF STD_LOGIC_VECTOR(7 DOWNTO 0) TYPE table IS RECORD
a: array logic;
b: STD_LOGIC_VECTOR(7 DOWNTO 0);
c: in teger RANGE 0 to len ;
END RECORD;
数据类型的转换
数据类型转换函数有VHDL语言的包提供
例如:STD_LOGIC_1164,
STD_LOGICARITH
STD_LOGIC_UNSIGNED等
函数
说明
1、STD_LOGIC_1164包
TO_STDLOGIC_VECTOR(A)
TO_LOGIC(A)
TO_BIT(A)
由BIT_VECTOR专换成STD_LOGIC_VECTOR
由STD_LOGIC_VECTOR^成BIT_VECTOR
由BIT转换成STD_LOGIC
由STD_LOGIC专换成BIT
2、STD_LOGIC_ARITH包
CONV_STD_LOGIC_VECTOR位长) CONV_INTEGER(A)
由INTEGER,UNSIGNE和SIGNED转换成
STD_LOGIC_VECTOR
由UNSIGNE[和SIGNED转换成INTEGER
3、STD_LOGIC_UNSIGNE包
CONV_INTEGER(A)
STD_LOGIC_VECTO转换成INTEGER
VHDL属性
VHDL没有一般程序语言中的那些运算类标准函数,取而代之的是多种能反映和影响硬件行
为的属性.属性在描述时序电路的VHDL设计文件中几乎处处可见,如检测上升沿,下降沿,知道前一次发生的事件•
VHDL属性
属性指的是关于实体,结构体,类型及信号的一些特征•有的|属性对综合(设计)非常有用•
VHDL的属性可分为数值类属性,函数类属性,范围类属性,信号类属性,类型类属性•其引用
的一般形式为:对象'属性• 数值类属性数值类属性用于返回数组,块或一般数据的有关值,如边界,数组长度等信息•对一般的数据有4种数值类属性:对象类型的左边界,右边界,上边界,下边界,对应的关键字是:LEFT,RIGHT,HIGH,LOW.数组在加一个长度属性LENGTH.
数值类属性
sdow n:IN std」o gic_vector(8 DOWNTO 0);
sup:IN std_logic-vector(0 to 8);
这两个信号的各属性值如下:
sdow n'left=8; sdow n'right=0; sdow n'low=0; sdow n'high=8; sdow n'le ngth=9;
sup'left=0; sup'right=8; sup'low=0; sup'high=8; sup'le ngth=9;
数值类属性
TYPE bit32 IS ARRAY (63 DOWNTO 32)OF BIT
VARIABLE:left_ra nge,right_ra nge,up_ra nge,low_ra nge,le n:INTEGER;
BEGIN
left-range:=bit32'LEFT; --return 63
right-ra nge:=bit32'RIGHT; --return 32
up-ra nge:=bit32'HIGH; --return 63
low-ra nge:=bit32'LOW; --return 32
len :=bit32'LENGTH; --return 32
函数类属性
信号属性函数属于函数类属性,用来返回有关信号行为功能的信息•共有5种信号属性函数,分别是:'EVENT(事件);'ACTIVE(活跃);
'LAST_EVENT (最近一次事件到现在经过多少时间);'LAST_ACTIVE (最近一次活跃到现在经过多少时间);'LAST_VALUE(信号变化前的|取值是什么)
EVENT
EVENT它的值为布尔型,取值为TRUE或FALSE;
如果刚好有事件发生在该属性所附着的信号上(即信号有变化),取值为TRUE.
利用此属性可决定时钟边沿是否有效,即时钟是否发生
EVENT
SIGNAL elk: IN std_logic;
elk 'EVENT AND clk='1'
clk='1' AND elk 'EVENT
elk 'EVENT AND clk='0'
clk='0' AND clk 'EVENT
risin g_edge(clk) falli ng_edge(clk)
EVENT和ACTIVE
EVENT要求信号值发生变化;1到0,0到1
ACTIVE信号值的任何变化,1到1,1到0,0到1,0到0;
所有的事件都是活跃,但并非所有的活跃都是事件
范围类属性
'RANGE属性,其生成一个限制性数据对象的范围.
例SIGNAL data_bus:std_logic_vector(15 DOWNTO 0); data_bus 'RANGE=15 dow nto 0
用VHDL语言设计分频电路,把1KHZ的时钟分至约1HZ左右的时钟LIBRARY IEEE;
USE
ENTITY FreDevider IS
PORT
(Clkin :IN Std_Logic;
Clkout :OUT Std_Logic);
END;
ARCHITECTURE Devider OF FreDevider IS
CONSTANT N:Integer:=499;
signal counter :Integer range 0 to N; signal Clk :Std_Logic;
BEGIN
PROCESSC(lkin )
begin
IF rising_edge(Clkin) THEN
IF Counter=N then
counter<=0;
Clk<=not clk;
else
counter<=counter+1;
end if;
end if;
end process;
clkout<=clk;
end;。