龙空技术网

FPGA高级编程语言VHDL中的数据对象详细介绍

学个习 259

前言:

当前朋友们对“vhdl语言简介”可能比较重视,朋友们都想要知道一些“vhdl语言简介”的相关知识。那么小编也在网摘上收集了一些对于“vhdl语言简介””的相关内容,希望看官们能喜欢,兄弟们一起来学习一下吧!

近年以来,随着大数据与人工智能技术的快速发展,对于数据处理速度的要求也越来越高。

而FPGA(可编程逻辑门阵列)就是一种可以进行高速并行运算的可编程芯片,在人工智能与大数据处理上具有非常明显的优势。

微软技术院士(Technical Fellow)Doug Burger博士就有这样的表述:“我们虽然可以通过不断增加处理器(CPU)核心的数量来达到并行计算的目的,但是由于能耗限制,不可能让他们同时工作。”

他还提出一个解决这种问题的办法,那就是使用“定制计算”,就是说在特定的工作场景和负载优化硬件设计,但是,定制芯片具有非常昂贵的成本。

例如,对于一个复杂的云计算场景,可能会需要47000种不同的定制芯片组成的系统,这可能估计无论对于设计者还是使用者都是没有人愿意的。

所以他将赌注押在了这个名叫FPGA的芯片上。

FPGA全名叫“现场可编程逻辑阵列”,它本质是一种可编程的芯片。人们可以把硬件设计重复烧写在它的可编程存储器里,从而使FPGA芯片可以执行不同的硬件设计和功能。

另外,你也可以在使用现场动态的改变它上面运行的功能,这就是为什么它们被称作“现场可编程”的原因。事实上,你可以每隔几秒就改变一次FPGA芯片上运行的硬件设计,因此这种芯片非常灵活。”

所以掌握最常用的FPGA高级编程语言之一的VHDL语言就非常有必要了。今天这篇文章主要就VHDL语言中比较难理解的一个关于数据对象的知识点进行详细的分析与讲解。

FPGA数据对象简介

首先,VHD中的数据对象有以下三种:常量(Constant)、变量(Variable)、信号(Signal),其中常量与变量跟其它编程语言中的定义类似,可以参考其中定义很好理解,但是信号(Signal)是VHDL中特有的数据对象,也是一个初学者很难理解的一个难点。

下面就依次对数据对象的特点进行详细介绍,并且结合实例进行分析,将各个变量的差异进行对比说明,相信通过阅读本文,可以非常容易掌握这些概念。

一、常量(Constant)介绍

常量,顾名思义就是值不能够被改变的量,跟其它语言的定义是非常类似的。

常量的定义格式为:

CONSTANT 常量名 : 数据类型:= 表达式; //其中最后的赋值表达式为必须的。

举例:CONSTANT Vcc:Real:=5; //指定一个电压为5V的常量。

使用范围:

常量的使用范围与定义的具体位置有关系,要是定义在程序包(Package)里面,则可以被用于所有调用该程序包的实体(Entity)中。而在实体中的结构体(Architecture)中定义的常量只能在该结构体中使用。

类似的在结构体内的进程(Process)内定义的常量也只能用在该进程中使用,不能用在除此以外的地方。

二、变量(Variable)介绍

变量:顾名思义就是值可以被改变的量,即允许多次被赋值的量。

定义格式为:

VARIABLE 变量名: 数据类型:=约束条件(:=初始值);//其中后面表达式为非必须的。

例子: VARIABLE x,y: INTEGER; //定义2个整数变量x,y。

变量赋值语句格式为:

目标变量名:=表达式;

例子: x:=10; y:=5+x;//赋值两边数据类型必须一致。表达式、常数均可。

变量(Variable)的特点:

① 可多次赋值,并且赋值立即生效,是一种理想化的数据传输过程。② 可允许设置初始值,但是在综合时,综合器会将略去所有的初始值。③ 变量是一个局部变量,只能用于进程、子进程、过程和函数中使用。④ 变量不能表达“连线”或存储元件。⑤ 对于变量赋值,目标变量可以是单值变量,也可以是数组型变量。

变量使用举例如下:

VARIABLE x,y,z: INTEFER;VARIABLE COUNT: INTEFER RANGE 0 to 255:=10;VARIABLE a,b: BIT_VECTOR(0 to 7);b:="1010101";a:=b;a(3 to 6):=('1','1','0','1');a(3 to 6):==("1101");a(0 to 5):=b(2 to 7);a(7):='0';

注意:赋值两边位宽必须相等,数据类型必须相同。

下面我们一起对最后一个VHDL特有的数据对象-信号(Signal)进行详细的学习。

三、信号(Signal)介绍

信号(Signal)是VHDL中特有的数据对象,其实际上相当于电路元件中的连线,或者可以认为是电路中的某一个节点,信号除了没有固定的数据流动方向以外,其它性质与实体中的端口是一样的。

换句话说,实体的端口可以理解为一种有方向的信号。这样可能会更好理解一些。

信号声明格式为:

SIGNAL 信号名:数据类型 约束条件:= 表达式;

例子:SIGNAL clock : bit :='0';//定义时钟信号赋初值0;

信号赋值格式为:

目标信号名 <= 表达式;

例子: x<=9; z<=x after 5 ns;//先给x赋值9,5ns后赋值为z;

注意:

细心的我们可能已经发现了,在定义信号的时候,赋初值的时候使用的赋值符号是与变量赋值符号一样的“:=”,而在信号赋值时使用的赋值符号是“<=”,这个一定要注意,千万别搞错了。下面对信号的使用以及特点进行介绍。

信号的特点:

① 信号没有方向性,也就是说,信号可以被赋值也可以被读取。② 信号只能在实体、结构体和包集合中定义,不能在进程和子程序中定义。③ 信号赋值不是立即起作用的,而是经过一定的延迟才有效(系统会自动设置一个微小的延时时间)④ 在使用进程Process(敏感列表)时,敏感列表中只能是信号,而不能是变量。举个例子:

Signal x,y : bit;Variable z: bit;Process(x,y) ;Process(z);
Process(x,y) 是对的,Process(z) 是错误的⑤ 在一个进程中,允许对同一个信号进行多次赋值,但是只有最后的赋值语句有效,即整个进程执行到最后一条语句时进程接下来挂起时,数据才发生带入(最后举例说明)。⑥ 进程外部信号赋值时,不能对同一个信号多次赋值。四、信号与变量进行对比

主要通过下列代码A与代码B的运行结果进行对比分析

代码A:

Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity contrast is Port(a,b:in integer range 0 to 7;	c,d:out integer range 0 to 15);End Entity contrast;Architecture behave of contrast isSignal d:integer range 0 to 15;BeginProc_A: Process(a,b,c,d)Begind<=a;x<=b+d;d<=c;y<=b+d;End process Proc_A;

代码B:

Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity contrast is Port(a,b:in integer range 0 to 7;	c,d:out integer range 0 to 15);End Entity contrast;Architecture behave of contrast isBeginProc_B: Process(a,b,c,d)Variable d:integer range 0 to 15;Begind:=a;x<=b+d;d:=c;y<=b+d;End process Proc_B;

代码A与代码B运行结果进行对比:

代码A运行结果:

x<=b+c;y<=b+c;

因为进程A中的信号赋值可以进程多次,但是只有最后一次有效,并且还是等进程结束挂起时才会执行。

代码B运行结果:

x<=b+a;y<=b+c;

因为进程B中,d为变量赋值,是立即生效,所以d的值会立刻等于a,之后又立刻等于c,才有最后的输出结果。

结尾

通过阅读本文,对于VHDL中的数据对象你学会了吗?有问题欢迎留言讨论,一起学习,共同进步。

标签: #vhdl语言简介