用户定义数据类型
VHDL允许用户自行定义类型;
自定义类型的元素实际上全部来自预定义类型;
用户定义类型必须在使用以前进行类型说明;
用户定义类型可以分为子类型、枚举类型和数组 3类;
子类型从已有类型中取连续子集合加以定义例:
subtype twoval_logic is std_logic range `0` to `1` ;
subtype bitnum is integer range 31 downto 0 ;
子类型的数据可以和原有类型的数据进行直接运算;
子类型当原有类型为 integer时,也可以采用下列简化定义:
type 子类型名称 is range 起点 to 终点;
例:
type a is range 32 to 212; 整数升序定义
type b is range 31 downto 0; 整数降序定义枚举类型从已有类型中取离散子集合加以定义
type type-name is ( value list) ;
例:
type move is ('1','0','A','a');
type tra_light is (reset,stop,wait,go);
type color is (red,green,blue,white,black)
枚举类型在括号中按顺序列举该类型中的全部元素;
各元素间以逗号分隔;
在枚举类型中,数据大小关系根据顺序进行排列,并根据数据元素的数量,采用最短的二进制自然码表达;
数组数组为同类型元素的有序排布(从左向右),每一元素与一个数组指标对应;
数组指标通常为整数;也可以采用枚举类型的元素来表达。
只有一维和二维数组可以综合,高维数组不可综合;
数组示例
type byte is array (7 downto 0) of std_logic;
type monthly_count is array (1 to 12) of integer;
type length is array (natural range <>) of bit;
数组示例
constant word_len,integer,= 32;
type word is array (word_len-1 downto 0)of
std_logic;
constant num_regs,integer,= 8;
type reg_file is array (1 to num_regs) of word;
多维数组定义的示例
type row is array (7 downto 0) of std_logic;
--先定义一维数组;
type matrix is array (0 to 3) of row;
--再定义 1x1数组 ;
type matrix is array (0 to 3) of std_logic_vector
(7 downto 0); --直接定义 1x1数组 ;
type matrix is array (0 to 3,7 downto 0) of
std_logic;--直接定义 2维数组 ;
数据类型的转换当数据需要交替进行算术和逻辑运算时,就需要进行数据转换;
一般的类型转换通常由专门的函数进行,这些函数存放在特定的包集合中;
子类型与基本类型之间可以直接赋值,不需要进行类型转换;个别非常关联的类型可以通过赋值进行直接转换;
常用的数据类型转换函数包集合,ieee.std_logic_1164
bit→ std_logic,to_stdlogic( a)
std_logic→ bit,to_bit (a)
bit_vector→ std_logic_vector,
to_stdlogicvector( a)
std_logic_vector→ bit_vector,to_bitvector (a)
常用的数据类型转换函数包集合,ieee.std_logic_unsigned
std_logic→ integer,conv_integer (a)
包集合,ieee.std_logic_arith
integer→ std_logic,
conv_std_logic_vector( a,l )
注,a 为待转换量,l为转换后数组的位长度;
VHDL的运算符号运算符号主要用于各类表达式中;
VHDL中主要有六类运算符号:
赋值运算、逻辑运算、算术运算关系运算、连接运算、移位运算运算的优先顺序
VHDL中运算没有左右优先级差别,同一表达式中进行多个运算时必须用括号表达先后差别;
在一般运算中,优先顺序排列为:
算术 — 关系 — 逻辑在同类运算中,单目运算优先;
在所有运算符号中,NOT的优先级别最高;
可以通过加括号来改变运算的优先顺序;
运算赋值
<= 信号赋值:将右端值赋给左端信号;
:= 变量赋值:将右端值赋给左端变量;
或用于对数据对象赋初始值;
=> 数组内部分元素赋值(括号内使用) ;
运算赋值所有数据类型都可以进行运算赋值;
赋值号两边的数据类型原则上应该相同;
在进行赋值时,若右端数据类型难以判断,可以在数据前加上? 类型名 '? 进行限定。
例,a0<=std_logic_vector' (" 01101010 ");
数据赋值的例子,信号、变量、常量
signal x1:std_logic;
variable y:std_logic_vector(3 downto 0);
constant z:std_logic_vector(7 downto 0):=
"11101100";
x<='1'; y:="0001";
y,=(0=>'1',others=>'0');
数据赋值的例子,1维数组、整数下标
signal x1:std_logic_vector(7 downto
0):="11101100";
x1 <= "00110100";
x1 <= ('0','0','Z','0','1','1','1','1');
x1 <= ((7 downto 4) =>"0011",3=>'Z',
OTHERS =>'0');
x1(4 downto 2) <="110"; x1(5) <="1";
数据赋值的例子,1维数组、自定义下标
type traffic_light_state is
(reset,stop,wait,go);
type statecount is array
(traffic_light_state) of bit;
signal x2:statecount;
x2(stop)<='1'; x2(stop to go)<="110";
数据赋值的例子,1X1维数组
type row is array (7 downto 0) of std_logic;
typt matrix is array (0 to 3) of row;
signal x3:matrix;
x3 <=("00001111","00101100",
"11010011","11000011");
x3(2)<="11010011"; x3(2)(4)<='1';
数据赋值的例子,2维数组
type matrix2 is array (0 to 3,7 downto 0) of
std_logic;
signal x4:matrix2;
x4 <= ("00001111","00101100",
"11010011","11000011");
x4(2,7 downto 0)<="11010011"; x4(2,4)<='1';
逻辑运算
not and or nand nor xor
适用数据类型:逻辑量
bit,bit_vector
boolean
std_logic,std_logic_vector
逻辑运算逻辑运算与基本逻辑单元器件形成直接对应;
逻辑运算结果为同类型逻辑量;
对数组类型进行逻辑运算时,参与运算的两个数据位数必须相等,所做运算为对应位进行;
逻辑运算合法的逻辑运算:
x<= not a and b; x<= not (a and b);
x<= (a or b) and c; x<= a or (b and c);
x<= a and b and c;
算术运算
/ (除) * (乘) + (加) - (减)
mod(求模) rem(取余) **(指数) abs
(绝对值)
适用数据类型:算术量
integer\real\signed\unsigned\time
使用 ieee.std_logic_signed和
ieee.std_logic_unsigned后,可以对
std_logic和 std_logic_vector进行加减运算;
算术运算算术运算用于抽象的编程(行为设计);
只有少数算术运算符能够进行综合:加、减、
乘;综合结果与工具有关;
通常算术运算的程序通过后,还需要对所使用的加法器、乘法器进行具体设计优化;
比较运算
=> (大于等于) <= (小于等于)
> (大于) < (小于)
/= (不等于) = (等于)
适用数据类型:
等于和不等于适用于所有类型;
其他运算适用于整数、实数、位、位矢量,以及枚举类型和数组类型;
比较运算比较运算对应于比较器,通常由异或门构成,
能够综合;
比较运算可以比较位长度不相同的情况(从左对齐,向右逐位比较);
比较运算的结果为 boolean类型:
false true
连接运算
&
适用数据类型
bit,bitvector,character,string
std_logic,std_logic_vector
连接运算结果为同类型元素构成的数组;
连接运算对应于总线的合并,能够综合。
连接运算例:
x<= "0010";y<="1101";z<=x & y;
--z<="00101101";
f<=z(2 downto 0 ) & z(7 downto 3);
--f<=(010111000);
使用连接运算时需要注意数据类型的匹配。
移位运算
sll srl,逻辑 (logic)移位 (shifting),空出位置 填‘ 0’ ;
sla sra,算术 (arithmetic)移位,空出位置 复制最末位 ;
rol ror,循环 (recycle)移位,空出位置填移出位;
适用数据类型:
待移位数据必须为逻辑数组,移动位数必须是整数类型 ;
移位运算语法:待移位数据 操作符 移动位数例,x<= "01001";
y<= x sll 2; --"00100"
y<= x sla 2; --"00111"
y<= x rol 2; --"00101"
通常对应于移位寄存器或桶形移位器,
综合效果与工具有关;
习题
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 3) of std_logic;
type array3 is array (0 to 3,7 downto 0) 0f std_logic;
signal x:row; signal y:array1;
signal v:array2; signal w:array3;
x(0)<=y(1)(2); x(2)<=w(2,1);
x<=v(1); x<=y(0);
x<=w(2); x<=w(2,2 downto 0);
v(0)<=w(2); v(0)<=w(2,2 downto 0);
y(1)(7 downto 3)<=x(4 downto 0);
w(1,5 downto 1)<=v(2)(4 downto 0);
习题
2 在所给信号定义条件下,判断下列运算是否合法。
signal a:bit:='1';
signal b:bit_vector(3 downto 0):="1100";
signal c:bit_vector(3 downto 0):="0010";
signal d:bit_vector(7 downto 0);
signal e:integer range 0 to 255;
signal f:integer range -128 to 127;
b(0) and a ; a+d(7); not b xnor c;
c+d ; e-f ; if (b<c) ;
if (e>d); b sra 1 ; c srl -2 ;
f ror 3 ; d<=c ; f:= 100 ;