当前位置:文档之家› 从Verilog到VHDL(上)基本语法

从Verilog到VHDL(上)基本语法

从Verilog到VHDL(上)基本语法
从Verilog到VHDL(上)基本语法

从Verilog到VHDL(上)基本语法

16六

从学校里开始,我所接触的就一直是VerilogHDL而非更老牌的VHDL,而且后续接触的项目中也多半是Verilog的用户,坦白的讲,Verilog的活力也确实更足一些,从

IEEE1800-2005开始的SystemVerilog的标准化,将Verification和Design的一体化的尝试,我个人认为,是走在正确的道路上。

所以,我确实想不到,我竟然也要回头学起VHDL来了,毕竟一些老牌公司,特别是欧洲的公司,往往因为历史原因,仍然在使用VHDL,看来终究是绕不过去的了——正如一个Design Verification工程师在目前想完全的不和SpecmanE 打交道是很难的一样。

下面记载的是两种语言学习过程中的一些体会,而且更多的是从语法角度出发,算是梳理一下思路吧,而且,以前从来没有接触过VHDL,当然会存在很多非常初级的东西。

而在本文之后,打算再写一篇简单阐述下结合Cadence的IUS工具,使用SystemVerilog对VHDL进行验证的基本方

法。

起手式

从Verilog撞进VHDL的世界,有些东西要先搞清楚,否则会一头雾水:

1. 大小写敏感:Verilog是大小写敏感的,VHDL则非;

2. 注释:Verilog的行注释为//,块注释为/**/;VHDL只支持行注释–;[1. 这个算是不方便的一个地方了,不过不论是在Vim还是Emacs当中,批量做行注释也很容易实现;] 基本结构

VHDL被认为是要求更严格,更多讲究的语言,相比和C类似的Verilog,架构上更严谨一些:

1. 基本结构:从上往下为

USE定义区(调用库和包);Package定义区(自定义程序包);Entity定义区(定义电路实体外观,I/O接口的规格);

[2. Entity感觉像是C的头文件定义之类的东西,而在Verilog 当中,这些其实都是被整合在Module里头一起完成

了。]Architecture定义区(描述内部功能);[3. 同上,相当于Verilog的Module内部实现。]Configuration定义区(决定那个Architecture被使用)[4. 这也许就是之所以要分开Arch和Entity的原因,类似的效果在Verilog里实现,则需

要使用那个configuration blocks/library map files这些在Verilog 2001当中增加的features,不过这些部分在Verilog 当中属于Beyond language,更多的是位于语言之上的scope中了。]

2. 并行与串行:

在这一点上,VHDL和Verilog有些类似,书写在Architecture 内的语句,直接被认为是并行执行,无论书写顺序的(就如同Verilog中的并列的Always语句块);而顺序执行的串行语句必须放置在进程语句(process)当中,正如Verilog的begin…end。

3. process:

和Verilog不同的是这里的Process是要求有敏感变量列表作为输入的,正如试图在Verilog中用Always语句实现组合逻辑时类似。所以当写这样的语句,不妨多回想Verilog中对于敏感变量列表的要求。

4. 例化:

在VHDL当中尝试例化一个entity,比起Verilog要麻烦不少。首先,必须在Architecture当中用Component语法来声明这个实体的Port和Generic(参数);然后才可在后续内容当中例化实体,并且用generic map和port map来进行参数

赋值和port连接。

5. 库,包和配置:

VHDL这方面的组织比起Verilog显然要严密多了,使用configuration,用简单的语句,就可以把不同的architecture 实现和entity实现绑定,而此时我们就能看出VHDL之所以要分开所谓entity和architecture的目的所在了。

CONFIGURATION 配置名OF 实体名IS

FOR 为实体选配的构造体名

END FOR;

END 配置名;

而事实上,configuration还可以直接指定某个Hierachy的某个实体究竟适用那种entity来例化,语法如下(参见VHDL Configuration):

configuration TopMixed of Top is —TopMixed是配置名,Top是实体名

for Structure —Structure 是结构体名,是和实体Top相对应的结构体

for B1: Blk —B1和B2

是结构体structure中的元件例化语句的标号

use entity Work.Blk(RTL);—此语句说明,在元件例化的时候,利用用户自定义

—的实体blk来例化,其结构体是RTL

end for;

for B2: Blk

use entity Work.GateLevelBlk(Synth)—此语句说明,元件例化B2时,利用实体

—GateLevelBLK对应的Synth构造体来例化

port map (IP => To_Vector(A),

To_Int8(OP) => F);

end for;

end for;

end TopMixed;

只不过这似乎太麻烦了一点。而Library和Package更好理解一些。用户可以将一些公共的定义统一靠Package和Package Body的关键字来定义到一个包里面去,而这些包又可以被编译在Library当中。不过Library的建立似乎只依赖于工具的解决,例如在编译的时候选择将包内容编译到某

个库之中,然后再使用。

使用的过程,则是利用Library,Use等关键字来import这些内容。而要提醒的是,当前编译代码都是被认为是缺省的编入到了work库当中,所以如果需要引用代码中定义的某个包内容,应该用work.

(packet_name).all之类的path来声明。

操作

1. 强类型语言:

VHDL是强类型语言,对类型要求非常严,一个对象只能有一种数据类型,而且不同类型数据间赋值是严格禁止的,这点Verilog用户应当注意。

2. Procedure和Function:

很好理解,直接对应Verilog的Task和Function,需要注意的就是在VHDL中还可以对Function进行重载,这个,也许有用吧。

3. 属性:

VHDL针对不同的对象,都具有不同的属性,这些属性不妨理解成Verilog当中的Predefined tasks or methods,但是似乎更加的丰富和多样,相信能够有效的减少代码量。

小结

本文目的不在于语法的教程或者指导(本来我也刚看VHDL

不过一个下午而已……),更希望能够迅速、扼要的抽出VHDL和Verilog的一些区别和共性,加速学习的过程。不过,我相信,一个熟悉Verilog的工程师,在吃透了上面这些不同点后,至少可以跌跌撞撞的开始写VHDL代码了,更多的东西,自然需要在实践中去体会和学习。

接下来,我的计划是结合Cadence的IUS工具,写一写最基本的SystemVerilog对于VHDL的验证的QuickStart了。

[5. 从目前了解的来看,VHDL对于验证方面的支持还真是有限,比起Verilog都有所不及,在最基本的打印,仿真控制上都要麻烦一些,所以,这种情况下,干脆一律交给SystemVerilog/Vera/E/去做,可能还更直接一些]

vhdl基本语法

VHDL 基础语法篇——VHDL VHDL硬件描述语言 1.1 VHDL概述 1.1.1 VHDL的特点 VHDL语言作为一种标准的硬件描述语言,具有结构严谨、描述能力强的特点,由于 VHDL语言来源于C、Fortran等计算机高级语言,在VHDL语言中保留了部分高级语言的原 语句,如if语句、子程序和函数等,便于阅读和应用。具体特点如下: 1. 支持从系统级到门级电路的描述,既支持自底向上(bottom-up)的设计也支持从顶向下 (top-down)的设计,同时也支持结构、行为和数据流三种形式的混合描述。 2. VHDL的设计单元的基本组成部分是实体(entity)和结构体(architecture),实体包含设 计系统单元的输入和输出端口信息,结构体描述设计单元的组成和行为,便于各模块之间数 据传送。利用单元(componet)、块(block)、过程(procure)和函数(function)等语句, 用结构化层次化的描述方法,使复杂电路的设计更加简便。采用包的概念,便于标准设计文 档资料的保存和广泛使用。 3. VHDL语言有常数、信号和变量三种数据对象,每一个数据对象都要指定数据类型,VHDL 的数据类型丰富,有数值数据类型和逻辑数据类型,有位型和位向量型。既支持预定义的数 据类型,又支持自定义的数据类型,其定义的数据类型具有明确的物理意义,VHDL是强类 型语言。 4. 数字系统有组合电路和时序电路,时序电路又分为同步和异步,电路的动作行为有并行 和串行动作,VHDL语言常用语句分为并行语句和顺序语句,完全能够描述复杂的电路结构 和行为状态。 1.1.2 VHDL语言的基本结构 VHDL语言是数字电路的硬件描述语言,在语句结构上吸取了Fortran和C等计算机高级 语言的语句,如IF语句、循环语句、函数和子程序等,只要具备高级语言的编程技能和数字 逻辑电路的设计基础,就可以在较短的时间内学会VHDL语言。但是VHDL毕竟是一种描述 数字电路的工业标准语言,该种语言的标识符号、数据类型、数据对象以及描述各种电路的 语句形式和程序结构等方面具有特殊的规定,如果一开始就介绍它的语法规定,会使初学者 感到枯燥无味,不得要领。较好的办法是选取几个具有代表性的VHDL程序实例,先介绍整 体的程序结构,再逐步介绍程序中的语法概念。 一个VHDL语言的设计程序描述的是一个电路单元,这个电路单元可以是一个门电路, 或者是一个计数器,也可以是一个CPU。一般情况下,一个完整的VHDL语言程序至少要包含程序包、实体和结构体三个部分。实体给出电路单元的外部输入输出接口信号和引脚信 息,结构体给出了电路单元的内部结构和信号的行为特点, 程序包定义在设计结构体和实体 中将用到的常数、数据类型、子程序和设计好的电路单元等。 一位全加器的逻辑表达式是: S=A⊕B⊕Ci Co=AB+ACi+BCi 全加器的VHDL程序的文件名称是fulladder.VHD,其中VHD是VHDL程序的文件扩展名, 程序如下: LIBRARY IEEE; --IEEE标准库 USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY fulladder IS -- fulladder是实体名称 PORT( A, B, Ci : IN STD_LOGIC; --定义输入/输出信号 Co, S : OUT STD_LOGIC ); END fulladder; ARCHITECTURE addstr OF fulladder IS --addstr是结构体名 BEGIN S <= A XOR B XOR Ci; Co <= (A AND B) OR (A AND Ci) OR (B AND Ci); END addstr; 从这个例子中可以看出,一段完整的VHDL代码主要由以下几部分组成: 第一部分是程序包,程序包是用VHDL语言编写的共享文件,定义在设计结构体和实体

vhdl语法格式(1)

上篇基础元素 目录:数据类型数据对象运算符语句基本程序结构电路描述方式 数据类型 预定义类型 bit bit_victor integer std_logic std_logic_victor 自定义类型 枚举类型 type 新数据类型 is (元素1, 元素2, ...) 例定义 type state_type is (s1, s2, s3. s4); -- 定义一个新类型state_type 引用 signal state : state_type; -- 定义一个信号state,类型为state_type 数组类型 type 数组 is array (范围) of 数据类型; 例定义 type byte is array (7 downto 0) of bit; -- 定义一个8bit的数组 type word is array (31 downto 0) of bit; -- 定义一个32bit的数组 数据对象 端口声明端口 : in | out 数据类型; -- 端口在特性上等同于信号,但赋值在entity的port中赋值端口 <= 表达式; 信号声明signal 信号 : 数据类型; 赋值信号 <= 表达式; 变量声明varable 变量 : 数据类型; 赋值变量 := 表达式; 常数声明常数 : 数据类型 := 数值; 运算符 算术运算 +, -, * 并置运算 & 关系运算 =, /=, <, <=, >, >= 逻辑运算 and, or, not, nand, nor, xor, xnor 语句 并行语句 ⑴信号赋值语句 简单信号赋值语句信号 <= 表达式; 选择信号赋值语句 with 选择表达式 select

vhdl基本语法(简略共34页)

VHDL硬件描述语言 1.1 VHDL概述 1.1.1 VHDL的特点 VHDL语言作为一种标准的硬件描述语言,具有结构严谨、描述能力强的特点,由于 VHDL语言来源于C、Fortran等计算机高级语言,在VHDL语言中保留了部分高级语言的原 语句,如if语句、子程序和函数等,便于阅读和应用。具体特点如下: 1. 支持从系统级到门级电路的描述,既支持自底向上(bottom-up)的设计也支持从顶向下 (top-down)的设计,同时也支持结构、行为和数据流三种形式的混合描述。 2. VHDL的设计单元的基本组成部分是实体(entity)和结构体(architecture),实体包含设 计系统单元的输入和输出端口信息,结构体描述设计单元的组成和行为,便于各模块之间数 据传送。利用单元(componet)、块(block)、过程(procure)和函数(function)等语句, 用结构化层次化的描述方法,使复杂电路的设计更加简便。采用包的概念,便于标准设计文 档资料的保存和广泛使用。 3. VHDL语言有常数、信号和变量三种数据对象,每一个数据对象都要指定数据类型,VHDL 的数据类型丰富,有数值数据类型和逻辑数据类型,有位型和位向量型。既支持预定义的数 据类型,又支持自定义的数据类型,其定义的数据类型具有明确的物理意义,VHDL是强类 型语言。 4. 数字系统有组合电路和时序电路,时序电路又分为同步和异步,电路的动作行为有并行 和串行动作,VHDL语言常用语句分为并行语句和顺序语句,完全能够描述复杂的电路结构 和行为状态。 1.1.2 VHDL语言的基本结构 VHDL语言是数字电路的硬件描述语言,在语句结构上吸取了Fortran和C等计算机高级 语言的语句,如IF语句、循环语句、函数和子程序等,只要具备高级语言的编程技能和数字 逻辑电路的设计基础,就可以在较短的时间内学会VHDL语言。但是VHDL毕竟是一种描述 数字电路的工业标准语言,该种语言的标识符号、数据类型、数据对象以及描述各种电路的 语句形式和程序结构等方面具有特殊的规定,如果一开始就介绍它的语法规定,会使初学者 感到枯燥无味,不得要领。较好的办法是选取几个具有代表性的VHDL程序实例,先介绍整 体的程序结构,再逐步介绍程序中的语法概念。 一个VHDL语言的设计程序描述的是一个电路单元,这个电路单元可以是一个门电路, 或者是一个计数器,也可以是一个CPU。一般情况下,一个完整的VHDL语言程序至少要包含程序包、实体和结构体三个部分。实体给出电路单元的外部输入输出接口信号和引脚信 息,结构体给出了电路单元的内部结构和信号的行为特点, 程序包定义在设计结构体和实体 中将用到的常数、数据类型、子程序和设计好的电路单元等。 一位全加器的逻辑表达式是: S=A⊕B⊕Ci Co=AB+ACi+BCi 全加器的VHDL程序的文件名称是fulladder.VHD,其中VHD是VHDL程序的文件扩展名, 程序如下: LIBRARY IEEE; --IEEE标准库 USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY fulladder IS -- fulladder是实体名称 PORT( A, B, Ci : IN STD_LOGIC; --定义输入/输出信号 Co, S : OUT STD_LOGIC ); END fulladder; ARCHITECTURE addstr OF fulladder IS --addstr是结构体名 BEGIN

VHDL常用语法列表

VHDL常用语法列表 1 VHDL语言的标识符 VHDL中的标识符可以是常数、变量、信号、端口、子程序或参数的名字。使用标识符要遵守如下法则: a)标识符由字母(A…Z;a…z)、数字和下划线字符组成。 任何标识符必须以英文字母开头。 末字符不能为下划线。 b)不允许出现两个连续下划线。 标识符中不区分大小写字母。 VHDL定义的保留子或称关键字,不能用作标识符。 c) VHDL中的注释由两个连续的短线(--)开始,直到行尾。 以下是非法标识符: -Decoder —起始不能为非英文字母 3DOP —起始不能为数字 Large#number —“#”不能成为标识符的构成符号 Data__bus —不能有双下划线 Copper_ —最后字符不能为下划线 On —关键字不能用作标识符。 注:在AHDL语言中标识符要区分大小写,但在VHDL语言中不区分大小写。所以写程序时,一定要养成良好的书写习惯,应用关键字时用大写,自己定义的标识符用小写。 2 VHDL的数据对象 标识符表示的几种数据对象的详细说明如下: 1) 常数(Constant ) 常数是一个固定的值,主要是为了使设计实体中的常数更容易阅读和修改。常数一被赋值就不能在改变。一般格式: CONSTANT 常数名:数据类型:=表达式; 例:CONSTANT Vcc: REAL: =5.0;--设计实体的电源电压指定 常数所赋得值应与定义的数据类型一致。 常量的使用范围取决于它被定义的位置。程序包中定义的常量具有最大的全局化特性,可以用在调用此程序包的所有设计实体中;设计实体中某一结构体中定义的常量只能用于此结构体;结构体中某一单元定义的常量,如一个进程中,这个常量只能用在这一进程中。 2) 变量(Variable) 变量是一个局部变量,它只能在进程语句、函数语句和进程语句结构中使用。用作局部数据存储。在仿真过程中。它不像信号那样,到了规定的仿真时间才进行赋值,变量的赋值是立即生效的。变量常用在实现某种算法的赋值语句中。 一般格式: VARIABLE 变量名数据类型约束条件:=表达式; 例:VARIABLE x,y:INTEGER; —定义x,y为整数变量 VARIABLE count: INTEGER RANGE0 TO255:=10; —定义计数变量范围 变量的适用范围仅限于定义了变量的进程或子程序中。若将变量用于进程之外,必须该值赋给一个相同的类型的信号,即进程之间传递数据靠的信号。

VHDL的基本描述语句

VHDL的基本描述语句有并行语句(Concurrent Statements)和顺序语句(Sequential Statements)两大类(如表8-3所示)。在系统设计中,这些基本描述语句从不同侧面完整地描述了数字系统的硬件结构和基本逻辑功能。 表8-3VHDL的并行语句和顺序语句 并行语句用于表示算法模块间的连接关系,相互之间无次序关系,它们是并行执行的,与书写顺序无关。VHDL的结构体由若干相互联系的并行描述语句组成,如图8-3所示。 并行描述语句在结构体中的语法格式如下: ARCHITECTURE 结构体名OF 实体名IS {说明语句} BEGIN {并行语句} END ARCHITECTURE 结构体名; 并行描述语句主要有:并行信号赋值语句(Concurrent Signal Assignments)、进程语句(Process Statements)、块语句(Block Statements) 、元件例化语句(Component Instantiations)、生成语

句(Generate Statements) 及并行过程调用语句(Concurrent Procedure Calls)等六种。其中,进程语句和块语句是两种最主要、最常用的并行描述语句。 本节介绍这六种并行描述语句及其功能。 一、进程语句(TOP) 进程PROCESS语句本身是并行描述语句,但却包含一系列顺序描述语句。所以,设计中各个进程是并行执行,而各进程内的顺序描述语句却是按顺序执行。 进程与其他部分的通信,是通过从进程外的信号或端口中读取或者写入值来完成。进程语句的语法格式如下: [进程名称:]PROCESS [(敏感表)] {进程声明} BEGIN {顺序语句} END PROCESS [进程名称]; 其中,进程声明是对子程序、类型、常量和变量等的说明;敏感表(Sensitivity_list)是所有敏感信号(包括端口)的列表;敏感表的语法格式为: 信号名称{,信号名称} 所谓进程对信号敏感,是指当信号发生变化时,能够触发进程中语句的执行。这种敏感方式有两种:显式敏感表形式和WAIT语句形式。如果进程包含wait或者ifevent语句,必定包含时序组件。此时,IEEE VHDL不允许有敏感表存在。所以,进程语句也为时序算法提供一种自然的手段。 二、块语句(TOP) 块BLOCK语句把几个并行语句打包成结构体的子模块,成为结构体中的一个单独块区域。块语句由一系列并行描述语句构成。块语句的语法格式如下: [块名称:]BLOCK [(表达式)] {块声明} BEGIN {并行语句} END BLOCK [块名称]; 其中,表达式是块的保护(Guard)条件;块声明是对子程序、类型、常量、信号和组件等的说明。 三、并行信号赋值语句(TOP)

从Verilog到VHDL(上)基本语法

从Verilog到VHDL(上)基本语法 16六 从学校里开始,我所接触的就一直是VerilogHDL而非更老牌的VHDL,而且后续接触的项目中也多半是Verilog的用户,坦白的讲,Verilog的活力也确实更足一些,从 IEEE1800-2005开始的SystemVerilog的标准化,将Verification和Design的一体化的尝试,我个人认为,是走在正确的道路上。 所以,我确实想不到,我竟然也要回头学起VHDL来了,毕竟一些老牌公司,特别是欧洲的公司,往往因为历史原因,仍然在使用VHDL,看来终究是绕不过去的了——正如一个Design Verification工程师在目前想完全的不和SpecmanE 打交道是很难的一样。 下面记载的是两种语言学习过程中的一些体会,而且更多的是从语法角度出发,算是梳理一下思路吧,而且,以前从来没有接触过VHDL,当然会存在很多非常初级的东西。 而在本文之后,打算再写一篇简单阐述下结合Cadence的IUS工具,使用SystemVerilog对VHDL进行验证的基本方

法。 起手式 从Verilog撞进VHDL的世界,有些东西要先搞清楚,否则会一头雾水: 1. 大小写敏感:Verilog是大小写敏感的,VHDL则非; 2. 注释:Verilog的行注释为//,块注释为/**/;VHDL只支持行注释–;[1. 这个算是不方便的一个地方了,不过不论是在Vim还是Emacs当中,批量做行注释也很容易实现;] 基本结构 VHDL被认为是要求更严格,更多讲究的语言,相比和C类似的Verilog,架构上更严谨一些: 1. 基本结构:从上往下为 USE定义区(调用库和包);Package定义区(自定义程序包);Entity定义区(定义电路实体外观,I/O接口的规格); [2. Entity感觉像是C的头文件定义之类的东西,而在Verilog 当中,这些其实都是被整合在Module里头一起完成 了。]Architecture定义区(描述内部功能);[3. 同上,相当于Verilog的Module内部实现。]Configuration定义区(决定那个Architecture被使用)[4. 这也许就是之所以要分开Arch和Entity的原因,类似的效果在Verilog里实现,则需

VHDL语法简单总结

VHDL语法简单总结 一个VHDL程序代码包含实体(entity)、结构体(architecture)、配置(configuration)、程序包(package)、库(library)等。 一、数据类型 1.用户自定义数据类型 使用关键字TYPE,例如: TYPE my_integer IS RANGE -32 TO 32; –用户自定义的整数类型的子集 TYPE student_grade IS RANGE 0 TO 100; –用户自定义的自然数类型的子集 TYPE state IS (idle, forward, backward, stop); –枚举数据类型,常用于有限状态机的状态定义 一般来说,枚举类型的数据自动按顺序依次编码。 2.子类型 在原有已定义数据类型上加一些约束条件,可以定义该数据类型的子类型。VHDL不允许不同类型的数据直接进行操作运算,而某个数据类型的子类型则可以和原有类型数据直接进行操作运算。 子类型定义使用SUBTYPE关键字。 3.数组(ARRAY) ARRAY是将相同数据类型的数据集合在一起形成的一种新的数据类型。 TYPE type_name IS ARRAY (specification) OF data_type; –定义新的数组类型语法结构 SIGNAL signal_name: type_name [:= initial_value]; –使用新的数组类型对SIGNAL,CONSTANT, VARIABLE进行声明 例如: TYPE delay_lines IS ARRAY (L-2 DOWNTO 0) OF SIGNED (W_IN-1 DOWNTO 0); –滤波器输入延迟链类型定义 TYPE coeffs IS ARRAY (L-1 DOWNTO 0) OF SIGNED (W_COEF-1 DOWNTO 0); –滤波器系数类型定义 SIGNAL delay_regs: delay_lines; –信号延迟寄存器声明 CONSTANT coef: coeffs := ( ); –常量系数声明并赋初值 4.端口数组

相关主题
文本预览
相关文档 最新文档