VHDL重点语法全解

举报
李锐博恩 发表于 2021/07/15 05:18:50 2021/07/15
【摘要】 今天看到一篇博文,将VHDL语法基本包括了,先转过来备忘:VHDL基本点【精解】 VHDL描述硬件实体 结构 举例 Entity()实体 Enitiy 实体名 is         PORT(端口名1,端口名N:方向:类型)     &nb...

今天看到一篇博文,将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 构造体名;

            例如:

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

     

  3. 其他设计单元

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

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

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

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

4、Library(库)

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

  • STD库 --VHDL的标准库

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

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

  • 不同公司自定义的库

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

  1. Package(包)

  2. 这些结构之间的关系

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)

(2)

(3)

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

(4)

(5)

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

3、常用操作

 

连接操作符---&

集合操作---()

集合操作---序号

集合操作--采用others

  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)类型的扩展,只允许一个驱动源

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

与std_ulogic的区别

(3)Std_unlogic_vector和std_logic_vector

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)逻辑操作符有:

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

(3)关系运算符有

(4)关系运算符的应用

(5)数学运算符

注意:上述运算符应用于 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 中的语句及子模块之间是并行处理的

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

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

  • process例子-值的更新

分析:

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

 

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

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

 

反例:

可见不符和设计要求

 

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

 

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

    Wait语句

    assert语句

    If 语句

    case语句

    for loop语句

    while 语句

 

 

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

    并行操作中的信号赋值

 

  • 信号赋值操作

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

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

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

  • 注意

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

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

  • 选择信号带入语句格式

with 表达式 select

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

表达式2 when 条件2,

…..

表达式n when 条件n;

  • 选择信号带入语句例子

 

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

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

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

 

其它语句

例子:

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

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/88535500

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。