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 配置名; 此语句可以为设计增加更大的灵活性,可以对不同构造 体进行比较。