VHDL入门

VHDL入门verilog感觉掌握的还不错了。最近准备学习一下VHDL。了解了一下,VHDL的一个重要特征是具有描述大量同时发生的时间的能力。大量时间同时发生是数字系统工作时所具有的内在特征,这些时间被称为并行事件。VHDL的注释以两个连字符“”开始,到该行尾自动结束,不支持成块的注释语句。VHDL设计实体的组成:库和程序包(Library,Package),实体(Entity),结构体(A

大家好,欢迎来到IT知识分享网。

verilog感觉掌握的还不错了。最近准备学习一下VHDL。

了解了一下,VHDL的一个重要特征是具有描述大量同时发生的时间的能力。大量时间同时发生是数字系统工作时所具有的内在特征,这些时间被称为并行事件。

VHDL 的注释以两个连字符“–”开始,到该行尾自动结束,不支持成块的注释语句。

VHDL设计实体的组成:库和程序包(Library,Package),实体(Entity),结构体(Architecture),配置(Configuration).

 

— VHDL Example  

library ieee;  

use ieee.std_logic_1164.all; –库声明 

entity TONE is  

port(A,B:in std_logic; –实体定义  

C:out std_logic);  

end TONE;  

 

architecture EX of TONE is –结构体定义  

begin  

C<=A OR B;  

end EX;  

 

VHDL不区分大小写

 

1:实体的语句格式

ENTITY 实体名 IS

GENERIC(——);                 –可选

PORT(——);

 END实体名;

类属说明的书写格式是:

GENERIC(常数名:数据类型:设定值;

       常数名:数据类型:设定值);

端口语句的格式:

PORT(端口信号名:端口模式数据类型;

    端口信号名:端口模式数据类型);

IN 输入

OUT 输出

INOUT 双向

BUFFER 缓冲

2.结构体

结构体的任务是:定义结构体中的各项内部使用元素,如数据类型(TYPE),常数(CONSTAND),信号(SIGNAL),元件(COMPONENT),过程(POCEDURE),变量(VARIABLE)和进程(PROCESS)等。通过VHDL语句描述实体所要求的具体行为和逻辑功能。描述各元件之间的连接。

结构体格式:

结构体名  OF 实体名IS

说明部分(可选,课用于对结构体中使用的信号等进行说明,这样做有利于提高程序的可读性)

BEGIN

功能描述语句法

END 结构体名称


VHDL内部是并发执行的,但是process内部的代码是顺序执行的。要实现时序电路,必须使用顺序执行代码。顺序执行代码可以同时实现组合逻辑电路和时序逻辑电路。

从本质上讲,VHDL代码是并发执行的。只有PROCESS,FUNCTION或者PROCEDURE内部的代码才是顺序执行的。值得注意的是,尽管这些模块中的代码是顺序执行的,但是当它们作为一个整体是,与其他模块之间又是并发的。IF,WAIT,CASE,LOOP语句都是顺序代码,用在PROCESS,FUNCTION和PROCEDURE内部。

我们将一系列的并发描述语句放在一个simple block中,目的仅仅是为了增强整个代码的可读性和可维护性。但是,一个特殊的例子是利用guarded BLOCK可以构造时序电路。




类属 GENERIC 参量是一种端口界面常数,常以一种说明的形式放在实体或块结构体前的说明部分。

类属参量以关键词 GENERIC 引导一个类属参量表,在表中提供时间参数或总线宽度等静态信息。

 一般在结构体中,类属的应用与常数是一样的,例如:当用实体例化一个设计实体的器件时,可以用类属表中的参数项定制这个器件,如可以将一个实体的传输延迟,上升和下降延时等参数加到类属参数表中,然后根据这些参数进行定制,这对于系统仿真控制是十分方便的。其中的常数名是由设计者确定的类属常数名,数据类型通常取INTEGER 或TIME 等类型,设定值即为常数名所代表的数值,但需注意 VHDL 综合器仅支持数据类型为整数的类属值。
GENERIC详细描述见以下网址
http://hi.baidu.com/rebornlinlin/item/0caedc0f8b0a058e03ce1b5a


一个元件 component是一个结构完整的常用代码,(包括库声明、实体和结构体这些基本的组成部分)。然而如果将这些代码声明为component,就可以被其他电路调用,从而使代码具有了层次化的结构。

COMPONENT是已有元件在别的文件中已经定义,在此声明之后,你的程序里就可以用了
就比如我在设计文件中定义了一个实体
entity cnt6 is  
  port  
  (clr,en,clk :in std_logic;  
  q  :out  std_logic_vector(2 downto 0)  
  );  
end entity;
然后我要在测试文件中使用它,需要例化它,但首先要使用component对它进行声明。
architecture rtl of cnt6_tb is  
  component cnt6  
    port(  
      clr,en,clk :in std_logic;  
      q  :out  std_logic_vector(2 downto 0)  
      );  
  end component;  
  关于VHDL 的testbench 的编写,请参照以下网址,写的蛮好
http://blog.csdn.net/wangjun403/article/details/6246830
http://www.cnblogs.com/zlh840/archive/2011/07/08/2101504.html

ƒCOMPONENT语句


COMPONENT 元件名


【GENERIC 说明】;


PORT 说明;


END COMPONENT;


COMPONENT语句可以在


ARCHITECTURE,PACKAGE及BLOCK


的说明部分中使用







ƒCOMPONENT_INSTANT语句


标号名:元件名 PORT MAP(信号,•••)


该语句使得使用已有元件或模块成为


可能,该语句将元件或模块的端口信号


映射成为高层次电路中的信号。



ƒCOMPONENT_INSTANT语句


标号名:元件名 PORT MAP(信号,•••)


该语句使得使用已有元件或模块成为


可能,该语句将元件或模块的端口信号


映射成为高层次电路中的信号。


例:已有设计and2的端口说明如下


Port(a,b:in bit;


c:out bit);


元件调用


u1:and2 portmap(x,y,q);


u2: and2 port map(a=>x,b=>y,c=>q);


在输出信号没有连接的情况下,其对应


端口的描述可以忽略





程序包说明格式如下: package 程序包名 is          说明语句; end    程序包名; 程序包名:设计者自定义便于记忆的标识符
说明语句:包括各种类型的说明语句

程序包体
描述函数和过程功能的函数体与过程等的集合称程序包体
程序包说明中,定义了数据类型和子程序中的函数、过程说明,而程序包体中才具体地描述该函数、过程功能的语句和数据的赋值。
程序包体格式:
package body 程序包名 is               顺序语句; end 程序包名;
程序包名:与程序包说明中的程序包名相同
顺序语句:描述函数、过程及其他功能的程序流


子程序——过程 VHDL中,所谓子程序指主程序调用它后能将处理结果返回主程序的程序模块。 VHDL语言中,子程序有两种类型,过程(procedure)和函数(function)。 他们的区别: 1、过程可具有多个返回值,而函数只能有一个 2、过程通常用来定义一个算法,而函数往往用来产生一个特定的值 3、过程中的参数可具有3种端口模式:in、out、inout,而函数中的参数只能具有一直端口模式:in   过程的书写结构 对于VHDL子程序来说,它通常包括子程序说明部分和子程序定义部分。 其中,子程序说明部分定义了其他设计调用子程序的接口;子程序定义部分则描述该子程序具体功能的实现。 因此,通常将子程序说明部分和子程序定义部分的书写结构分别介绍
在VHDL中,过程说明部分的书写结构: procedure:过程名 (对象类型1 参数名1: 端口模式1 数据类型1;     对象类型2 参数名2:端口模式2 数据类型2;......);
其中对象类型、端口模式是可选项。
在VHDL语言中,过程定义部分 procedure 过程名 (对象类型1 参数名1: 端口模式1 数据类型1;     对象类型2 参数名2:端口模式2 数据类型2;......)is    过程说明部分; begin   过程顺序语句部分; end 过程名;
参数列表中:每个参数包括它的对象类型、参数名、端口模式以及数据类型 参数的对象类型包括:常量、信号、变量 参数名是用来表示参数的唯一标识 端口模式:包括in、out、inout 若过程中没有指明参数的对象类型,那么参数的对象类型将默认为一个变量 过程定义在程序包中的定义规则为:过程说明部分书写在程序包的说明部分,过程定义部分书写在程序包体部分 过程定义在结构体中:即将过程定义部分书写在结构体的说明部分,然后在结构体进程语句里调用 函数
函数包括:函数说明部分和函数定义部分 函数说明部分定义了主程序调用函数的接口 函数定义部分描述了该函数具体逻辑功能的实现 函数的书写结构 function 函数名 (对象类型1 参数名1; in 数据类型1;    对象类型2  参数名2;  in 数据类型2;......) return 数据类型; 其中对象类型和端口模式in是可选项 函数定义部分书写结构 function 函数名 (对象类型1 参数名1; in 数据类型1;    对象类型2  参数名2;  in 数据类型2;......) return 数据类型is      函数说明部分: begin          函数顺序语句部分; return(参数值); end 函数名; 函数参数的对象类型只能包括常量和信号:参数的端口模式只能是in,因此参数端口模式可以省略。 函数的返回值只能有一个。 函数定义在程序包中:函数说明部分书写在程序包说明部分,函数定义部分书写在程序包体部分。如果需要使用程序包中定义的函数,那么只需要通过use语句使其对设计实体可见。 函数定义在结构体中:只需将函数定义部分书写在结构体说明部分即可。然后在结构体中调用这个函数。
function内是不允许加入进程process的。函数function的通常应用是作逻辑组合、判决和转移。
VHDL入门

Function 例子
function maxabbit
   return boolean isvariable flagboolean
begin
   if a=bthen
      flag<=true
  end if
return flag
end max

Pprorocedure例子
procedure max(a,b:in bit;
                          flag:out boolean)is
begin
   if (a=b)then
      flag<=true
  end if
end max


Vhdl 程序包


程序包是用VHDL语言编写的一段程序,可以供其他设计单元调用和共享,相当于公用的“工具箱”,各种数据类型、子程序等一旦放入了程序包,就成为共享的“工具”,类似于C语言的头文件,使用它可以减少代码的输入量,使程序结构清晰。在一个设计中,实体部分所定义的数据类型、常量和子程序可以在相应的结构体中使用,但在一个实体的声明部分和结构体部分中定义的数据类型、常量及子程序却不能被其他设计单元使用。因此,程序包的作用是可以使一组数据类型、常量和子程序能够被多个设计单元使用。
程序包分为包头和包体两部分。包头(也称程序包说明)是对包中使用的数据类型、元件、函数和子程序进行定义,其形式与实体定义类似。包体规定了程序包的实际功能,存放函数和过程的程序体,而且还允许建立内部的子程序、内部变量和数据类型。包头、包体均以关键字PACKAGE开头。程序包格式如下。
包头格式:
PACKAGE 程序包名 IS
[包头说明语句]
END 程序包名;
包体格式:
PACKAGE BODY 程序包名 IS
[包体说明语句]
END 程序包名;
调用程序包的通用模式为:USE 库名.程序包名.ALL; VHDL入门

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/14141.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信