三、VHDL语言基础

更新时间:2024-05-21 16:30:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第三章 VHDL语言基础

本章介绍VHDL语言的基础知识,具体内容包括: 1、概述

2、VHDL程序的基本结构

库、程序包、实体说明、结构体、配置 3、VHDL的语言要素

语法规则、数据对象、数据类型、运算操作符 4、VHDL的描述语句

并行语句、顺序语句、子程序、属性语句

5、VHDL的描述方式

行为描述方式、寄存器传输级描述方式、结构描述方式

第一节 概述

HDL(Hardware Description Language):硬件描述语言,描述数字电路和系统的语言。具体来说,用于描述数字系统的结构、行为、功能和接口。

在EDA设计中,设计者利用硬件描述语言,可以描述自己的设计思想,完成设计输入的步骤。设计输入共有三种方法——原理图、文本、波形输入,其中,文本输入方式就是用硬件描述语言跟计算机交流,让计算机读懂设计者的设计。 VHDL的全称是Very-High-Speed Integrated Circuit Hardware Description Language,译作甚高速集成电路硬件描述语言,是当前广泛使用的HDL语言之一,并被IEEE和美国国防部采用为标准的HDL语言。 1、发展历程:

美国国防部1982年开发VHDL语言,在1987年被IEEE采用为标准硬件描述语言。在实际使用过程中,发现1987年版本的缺陷,并于1993年对87版进行了修订。因此,现在有两个版本的VHDL语言。 1)1987年的IEEE 1076(VHDL87) 2)1993年进行了修正(VHDL93)

VHDL语言目前已成为,开发设计可编程逻辑器件的重要工具。 2、优点:

VHDL语言能够成为标准化的硬件描述语言并获得广泛应用,它自身必然具有很多其他硬件描述语言所不具备的优点。归纳起来,VHDL 语言主要具有以下优点:

? 功能强大,设计方式多样

VHDL具有功能强大的语言结构, 可用简洁明确的代码来描述十分复杂

的硬件电路。

VHDL 语言设计方法灵活多样,既支持自顶向下的设计方式,也支持自

底向上的设计方法;既支持模块化设计方法,也支持层次化设计方法。 (自上而下:“上”指的是整个数字系统的功能和定义,“下”指的是组成系统的功能部件(子模块)。自上而下的设计,就是根据整个系统的功能,按照一定的原则把系统划分为若干个子模块,然后分别设计实现每个子模块,最后把这些子模块组装成完整的数字系统。)

? 具有强大的硬件描述能力

VHDL 语言具有多层次描述系统硬件功能的能力,既可描述系统级电路,也可以描述门级电路。

描述方式既可以采用行为描述、寄存器传输描述或者结构描述,也可以采用三者的混合描述方式。 ? VHDL 语言的强大描述能力还体现在它具有丰富的数据类型。VHDL

语言既支持标准定义的数据类型,也支持用户定义的数据类型,这样便会给硬件描述带来较大的自由度。 ? 具有很强的移植能力

因为VHDL是一个标准语言, 故VHDL的设计描述可以被不同的工具所支持, 可以从一个模拟工具移植到另一个模拟工具, 从一个综合工具移植到另一个综合工具, 从一个工作平台移植到另一个工作平台去执行。 ? 设计描述与器件无关(可以与工艺无关编程)

采用 VHDL 语言描述硬件电路时,设计人员并不需要首先考虑选择进行设计的器件。这样做的好处是可以使设计人员集中精力进行电路设计的优化,而不需要考虑其他的问题。当硬件电路的设计描述完成以后,VHDL 语言允许采用多种不同的器件结构来实现。若需对设计进行资源利用和性能方面的优化, 也并不是要求设计者非常熟悉器件的结构才行。 ? 易于共享和复用

VHDL 语言采用基于库的设计方法。在设计过程中,设计人员可以建立各种可再次利用的模块,一个大规模的硬件电路的设计不可能从门级电路开始一步步地进行设计,而是一些模块的累加。这些模块可以预先设计或者使用以前设计中的存档模块,将这些模块存放在库中,就可以在以后的设计中进行复用。也就是说,VHDL 语言可以使设计成果在设计人员之间方便地进行交流和共享,从而减小硬件电路设计的工作量,缩短开发周期。 ? 具有良好的可读性

容易被读者理解。

3、VHDL的学习:

VHDL的语言形式与一般的计算机高级语言(C语言)非常类似,可以借鉴其他语言的学习方法。但VHDL作为一种硬件描述语言,具有许多与硬件相关的特征,学习的时候一定要特别注意。 ? VHDL的可综合性问题

VHDL有两种用途:系统仿真和硬件实现。如果程序只用于仿真,那么几乎所有的语法和编程方法都可以使用。但如果程序是用于硬件实现,那么就必须保证程序“可综合”(程序的功能可以用硬件电路实现)。

不可综合的VHDL语句在软件综合时将被忽略或者报错。应当牢记一点:

“所有的VHDL描述都可以用于仿真,但不是所有的VHDL描述都能用硬件实现。”

? 充分理解HDL语句和硬件电路的关系

学好HDL的关键是充分理解HDL语句和硬件电路的关系。 编写HDL,就是在描述一个电路,设计者写完一段程序以后,应当对生成的电路有一些大体上的了解,而不能用纯软件的设计思路来编写硬件描述语言。 ? 语法掌握贵在精,不在多

30%的基本HDL语句就可以完成95%以上的电路设计,很多生僻的语句并不能被所有的综合软件所支持,在程序移植或者更换软件平台时,容易产生兼容性问题,也不利于其他人阅读和修改。建议多用心钻研常用语句,理解这些语句的硬件含义,比多掌握几个新语法要有用的多。 ? 多维并行的思路

传统的软件编程语言永远是单向和一维的。根据CPU的工作方式,以排队式指令的形式来对特定的事件和信息进行控制或接收,在CPU工作的任一时间段只能完成一种操作。

VHDL则不同,它必须适应实际电路系统的工作方式,以并行和顺序的多种语句方式来描述事件。电路系统本质上是有许多并行工作的门电路组成。VHDL正是从这种电路系统构成思想出发的。因此,设计者在学习和应用VHDL语言时,要建立起并行设计的思想。 4、VHDL与Verilog HDL

选择VHDL还是Verilog HDL?这是一个初学者最常见的问题。其实两种语言有类似的地方,掌握其中一种语言以后,可以通过短期的学习,较快的学会另一种语言。当然,如果从事集成电路设计,则必须首先掌握Verilog,因为在IC设计领域,90%以上的公司都是采用Verilog进行IC设计。对于PLD/FPGA设计者而言,两种语言可以自由选择。

? VHDL语法严格,书写规则比Verilog繁琐一些;而Verilog HDL是在C

语言的基础上发展起来的一种硬件描述语言,语法较自由,但Verilog自由的语法也容易让少数初学者出错。 ? 二者描述的层次不同。VHDL语言更适合行为级和RTL级的描述,Verilog

HDL通常只适用于RTL级和门电路级的描述。

VHDL是一种高级描述语言,适用于描述电路的行为,即描述电路的功能,然后由综合器根据功能要求来生成符合要求的电路网表;Verilog HDL是一种较低级的描述语言,适用于描述门级电路,描述风格接近与原理图,从某种意义上来说,它是原理图的高级文本表示方式。

VHDL虽然也可以直接描述门电路,但这方面能力不如Verilog HDL;反之,在高级描述方面,Verilog HDL则不如VHDL。

? 在VHDL设计中,大量的工作是由综合器完成的,设计者所做的工作相

对较少;Verilog HDL设计中,设计者的工作量通常比较大,对设计人员的硬件水平要求比较高。

? 与VHDL相比Verilog HDL的最大优点是:它是一种非常容易掌握的硬

件描述语言,只要有C语言的编程基础,通过二十学时的学习,再加上一段实际操作,一般读者可在二至三个月内掌握这种设计技术。

而掌握VHDL设计技术就比较困难。这是因为VHDL不很直观,需要有EDA编程基础,一般认为至少需要半年以上的专业培训,才能掌握VHDL的基本设计技术。但在熟悉以后,设计效率明显高于Verilog HDL。

第二节 VHDL程序的基本结构

完整的VHDL语言程序通常包含实体(ENTITY)(实体说明+结构体ARCHITECTURE)、库(LIBRARY)、程序包(PACKAGE)和配置

(CONFIGURATION):

实体——基本单元,简单的可以是一个与非门,复杂的可以是一个系统。由两部

分构成:

实体说明——用于描述所设计系统的外部接口信号、类属参数; 结构体——用于描述系统内部的结构和行为;

库 —— 存放已经编译的实体、结构体、程序包和配置;

程序包—— 存放各设计模块都能共享的数据类型、常数和子程序等;

配置 —— 为实体指定结构体(用于从库中选取所需单元来组成系统设计的不

同版本)。

VHDL程序举例:二输入与非门 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164. ALL;

ENTITY nand2_1 IS

PORT(a, b: IN STD_LOGIC; y: OUT STD_LOGIC); END nand2_1;

ARCHITECTURE behav OF nand2_1 IS BEGIN

y<=a NAND b; END behav;

一、库(LIBRARY)

用来存储预先完成的程序包、数据集合体和元件的仓库。

库的作用在于它可以使设计者共享已经编译过的成果和有用数据。 1、库的种类 ? IEEE 库

最常见的库,存放的元件、函数都是IEEE标准、或者其他一些工业标准认可的。

包含:STD_LOGIC_1164 STD_LOGIC_ARITH

STD_LOGIC_UNSIGNED

其中,STD_LOGIC_1164是最重要和最常用的程序包,大部分基于数字系统设计的程序包都以此为基础。 ? STD库

标准库,包含一些预定义的数据类型和函数 包含:STANDARD、TEXTIO程序包

标准库,使用VHDL时一定会用到,但不需要声明。 ? WORK 库

为现行作业库,存放设计者的VHDL语言程序。临时的“仓库”,用来存放用户定义的成品或半成品。 使用时也不需要声明。 ? 用户定义的库

各公司提供的一些资源库,用户自己建立的库等。? 2、库的使用 ? 一个VHDL程序需要使用库中的单元时,需要在每个实体开始时,进行声明。格式:

LIBRARY [库名]; USE [库名.包名.项目名];

需要在每个实体开始时说明引用的库,然后使用USE语句来指明要使用库中的哪一个设计单元。 例: LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

STD库、WORK 库由VHDL标准规定的,对所有项目都默认可见的,使用时不需要声明。

二、程序包(PACKAGE)

在编写VHDL程序的过程中,一个设计实体中的各种定义(数据类型、函数等)只能够在本设计实体中使用,而其他设计实体来说则是不可见的。为了使已定义的这些设计单元能被更多的设计实体访问和共享,可以将它们收集在一个VHDL程序包中。

可以存储常量说明、数据类型说明、元件定义、子程序等。 1、程序包的结构:

PACKAGE 程序包名 IS [说明语句]; END程序包名;

PACKAGE BODY程序包名IS [子程序体]; END程序包名;

一个完整的程序包一般由程序包首和程序包体两个部分组成。其中,程序包首主要对数据类型、子程序、常量等进行说明;程序包体用来规定程序包的实际功能。 例:

PACKGE mathx IS

CONSTANT aq: STD_LOGIC_VECTOR(2 DOWNTO 0) := \ --定义常量 TYPE tw32 IS ARRAY(31 DOWNTO 0) OF STD_LOGIC; --定义数据类型 FUNCTION max(a, b: IN INTEGER) RETURN INTEGER; --函数说明 END mathx;

PACKAGE BODY mathx IS

FUNCTION max(a, b: IN INTEGER) RETURN INTEGER IS BEGIN

IF (a>=b) THEN RETURN a; ELSE RETURN b; END IF; END max; END mathx;

2、程序包的使用:

USE [库名.程序包名.项目名];

例如:USE IEEE. STD_LOGIC_1164. ALL; 3、常用的预定义程序包

STD_LOGIC_1164、STD_LOGIC_ARITH、STANDARD 三、实体说明

实体说明部分指定了设计单元的输入、输出端口或引脚,它是设计实体对外的一个通信界面,是一个器件的外部视图,是外界可以看到的部分。 一般格式:

ENTITY 实体名 IS

GENERIC(类属参数说明); PORT(端口说明); END 实体名; ?以“ENTITY 实体名 IS”开始,至“END实体名”结束。 1、类属参数说明: 在端口说明前,用于设置实体与外部电路间的静态参数,用来规定端口的大小、实体中子元件的数目等。

格式:GENERIC (参数名:数据类型:= 缺省值;

??

参数名:数据类型:= 缺省值); 2、端口说明:

用于描述实体和外部电路的接口信号,外部引脚信号的名称、数据类型和输入输出方向。

格式:PORT (端口名,端口名:端口方向 数据类型;

??

端口名,端口名:端口方向 数据类型); ? 端口名

设计者为接口取的名字。 ? 端口方向:

端口处的数据流动方式。

IN (输入端口):只允许信号流入端口,用于时钟输入、控制输入(装入、

复位、使能)、单向数据输入;

OUT (输出):只允许信号流出端口,用于不能反馈的输出; INOUT(输入输出双向端口):既可以输入,又可以输出;

BUFFER(缓冲端口):类似于输出端口,不同——可以用于输出信号到外

部,也可以用于端口信号的内部反馈。

LINKAGE:说明端口无指定方向,无论哪个方向的信号都可以连接。 ? 数据类型:

VHDL是一种强类型语言,需要对数据类型作明确的界定。提供10种数据类型,但端口描述中的数据类型一般只有两类:位(BIT)和位矢量类型(BIT_VECTOR)。若端口的数据类型定义为BIT,则其信号值是一个1位的二进制数,取值是0或1;若端口的数据类型定义为BIT_VECTOR,则其信号值是一组二进制数。 ?

3、例子

ENTITY comp IS

GENERIC(N : INTEGER := 8 );

PORT ( x, y : IN BIT_VECTOR ( 0 TO N-1); equal: OUT BIT); END comp; 四、结构体

结构体描述设计实体的逻辑结构和逻辑功能,是外界看不到的部分。每个实体可以有多个结构体,但同一结构体不能为不同的实体所共有。 格式:ARCHITECTURE 结构体名OF 实体名 IS 说明语句;

BEGIN

并行处理语句;

END 结构体名;?

? 说明语句

位于ARCHITECTURE 和BEGIN之间,对结构体内部的使用信号、常数、数据类型和函数进行说明。

例:ARCHITECTURE behav OF flips IS SIGNAL q : BIT;

BEGIN ??

END behav; ? 并行语句

位于BEGIN 与END之间,描述结构体的行为与连接关系。 并行执行,跟书写顺序无关

子结构描述:在规模较大的电路设计中,全部电路都用唯一的一个模块来描述是非常不方便的。为此,电路设计者总希望将整个电路分成若干个相对比较独立的模块来进行电路的描述。这样,一个结构体可以用几个子结构来构成。VHDL语言可以有以下三种形式的子结构描述语句:

进程(PROCESS) 模块(BLOCK)

子程序(SUBPROGRAM):过程(PROCEDURE)、函数(FUNCTION) 五、配置

描述层与层之间的连接关系以及实体与结构体之间的连接关系。设计者可以利用这种配置语句来选择不同的结构体,使其与要设计的实体相对应。

如果一个实体具有多个结构体,必须用配置语句进行说明,指定其中一个。 默认的配置方式:

CONFIGURATION 配置名 OF 实体名 IS FOR 所选结构体名 END FOR; END 配置名; 例:

CONFIGURATION my_config OF counter3 IS FOR my_arch

END FOR; END my_config;

第三节 VHDL的语言要素

一、语法规则 1、标识符

最常用的操作符,标识符的用法规定了VHDL书写符号的一般规则。可以是常数、变量、信号、端口、子程序或参数的名字。 1)短标识符 VHDL’87版

有效字符:英文字母、数字和下划线; 必须以英文字母开头;

下划线前后必须有英文字母或数字; 不能使用VHDL保留字;

不区分大小写:EDA= eda= Eda(一般保留字用大写,用户定义的符号小写)。 2)扩展标识符 VHDL’93版支持 用反斜杠来界定;

允许空格、图形符号; 可以用数字开头;

允许多个下划线相邻; 可以用保留字; 区分大小写;

\\te\\\\xe\\表示te\\xe;

注意:目前很多VHDL工具软件不支持扩展标识符。 2、数字 1)整数

十进制整数;如:012,12_3,2E3 前面可加0,中间不能加0;

相邻数字之间可插入下划线_,但不允许存在空格。 2)实数

十进制,但必须要有小数点,如1_2.0,2.5E2 3)以数制基数表示的数字

形式:基数#整数或者实数#E指数

2进制:2#11_11#,2#1011#E4,2#100.1111#E2 16进制:16#5A#,16#28_C#E4,16#22.8FF#E3 3、字符和字符串

字符:被单引号括起来的ASCII字符,数值、符号、字母。如'a'、'0'、'*'; 文字字符串:被双引号括起来的一串文字,如\、\!%\;

位矢量字符串:被双引号括起来的数字序列,其前冠以基数说明符(B、O、X);

B:在字符串中每一个位表示一个二进制数; O:在字符串中每一个数代表一个八进制数; X:在字符串中每一个数代表一个十六进制数;

如:B\,O\,X\; 4、下标名和下标段名

用于指示数组型变量或信号的某一元素或某几个元素,如a(3)、a(3 TO 5)。 5、其他 注释:‘--’,且只在该文本行有效; 分隔:‘;’为行分隔,VHDL的语句行可写在不同文本行中;

空格:除关键字、标识符自身中间不能插入空格外,其他地方可插入任意数目的空格。 二、数据对象

可以赋值的对象,在VHDL中,数据对象有三种:常量、变量和信号。前两种在计算机高级语言中都有相对应的,意义也类似。信号这一数据对象比较特殊,具有更多的硬件特征,是VHDL语言的特色之一。 1、常量

在VHDL程序中值一经定义,就不再发生变化的量。 常量在使用之前必须要进行说明,说明语句格式: CONSTANT 常量名:数据类型 := 表达式; ? 例:CONSTANT vcc : REAL := 5.0; CONSTANT delay: TIME := 10 ns;

* 常量赋值后不能变,赋的值要与数据类型一致;

* 常量的使用范围取决于它被定义的位置。在程序包中说明的常数为全局量;在实体说明部分的常数可以被该实体中任何结构体引用,在结构体中的常数能被其结构体内部任何语句采用,包括被进程语句采用;在进程说明中说明的常量只能在进程中使用。 2、变量

用做局部的数据存储 ? 说明语句的一般格式:

VARIABLE变量名:数据类型 [:= 初始值]; ? 例:VARIABLE x,y: INTEGER;

VARIABLE count: INTEGER RANGE 0 TO 255 := 10; * 局部量,只能在进程、函数或过程中使用。 * 赋值语句的一般格式 变量名:= 表达式;

例 x := 100.0; y := 1.5+x; 赋值立即生效,不能附加延时 3、信号

类似于电路内部的连接线,可以作为实体中语句模块间的信息交流通道。 说明语句的一般格式: ? SIGNAL信号名:数据类型 [:=初始值]; 例:SIGNAL ground: BIT : = '0';

SIGNAL en : STD_LOGIC_VECTOR(7 DOWNTO 0);

* 通常在结构体、程序包、实体中说明。全局信号在程序包中说明,它们被所有的实体分享。

* 赋值语句 信号名 <= 表达式 [AFTER 时间表达式]; 如:s1 <= s2 AFTER 10ns;

信号赋值可以有附加延迟:即s2经过10ns的延迟后,其值才赋值到s1中。 4、信号与变量的区别

? 信号是全局量,变量为局部量(只在进程、过程、函数中使用)。? ? 变量赋值立即发生,无延迟;信号赋值可以附加延时。 ? 变量赋值用“:=”,信号“<=”; 三、数据类型

VHDL是一种强类型语言,对数据对象的数据类型有严格的要求,要求是实体中的每一个常量、变量、信号等都必须具有确定的数据类型,只有相同数据类型的量才能相互传递和作用。

VHDL的数据类型包括两大类,一类是预定义数据类型,另一类是自定义数据类型。

1、预定义数据类型

是指已经在VHDL标准中预先定义的类型,可直接使用。STD库中的程序包STANDARD中定义,不必用USE语句说明。 a)整数类型(INTEGER)

范围:-(231-1)~(231-1)。

在使用整数时,VHDL综合器要求用RANGE子句为所定义的数限定范围,然后根据所限定的范围来决定表示此信号或变量的二进制数的位数,因为VHDL综合器无法综合未限定范围的整数类型的信号或变量。

如:SIGNAL tmp: INTEGER RANGE 0 TO 15; b) 自然数和正整数类型

都是整数的子类型

NATURAL:零和正整数 POSITIVE:正整数 c) 实数类型(REAL)

一般来讲,VHDL仿真器支持实数,而VHDL综合器不支持实数 d) 字符类型(CHARACTER)

单引号,如'A'。字符类型区分大小写。 e) 字符串类型(STRING)

双引号,如\f) 布尔类型(BOOLEAN)

常用来表示信号的状态,取值FALSE和TRUE两种。 不能进行算术运算,但可以进行关系运算。 g) 位类型(BIT)

取值为逻辑0、1,在程序中将值放在单引号中,'0'、'1'。 h) 位矢量型(BIT_VECTOR)

由逻辑0、1组成的矢量串,在程序中放在双引号中,例如\i) 时间型(TIME)

时间型数据常在仿真中用到,表示信号延时。

包含整数和单位两部分,特别要注意,整数和单位之间至少应留一个空格的位置。如1000 sec

j) 错误等级类型(SEVERITY LEVEL)

用于表示电子系统的工作状态,在仿真时给设计者提供电子系统的工作情况,分为NOTE、WARNING、ERROR、FAILURE四种状态 2、标准逻辑位类型、标准逻辑矢量类型

IEEE库、STD_LOGIC_1164中预定义的两种常用数据类型,使用时需要用

USE语句说明。

a) 标准逻辑位(STD_LOGIC)

在VHDL语言中,由于BIT类型只能取值'0'、'1';而在实际的电路设计和仿真中,还存在不定态'X',高阻状态'Z'等其他状态,所以定义了STD_LOGIC类型。STD_LOGIC包含9种取值,可以使设计者精确模拟一些未知和高阻态的线路情况。

b) 标准逻辑矢量(STD_LOGIC_VECTOR)

一维数组,数组中的每一个元素的数据类型都是以上定义的STD_LOGIC型数据。

3、 自定义数据类型

除了上面介绍的标准类型,VHDL语言还允许用户自己定义数据类型,这给设计者带来了很大的方便。下面介绍几种常用的自定义数据类型。 1) 整数、实数类型

这两种在标准类型中已经存在,只不过是允许用户对取值范围加以限制。 定义的一般格式为:TYPE 数据类型名 IS 标准类型名 约束范围; 例如,要定义一个名为data 的整数类型,取值范围为-128到127,就是

TYPE data IS INTERGER RANGE -128 TO 127; 定义data类型的变量 VARIABLE m : data; 2) 枚举类型

枚举类型是把数据类型中各个可能的取值都列举出来。

定义的一般格式为:TYPE 数据类型名 IS (元素1,元素2,??); 例如,TYPE state IS (st0,st1,st2,st3); 3) 数组类型

是相同类型的数据集合。VHDL允许用户自定义两种不同类型的数组,即限定性数组和非限定数组。 ? 限定性数组

在定义时确定数组下标的取值范围,一般格式为

TYPE 数组类型名 IS ARRAY (数组范围) OF 数据类型;

例如 TYPE word IS ARRAY (0 TO 7) OF BIT; 定义了一个名为word的数组类型,包含8个元素,这8个元素的数据类型是相同的,都是BIT类型的。

用word来定义信号:

TYPE word1 IS ARRAY (0 TO 7) OF BIT; SIGNAL a : word1;

则a的元素包含——a(0)、a(1)??a(7)

TYPE word2 IS ARRAY (7 DOWNTO 0) OF BIT; SIGNAL a : word2;

则a的元素包含——a(7)、a(6)??a(0) ? 非限定性数组

在定义时并不说明数组下标的取值范围,而是在定义具体的数据对象时才说明,一般格式:

TYPE 数据类型名 IS ARRAY (数组下标名 RANGE <>) OF 数据类型; 非限定数组与限定性数组的区别就在于,只给出数组下标名,以及特定的符号。在定义数组类型时,并不知道数组的元素个数。当用到该数组类型时,再填

入具体的数值范围。

例:TYPE www IS ARRAY (xb RANGE <>) OF BIT;

VARIABLE vv : www (1 TO 6); ? 数组赋值

整体赋值 a <= \

逐一赋值 a(7) <= '0'; a(6) <='1' ; ??; a(0) <= '1'; 4) 记录类型

记录可以将不同类型的数据组织在一起。 ? 定义的一般格式为

TYPE 数据类型名 IS RECORD 元素名:数据类型名;

元素名:数据类型名;

……

END RECORD;

在定义记录类型的数据时需要一一定义。例: TYPE bank IS RECORD

add : STD_LOGIC_VECTOR (7 DOWNTO 0); bdd : STD_LOGIC;

cdd : INTEGER RANGE 0 TO 255; ddd : state; END RECORD; ? 记录赋值

整体赋值 SIGNAL xx : bank := (\逐一赋值 SIGNAL xx : bank;

xx.add <= \ xx.bdd <= '0'; xx.cdd <= 1; xx.ddd <= st0;

4、 类型转换:

VHDL规定,不同类型的数据之间不能直接进行运算和赋值。不同类型的数据必须在类型转换后才能进行运算或操作。常用的是函数转换法。

在VHDL中,很多程序包都提供转换函数,常见的程序包有: STD_LOGIC_1164、STD_LOGIC_UNSIGNED、STD_LOGIC_ARITH 例:在STD_LOGIC_1164程序包中函数TO_STDLOGIC(A)的作用——由BIT类型转换成 STD_LOGIC类型。 四、运算操作符

逻辑运算符、关系运算符、算术运算符、并置运算符 1、逻辑运算符

NOT(非) OR(或) AND(与) NOR(或非) NAND(与非) XOR(异或)XNOR(异或非)

? 操作数类型:STD_LOGIC, BIT, STD_LOGIC_VECTOR, BIT_VECTOR, BOOLEAN; ? 操作数必须同类型;数组操作数必须同长度;作用于两个数组操作数的

逻辑运算符就是作用在两数组相应的元素对上,运算结果为同长度数组。

? NOT优先级最高,其他优先级相同。表达式左右无优先级差别,必要时加括号;当表达式中仅有AND, OR, XOR运算符时,可省略括号。 ?例:

SIGNAL a,b,c: BIT_VECTOR(3 DOWNTO 0); SIGNAL d,e,f,g: BIT_VECTOR(1 DOWNTO 0); SIGNAL h,i,j,k: BIT; 正确的逻辑运算: a <= b AND c;

d <= e OR f OR g;

h <= (i NAND j) NAND k; 错误的逻辑运算:

a <= b AND e; --数组操作数必须大小相同; h <= d OR h; --操作数必须类型相同; h <= i AND j OR k; --需括号; 2、关系运算符 ? ( =, /=, < , <= , > , >= )6种,比较同类型的两个操作数,返回一个BOOLEAN值(TRUE、FALSE)。 ? 关系运算两边数据类型必须相同,但位长可以不同

<= 与信号赋值语句的符号相同,读程序时按上下文来判断。 3、算术运算符 ? + , -, * , / , MOD(求模), REM(取余),+ (正号), -(负号),**(乘方), ABS(取绝对值) ? 求模和取余的操作数必须为整型; ? 指数运算的左操作数可为整或实型,而右操作数为整型; ? 只有\才能综合。 ? 例:

SIGNAL a,b,c,d,e,f,g,h,i: INTEGER RANGE 0 TO 15; SIGNAL j,k,l,m,n: INTEGER RANGE 0 TO 3; j <= k+l;

i <= -b;

a <= b * 4; c <= d / 4; e <=f MOD 4; g <=h REM 4; h<=ABS(c); f<=2 ** m; 4、并置运算符

&——位的连接和位矢量的连接 例:

data_a <= \data_b <= \

data_c <= data_a & data_b; \5、操作运算符的优先级 最高:NOT, ABS, **

*, /, MOD, REM +, -(正负号) +, -, &

=, /=, < , <= , > , >=

最低:OR、AND、NOR、NAND、XOR、XNOR 注意:为了阅读程序的方便,尽可能加括号。

第四节 VHDL的描述语句

在VHDL中,一个设计实体的行为和结构是通过结构体来实现的,而结构体是采用一些基本描述语句来组合描述的。VHDL的基本描述语句包括并行语句和顺序语句。

并行语句:在语句的执行过程中,语句的执行顺序与书写顺序无关,所有语

句并发执行。

顺序语句:语句的执行顺序按照书写顺序依次执行。 一、并行语句

各种并行语句同步执行。

在每一并行语句内部,语句运行方式可以有两种:并行执行方式(如块语句)和顺序执行方式(如进程语句)。 常见的并行语句有: ? 进程语句 ? 块语句

? 并行信号赋值语句 ? 并行过程调用语句 ? 元件例化语句 ? 生成语句

? 并行断言语句

1、进程语句(PROCESS)

使用最为频繁的一种语句。一个结构体可以包含一个或多个进程语句,各个进程语句之间是并发执行的。而在每一个进程语句中,组成进程的各个语句则是顺序执行的。进程语句同时具有并行描述语句和顺序描述语句的特点。 ? 语句格式

[进程标号:] PROCESS(敏感信号表)

进程说明部分;

BEGIN

顺序描述语句;

END PROCESS [进程标号];

多个进程时,需要进程标号。

敏感信号表是列出用于启动本进程的信号名,通常应将进程中的所有输入信号都列入敏感信号表中,只有当敏感信号表中的某个信号发生变化时,该进程才被激活。不要把变量列入,因为进程只对信号敏感。

进程说明:进程中用到的变量说明,不允许定义信号。 顺序描述语句:语句顺序执行。

? 执行状态和等待状态

只要有一个敏感信号发生变化,进程中语句将从上到下逐句执行一遍,最后一个语句执行完毕后,返回进程开始的语句,等待下一次敏感表的变化。 ? 另一种进程语句格式

[进程名]:PROCESS

[进程说明部分];

BEGIN

顺序语句; WAIT语句;

END PROCESS [进程名];

无敏感信号,用WAIT语句启动进程。 ? 进程举例(见并行语句演示程序) 2、块语句(BLOCK) ? 块语句是VHDL中具有的一种划分机制,允许设计者合理分组一个模型的区域,即把类似的部分由块语句保持在一起。例如设计CPU,算术逻辑单元一个块、寄存器堆一块,而移位寄存器是另一个块。BLOCK为并发语句,其所包含的语句也是并发语句。 ? 语句格式

块标号:BLOCK 块说明; BEGIN

并行语句;

END BLOCK 块标号; 必须要有块标号。

说明部分:信号说明;块中所说明的目标在该BLOCK中都是可见的。 并发语句:并发执行,与书写顺序无关。 例 b1: BLOCK

SIGNAL s: BIT; BEGIN

s<=a AND b; END BLOCK b1;

? 举例(见并行语句演示程序) 3、并行信号赋值语句

VHDL提供3种并行信号赋值语句,分别是简单信号赋值语句、条件信号赋值语句、选择信号赋值语句。 ? 简单并行信号赋值语句

在结构体的进程之外使用,等价于包含顺序赋值语句的进程; ? 格式:赋值目标 <= 表达式 [AFTER 时间表达式]; ? 例:

ARCHITECTURE behav OF bbb IS SIGNAL x, y, z: STD_LOGIC; BEGIN

x <= a(i); y <= b + c;

本文来源:https://www.bwwdw.com/article/98f7.html

Top