VHDL重点语法全解

今天看到一篇博文,将VHDL语法基本包括了,先转过来备忘:VHDL基本点【精解】

VHDL描述硬件实体

结构

VHDL重点语法全解

举例

VHDL重点语法全解

  1. Entity()实体

    Enitiy 实体名 is

            PORT(端口名1,端口名N:方向:类型)

            [端口说明]

        End Entity;

    Port的方向有: IN , OUT, INOUT, BUFFER, LINKAGE

    In 信号只能被引用,不能被赋值;不可以出现在<= 或 : = 的左边

    out 信号只能被赋值,不能被引用;不可以出现在<= 或 : = 的右边

    buffer 信号可以被引用,也可以被赋值;可以出现在<= 或 : = 的两边

     

    Entity的内部结构将由Architecture来描述

     

  2. Arcthitecture(构造体)

        Arcthitecture 构造体名 of 实体名 is

    [定义语句] 内部信号、常数、元件、数据类型、函数等的定义

    begin

    [并行处理语句和block、process、function、procedure]

    end 构造体名;

            例如:

    VHDL重点语法全解

    下面让我们来看一看如何将一个实体(FULLADD)构造为一个内部能实现功能的构造体(STRUCT):

     

    VHDL重点语法全解

    VHDL重点语法全解

    VHDL重点语法全解

    VHDL重点语法全解

  3. 其他设计单元

除了entity(实体)和architecture(构造体)外还有另外三个可以独立进行编译的设计单元

Package(包集合)属于库结构的一个层次,存放信号定义、常数定义、数据类型、元件语句、函数定义和过程定义。

Package Body: 具有独立对端口(port)的package

configuration(配置)描述层与层之间的连接关系以及实体与构造体之间关系

VHDL重点语法全解

4、Library(库)

库: 数据的集合。内含各类包定义、实体、构造体等

  • STD库 --VHDL的标准库

  • IEEE库 -- VHDL的标准库的扩展

  • 面向ASIC的库 --不同的工艺

  • 不同公司自定义的库

  • 普通用户自己的库 --当VHDL文件被编译后,编译的结果储存在特定的目录下,这个目录的逻辑名称即Library,此目录下的内容亦即是这个Library的内容。

    VHDL重点语法全解

  1. Package(包)

    VHDL重点语法全解

  2. 这些结构之间的关系

    VHDL重点语法全解

VHDL对象、操作符、数据类型

1、VHDL中的对象(对客观实体的抽象和概括)有:

Constant(常量)在程序中不可以被赋值

Variable(变量)在程序中可以被赋值(用": ="),赋值后立即变化为新值。

Signal(信号)在程序中可以被赋值(用"<=") ,但不立即更新,当进程挂起后,才开始更新。

 

例如:

variable

x,y:integer;--定义了整数型的变量对象x,y

constant

Vcc:real;--定义了实数型的常量对象Vcc

signal

clk,reset:bit;--定义了位类型的信号对象clk,reset

 

注意:

1、variable只能定义在process和subprogram(包括function和procedure)中,不可定以在其外部。

2、signal不能定义在process和subprogram(包括function和procedure)中,只可定以在其外部。

 

对象的属性(类似于其它面向对象的编程语言如VB、VC、DELPHI):

用法格式:对象 ' 属性

例子:clk'event --表明信号clk的event属性

常用的属性:

Signal 对象的常用属性有:

event : 返回boolean值,信号发生变化时返回true

last_value:返回信号发生此次变化前的值

last_event:返回上一次信号发生变化到现在变化的间隔时间

delayed[(时延值)]: 使信号产生固定时间的延时并返回

stable[(时延值)]: 返回boolean, 信号在规定时间内没有变化返回true

transaction: 返回bit类型,信号每发生一次变化,返回值翻转一次

例子:A<=B'delayed(10 ns); --B延时10ns后赋给A;

if(B'Stable(10 ns)); --判断B在10ns中是否发生变化

 

    应用:

信号的event和last_value属性经常用来确定信号的边沿

例子:

判断clk的上升沿

if ( (clk'event)and (clk='1') and(clk'last_value='0')) then

判断clk的下降沿

if ( (clk'event)and (clk='0') and(clk'last_value='1')) then

2、VHDL的基本(数据)类型

bit(位): `0` 和`1`

bit-Vector(位矢量): 例如:``00110``

Boolean " ture"和"false"

time 例如:1 us、100 ms,3 s

character 例如:'a'、'n'、'1'、 '0'

string 例如:"sdfsd"、"my design"

integer 32位例如:1、234、-2134234

real 范围-1.0E38~+1.0E38 例如:1.0、2.834、3.14、0.0

natural 自然数 和 positive 正整数

senverity level (常和assert语句配合使用)包含有:note、warning、error、failure

以上十种类型是VHDL中的标准类型,在编程中可以直接使用。使用这十种以外的类型,需要自行定义或指明所引用的Library(库)和Package(包)集合

 

例子:

(1)

VHDL重点语法全解

(2)

VHDL重点语法全解

(3)

VHDL重点语法全解

信号Z有两个驱动A和B;Z必须定义为一种新的数据类型,否则Z将无法决定取值,语句视为非法。

(4)

VHDL重点语法全解

(5)

VHDL重点语法全解

要点:赋值语句中的方向应和声明中的方向一样

3、常用操作

 

连接操作符---&

VHDL重点语法全解

集合操作---()

VHDL重点语法全解

集合操作---序号

VHDL重点语法全解

集合操作--采用others

VHDL重点语法全解

  1. 定义自己的类型

通用格式

TYPE 类型名 IS 数据类型定义

用户可以定义的数据类型:

枚举类型enumberated、整数型integer、

实数型real、数组类型array、

纪录类型record、时间类型time、

文件类型file、存取类型access

(1)

  • 枚举类型enumberated

  • 格式

type 数据类型名 is (元素,元素…...);

  • 例子

type week is (sun,mon,tue,thu,fri,sat);

type std_logic is ('1','0','x','z');

(2)

  • 整数类integer和实数类real

  • 格式

type 数据类型名 is 数据类型定义 约束范围;

  • 例子

type week is integer range 1 to 7;

type current is real range -1E4 to 1E4

(3)

  • 数组类型array

  • 格式

type 数据类型名 is array 范围 of 元数据类型名

  • 例子

type week is array (1 to 7) of integer;

type deweek is array (1 to 7) of week;

(4)

  • 时间类型time

  • 格式

type 数据类型名 is 范围

units 基本单位;

单位;

end units

  • 例子

type time is range -1E18 to 1E18

units

us;

ms=1000 us;

sec=1000 ms;

min=60 sec;

end units

注意:引用时间时,有的编译器要求量 单位 之间应有一个空格如:1 ns;不能写为1ns

(5)

  • 纪录类型record

  • 格式

type 数据类型名 is record

元素名:数据类型名;

元素名:数据类型名;

….

end record;

  • 例子

type order is record

id:integer;

date:string;

security:boolean;

end record;

引用:signal flag:boolean;

signal order1:order;

order1<=(3423,"1999/07/07",true);

flag<=order1.security;

  1. IEEE 1164中定义的类型

(1)std_ulogic 是对位(bit)类型的扩展,只允许一个驱动源

VHDL重点语法全解

(2)Std_logic同std_ulogic 一样有九个状态,允许一个或多个驱动源

VHDL重点语法全解

与std_ulogic的区别

VHDL重点语法全解

(3)Std_unlogic_vector和std_logic_vector

VHDL重点语法全解

Std_unlogic、std_ulogic_vector

std_logic_vector和 std_unlogic_vector 类型

均定义在package(包) standard_logic_1164中

在使用这四种类形时应加以说明,

例如:library ieee;

use ieee.std_logic_1164.all;

 

  1. VHDL中的操作符

    (1)逻辑操作符有:

    VHDL重点语法全解

(2)逻辑操作符的应用例子

VHDL重点语法全解

(3)关系运算符有

VHDL重点语法全解

(4)关系运算符的应用

VHDL重点语法全解

(5)数学运算符

VHDL重点语法全解

注意:上述运算符应用于 integer,real,time 类型,不能用于vector(如果希望用于vector,可以使用库IEEE的std_logic_unsigned包,它对算术运算符进行了扩展)

(6)VHDL中的操作符应用要点

VHDL属于强类型,不同类型之间不能进行运算和赋值,可以进行数据类型转换

vector不表示number

array 不表示number

 

VHDL中的控制语句及模块

  1. 基本概念

    1. 并行处理(concurrent):语句的执行与书写顺序无关,并行块内的语句时同时执行的

    2. 顺序处理(sequential): 语句的执行按书写的先后次序,从前到后顺序执行。这种方式和其他普通编程语言(如c,pascal)是一样的。

2、并行和顺序处理在vhdl中的应用

(1)Architecture 中的语句及子模块之间是并行处理的

VHDL重点语法全解

(2)子模块block中的语句是并行处理的

VHDL重点语法全解

VHDL重点语法全解

VHDL重点语法全解

VHDL重点语法全解

(3)子模块process中的语句是顺序处理的

VHDL重点语法全解

  • process例子-值的更新

VHDL重点语法全解

分析:

当A、B、C、D中任一信号发生变化时,进程将开始执行,当执行 Z <= A and B 后, Z 的值不会立即变化 ;同理执行 Z <= C and D 后Z 的值也不会立即变化。当执行end process后, Z 的值才开始更新,同时系统挂起开始等待敏感信号。

 

  • Process中敏感信号列表的普遍原则是:

在process中,其值被引用的信号应当出现在敏感信号列表中

 

反例:

VHDL重点语法全解

VHDL重点语法全解

可见不符和设计要求

 

(4)子模块subprogram中的function和procedure是顺序处理的

VHDL重点语法全解

VHDL重点语法全解

VHDL重点语法全解

VHDL重点语法全解

 

  1. 顺序执行语句(sequential statement)

    Wait语句

    assert语句

    If 语句

    case语句

    for loop语句

    while 语句

    VHDL重点语法全解

    VHDL重点语法全解

    VHDL重点语法全解

    VHDL重点语法全解

    VHDL重点语法全解

    VHDL重点语法全解

    VHDL重点语法全解

    VHDL重点语法全解

    VHDL重点语法全解

    VHDL重点语法全解

    VHDL重点语法全解

    VHDL重点语法全解

 

 

  1. 并行处理语句(concurrent statement)

    并行操作中的信号赋值

 

  • 信号赋值操作

  • 符号"<="进行信号赋值操作的,

  • 它可以用在顺序执行语句中,

  • 也可以用在并行处理语句中

  • 注意

*用在并行处理语句中时,符号<=右边的值是此条语句的敏感信号,即符号<=右边的值发生变化就会重新激发此条赋值语句,也即符号<=右边的值不变化时,此条赋值语句就不会执行。如果符号<=右边是常数则赋值语句一直执行。

*用在顺序执行语句中时,没有以上说法。

  • 选择信号带入语句格式

with 表达式 select

目的信号量 <= 表达式1 when 条件1,

表达式2 when 条件2,

…..

表达式n when 条件n;

  • 选择信号带入语句例子

VHDL重点语法全解

 

  • 顺序执行语句和并行处理语句总结

1、顺序执行语句 wait、assert、if -else 、case、for-loop、while语句只能用在process、function 和 procedure 中;

2、并行处理语句(条件信号带入和选择信号带入)只能用在architecture、block中;

 

其它语句

VHDL重点语法全解

例子:

entity testand2 is

port(ain,bin: in nit ; cout:out bit);

end testand2;

architecture behav of testand2 is

component and2

generic(rise:time); port(a,b: in nit ; c:out bit);

end component;

begin

c<=(a xor b) after (rise);

u0:and2 generic map(20 ns) port map(ain,bin,cout);

  1. end behav