VHDL中的资源:库和包集合
Library 库编译后数据的集合,存放包集合定义、实体定义、构造体定义和配置定义,其功能相当于其他操作系统中的目录,经过说明后,设计中就可以使用库中的数据,实现共享;
库的使用当使用库时,需要说明使用的库名称,同时需要说明库中包集合的名称及范围;
每个实体都应独立进行库的说明;库的说明应该在实体之前;
经过说明后,实体和结构体就可以自动调用库中的资源;
库的使用库说明语句格式
library 库名;
use 库名,包集合名,范围(或项目名) ;
例,library ieee;
use ieee.std_logic_1164.all;
库的主要种类
ieee库 std库
work库 用户定义库
ASIC库
ieee库含有 IEEE的标准包集合,std_logic_1164”以及一些大公司提供的包集合;
使用前必须进行说明;
例,library ieee;
ieee库中的重要包集合
std_logic_1164:
定义了 std_logic数据类型及相应运算;
std_logic_arith:定义了 signed和 unsigned
数据类型、相应运算和相关类型转换函数;
std_logic_signed与 std_logic_unsigned:
定义了一些函数,可以使 std_logic_vector类型被当作符号数或无符号数一样进行运算。
std库
VHDL标准所含的资源库,含有,standard”包集合和,textio”包集合,对所有预定义的数据类型、运算规则、函数和语法进行表达;
使用 standard”包集合时无需说明;
work库与用户定义库
work库,
work库为当前设计文件的保存目录;
work库使用时通常无须说明;但在结构设计中进行元件的宏调用时需要说明;
例,use work.all;
用户定义库,
由用户自定义生成,使用时需说明 (指定库所在的路径 );
ASIC库由各公司提供,存放与逻辑门一一对应的实体,
用于 ASIC设计的门级仿真,使用时需加以说明;
例,library altera;
use altera.maxplus2.all;
library lpm;
use lpm.lpm_components.all;
包集合,package
用于保存 VHDL语言中经常使用的类型定义、信号定义、常数定义、元件定义、函数定义和过程定义等(类似于 C语言中的 include语句),
方便不同模块的设计中公共定义的共享;
包集合在使用前必须采用 use语句进行说明
(在设计程序的最前面);
包集合内容可以由用户自行定义;
包集合的定义与结构
package 包集合名 is
说明语句;(只有名称)
end 包集合名;
package body包集合名 is
说明语句; (完整定义)
end 包集合名;
包集合的简单定义
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);
end upac;
包集合的详细定义
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;
也可以选择特定的用户库进行存放和调用。
包集合的程序实例:说明部分
package and_pkg is
procedure p_and(a,b:in bit;signal c:out bit);
--过程说明
function f_and(a,b:bit) return bit;
--函数说明
end;
包集合的程序实例:执行部分
package body and_pkg is
--过程的完整编程
procedure p_and(a,b:in bit;signal c:out bit)
is
begin c<=a and b;
end;
--函数的完整编程
function f_and(a,b:bit) return bit is
begin return (a and b);end;
end ;
包集合的程序实例:调用方式
entity f is port(x,y:in bit;s,z:out bit:='0');end;
use work.and_pkg.all; --包集合的调用
architecture str of f is
begin
u1:p_and(x,y,s); --过程调用
z<=f_and(x,y); --函数调用
end str;
配置,configuration
在一个实体内可以编写多种不同的构造体,通过配置语句来进行选择;
配置语句格式:
configuration 配置名 of 实体名 is
for 选择的构造体名
end for;
end 配置名;
此语句可以为设计增加更大的灵活性,可以对不同构造体进行比较。
关于配置使用的一个例子
entity an2 is port (a1,a2:in bit;y:out bit);end;
architecture dat of an2 is begin y<=a1 and a2;end;
entity xr2 is port (x1,x2:in bit;y:out bit);end;
architecture dat of xr2 is begin y<=x1 xor x2;end;
--上述程序分别定义了 2个 2输入的器件;
关于配置使用的一个例子
entity half_adder is port(x,y:in
bit;sum,cout:out bit);end;
architecture netlist of half_adder is use
work.all;
component mx port(a,b:in bit;z:out bit);
end component; --可以采用元件的抽象定义;
component ma port(a,b:in bit;z:out bit);end
component;
for g1:mx use entity xr2(dat)
port(x1=>a,x2=>b,y=>z); --对 mx,采用 xr2元件;
end;
--程序中使用了 2个 2输入器件,mx采用 xr2,ma未指定;
关于配置使用的一个例子
begin
g1:mx port map(x,y,sum); --已经有具体元件定义;
g2:ma port map(x,y,cout); --仍然为抽象元件定义;
end;
关于配置使用的一个例子
configuration c1 of half_adder is
use work.all;
for netlist
for g2:ma use entity an2(dat)
port(a1=>a,a2=>b,y=>z);
--为 ma补充定义,采用 an2元件;
end for;
end for;
end;
VHDL的属性语句属性语句可以从一个信号或变量中提取相关信息,可以针对类型、信号、函数、数值和范围得出相应的结果;
属性语句通常在程序中用于过程执行的判断;
主要在程序的仿真调试中使用,多数属性语句不可综合;
VHDL的典型属性语句
s'event 检测信号发生变化时给出 true;
s'active 检测信号有效时给出 true;
s'last_value 给出信号上一次变化之前的值;
t'left 提取类型最左边的元素;
t'high 提取类型中最大的元素;
a'left 提取数组最左边的元素;
a'length 给出数组的长度;
自定义属性语句可以通过下述方式自行定义属性:
attribute 属性名称,属性的数据类型 ;
attribute 属性名称 of 数据对象,对象类型 is
对象值 ;
例:
attribute syn,boolean;
attribute syn of clk,signal is true;
p<=clk ' syn; -- 将属性取值赋值给信号量;
仿真调试过程使用的典型语句断言与报告语句,assert/report
用于将仿真调试中的问题表现出来,不可综合,
不消耗硬件资源。
语法格式:
assert condition
report "message"
severity severity_level;
仿真调试过程使用的典型语句例:检测两个数据的位宽是否一致:
assert a'length = b'length
report "Error:data length are not same"
severity failure;
错误等级是一种预定义类型,包括 4个元素:
( note,warning,error,failure)