VHDL的运算符号VHDL中主要有六类运算符号:赋值运算、逻辑运算、算术运算关系运算、连接运算、移位运算运算符号主要用于各类表达式中;
运算可以分为单目运算(只有一个运算量)和双目运算(针对两个运算量);进行双目运算时,两个运算量必须类型相同;VHDL中运算没有左右优先级差别,同一表达式中进行多个运算时必须用括号表达先后差别;
在同类运算中,单目运算优先;在所有运算符号中, NOT的优先级别最高;
赋值运算符
<= 信号赋值:将右端值赋给左端信号;
:= 变量赋值:将右端值赋给左端变量;或用于赋初始值;
=>数组内部分元素赋值;适用类型: 所有数据类型;
赋值号两边的数据类型原则上应该相同;
逻辑运算符
NOT AND OR NAND NOR XOR适用类型:STD LOGIC STD LOGIC VECTORBIT BIT VECTOR BOOLEAN
逻辑运算结果为同类型逻辑量;对数组类型进行逻辑运算时,参与运算的两个数据位数必须相等,所做运算为对应位进行;
算术运算:
/ 除)* (乘) + (加)减MOD (求模) REM (取余) ** (指数) ABS (绝对值)适用类型:INTEGER REAL BIT BIT VECTOR TIME
加/减运算的结果为同类型算术量;注意:算术运算大多数只用于抽象的编程(行为设计);
只有少数算术运算符能够进行综合,应尽量只使用加/减;对数组类型进行算术运算时,两边位数必须相同;
关系运算:
=> (大于等于) <= (小于等于)> (大于)< (小于) /= (不等于) = (等于)适用类型:等于和不等于适用于所有类型;
其他运算适用于整数、实数、位、位矢量,以及枚举类型和数组类型;
可比较位长度不相同的情况(从左向右逐位比较);关系运算的结果为boolean类型: false true
注意:小于等于符号与信号赋值符号的写法相同,应注意使用位置和意义;
连接运算: &
适用类型bit bitvector character stringstd logic std logic_vector
连接运算结果为同类型元素构成的数组;
库和包集合除了实体、结构体外的第三种可编程结构
Library 库编译后数据的集合,存放包集合定义、实体定义、构造体定义和配置定义,
其功能相当于其他操作系统中的目录,经过说明后,设计中就可以使用库中的数据,实现共享;在前面图形输入的应用中,已多次采用库中的单元进行设计
库的使用:
当使用库时,需要说明使用的库名称,同时需要说明库中包集合的名称及范围;每个实体都应独立进行库的说明;
库的说明应该在实体之前;经过说明后,实体和结构体就可以自动调用库中的资源;
库说明语句格式library库名;use库名包集合名.范围(或项目名);
例: library ieee;use ieee.std_logic_1164.all:VHDL中库的主要种类:IEEE库 STD库 ASIC库work库 用户定义库IEEE库:含有IEEE的标准包集合"STD-LOGIC-1164"以及一些大公司提供的包集合;使用前必须说明;例:library ieee;
VHDL中库的主要种类:
IEEE库 STD库 ASIC库 work库 用户定义库
IEEE库:含有IEEE的标准包集合"STD-LOGIC-1164"以及一些大公司提供的包集合;使用前必须说明;例:library ieee.
use ieee.std logic 1164.all;使用标准逻辑量的定义和运算;
use ieeestd logic-unsigned.all;无符号数算术运算的定义;
use ieee.std logic-arith.all;使用符号数算术运算的定义;
STD库:
含有"STANDARD"包集合和"TEXTIO"包集合,使用前者时无需说明;
ASIC库:
由各公司提供,存放与逻辑门-对应的实体,用于ASIC设计的门级仿真,使用时需加以说明;例library altera;use altera.maxplus2.all;library Ipmuse Ipm.Ipm_components.all
WORK库:
WORK库为现行作业库,位于当前使用时设计文件的指定保存目录;
WORK使用时通常无须说明;但在结构设计中进行元件,的宏调用时需要说明;例: use work.all
用户定义库:
由用户自定义生成,使用时需说明(指定库所在的路径);
package包集合用于罗列VHDL语言中使用的类型定义、信号定义、常数定义、元件定义、函数定义和过程定义等(类似于C语言中的include语句),
方便不同模块的设计中公共定义的共享;
数字电路设计中经常使用的包集合:
ieee.std_logic_1164逻辑量的定义
ieee.std_logic_arith数据转换,逻辑判断
ieee.std_logic_unsigned 算术运算
std.textio文本数据输入/输出格式包集合在使用前必须采用use语句进行说明(在设计程序的最前面);
包集合可以由用户自定义;
包的结构与定义: (用户自定义的包集合)包集合标题+ (包集合体)包集合标题:
package包集合名is
说明语句; (只有名称)
end包集合名;
包集合体:package body包集合名is
说明语句; (完整定义)end包集合名;
例: (函数取自p.279表4-38 )library ieee;use ieee.std_logic_1164.all;
library ieee;
use ieee. std_logic 1164. all;
packge upac isconstant k: integer:= 4:subtype cpu_bus is std_logic-vector(k-1downto 0);
function conv_integer (x:std_logic_vector) return integer;
end upac;
packge body upac is
function conv_integer (x: std_logic_vector) return integer is
variable result:
integer;
begin
result :=0;
for I in x'range loop
result :=result*2:
case x(i) is when 'O'L' =>null;
when '1'H'=> result := result+ 1;
when others =>null:
end case;
end loop;
return result;
end conv_integer;
end upac;
用户自行编写的包集合将自动存放于WORK库中,使用时可采用下列语句调用use work.upac.all;