VHDL语言程序的基本结构

来源:本站
导读:目前正在解读《VHDL语言程序的基本结构》的相关信息,《VHDL语言程序的基本结构》是由用户自行发布的知识型内容!下面请观看由(电工学习网 - www.9pbb.com)用户发布《VHDL语言程序的基本结构》的详细说明。
一、VHDL语言设计的基本单元及其构成
l 一个完整的VHDL语言程序通常包含实体(Entity)、构造体(Architecture)、配置(Configuration)、包集合(Package)和库(Library):
l 功能:
实体 -—- 用于描述所设计的系统的外部接口信号;
构造体—— 用于描述系统内部的结构和行为;
包集合—— 存放各设计模块都能共享的数据类型、常数和子程序库;
配置 —— 用于从库中选取所需单元来组成系统设计的不同版本;
库 —— 存放已经编译的实体、构造体、包集合和配置。
l 基本组成:实体说明和构造体两部分
实体说明(接口)
构造体(实现)
1. 实体说明:
规定此实体输入与输出的数目与类型。
l 结构:
  entity 实体名 is
[generic(类属参数说明)];
[port(端口说明)];
end 实体名;
l 类属参数说明:
generic (
常数名:数据类型 :=数值);
在端口说明前,用于指定参数。
l 端口说明:
在entity语句的实体说明部分,常用port语句描述实体对外界连接的端口(数目、方向和数据类型)。
port (
  端口名:端口方向 端口数据类型;
  .
 .
 .
  端口名:端口方向 端口数据类型;
);
端口方向:
in (输入),只能读,用于:时钟输入、控制输入(装入、复位、使能)、单向数据输入;
out (输出),只能被赋值,用于不能反馈的输出;
inout(输入输出) ,既可读又可被赋值,被读的值是端口输入值而不是被赋值,作为双向端口。
buffer(缓冲),类似于输出,但可以读,读的值是被赋值,用做内部反馈用,不能作为双向端口使用。
l 例1):
entity NAND2 is
port(A,B: in BIT;
Z: out BIT);
end NAND2;
l 例2):
--Define an entity (design) called COMP
--that has 2 N-bit input and one output.
entity COMP is
generic(N : INTEGER :=8 ) ; -- default is 8 bits
port ( x, y : in BIT_VECTOR ( 0 to N-1);
equal : out BOOLEAN );
end COMP;
2.  构造体
构造体定义实体功能的一种实现。
l 构造体的结构:
architecture 构造体名 of 实体名 is
 {块说明项}
begin
{并发语句}
end 构造体名;
l 块说明项(或定义语句),位于architecture 和begin之间,对构造体内部的使用信号、常数、数据类型和函数进行说明,包括:
使用语句
子程序说明
子程序体
类型说明
子类型说明
常数说明
信号说明
元件说明
l 并行语句处于begin 与end之间,描述构造体的行为与连接关系。
l 构造体的描述方法:
行为描述(按算法的路径来描述);
数据流描述或RTL描述(采用寄存器传输描述);
结构化描述(采用例化元件)
例化(instantiation ):在高层次的设计中调用低层次的实体作为元件的过程。
l 构造体的组织
l 例
entity COUNTER3 is
port( clk: in bit;
reset : in bit;
count: out integer range 0 to 7);
end COUNTER3;

architecture MY_ARCH of COUNTER3 is
signal count_tmp : integer range 0 to 7;
begin
process
begin
wait until (clk'event and clk='1');
if reset='1' or count_tmp =7 then
count_tmp<=0;
else
count_tmp<=count_tmp + 1;
end if;
end process;
count<=count_tmp;
end MY_ARCH;
注:构造体中的信号和常数名不能与实体端口名相同。
二、语言结构体的子结构描述
1. block语句结构
l 语句结构:
块结构名:
block
begin
.
.
.
end block 块结构名;
2. 进程(process)语句结构
l 进程语句的结构:
[进程名]:process(信号1,信号2,……)
{说明 内部变量}
begin
  {顺序语句} 
end process;
l 进程的组织
l 功能独立的电路可用进程来描述
l 进程中语句的顺序性
l 进程的启动
*敏感表
*敏感表中信号的变化将启动进程语句
*启动后,语句从上到下逐句执行,最后一个语句执行完毕后,返回进程开始的语句,等待下一次敏感表的变化。
l 进程的同步描述
同一结构体中有多个进程存在时,进程之间可一边进行通信,一边并行同步执行。
3.子程序(subprogram)语句结构描述
两种类型:过程(procedure)
函数 (function)
l 过程语句
结构:
procedure 过程名(参数1,参数2,…) is
[定义语句];
begin
[顺序处理语句];
end 过程名;
*参数可以是输入也可以是输出
*例: 将位矢量转换为整数
procedure vector_to_int
(z : in std_logic_vector;
x_flag : out boolean;
q : inout integer) is
begin
q:=0;
x_flag:=false;
for i in z' range loop
q:=q*2;
if (z(i)=1) then
q:=q+1;
elsif(z(i)/=0) then
x_flag:=true;
end if;
end loop;
end vector_to_int;
循环次数由z的位数决定,z(0)为最高位。
l 函数语句
结构:
function 函数名(参数1,参数2,…)
return 数据类型名 is
[定义语句];
begin
[顺序处理语句];
return 返回变量名
end 函数名;
*参数为输入参数
*通常集中在包集合中
*例:将boolean型信号转换到 bit型
function b12bit(a: Boolean) return BIT is
begin
if a then
return '1';
else
return '0';
end if;
end b12bit;
三、包集合、库与配置
1.库
库(Library)是经编译后的数据的集合,库说明总是放在设计单元的最前面。
1) 库的种类:
l IEEE 库
包含:STD_LOGIC_1164
STD_LOGIC_ARITH
STD_LOGIC_UNSIGNED
l STD库
包含:STANDARD包集合
TEXTIO 包集合
TEXTIO 包集合使用例:
LIBRARY STD;
USE STD.TEXTIO. ALL;
l ASIC矢量库
各公司提供的ASIC称逻辑门库
l WORK 库
为现行作业库,存放设计者的VHDL语言程序
l 用户定义的库
用户为自身设计需要所开发的共用包集合和实体。
2) 库的使用
l 除WORK、STD库外,首先要说明。格式:
library [库名];
use [库名.包名.项目名];
例:
library ieee;
use ieee.std_logic_1164.all;
l 库说明的作用范围:
从实体开始到其所属构造体、配置为止。
2.包集合
l 包集合用于封装属于多个设计单元分享的公共信息。
l 包集合由包说明(说明数据类型、子程序和常量等)和包体(它
含有子程序体与现有的延时常数)所组成。子程序由执行公共操作的过程和函数组成。包集合是分享属于实体数据的一种机制,把子程序、数据类型和元件说明看成建立设计的工具,则包集合可看成工具箱。
1) 包集合的结构:
package 包集合名 is
[包集合说明语句];
end 包集合名;
package body 包集合名 is
[包集合体说明语句];
end 包集合名;
注:包集合体为可选项。
3) 包集合的使用:
use work.[包集合名].all;
例:
l 建一个包集合。此例中,用字母符号代表用于控制的二进编码序列。
library ieee;
use ieee.std_logic_1164.all;
--ALU source operand control mnemonics
package mnemonics0 is
constant aq: std_logic_vector(2 downto 0) :="000";
constant ab: std_logic_vector(2 downto 0) :="001";
constant zq: std_logic_vector(2 downto 0) :="010";
constant zb: std_logic_vector(2 downto 0) :="011";
constant za: std_logic_vector(2 downto 0) :="100";
constant da: std_logic_vector(2 downto 0) :="101";
constant dq: std_logic_vector(2 downto 0) :="110";
constant dz: std_logic_vector(2 downto 0) :="111";
end mnemonics0;
l 编译通过后即可使用。
注:maxplus2在编译此package时,报告: "…does not contain an architecture body—stopping compilation",但此package 将被正确分析,并可成功地编译使用此package的其他设计。
l 用于其他使用此包集合的程序:
--由控制信号控制两个多路选择器
library ieee;
use ieee.std_logic_1164.all;
use work.mnemonics0.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity src_op is port(
d,ad,bd,q: in unsigned(3 downto 0);
src_ctl: in std_logic_vector(2 downto 0);
r,s: buffer unsigned(3 downto 0));
end src_op;
architecture src_op of src_op is
begin
with src_ctl select
r <= ad when aq | ab,
"0000" when zq | zb | za,
d when others;
with src_ctl select
s <= q when aq | zq | dq,
bd when ab | zb ,
ad when za |da,
"0000" when others;
end src_op;
3.配置
描述层与层之间的连接关系以及实体与构造体之间的连接关系。在仿真时利用配置选择不同的构造体。
格式:
CONFIGURATION 配置名 OF 实体名 IS
FOR 构造体名
END FOR;
END 配置名;
l 例
configuration MY_CONFIG of COUNTER3 is
for MY_ARCH
end for;
end MY_CONFIG;
提醒:《VHDL语言程序的基本结构》最后刷新时间 2023-07-10 03:54:19,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《VHDL语言程序的基本结构》该内容的真实性请自行鉴别。