用户定义数据类型
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 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维数组;
数据类型的转换
枚举类型
在括号中按顺序列举该类型中的全部元素;
各元素间以逗号分隔;
在枚举类型中,数据大小关系根据顺序进
行排列,并根据数据元素的数量,采用最
短的二进制自然码表达;
数组 数组为同类型元素的有序排布(从左向 右),每一元素与一个数组指标对应; 数组指标通常为整数;也可以采用枚举类 型的元素来表达。 只有一维和二维数组可以综合,高维数组 不可综合;
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);
在所有运算符号中,NOT的优先级别最高;
可以通过加括号来改变运算的优先顺序;
运算赋值 <= := 信号赋值:将右端值赋给左端信号; 变量赋值:将右端值赋给左端变量; 或用于对数据对象赋初始值; => 数组内部分元素赋值(括号内使用);
运算赋值 所有数据类型都可以进行运算赋值; 赋值号两边的数据类型原则上应该相同; 在进行赋值时,若右端数据类型难以判断,可 以在数据前加上“类型名'”进行限定。
subtype bitnum is integer range 31 downto 0 ;
子类型的数据可以和原有类型的数据进行直接运
算;
Baidu Nhomakorabea
子类型 当原有类型为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)
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); 使用连接运算时需要注意数据类型的匹配。
y<= x sll 2;
y<= x sla 2;
--"00100"
--"00111"
y<= x rol 2;
--"00101"
通常对应于移位寄存器或桶形移位器,
综合效果与工具有关;
习题
1 在所给变量定义条件下,判断下列赋值是否合法。
type type type type row is array1 array2 array3 array (7 is array is array is array downto 0) of std_logic; (0 to 3) of row; (0 to 3) of std_logic; (0 to 3,7 downto 0) 0f std_logic;
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
当数据需要交替进行算术和逻辑运算时,就需
要进行数据转换; 一般的类型转换通常由专门的函数进行,这些 函数存放在特定的包集合中; 子类型与基本类型之间可以直接赋值,不需要 进行类型转换;个别非常关联的类型可以通过 赋值进行直接转换;
常用的数据类型转换函数
包集合:ieee.std_logic_1164
算术运算 算术运算用于抽象的编程(行为设计); 只有少数算术运算符能够进行综合:加、减、 乘;综合结果与工具有关; 通常算术运算的程序通过后,还需要对所使用
的加法器、乘法器进行具体设计优化;
比较运算
=> (大于等于)
> (大于) /= (不等于) 适用数据类型:
<= (小于等于)
< (小于) = (等于)
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数组;
逻辑运算 逻辑运算与基本逻辑单元器件形成直接对应;
逻辑运算结果为同类型逻辑量;
对数组类型进行逻辑运算时,参与运算的两个 数据位数必须相等,所做运算为对应位进行;
逻辑运算 合法的逻辑运算: x<= not a and b; x<= not (a and b); x<= a or (b and c);
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');
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)
移位运算
sll
sla rol
srl
sra ror
:逻辑(logic)移位(shifting),空出位置填‘0’;
:算术(arithmetic)移位,空出位置复制最末位; :循环(recycle)移位,空出位置填移出位;
适用数据类型: 待移位数据必须为逻辑数组,移动位数必须是整 数类型;
移位运算 语法:待移位数据 操作符 移动位数 例:x<= "01001";
常用的数据类型转换函数 包集合: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为转换后数组的位长度;
例: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";
等于和不等于适用于所有类型; 其他运算适用于整数、实数、位、位矢量,以 及枚举类型和数组类型;
比较运算 比较运算对应于比较器,通常由异或门构成, 能够综合; 比较运算可以比较位长度不相同的情况(从左
对齐,向右逐位比较);
比较运算的结果为boolean类型:
false
true
连接运算
&
适用数据类型
数组示例 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;
习题
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;
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;
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
用户定义数据类型 VHDL允许用户自行定义类型;
自定义类型的元素实际上全部来自预定义类型;
用户定义类型必须在使用以前进行类型说明;
用户定义类型可以分为子类型、枚举类型和数
组3类;
子类型 从已有类型中取连续子集合加以定义
例:
subtype twoval_logic is std_logic range `0` to `1` ;
VHDL的运算符号 运算符号主要用于各类表达式中;
VHDL中主要有六类运算符号:
赋值运算、逻辑运算、算术运算 关系运算、连接运算、移位运算
运算的优先顺序 VHDL中运算没有左右优先级差别,同一表达式 中进行多个运算时必须用括号表达先后差别;
在一般运算中,优先顺序排列为:
算术—关系—逻辑
在同类运算中,单目运算优先;
x<= (a or b) and c; x<= a and b and c;
算术运算
/
(除)*
(乘) + (加)
rem(取余)
- (减)
mod(求模)
**(指数) abs
(绝对值)
适用数据类型:算术量 integer\real\signed\unsigned\time 使用ieee.std_logic_signed和 ieee.std_logic_unsigned后,可以对 std_logic和std_logic_vector进行加减运算;
OTHERS =>'0');
x1(4 downto 2) <="110"; x1(5) <="1";
数据赋值的例子:1维数组、自定义下标 type traffic_light_state is
(reset, stop, wait, go);
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维数组;
数据类型的转换
枚举类型
在括号中按顺序列举该类型中的全部元素;
各元素间以逗号分隔;
在枚举类型中,数据大小关系根据顺序进
行排列,并根据数据元素的数量,采用最
短的二进制自然码表达;
数组 数组为同类型元素的有序排布(从左向 右),每一元素与一个数组指标对应; 数组指标通常为整数;也可以采用枚举类 型的元素来表达。 只有一维和二维数组可以综合,高维数组 不可综合;
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);
在所有运算符号中,NOT的优先级别最高;
可以通过加括号来改变运算的优先顺序;
运算赋值 <= := 信号赋值:将右端值赋给左端信号; 变量赋值:将右端值赋给左端变量; 或用于对数据对象赋初始值; => 数组内部分元素赋值(括号内使用);
运算赋值 所有数据类型都可以进行运算赋值; 赋值号两边的数据类型原则上应该相同; 在进行赋值时,若右端数据类型难以判断,可 以在数据前加上“类型名'”进行限定。
subtype bitnum is integer range 31 downto 0 ;
子类型的数据可以和原有类型的数据进行直接运
算;
Baidu Nhomakorabea
子类型 当原有类型为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)
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); 使用连接运算时需要注意数据类型的匹配。
y<= x sll 2;
y<= x sla 2;
--"00100"
--"00111"
y<= x rol 2;
--"00101"
通常对应于移位寄存器或桶形移位器,
综合效果与工具有关;
习题
1 在所给变量定义条件下,判断下列赋值是否合法。
type type type type row is array1 array2 array3 array (7 is array is array is array downto 0) of std_logic; (0 to 3) of row; (0 to 3) of std_logic; (0 to 3,7 downto 0) 0f std_logic;
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
当数据需要交替进行算术和逻辑运算时,就需
要进行数据转换; 一般的类型转换通常由专门的函数进行,这些 函数存放在特定的包集合中; 子类型与基本类型之间可以直接赋值,不需要 进行类型转换;个别非常关联的类型可以通过 赋值进行直接转换;
常用的数据类型转换函数
包集合:ieee.std_logic_1164
算术运算 算术运算用于抽象的编程(行为设计); 只有少数算术运算符能够进行综合:加、减、 乘;综合结果与工具有关; 通常算术运算的程序通过后,还需要对所使用
的加法器、乘法器进行具体设计优化;
比较运算
=> (大于等于)
> (大于) /= (不等于) 适用数据类型:
<= (小于等于)
< (小于) = (等于)
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数组;
逻辑运算 逻辑运算与基本逻辑单元器件形成直接对应;
逻辑运算结果为同类型逻辑量;
对数组类型进行逻辑运算时,参与运算的两个 数据位数必须相等,所做运算为对应位进行;
逻辑运算 合法的逻辑运算: x<= not a and b; x<= not (a and b); x<= a or (b and c);
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');
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)
移位运算
sll
sla rol
srl
sra ror
:逻辑(logic)移位(shifting),空出位置填‘0’;
:算术(arithmetic)移位,空出位置复制最末位; :循环(recycle)移位,空出位置填移出位;
适用数据类型: 待移位数据必须为逻辑数组,移动位数必须是整 数类型;
移位运算 语法:待移位数据 操作符 移动位数 例:x<= "01001";
常用的数据类型转换函数 包集合: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为转换后数组的位长度;
例: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";
等于和不等于适用于所有类型; 其他运算适用于整数、实数、位、位矢量,以 及枚举类型和数组类型;
比较运算 比较运算对应于比较器,通常由异或门构成, 能够综合; 比较运算可以比较位长度不相同的情况(从左
对齐,向右逐位比较);
比较运算的结果为boolean类型:
false
true
连接运算
&
适用数据类型
数组示例 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;
习题
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;
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;
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
用户定义数据类型 VHDL允许用户自行定义类型;
自定义类型的元素实际上全部来自预定义类型;
用户定义类型必须在使用以前进行类型说明;
用户定义类型可以分为子类型、枚举类型和数
组3类;
子类型 从已有类型中取连续子集合加以定义
例:
subtype twoval_logic is std_logic range `0` to `1` ;
VHDL的运算符号 运算符号主要用于各类表达式中;
VHDL中主要有六类运算符号:
赋值运算、逻辑运算、算术运算 关系运算、连接运算、移位运算
运算的优先顺序 VHDL中运算没有左右优先级差别,同一表达式 中进行多个运算时必须用括号表达先后差别;
在一般运算中,优先顺序排列为:
算术—关系—逻辑
在同类运算中,单目运算优先;
x<= (a or b) and c; x<= a and b and c;
算术运算
/
(除)*
(乘) + (加)
rem(取余)
- (减)
mod(求模)
**(指数) abs
(绝对值)
适用数据类型:算术量 integer\real\signed\unsigned\time 使用ieee.std_logic_signed和 ieee.std_logic_unsigned后,可以对 std_logic和std_logic_vector进行加减运算;