VHDL的运算符号
VHDL中主要有六类运算符号:
赋值运算、逻辑运算、算术运算
关系运算、连接运算、移位运算
运算符号主要用于各类表达式中;
运算可以分为单目运算(只有一个运算量)和双目运算
(针对两个运算量);
进行双目运算时,两个运算量必须类型相同;
VHDL中运算没有左右优先级差别,同一表达式中进行
多个运算时必须用括号表达先后差别;
在同类运算中,单目运算优先;
在所有运算符号中,NOT的优先级别最高;
在一般运算中,优先顺序排列为:算术—关系—逻辑
可以通过加括号来改变运算的优先顺序;
赋值运算符
<= 信号赋值:将右端值赋给左端信号;
:= 变量赋值:将右端值赋给左端变量;或用于赋初始值;
=> 数组内部分元素赋值;
适用类型: 所有数据类型;
赋值号两边的数据类型原则上应该相同;
逻辑运算符
NOT AND OR NAND NOR XOR
适用类型:
STD_LOGIC STD_LOGIC_VECTOR
BIT BIT_VECTOR BOOLEAN
逻辑运算结果为同类型逻辑量;
对数组类型进行逻辑运算时,参与运算的两个数据位数必须
相等,所做运算为对应位进行;
算术运算:
/ (除)* (乘) + (加) - (减)
MOD(求模)REM(取余) **(指数) ABS(绝对值)
适用类型:
INTEGER REAL BIT BIT_VECTOR TIME
加/减运算的结果为同类型算术量;
注意:算术运算大多数只用于抽象的编程(行为设计);
只有少数算术运算符能够进行综合,应尽量只使用加/减;
对数组类型进行算术运算时,两边位数必须相同;
关系运算:
=> (大于等于)<= (小于等于)
> (大于)< (小于) /= (不等于) = (等于)
适用类型:
等于和不等于适用于所有类型;
其他运算适用于整数、实数、位、位矢量,以及枚举类
型和数组类型;
可比较位长度不相同的情况(从左向右逐位比较);
关系运算的结果为boolean类型: false true
注意:
小于等于符号与信号赋值符号的写法相同,应注意使用
位置和意义;
连接运算: &
适用类型
bit bitvector character string
std_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;
use ieee.std_logic_1164.all; 使用标准逻辑量的定义和运算;
use ieee.std_logic_unsigned.all; 无符号数算术运算的定义;
use ieee.std_logic_arith.all; 使用符号数算术运算的定义;
STD库:
含有“STANDARD”包集合和“TEXTIO”包集合,使
用前者时无需说明;
ASIC库:
由各公司提供,存放与逻辑门一一对应的实体,用于ASIC
设计的门级仿真,使用时需加以说明;
例
library altera;
use altera.maxplus2.all;
library lpm;
use lpm.lpm_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;
packge upac is
constant 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 '0'|'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;
configuration 配置
在一个实体内可以编写多种不同的构造体,通过配置语
句来进行选择;
配置语句格式:
configuration 配置名 of 实体名 is
for 选择的构造体名
end for;
end 配置名;
此语句可以为设计增加更大的灵活性,可以对不同构造
体进行比较。