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语言程序的基本结构

相关文章:

你感兴趣的文章:

标签云: