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;
也可以选择特定的用户库进行存放和调用。
配置,configuration
在一个实体内可以编写多种不同的构造体,通过配置语句来进行选择;
配置语句格式:
configuration 配置名 of 实体名 is
for 选择的构造体名
end for;
end 配置名;
此语句可以为设计增加更大的灵活性,可以对不同构造体进行比较。
配置,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 g1:ma use entity an2(dat)
port(a1=>a,a2=>b,y=>z);
--为 ma补充定义,采用 an2元件;
end for;
end for;
end;
VHDL的执行语句并行语句 /顺序语句并行语句体现电路硬件的特点:
各元件 /信号相互影响,同时发生变化;
顺序语句体现设计人员的思路:
现象的因果关系、局部与整体的关系;
VHDL的执行语句描述结构体中电路硬件的变化特点;
结构体中的任何执行语句都是并行语句;
并行语句的种类有:
赋值类语句:数据流描述 (逻辑函数的运算 )
元件类语句:结构描述 (逻辑符号的连接)
进程语句:行为描述 (电路功能的流程)
并行语句的仿真特点所有语句在同一时刻执行;
在仿真时刻零点开始执行;
在任一输入信号出现变化时开始执行;
(在电路模块中,一次仿真只考虑一个输入变化引起的状态变化;仅当电路进入稳定状态后,才能进行下一个输入的变化。)
并行语句的仿真过程仿真开始 ---执行全部并行语句(耗时
t);
执行过程中不改变信号值;
执行完毕,根据执行结果为信号赋值;
检查上述过程有没有任何语句的输入信号发生变化;
若有变化,则立即开始下一次执行;
并行语句的仿真过程继续上述过程直到电路进入稳定状态
(输入信号不再发生变化);
若一次执行后没有任何输入信号发生变化,则等待输入信号的变化,或程序中与时间有关的语句发生作用。
若经过足够多次执行电路仍然不能稳定,
则停止仿真,提示错误;
信号赋值语句:数据流描述以基本信号为基础,描述信号间的相互关系(函数关系);
也称为“寄存器传输描述方式”:认为各信号存放于各寄存器中,信号的变化只是经过适当操作后在寄存器之间的传递;
信号赋值语句主要包括 3种形式:
直接赋值、条件赋值、选择赋值。
直接赋值语句信号名 <= 信号值(表达式);
赋值语句将,<=”右边的值赋给左边的信号;
右边可以是直接常数、信号、表达式、函数;
赋值式双方应为相同类型;
直接赋值语句每条赋值语句对应一个电路模块,右边信号为输入信号,左边信号为输出信号;
赋值号左边不能为端口输入信号,右边不能含有端口输出信号;
赋值号双方不能出现同一信号名;
在一个程序块中,应避免采用多条赋值语句为同一信号赋值;
直接赋值的例题程序例,2-4译码器设计
library ieee;use ieee.std_logic_1164.all;
entity kdecoder24 is
port (a,in std_logic_vector (1 downto 0);
f,out std_logic_vector (3 downto 0) );
end kdecoder24;
architecture d of kdecoder24 is
begin
f(0) <= not a(1) and not a(0); f(1) <= not a(1) and a(0);
f(2) <= a(1) and not a(0);f(3) <= a(1) and a(0);
end d;
例:奇偶校验电路的设计
library ieee;use ieee.std_logic_1164.all;
entity kparity is
port (n,in std_logic_vector (3 downto 0);
odd,even,out std_logic);
end kparity;
architecture rtl of kparity is
signal oddi:std_logic;
begin
oddi <= n(3) xor n(2) xor n(1) xor n(0);
odd <= oddi; even <= not oddi;
end rtl;
例:素数检测器的设计 p.287(表 4-53)
library ieee; use ieee.std_logic_1164.all;
entity prime is
port (n,in std_logic_vector (3 downto 0); f,out std_logic);
end prime;
architecture rtl1 of prime is
signal n3l_n0,n3l_n2l_n1,n2l_n1_n0,n2_n1l_n0:std_logic;
begin
n3l_n0 <= not n(3) and n(0);
n3l_n2l_n1 <= not n(3) and not n(2) and n(1);
n2l_n1_n0 <= not n(2) and n(1) and n(0);
n2_n1l_n0 <= n(2) and not n(1) and n(0);
f<= n3l_n0 or n3l_n2l_n1 or n2l_n1_n0 or n2_n1l_n0;
end rtl1;