VHDL语言详解

合集下载

VHDL入门教程

VHDL入门教程

VHDL入门教程VHDL(Very High-speed Integrated Circuit HardwareDescription Language)是一种用于设计数字电路的硬件描述语言。

它是IEEE 1076标准中规定的一种语言,广泛应用于数字电路的设计、仿真和综合等领域。

本文将为大家介绍VHDL的基础知识和入门教程。

一、VHDL的基本概念1. 实体(Entity):VHDL代码的最高层次,用于定义模块的输入、输出和内部信号。

2. 架构(Architecture):定义了实体中的各个信号和组合逻辑的行为。

3. 信号(Signal):表示数据在电路中的传输和操作。

4. 进程(Process):定义了组合逻辑的行为,用于描述信号之间的关系。

5. 实体声明(Entity Declaration):用于描述模块的名称、输入、输出和内部信号。

6. 架构声明(Architecture Declaration):用于描述模块的内部逻辑。

二、VHDL的基本语法1.实体声明语法:```entity entity_name isport ( port_list );end entity_name;```其中,entity_name是实体的名称,port_list是实体的输入、输出和内部信号。

2.架构声明语法:```architecture architecture_name of entity_name issignal signal_list;beginprocess (sensitivity_list)begin--逻辑行为描述end process;end architecture_name;```其中,architecture_name是架构的名称,entity_name是实体的名称,signal_list是架构的内部信号,sensitivity_list是触发事件的信号列表。

三、VHDL的基本例子下面以一个简单的4位加法器为例介绍VHDL的编写和仿真流程。

第四讲VHDL语言基础知识

第四讲VHDL语言基础知识

关键词 VHDL 实体 逻辑功能
此两处必须同名
逻辑行为描述
1、实体
格式
ENTITY 实体名 IS [GENERIC ( 类属表 );] [PORT ( 端口表 );] END 实体名;
说明
实体说明所设计的逻辑电路的输入、输 出信号及其特性(输入(in)输出(out)、双向 (inout)、buffer)
•文件(FILES)是传输大量数据的客体,包含一些专门数据 类型的数值。
对象说明的一般格式是: <对象类型> < 标识符表>:<子类型说明> <信号种类>: =<表达式>; 说明 标识符 <子类型说明>是类型名或类型名加限制条件 <信号种类>为BUS或REGISTER,该项为任选项 :=<表达式>为对象赋初值
IS
一个包集合由包集合标题和包集合体两 大部分组成。 包集合体是一个可选项。
5、库
格式
LIBRARY 库名; USE 库名. 程序包名. All;
USE语句的使用有两种常用格式: USE 库名.程序包名.项目名 ; USE 库名.程序包名.ALL ;
VHDL库的种类
• IEEE库:IEEE标准库, 是按IEEE组织制定的 工业标准进行编写的, 是内容丰富的资源库 使用需声明 • •STD_LOGIC_1164 程序包 •STD_LOGIC_ARITH 程序包 •STD_LOGIC_UNSIGNED 程序包
STD库:VHDL标准库,STANDARD和 TEXTIO程序包即收入在STD库中 使用无需声明
VHDL库的种类
• • •
ASIC库:EDA厂商提供库 使用需声明 WORK库:现行作业库,当前工作目录的所有设计 使用无需声明 USER库:用户自定义库 使用需声明

第1章VHDL语言基础

第1章VHDL语言基础
(Bit)、位矢量型(Bit-vector)和整数型(Integer)等。 ➢ 在实用中,端口描述中的数据类型主要有两类:位(BIT)和
位矢量(BIT_VECTOR)。若端口定义为BIT,则其信号值 是一个1位的二进制数,取值只能是0或1;若端口定义为 BIT_VECTOR,则其信号值是一组二进制数。
➢ 在电路中,如果实体代表一个器件符号,则结构体描述了 这个符号的内部行为。当把这个符号例化成一个实际的器 件安装到电路上时,则需用配置语句为这个例化的器件指 定一个结构体(即指定一种实现方案),或由编译器自动选一 个结构体。
1. 结构体的一般语句格式 ARCHITECTURE 结构体名 OF 实体名 IS [说明语句;] BEGIN [功能描述语句;] END [ARCHITECTURE] [结构体名];
1.1 VHDL程序基本结构
一、VHDL程序设计约定 ➢ 语句结构描述中方括号“[ ]”内的内容为可选内容。 ➢ 对于VHDL的编译器和综合器来说,程序文字的大小写是不
加区分的。 ➢ 程序中的注释使用双横线“- -”。 ➢ 源程序命名与实体同名(MAX+plus Ⅱ要求)。
二、VHDL程序设计引例( 74LS00的设计 )
③ 信号赋值语句将设计实体内的处理结果向定义的信号或界面 端口进行赋值。
④ 子程序调用语句用于调用一个已设计好的子程序。
⑤ 元件例化语句对其他的设计实体作元件调用说明,并将此元 件的端口与其他的元件、信号或高层次实体的界面端口进行 连接。
A
A NAND2
Y
Y
B
B
(a)
A1
A NAND2
U1 Y
Y1
B1
B
A2
A NAND2

VHDL语言介绍

VHDL语言介绍

VHDL语言介绍VHDL(VHSIC Hardware Description Language)是一种硬件描述语言,用于描述数字电路的结构和行为。

它是一种高级编程语言,用于描述数字系统中的硬件功能。

VHDL是一种被广泛应用于数字系统设计的硬件描述语言,它可以用于描述数字系统的结构和功能,并且允许进行仿真、综合和验证。

VHDL最初是由美国国防部(DoD)为了应对不同供应商生产的不同硬件之间互通性的问题而开发的。

它提供了一种用于描述数字电路的方法,可以在不同供应商的工具之间进行交换。

VHDL已成为一种行业标准,在数字系统设计领域被广泛应用。

VHDL的语法类似于Ada编程语言,它使用关键字、运算符和数据类型来描述数字系统中的硬件元素。

VHDL中的关键概念包括实体(entity)、架构(architecture)和过程(process)。

实体描述了数字系统的接口和功能,架构描述了数字系统的内部结构和行为,而过程描述了数字系统中的操作和控制。

VHDL主要有两种用途,一是用于模拟和验证数字系统的功能,二是用于综合数字系统的设计,生成实际的硬件电路。

在模拟和验证阶段,设计师可以使用VHDL描述数字系统的功能,并通过仿真工具对其进行验证。

在综合阶段,设计师可以使用VHDL描述数字系统的结构,并通过综合工具生成对应的硬件电路。

VHDL的优点在于其强大的表达能力和灵活性。

设计师可以使用VHDL描述各种复杂的数字系统,包括处理器、通信接口、存储器等。

VHDL还提供了丰富的数据类型和运算符,使设计师可以轻松地描述数字系统中的各种操作。

除了描述数字系统的结构和行为,VHDL还提供了丰富的标准库和模块化编程的方法。

设计师可以使用标准库中提供的各种功能模块来加速开发过程,并且可以将自己设计的模块封装成库以便重复使用。

VHDL还支持面向对象的设计方法,设计师可以使用面向对象的技术来组织和管理复杂的数字系统。

通过使用面向对象的方法,设计师可以将数字系统分解成多个模块,每个模块都有自己的接口和功能,并且可以通过继承和复用来简化设计过程。

VHDL语言介绍

VHDL语言介绍
— 53 —
浙江大学电工电子教学中心 傅晓程
2.3 用户包集合说明及包集合体
为了使一组类型说明、常量说明、函数、过程等能被多个实体引用,可将这 些内容打包,单独编译,然后利用上述的包集合引用语句便可引用。对于一个大 型的设计系统,定义用户包,一方面可将大系统拆成小系统由多人共同完成,另 一方面也可使程序设计更加清晰。这部分通常不放在主程序设计之中,而是单独 编写并编译。但是,对于一个小的设计系统,也可将这部分插入主程序的设计之 中,或者干脆省略这部分内容。用户包集合说明及包集合体的编写见后面的内容。
SUBTYPE 子类型名 IS 数据类型名 <范围>; 例,SUBTYPE my_word IS STD_LOGIC_VECTOR(7 DOWNTO 0); 3.“STD_LOGIC”和“STD_LOGIC_VECTOR”数据类型 标准数据类型中的 BIT 和 BIT_VECTOR 是一个逻辑数据,只能取“1”或“0”, 不能仿真任意态“X”,及高阻“Z”等。IEEE1164 标准定义了 STD_LOGIC 类数据, 它是在基本类型数据基础上定义的一个枚举类数据类型,其定义为: TYPE STD_LOGIC IS (‘U’,‘X’,‘0’,‘1’,‘Z’,‘W’,‘L’,‘H’,‘-’); 其含义分别为初始值、不定态、逻辑 0、逻辑 1、高阻、弱信号不定、弱信号 0, 弱信号 1 和不可能状态。 四 属性
表 1.1 基本数据类型
含义
32 位整数,-2 147 483 647~2 147 483 647 浮点数,-1.0E+38~+1.0E+38 逻辑‘0’或‘1’ 位矢量,例“0110” 逻辑“真”或“假” ASCII 字符,例‘A’ 字符矢量,例“ABC” 时间值+时间单位,例 10NS,3S Note,waring,error 或 failure 大于等于 0 的整数 大于 0 的整数

VHDL语言讲解

VHDL语言讲解

FT工作室
• • • • • • • • • • • • • • • • 八.并行语句 1.with select when 2.when else 九.顺序语句 1. if then else 2. case when 十.元件 调用元件首先在结构体中声明: component 元件名 port( ); end component; 然后在结构体begin后面讲管脚映射: U1:元件名 port map(……);
FT工作室
培训. Vቤተ መጻሕፍቲ ባይዱDL讲解
FT工作室
• 一.VHDL程序主要组成 • 1.库 • 2.包 • 3.实体 • 4.结构体
FT 工作室
• 二.程序开头 • library ieee; • use ieee.std_logic_1164.all; • use ieee.std_logic_unsigned.all; • use ieee.std_logic_arith.all; • 注:以后不管写什么VHDL程序,程序的开 头就这四句不变.
FT工作室
• 四.结构体 • 一个VHDL程序是实现某个特定功能的电路. 而功能的描述就是在结构体内. • architecture 结构名 of 实体名 is • 定义信号, • 定义状态机 • 调用其他模块 • begin • 功能描述 • end 结构名; •
FT工作室
• 五.进程 • 进程是放在结构体内的. • 固定写法:process(a,b,c…….) • 定义变量 • begin • if rst=‘0’ then • 要复位的信号 • elsif rising_edge(clk) then—时钟的上升沿 • 功能描述 • end if; • end process; • 其中括号里的a,b,c….是敏感信号.所谓敏感信号,就是当这些信 号里任意一个信号有变化,进程就会触发而工作.

vhdl语言

vhdl语言

VHDL语言VHDL(VHSIC Hardware Description Language)是用于描述数字电路和系统的硬件描述语言,是一种标准化的硬件描述语言,广泛应用于数字电路设计和电子系统设计领域。

VHDL语言是一种强大的工具,可以帮助工程师描述复杂的数字电路,并进行仿真和综合。

它可以描述电路的结构、功能和时序行为,是一种形式化的语言,能够准确地描述电路的行为特性,有助于工程师在设计阶段发现和解决问题。

VHDL语言的基本概念实体(Entity)•实体描述了电路的接口和功能,可以看作是一种抽象的模块。

•实体中定义了输入输出端口,以及对应的信号类型和位宽。

•实体可以包含多个体系结构(Architecture)。

体系结构(Architecture)•体系结构描述了实体的具体实现,定义了实体的行为。

•体系结构中包含了处理逻辑、时序行为以及信号的赋值。

•体系结构可以描述电路的功能和行为。

信号(Signal)•信号是VHDL语言中的基本数据类型,用于在电路中传递信息。

•信号可以是标量(Scalar)或矢量(Vector),可以是时序或组合。

•信号的赋值可以是同步的或异步的。

过程(Process)•过程描述了VHDL中的行为,通常用于描述组合逻辑或时序逻辑。

•过程中可以包含逻辑运算、条件语句、循环语句等。

•过程中的代码在仿真或综合时会被执行。

VHDL语言的应用VHDL语言主要用于数字电路设计、电子系统设计、FPGA设计等领域。

工程师可以使用VHDL语言描述数字电路的结构和行为,进行仿真和综合,快速验证设计的正确性。

VHDL语言的应用领域包括但不限于:•数字电路设计•通信系统设计•控制系统设计•图像处理系统设计•嵌入式系统设计VHDL语言在电子设计领域具有广泛的应用前景,可以帮助工程师快速高效地设计数字电路系统,并满足不同应用场景的需求。

总结VHDL语言是一种强大的硬件描述语言,可以帮助工程师描述数字电路的结构和行为,进行仿真和综合,快速验证设计的正确性。

VHDL入门教程

VHDL入门教程

VHDL入门教程VHDL(Very High-Speed Integrated Circuit HardwareDescription Language)是一种硬件描述语言,用于设计数字电路和系统。

它是由美国国防部在20世纪80年代早期开发的,并由IEEE 1076标准化。

VHDL可以用于描述电路结构、电路行为和模拟。

一、VHDL概述VHDL是一种硬件描述语言,它允许工程师以更高级的语言编写硬件描述。

它可以描述电路结构、电路行为和模拟。

VHDL可以应用于各种电子系统的设计,从简单的数字逻辑门到复杂的处理器。

二、VHDL基本结构VHDL的基本结构包括实体声明、体声明和结构化代码。

实体声明描述了电路的接口,包括输入和输出。

主体声明描述了电路的行为。

结构化代码定义了电路的结构。

三、VHDL数据类型VHDL提供了多种数据类型,包括标量类型(比如整数和实数)、数组类型和记录类型。

每种类型都有其特定的操作和范围。

四、VHDL信号VHDL中的信号用于在电路中传递信息。

信号可以在过程中赋值,并且具有各种延迟属性。

信号还可以连接到模块的输入和输出端口,以实现电路之间的通信。

五、VHDL实体和体VHDL设计包含实体和体。

实体描述了电路的接口和连接,而体描述了电路的行为。

实体和体之间使用端口来传递信息。

六、VHDL组件VHDL中的组件用于将电路模块化,以实现更高层次的设计和复用。

组件可以在实体中声明,并在体中实例化。

七、VHDL并发语句VHDL中的并发语句用于描述电路中多个同时运行的过程。

并发语句包括并行语句、过程、并行块和并行时钟。

八、VHDL测试VHDL测试包括自动测试和手动测试。

自动测试使用测试工具和仿真器来验证电路的正确性。

手动测试包括使用仿真器进行手工测试和调试。

九、VHDL实例以下是一个简单的VHDL实例,实现了一个4位二进制加法器:```vhdllibrary IEEE;use IEEE.STD_LOGIC_1164.all;entity binary_adder isporta : in std_logic_vector(3 downto 0);b : in std_logic_vector(3 downto 0);sum : out std_logic_vector(4 downto 0);carry : out std_logicend binary_adder;architecture behavior of binary_adder isbeginprocess(a, b)variable temp_sum : std_logic_vector(4 downto 0);variable temp_carry : std_logic;begintemp_sum := ("0000" & a) + ("0000" & b);temp_carry := '0' when temp_sum(4) = '0' else '1';sum <= temp_sum;carry <= temp_carry;end process;end behavior;```上述VHDL代码定义了一个名为`binary_adder`的实体,它有两个4位输入`a`和`b`,一个5位输出`sum`和一个单一位输出`carry`。

第2章 VHDL语言基础

第2章 VHDL语言基础

End 实体名;
端口名
端口模式
数据类型
(2)ENTITY
端口模式(MODE)有以下几种类型: IN ;OUT;INOUT ;BUFFER 端口模式可用下图说明:(黑框代表一个设计或模块)
IN
OUT
BUFFER
INOUT
二输入与门电路设计范例
Library std; Use std.standard.all;
(4)CONFIGURATION定义区
定义格式: Configuration 配置名 of 实体名 is for 选用的结构体名 end for; end configuration 配置名 ;
二输入与门电路设计范例
a c
b电Leabharlann 真值表abc
0
0
0
1
0
0
0
1
0
1
1
1
二输入与门电路设计范例
Architecture Na of and2 is
‘1’; 符号<=为信号直接赋值符。
End Na;
--结构体Na
Architecture Nb of and2 is
Begin
c <= a and b;
--and 为逻辑与操作
End Nb; --结构体Nb
Library ieee; Use ieee.std_logic_1164.all;
Entity half_adder is Port( x,y : in std_logic;sum,carry : out hlf_adder); End half_adder;
(4)CONFIGURATION定义区
一个完整VHDL电路设计必须有一个实体 和对应的结构体,即实体和结构体对构成一个 完整的VHDL设计。

VHDL语言的基本语法解析

VHDL语言的基本语法解析
1文字字符串文字字符串是用双引号引起来的一串文字lxbbcc2数位字符串也称数值字符串位矢量是预定义的数据类型bit的一维数组它们所代表的是二进制八进制或十六进制的数组其位矢量的长度即为等值的二进制数的位数
VHDL语言要素
一、VHDL语言的基本语法
1、VHDL语言的标识符
VHDL中的标识符可以是常数、变量、信号、端口、子程序或参 数的名字。使用标识符要遵守如下规则:
信号与变量的区别
(1)声明的形式与位置不同 信号 signal count : std_logic_vector(7 downto 0); 变量 variable tema:std_logic_vector(3 downto 0); 信号在结构体中声明;变量在进程中声明
(2)赋值符不同 count<=“00000000”, count<=“ZZZZZZZZ” count<=tema; tema:=0000;
2、变量( Variable )
变量是一个局部变量,它只能在进程语句、函数语句和过程 语句结构中使用,用作局部数据存储。变量常用在实现某种算 法的赋值语句中。
一般格式:
VARIABLE 变量名:数据类型 约束条件:= 表达式;
例: VARIABLE x, y: INTEGER;
--定义x,y为整数变量
(3)赋值生效的时间不同 信号:进程结束时 变量:立即生效
(4)进程对信号敏感,对变量不敏感
(5)作用域不同 信号可以是多个进程的全局信号, 变量只在定义后的顺序域可见
三、VHDL语言的数据类型 ? VHDL中的数据类型可以分成四大类。
标量型(Scalar Type) 复合类型(Composite Type)
1) 布尔(BOOLEAN)数据类型

vhdl语言

vhdl语言

VHDL语言简介VHDL(VHSIC Hardware Description Language)即可高速集成电路硬件描述语言,是一种用于描述数字系统和电路的硬件描述语言。

它在1981年由美国国防部的高速集成电路联合委员会(VHSIC)开发,用于设计大规模集成电路。

VHDL是一种面向对象的语言,可以用于描述各种数字系统,从简单的逻辑门到复杂的处理器。

它提供了丰富的语法和语义,使得设计人员可以准确地描述他们的电路和系统。

VHDL的优势VHDL作为一种硬件描述语言,在数字系统设计中具有许多优势。

1.可重用性:VHDL允许设计人员创建可重用的模块和子系统,这些模块和子系统可以在不同的项目中重复使用,提高了设计效率和可维护性。

2.仿真和验证:VHDL具有强大的仿真和验证能力,可以在设计之前对系统进行全面的仿真和验证。

这有助于检测和纠正潜在的问题,并确保系统在硬件实现之前达到预期的功能。

3.抽象级别:VHDL允许设计人员在不同的抽象级别上描述系统,从高级的行为级别到底层的结构级别。

这使得设计人员可以根据需要在不同的级别上工作,并且可以更容易地进行系统级别的优化。

4.灵活性和可扩展性:VHDL支持灵活的设计方法和工作流程,并允许设计人员在设计过程中进行迭代和修改。

它还可以与其他常用的设计工具和方法集成,以满足特定的需求。

VHDL语言的基本结构VHDL语言由模块、实体、架构以及信号和过程等基本元素组成。

模块(Module)模块是VHDL中描述数字系统的最基本单位。

一个模块可以包含多个实体和架构,并通过连接信号进行通信。

每个模块都有一个顶层实体和一个或多个架构。

实体(Entity)实体是描述模块的接口和行为的抽象。

它定义了输入输出端口,以及模块对外部环境的接口。

一个实体可以有一个或多个架构。

架构(Architecture)架构描述模块的具体行为和内部结构。

它定义了模块的内部信号和过程,以及对外部信号和过程的接口。

VHDL语言详解

VHDL语言详解
ENTITY mux4 IS PORT (i0, i1, i2, i3, a, b : IN STD_LOGIC;
q : OUT STD_LOGIC); END mux4;
case muxval is when 0 => q <= i0; when 1 => q <= i1; when 2 => q <= i2; when 3 => q <= i3;
muxval := muxval + 1;
end if;
if (b = '1') then
muxval := muxval + 2;
end if;
VHDL语言的数据对象(四)
文件
VHDL-93语法把文件也当作对象; 不能被赋值; 通过规定的过程和函数对文件对象进行读出
和写作的操作; 说明的格式
File 文件名 : 文件类型 is [方向] 路径表达式; Type 文件类型名 is file of 数据类型; 例: type filetype is file of std_logic_vector;
file myfile : filetype is in “/myproject/vector.in”
基本概念(6/7)
结构体(architecture)说明的相关概念
结构体是由一个或多个并行语句构成的,他们的书 写顺序并不代表他们的执行顺序。
Entity test1 Is Port ( a, b : in bit;
输出只和输入有关
c, d : out bit);
end test1;
architecture test1_body of test1 is

硬件描述语言(VHDL)

硬件描述语言(VHDL)
FOR 元件标号:元件名 USE ENTITY 库名.实体名[(结构名)];

(1)体内配置指定

(2)体外配置说明
由于体外配置语句是一个独立的编译单位, 故需给它指定一个单位名—配置名。实体 名和结构体名为需对例元做配置的实体及 相应的结构体。

(3)直接例化

二. VHDL语言的数据对象,数据类型
TYPE week IS(sum,mon,tue,wed,thu,fri,sat);
2.整数,实数(Integer,Real)类型 格式:TYPE 数据类型名 IS 数据类型定义约束范围
TYPE twos IS INTEGER RANGE –32768 TO 32767; TYPE voltage IS REAL RANGE 0.0 TO 10.0;



结构体的子结构描述:
BLOCK,PROCESS,SUBPROGRAM三种语句结构
1. BLOCK语句结构描述
格式: 块结构名: BLOCK BEGIN ….
END BLOCK 块结构名;
在对程序进行仿真时,BLOCK语句中所描述的各个语 句是可以并发执行的,它与书写顺序无关。 卫式BLOCK语句的格式::BLOCK [卫式布尔表达式]; 当卫式布尔表达式为真时,BLOCK语句执行。
为了能重复使用这些函数和过程,这些程 序通常组织在包集合库中。 (1)多个过程和函数汇集在一起就构成一个 包集合(Package)。 (2)n个包集合汇集在一起就形成一个库 (Library)。


(三) 包集合,库及配置
1.库(Library):它是一个经过编译后的数据的集合, 存放包集合EE库,STD库,ASIC矢量库, WORK库,用户定义库。

VHDL语言简介

VHDL语言简介

(3)结构体的子结构设计方法 一个设计实体可以有多个结构体,对于一个结构复杂、 功能丰富的结构体来说,用一个描述模块很不方便,所以要 采用结构体中的子结构模块进行设计。 其形式有三种: a) 采用多个进程的子结构方式(进程语句); b) 采用多个模块的子结构方式(Block语句); c) 采用多个子程序的子结构方式(子程序调用语句)。
Architecture Body
1、VHDL程序基本单元 、 程序基本单元 一个基本设计单元可以是整个电子系统,也可以代表一 块电路板或一块芯片,简单的可以是一个反向器,复杂的可 以是一个微处理器或一个数字电路系统 。 不管是简单的还是复杂的数字电路其基本结构都是相同 的,都由两部分构成:实体说明Entity Declaration、结构体。 一个程序只能有一个实体,但可以有多个结构体。 实体相当于器件外壳,而结构体相当于内部电路结构。 器件是固定的,但具体的电路实现可以是多样化的。
数据流描述:描述了数据流的运动路线、运动方向和运动结果, 对于全加器,其布尔方程如下: sum = s xor c_in s = x xor y c_out = (x and y) or (s and c_in) 全加器的数据流描述如下: Library ieee; Use ieee.std_logic_1164.all; Entity full_adder is Generic(tpd: time:= 10ns); Port(x, y, c_in: in std_logic; sum, c_out: out std_logic); End full_adder;
2、设计实体 、 实体是一个初级设计单元,可以单独编译并且可以被并 入设计库。 实体说明是一个器件的外观视图,即从外部看到的器件 外貌,包括端口等。 实体说明也可以定义参数,并把参数从外部传入模块内 部。 任何一个基本设计单元的实体说明都具有如下结构:

VHDL入门易懂教程

VHDL入门易懂教程

VHDL入门易懂教程VHDL(VHSIC Hardware Description Language)是一种硬件描述语言,用于描述数字系统的行为,结构和时序。

它是一种用于设计和开发数字电路的语言,比如FPGA(Field-Programmable Gate Array)和ASIC (Application-Specific Integrated Circuit)。

本文将提供一个易懂的VHDL入门教程,以帮助初学者快速了解并上手VHDL语言。

一、VHDL概述VHDL最初是为了满足军事和航空航天领域的需求而开发的,目前已经成为了一种广泛使用的硬件描述语言。

它不仅可以用于系统级的设计,还可以用于模块级和门级的设计。

VHDL的设计思想是从高级抽象开始,逐步转化为底层的物理设计,这使得VHDL非常适合大型和复杂的设计项目。

二、VHDL语法1.声明语句在VHDL中,首先需要声明各种信号和变量,以便在后续的代码中使用。

声明语句的语法如下:```signal signal_name : signal_type := initial_value;variable variable_name : variable_type := initial_value;```其中,signal_name和variable_name为信号和变量的名称,signal_type和variable_type分别为信号和变量的类型,initial_value为信号和变量的初始值。

2.过程语句VHDL中的过程类似于程序中的函数,用于执行一系列的操作。

过程语句的语法如下:```process (sensitivity_list)begin-- codeend process;```sensitivity_list是一个由信号组成的列表,当列表中的任意一个信号发生变化时,过程会被触发执行。

过程中的代码为具体的操作。

3.结构语句VHDL中的结构语句用于描述数字系统的结构,也就是各个模块之间的连接关系。

VHDL详细语法教程

VHDL详细语法教程

VHDL详细语法教程VHDL(Very High Speed Integrated Circuit HardwareDescription Language)是一种硬件描述语言,用于对数字电路进行描述、建模和仿真。

它是一种用于描述数字系统结构和行为的语言,广泛用于FPGA(Field Programmable Gate Array)和ASIC(ApplicationSpecific Integrated Circuit)设计中。

VHDL语言具有丰富的语法结构,可以描述数字系统的结构和行为,并可以进行仿真和综合。

下面是VHDL语言的详细语法教程:1. 实体声明(Entity Declaration):VHDL代码的第一部分是实体声明,用于定义设计的接口和名称。

实体声明是设计的顶级结构,它包含输入输出端口的定义。

语法格式如下:```vhdlentity entity_name isportport_name : in/out type;port_name : in/out type;...end entity_name;```其中,entity_name为实体名称,port_name为端口名称,type为端口类型,in表示输入端口,out表示输出端口。

2. 结构体声明(Architecture declaration):在实体声明后,需要定义该实体的结构和行为。

这一部分被称为结构体声明。

语法格式如下:```vhdlarchitecture architecture_name of entity_name issignal signal_name : type;...begin...end architecture_name;```3. 信号声明(Signal declaration):信号用于在VHDL代码中传输数据。

通过信号声明,可以定义存储或传输数据的变量。

信号声明需要在结构体声明的前面进行。

语法格式如下:```vhdlsignal signal_name : type;```其中,signal_name为信号名称,type为信号类型。

VHDL语言详解

VHDL语言详解

VHDL语⾔详解第⼆章 VHDL程序基础2.1 VHDL程序结构2.2 VHDL的语⾔元素2.3 VHDL的基本描述语句2.4 VHDL结构体的三种描述⽅法2.1 VHDL程序结构2.1.1 VHDL程序基本结构2.1.2 VHDL结构体的基本⼦结构2.1 VHDL程序结构2.1.1 VHDL程序基本结构例1 ⼀个2输⼊的与门的逻辑描述LIBRARY ieee; --库说明语句USE ieee.std_logic_1164.ALL; --程序包说明语句ENTITY and2 ISPORT(a,b : IN STD_LOGIC;y : OUT STD_LOGIC);END and2;ARCHITECTURE and2x OF and2 ISBEGINy<=a AND b;END and2x;实体部分结构体部分VHDL设计⽂件的两个基本组成部分实体(Entity)结构体(Architecture)配置(Configuration)包集合(Package)库(Library)⼀个完整的VHDL程序库⽤于存放已编译的实体,结构体,包集合和配置2.1.1 VHDL程序基本结构实体部分描述设计系统的外部接⼝信号(即输⼊/输出信号)结构体⽤于描述系统的内部电路配置⽤于从库中选取所需元件安装到设计单元的实体中包集合存放各设计模块能共享的数据类型,常数,⼦程序等2.1.1.1 实体(ENTITY)实体的⼀般格式为:ENTITY 实体名 IS[类属参数说明];[端⼝说明];END;ENTITY,IS,END是VHDL的关键字(保留字).实体中的每⼀个I/O信号被称为端⼝,其功能对应于电路图符号的⼀个引脚.端⼝说明则是对⼀个实体的⼀组端⼝的定义,即对基本设计实体与外部接⼝的描述.端⼝是设计实体和外部环境动态通信的通道.ayand2b类属参数说明是可选部分.如果需要,可使⽤以"GENERIC"语句来指定该设计单元的类属参数(如延时,功耗等).实体名,端⼝名等均应为符合VHDL命名规则的标识符.端⼝说明的⼀般格式为:PORT(端⼝名{,端⼝名}:端⼝模式数据类型;端⼝名{,端⼝名}:端⼝模式数据类型);端⼝模式⽤来说明数据传输通过该端⼝的⽅向.端⼝模式有以下⼏类:IN(输⼊):仅允许数据流进⼊端⼝.主要⽤于时钟输⼊,控制输⼊,单向数据输⼊.OUT(输出):仅允许数据流由实体内部流出端⼝.该模式通常⽤于终端计数⼀类的输出,不能⽤于反馈.BUFFER(缓冲):该模式允许数据流出该实体和作为内部反馈时⽤,但不允许作为双向端⼝使⽤.INOUT(双向):可以允许数据流⼊或流出该实体.该模式也允许⽤于内部反馈.如果端⼝模式没有指定,则该端⼝处于缺省模式为:IN .数据类型原则上可以是任何标准的数据类型和⽤户⾃定义类型.PORT (a,b : IN STD_LOGIC;y : OUT STD_LOGIC);inininoutoutbufferinoutmodemode模式及其信号源类属参数说明的格式为:GENERIC(端⼝名{,端⼝名}:[IN] ⼦类型 [:=初始值]{;端⼝名{,端⼝名}: [IN] ⼦类型 [:=初始值]} );例2:加⼊类属说明的2输⼊的与门的逻辑描述ENTITY and2 ISGENERIC (rise,fall:time);PORT(a,b: IN STD_LOGIC;y : OUT STD_LOGIC);END and2;ARCHITECTURE and2x OF and2 ISSIGNAL u: BIT;BEGINu<=a AND b;y<=u after(rise) when u='1' else u after(fall) ;END and2x;例3: 四位加法器实体说明程序ENTITY add4 ISPORT(a, b: IN STD_LOGIC_VECTOR(3 downto 0);Ci: IN STD_LOGIC;Sum: OUT STD_LOGIC_VECTOR(3 downto 0);Co: OUT STD_LOGIC);END add4;由实体说明画出四位加法器add4的电路图如下所⽰.add4a[3..0]b[3..0]Sum[3..0]CiCo2.1.1.2 结构体(ARCHITECTURE )结构体的⼀般格式如下:ARCHITECTURE 结构体名 OF 实体名 IS[结构体说明部分];BEGIN[并发处理语句];END 结构体名;结构体说明是指对结构体需要使⽤的信号,常数,数据类型和函数进⾏定义和说明.并发处理语句位于BEGIN和END之间,这些语句具体地描述了构造体的⾏为.并发处理语句是功能描述的核⼼部分,也是变化最丰富的部分.并发处理语句可以使⽤赋值语句,进程语句,元件例化语句,块语句以及⼦程序等.需要注意的是,这些语句都是并发(同时)执⾏的,与排列顺序⽆关.2.1.1.3 配置(CONFIGURATION)配置的基本格式为:CONFIGURATION 配置名 OF 实体名 IS[配置说明];END 配置名;配置语句描述了层与层之间的连接关系,以及实体与构造体之间的连接关系.设计者可以利⽤配置语句选择不同的构造体,使其与要设计的实体相对应;在仿真某⼀个实体时,可以利⽤配置选择不同的构造体进⾏性能对⽐实验,以得到性能最佳的构造体. CONFIGURATION 配置名 OF 实体名 ISFOR 选配结构体名END FOR;END 配置名;配置语句根据不同情况,其说明语句有简有繁.最简单的缺省配置格式为:例4:加⼊了配置的4位等值⽐较器设计⽂件LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY comp4 ISPORT(a, b: IN STD_LOGIC_VECTOR(3 downto 0);y: OUT STD_LOGIC);END comp4;--结构体 1:ARCHITECTURE behavior OF comp4 ISBEGINComp: PROCESS(a, b)BEGINIF a=b THENy<='1';ELSEy RETURN '0';WHEN 'Z'=> RETURN 'Z';END CASE;END invert;END BODY;⼀个包集合说明⾄多可以带⼀个包体,包体和包头使⽤相同的名字.包体的内容是基本说明和⼦程序体说明.但要注意,若包集合中含有⼦程序说明时,必须将⼦程序放在对应的包体中.包体中的⼦程序及其相应的说明是专⽤的,不能被其它VHDL单元所引⽤;⽽包集合中的说明是公⽤的,它可以独⽴地编译并插⼊设计库中.包集合体是次级设计单元,只有在其对应的主设计单元编译并插⼊设计库之后,才可独⽴地编译并插⼊到设计库中.程序包举例(见vhdl程序example )2.1.1.5 库(LIBRARY)库是⽤来放置可编译的设计单元的地⽅,通过其⽬录可查询和调⽤. VHDL中的库⼤致可归纳为5种:IEEE库,STD库,ASIC⽮量库,WORK库和⽤户定义库.IEEE库.常⽤的资源库.IEEE库包含经过IEEE正式认可的STD_LOGIC_1164包集合和某些公司提供的⼀些包集合,如STD_LOGIC_ARITH(算术运算库),STD_LOGIC_UNSIGNED等.STD库.VHDL的标准库.库中存放有称为"standard"的标准包集合,其中定义了多种常⽤的数据类型,均不加说明可直接引⽤.STD 库中还包含有称为"textio"的包集合.在使⽤"textio"包集合中的数据时,应先说明库和包集合名,然后才可使⽤该包集合中的数据. ASIC⽮量库.在VHDL语⾔中,为了进⾏门级仿真,各公司可提供⾯向ASIC的逻辑门库.在该库中存放着与逻辑门⼀⼀对应的实体.为了使⽤⾯向ASIC的库,对库进⾏说明是必要的.WORK库.WORK库是现⾏作业库.设计者所描述的VHDL语句不需要任何说明,将都存放在WORK库中.WORK库对所有设计都是隐含可见的,因此在使⽤该库时⽆需进⾏任何说明.⽤户定义库.⽤户定义库简称⽤户库,是由⽤户⾃⼰创建并定义的库.设计者可以把⾃⼰经常使⽤的⾮标准(⼀般是⾃⼰开发的)包集合和实体等汇集成在⼀起定义成⼀个库,作为对VHDL标准库的补充.⽤户定义库在使⽤时同样要⾸先进⾏说明.上述5类库中,除了STD库和WORK库之外的其它库均为资源库.资源库是存放常规元件和标准模块的库,使⽤时需预先说明.库说明语句的语法形式为:LIBRARY 库名; --说明使⽤什么库USE 包集合名; --说明使⽤库中哪⼀个包集合及包集合中的项⽬(如过程名,函数名等)包集合名最多为三个层次,即 :library-name. packge-name. item-nameLIBRARY 语句和USE语句的作⽤范围:仅限于紧跟起后的实体和结构体.2.1.2 VHDL结构体的基本⼦结构在规模较⼤的电路设计中,整个电路将被分成若⼲个相对独⽴的模块来描述.这样,⼀个结构体可以⽤⼏个⼦结构,即相对独⽴的⼏个模块来构成.VHDL语⾔有以下3种形式的⼦结构描述语句:BLOCK 语句结构PROCESS 语句结构SUBPROGRAMS 结构2.1.2.1 块( BLOCK )BLOCK语句的语法格式为:块标号:BLOCK [(块保护条件)][说明语句];BEGIN[并发处理语句];END BLOCK 标号名;保护条件是可选项,它是⼀个布尔表达式.如果有保护条件,则该条件应⽤圆括号括起来,放在BLOCK之后.保护条件的作⽤是:只有当其为真时,该块中的语句才被启动执⾏;否则,该块中的语句不被执⾏.BLOCK语句中所描述的各个语句是可以并⾏执⾏的,它和书写顺序⽆关.⼀个⼤规模的电原理图通常可以分割成多张⼦原理图,以便于设计和存档.同样,在VHDL程序设计中,构造体对应整个电原理图,⽽构造体可由多个BLOCK块组成,每⼀个BLOCK块则对应⼀张⼦原理图.电原理图的分割关系和VHDL程序中⽤BLOCK块分割构造体的关系是⼀⼀对应的.例7 ⽤BLOCK语句描述2选1电路的程序.ENTITY mux2_1 ISPORT(d0, d1, sel : IN STD_LOGIC;q :OUT STD_LOGIC);END mux2_1;ARCHITECTURE amux OF mux2_1 ISSIGNAL tmp1,tmp2,tmp3 : STD_LOGIC;BEGINcale: BLOCKBEGINtmp1<=d0 AND sel;tmp2<=d1 AND (not sel);tmp3<=tmp1 OR tmp2;q<=tmp3;END BLOCK cale;END amux;上述结构体中只有⼀个 BLOCK块,若电路复杂时可由⼏个BLOCK块组成.2选1 数据选择器d1d0qselu2u1u3tmp1tmp2tmp3例8 ⽤带保护条件的BLOCK语句描述⼀个锁存器的结构.ENTITY latch ISPORT(d, clk : IN STD_LOGIC;q, qn : OUT STD_LOGIC);END latch;ARCHITECTURE latch_a OF latch ISBEGINg1:BLOCK(clk='1')BEGINq<=guarded d after 5ns;qn<=guarded not(d) after 7ns;END BLOCK g1;END latch_a;qnqQD Cdclk在BLOCK块中的两个信号传送语句都写有前卫关键词guarded,表明只有clk='1'为真时,这两个语句才能执⾏.(注意 :这⾥的综合⼯具不⽀持 guarded block 语句和 after 短语.)2.1.2.2 进程( PROCESS )PROCESS语句是⼀种并发处理语句,在⼀个构造体中多个PROCESS语句可以同时并发运⾏.因此,PROCESS语句是VHDL中描述硬件系统并发⾏为的最常⽤,最基本的语句.进程语句的⼀般格式为;[进程名:] PROCESS (敏感信号表)进程说明语句BEGIN顺序描述语句;END PROCESS [进程名];例9 利⽤PROCESS语句设计与⾮门电路.nandx: PROCESS (a, b)BEGINy<=a NAND b AFTER 10ns;END PROCESS nandx;敏感信号表所标明的信号是⽤来启动进程的.敏感信号表中的信号⽆论哪⼀个发⽣变化(如由'0'变'1'或由'1'变'0' )都将启动该PROCESS语句.⼀旦启动后, PROCESS中的语句将从上⾄下逐句执⾏⼀遍.当最后⼀个执⾏完毕以后,即返回到开始的PROCESS语句,等待下⼀次启动.因此,只要PROCESS中指定的信号变化⼀次,该PROCESS语句就会执⾏⼀遍. PROCESS内部各语句之间是顺序关系 .在系统仿真时, PROCESS语句是按书写顺序⼀条⼀条向下执⾏的.⽽不象BLOCK中的语句可以并⾏执⾏.若构造体中有多个进程存在,各进程之间的关系是并⾏关系 ;进程之间的通信则⼀边通过接⼝由信号传递,⼀边并⾏地同步执⾏.2.1.2.3 ⼦程序( SUBPROGRAM )⼦程序的特点:⼦程序可以在结构体或程序包的任何位置被调⽤,⽽且可以反复调⽤.⼦程序是⼀个⾮重⼊的程序,即⼦程序返回后才能再被调⽤.在调⽤时⼦程序⾸先要进⾏初始化,执⾏结束后⼦程序终⽌;再调⽤时要再进⾏初始化.因此,⼦程序内部的值不能保持.VHDL的⼦程序具有可重载性,即允许有许多重名的⼦程序,但这些⼦程序的参数类型和返回数值类型是不同的.VHDL的⼦程序有两种类型:过程(PROCEDURE)函数(FUNCTION)过程(PROCEDURE)过程语句的结构:PROCEDURE 过程名(参数1;参数2; (I)[定义语句];BEGIN[顺序处理语句];END 过程名;过程语句的调⽤格式:过程名(实际参数表);例10 设计⼀个从两个整数中求取最⼤值的过程.PROCEDURE max(a, b: IN INTEGER;y: OUT INTEGER) ISBEGINIF (ay<=b;ELSEyb) THENtmp:=a;ELSEtmp:=b;END IF;RETURN tmp;END max;函数的参数均为输⼊参数.函数调⽤返回⼀个指定数据类型的值.例11 在结构体中调⽤求最⼤值的函数.LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.newlib.ALL;ENTITY dpeak ISPORT(clk, set : IN STD_LOGIC;date : IN STD_LOGIC_VECTOR(5 downto 0);dout : OUT STD_LOGIC_VECTOR(5 downto 0));END dpeak;ARCHITECTURE rtl OF dpeak ISSIGNAL peak : STD_LOGIC_VECTOR(5 downto 0);BEGINdout<=peak;PROCESS (clk)BEGINIF (clk'event and clk='1') THENIF (set='1') THENpeak<=date;ELSEpeak<= max(date,peak);END IF;END IF;END PROCESS;END rtl;2.2 VHDL的语⾔元素2.2.1 标识符2.2.2 数据对象2.2.3 数据类型2.2.4 运算符与操作符2.2.5 属性标识符规则:标识符规则是在书写VHDL程序时的⼀般⽂字规则.基本标识符由字母,数字以及下划线字符组成,且具有以下特征要求:●第⼀个字符必须是字母;●最后⼀个字符不能是下划线;●不允许连续两个下划线;●在标识符中⼤,⼩写字母是等效的.● VHDL中的注释⽂字⼀律为2个连续的连接线"--",可以出现在任⼀语句后⾯,也可以出现在独⽴⾏;● VHDL的保留字(关键字)不能⽤于标识符;2.2.1 标识符如下标识符是⾮法的:_ tx_clk8B10Blarge#numberlink__barselectrx_clk_例如:如下标识符是合法的:tx_clkThree_state_Enablesel7DHIT_1124--标识符必须起始于字母--只能是字母,数字,下划线--不能有连续两个下划线--关键字(保留字)不能⽤于标识符--最后字符不能是下划线2.2.2 数据对象在VHDL中,数据对象是可以赋予⼀个值的客体.常⽤的数据对象为常量,变量和信号,在使⽤前必须给予说明.●常量(CONSTANT)常量是指在设计描述中不会变化的值.在VHDL描述中,⼀般⽤常量名代替数值.常量说明语句的⼀般格式为:CONSTANT 常量名{,常量名}:数据类型 := 取值;例如: CONSTANT width : integer : = 8 ;常量所赋值和定义的数据类型应⼀致.常量⼀旦赋值就不能再改变.●变量(VARIABLE)变量是暂存数据的量.变量说明语句的格式是:VARIABLE 变量名{,变量名}:数据类型 [:=初始值];例如:VARIABLE count: INTEGER RANGE 0 TO 99 : =0变量是⼀个局部量 ,它只⽤于进程和⼦程序.变量必须在进程或⼦程序的说明区域中加以说明.变量赋值是直接的,⾮预设的 ,它在某⼀时刻仅包含⼀个值.变量的赋值⽴即⽣效,不存在延时⾏为.变量常⽤在实现某种运算的赋值语句中.赋值语句中的表达式必须与⽬标变量具有相同的数据类型.变量赋值语句格式为: ⽬标变量名 := 表达式;●信号(SIGNAL)信号是电⼦电路内部硬件实体相互连接的抽象表⽰.信号能够代表连线,也可内连元件,端⼝也是信号.信号说明语句的格式为:SIGNAL 信号名{,信号名} :数据类型 [:=初始值];例如: SIGNAL count: BIT_VECTOR(3 downto 0);信号包括I/O引脚信号以及IC内部缓冲信号,有硬件电路与之对应,故信号之间的传递有实际的附加延时.信号通常在构造体,包集合和实体中说明;信号不能在进程中说明(但可以在进程中使⽤).硬件中的信号总是同时⼯作的,即信号同时在各个模块中流动,这就是硬件电路的并发性 .HDL体现了实际电路中信号"同时"流动的这种基本特性.信号赋值语句格式为: ⽬标信号名 <= 表达式;赋值语句中的表达式必须与⽬标信号具有相同的数据类型.信号和变量的主要区别:1. 变量是⼀个局部量,只能⽤于进程或⼦程序中;信号是⼀个全局量,它可以⽤来进⾏进程之间的通信.2. 变量赋值⽴即⽣效,不存在延时⾏为;信号赋值具有⾮⽴即性,信号之间的传递具有延时性.4. 信号赋值可以出现在进程中,也可以直接出现在结构体中,但它们的运⾏含义不同:前者属顺序信号赋值,此时的赋值操作要视进程是否已被启动;后者属并⾏信号赋值,其赋值操作是各⾃独⽴并⾏发⽣的.3. 变量⽤作进程中暂存数据的单元;信号⽤作电路中的信号连线.5. 在进程中变量和信号的赋值形式与操作过程不同:在变量的赋值语句中,该语句⼀旦被执⾏,其值⽴即被赋予变量.在执⾏下⼀条语句时,该变量的值即为上⼀句新赋的值.在信号的赋值语句中,该语句即使被执⾏,其值不会使信号⽴即发⽣代⼊,在下⼀条语句执⾏时,仍使⽤原来的信号值.直到进程结束之后,所有信号赋值的实际代⼊才顺序进⾏处理.因此,实际代⼊过程和赋值语句的执⾏是分开进⾏的.如例12所⽰.例12 信号和变量值代⼊的区别举例PROCESS (a,b,c,d)BEGINd<=a;x<=b+d;d<=c;y<=b+d;END PROCESS;结果: x<=b+c;y<=b+c;PROCESS (a,b,c)VARIABLE d:std_logic_vector(3 downto 0);BEGINd:=a;x<=b+d;d:=c;y<=b+d;END PROCESS;结果: x<=b+a;y<=b+c;当进程运⾏时,信号赋值将⾃上⽽下顺序执⾏,但第⼀项赋值操作并不会发⽣,这是因为信号赋值是在进程结束时才起作⽤.因为在进程结束更新时,d的最后⼀个赋值为c ,因此执⾏结果为该式.2.2.3 数据类型VHDL是⼀种类型型很强的语⾔.对象的数据类型定义了该对象可以具有的值和对该对象可以进⾏的运算的限制.在VHDL中,这种限制是被强制执⾏的.VHDL提供了多种标准的数据类型.在VHDL描述中,每个信号,常量,变量都要指定它的数据类型,以确定它能保持那⼀类数据. VHDL对数据类型的定义相当严格,在进⾏赋值或变换过程中都要进⾏类型检查.VHDL不允许不同类型的数值相互赋值或使⽤类型不允许的运算符进⾏运算.这种特性可以帮助设计者在设计前期发现错误.标准数据类型⽤户⾃定义数据类型数据类型的转换1. 标准数据类型VHDL提供的10种标准数据类型.(2)Real(实数).取值范围为 -1.0E+38 ~ +1.0E+38.和整数⼀样,实数能被约束.由于实数运算需要⼤量的资源,因此综合⼯具常常并不⽀持实数类型.(3)Bit(位). 只有两种取值,即 0 和 1 ,可⽤于描述信号的取值.(4)Bit_Vector(位⽮量). 是⽤双引号括起来的⼀组数据,每位只有两种取值:0 和 1.在其前⾯可加以数制标记,如X(16进制),B(2进制,默认),O(8进制)等.位⽮量常⽤于表⽰总线的状态.(1)Integer(整数). 取值范围为 -(231-1)~(231-1).⼀个整数类型和要被综合进逻辑的信号或变量在其范围上应有约束.例如: variable a: integer range –255 to 255;整数可通过语句内带符号⽮量来表达给综合⼯具.(5)Boolean(布尔量). ⼜称逻辑量.有"真","假"两种状态,分别⽤TRUE和FALSE标记.⽤于关系运算和逻辑运算.(6)Character(字符).是⽤单引号括起来的⼀个字母,数字,空格或⼀些特殊字符(如$,@,%等).字符区分⼤,⼩写字母.(7)String(字符串).是⽤双引号括起来的⼀个字符序列.字符串区分⼤,⼩写字母.常⽤于程序的提⽰和结果说明等.(8)Time(时间).时间的取值范围从 -(231-1)~(231-1).时间由整数值,⼀个以上空格以及时间单位组成.常⽤的时间单位有:fs,ns,µs,ms,s,min,hr等.时间常⽤于指定时间延时和标记仿真时刻.上述10种数据类型是VHDL种标准的数据类型,在编程时可以直接引⽤.如果⽤户需使⽤其它的数据类型,则必须进⾏⾃定义.(9)Natural(⾃然数)和Positive(正整数).是整数类型的⼦类型.⾃然数取值范围为0 ~(231-1);正整数是⼤于 0 的整数.(10)Severity Level(错误等级).错误等级分为:NOTE(注意),WARNING(警告),ERROR(出错),FAILURE(失败)四级,⽤于提⽰系统的错误等级.时间单位fs,ps,ns,µs,ms,sec,min,hr时间整数的⼦集:⾃然数取值范围为0 ~(231-1);正整数是⼤于0的整数⾃然数,正整数Note,warning,error,failure错误等级字符⽮量字符串ASCII字符字符逻辑"真" 或"假",⽤TRUE和FALSE标记布尔量位⽮量,⽤双引号括起来的⼀组数据位⽮量逻辑'0'或'1'位浮点数,取值范围: -1.0e+38 ~ 1.0e+38实数整数32位, 取值范围:-(231-1) ~ (231-1)整数含义数据类型标准数据类型IEEE库STD_LOGIC_1164程序包中定义的STD_LOGIC类型和STD_LOGIC_VECTOR类型.STD_LOGIC类型的数据可以具有九种取值,其含义如下:'U':初始值'X':不定态'0': 强制0'1': 强制1'Z': ⾼阻态'W':弱信号不定态'L':弱信号0'H':弱信号1'_':不可能情况(可忽略值)其中,"X"⽅便了系统仿真,"Z"⽅便了双向总线的描述.STD_LOGIC_VECTOR类型定义如下:TYPE STD_LOGIC_VECTOR IS ARRAY (NATURALRANGE ) OF STD_LOGIC;2. ⽤户⾃定义数据类型VHDL允许⽤户⾃⼰定义数据类型.常⽤的⽤户⾃定义数据类型主要有:(1)枚举(Enumerated)类型. 通过列举某类变量所有可能的取值来加以定义.对这些取值,⼀般使⽤⾃然语⾔中有相应含义的单词或字符序列来代表,以便于阅读和理解.⾃定义数据类型说明语句的⼀般格式是:TYPE 数据类型名 {,数据类型名} IS [数据类型定义];枚举类型定义的格式为:TYPE 数据类型名 IS (元素1,元素2,…);该数据类型括号中的值⾃左向右按升序排列,中间⽤逗号分隔.在VHDL中,对其中每⼀个元素都赋予⼀个位置编号,最左边的元素开始记为"0" ,向右依次递增"1" .这为"属性"提供了⼀个访问位置编号的机制.例如,在程序包STD_LOGIC_1164中对STD_LOGIC的定义为TYPE STD_LOGIC IS ( 'U' ,'X' ,'0' ,'1' ,'Z' ,'W' ,'L' ,'H' ,'_' );(2) 数组(ARRAY)类型. ⼜称为向量,是多个相同类型的数据集合.它可以是⼆维的和多维的.数组类型定义的格式为:TYPE 数据类型名 IS ARRAY (范围) OF 元素类型名;范围⼀项规定数组下标的类型和范围.默认的下标类型是整型,但也可以使⽤其它数据类型,这就需要在范围中标明下标的类型.例如:TYPE count1 IS ARRAY ( STD_LOGIC '_' DOWNTO 'U' )OF INTEGER;多维数组需要⽤两个以上的范围来描述,⽽且多维数组不能⽣成逻辑电路,因此只能⽤于⽣成仿真图形及硬件的抽象模型. (3) 纪录(RECORD)类型. 是多个不同类型的数据集合.纪录类型定义的格式为:TYPE 数据类型名 IS RECORD元素名: 数据类型名;元素名: 数据类型名;……END RECORD;纪录适⽤于描述总线,仿真等.对于记录类型的对象进⾏单元素赋值时,可在记录类型对象名后加点".",然后再加赋值元素的元素名.(4)时间(TIME)类型(物理类型).表⽰时间的数据类型,在仿真时是必不可少的.时间类型定义的⼀般格式为:TYPE 数据类型名 IS 范围;UNITS 基本单位;单位;END UNITS;例如:TYPE time IS range –1e18 TO 1e18;UNITS fs;ps=1000fs;ns=1000ps;µs=1000ns;ms=1000µs;set=1000ms;min=60set;hr=60min;END UNITS;这⾥的基本单位是"fs".时间是物理类型的数据,当然对容量,阻抗值也可以做定义.(5) ⼦类型(SYBTYPE).⼦类型是⼀个具有限制条件的类型,通常⽤来定义具有⼀定限制条件的基本类型的数据对象.⼦类型定义的⼀般格式为:SYBTYPE ⼦类型名 IS 数据类型名[约束范围];例如:如下 Byte 被定义作为⼀个⼦类型,⽽后数据对象被定义为从属于该⼦类型.SYBTYPE Byte IS Bit_Vector(7 downto 0);SIGNAL Byte1, Byte2:Byte;SIGNAL Data1, Data2:Byte;SIGNAL Addr1, Addr2:Byte;3. 数据类型的转换在VHDL程序中,不同类型的对象不能代⼊,因此要进⾏类型转换.类型转换的⽅法有:(1)类型标记法.⽤类型名称来实现关系密切的标量类型之间的转换.例如: VARIABLE x:INTEGER;VARIABLE y:REAL;使⽤类型标记(即类型名)实现类型转换时,可采⽤赋值语句:x :=INTEGER(y); y :=REAL(x).(2)类型函数法.VHDL程序包中提供了多种转换函数,使得某些类型的数据之间可以相互转换,以实现正确的赋值操作.常⽤的类型转换函数有:★CONV_INTEGER ( ):将STD_LOGIC_VECTOR类型转换成INTEGER类型.★CONV_STD_LOGIC_VECTOR( ):将INTEGER类型,UNSIGNED类型或 SIGNED类型转换成STD_LOGIC_VECTOR类型.★TO_BIT ( ): 将STD_LOGIC类型转换成BIT类型.★TO_BIT_VECTOR( ):将STD_LOGIC_VECTOR类型转换BIT_VECTOR 类型.★TO_STD_LOGIC( ): 将BIT类型转换成STD_LOGIC类型.★TO_STD_LOGIC_VECTOR( ): 将BIT_VECTOR类型转换成STD_LOGIC_VECTOR类型.注意 :引⽤时必须⾸先打开库和相应的程序包.该函数由STD_LOGIC_UNSIGNED程序包定义该函数由STD_LOGIC_ARITH程序包定义以下函数由STD_LOGIC_1164程序包定义2.2.4 运算符与操作符VHDL中共有四类运算符:(1)算术运算符:包括⼀元算术运算符和⼆元算术运算符.⼀元算术运算符包括:+(正号),—(负号),ABS(求绝对值)⼆元算术运算符包括:+ ,— ,* ,/ ,MOD(求模),REM(求余),**(指数运算)(2)关系运算符:它包括:= ,/= ,=(3)逻辑运算符:包括⼀元逻辑运算符和⼆元逻辑运算符.⼀元逻辑运算符包括:NOT⼆元逻辑运算符包括:AND,OR,NAND,NOR,XOR(4)并置运算符:&(连接),⽤于将多个位连接成为位⽮量.例如:DBUS<=D0&D1&D2&D3,即DBUS= ,,<,/= ,= ;XOR,NOR,NAND,OR,AND .需要注意的是:在编写VHDL程序时,必须保证操作数的数据类型与运算符所要求的数据类型⼀致.VHDL中的操作符:● "" 符号: 在WHEN语句中出现,其含义是"THEN(则)".2.2.5 属性(Attributes)VHDL没有⼀般程序设计语⾔中那些运算类标准函数,取⽽代之的是多种能反映和影响硬件⾏为的属性.VHDL的属性可分为数值类,函数类,信号类,类型类和范围类等属性.属性的⼀般格式为:Object ′Attributes为获取硬件设计中的⼀些有关信息(各类项⽬特性)⽽定义的内部函数某⼀项⽬的属性或特征通常可以⽤⼀个值或⼀个表达式来表⽰;它可以通过VHDL的属性描述语句加以访问.1.数值类属性数值类属性⽤于返回数组,块,或⼀般数据的有关值,如边界,数组长度等.●对⼀般数据属性,返回函数的边界值.其格式为Object ′LEFT;Object ′RIGHT;Object ′HIGH;Object ′LOW;●对于数组的数值属性,返回数组的长度值.其格式为Object ′LENGTH;●对于块结构体的数值属性,返回块的信息.其格式为Object ′BEHAVIOR;Object ′STRUCTURE;例如:TYPE num IS ARRAY RANGE 7 DOWNTO 0;VARIABLE i1,i2,i3,i4,M: INTEGER;BEGINi1:=num ′LEFT; --i1取得num的左边界值 7i2:=num ′RIGHT; --i2取得num的右边界值 0i3:=num ′HIGH; --i3取得num的上限值 7i4:=num ′LOW; --i4取得num的下限值 0M:= num ′LENGTH;2.函数类属性函数类属性是以函数形式为设计⼈员提供数据类型,数组,信号的相关信息的.●数据类型的属性函数.利⽤数组属性可以获得数组的区间,该属性的格式为Object ′SUCC(X); --获取X的下⼀个值Object ′PRED(X); --获取X的前⼀个值Object ′LEFTOF(X); --获取X的左边值Object ′RIGHTOF(X); --获取X的右边值其中, "Object"为数据类型名,X为其中的⼀个元素.例如:TYPE time IS (year,month,day,hour,min,sec);则 time ′SUCC(hour); --获取元素hour的下⼀个值mintime ′LEFTOF(day); --获取元素day的左边值month●数组的属性函数.其格式为Object ′LEFT(n); --获取索引号为n的区间左端边界值Object ′RIGHT(n); --获取索引号为n的区间右端边界值Object ′HIGH(n); --获取索引号为n的区间⾼端边界值Object ′LOW(n); --获取索引号为n的区间低端边界值其中, "Object"为数组名;n为多维数组中所定义的多维区间的序号.默认值n=1,表⽰对⼀维空间进⾏操作.●信号的属性函数.利⽤信号属性可得到信号的⾏为和功能信息,其格式为Object ′EVENT; --反映信号的值是否变化,是,则返回为"真"Object ′ACTIVE; --反映信号是否活跃,是,则返回为"真"Object ′LAST_EVENT; --反映从最近⼀次事件到现在经过的时间,返回⼀个时间值Object ′LAST_VALUE; --反映信号变化前的取值,并将该历史值返回Object ′LAST_ACTIVE; --反映从最近⼀次活跃到现在经过的时间,返回⼀个时间值需要注意的是 :信号的事件(Event)和活跃(Active)是两个不同的概念,必须严格区分.信号的活跃定义为信号值的任何变化.信号值由1变为0是⼀个活跃,⽽从1变为1也是⼀个活跃,唯⼀的准则是发⽣了事情,这种情况被称为⼀个事项处理(Transaction).然⽽,信号的事件则要求信号值发⽣变化.信号值从1变为0是⼀个事件,但从1变为1虽是⼀个活跃却不是⼀个事件.所有的事件都是活跃,但并⾮所有的活跃都是事件.例如:利⽤函数信号属性检查信号的建⽴时间.LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY dff1 ISPORT(d,clk : IN STD_LOGIC;q : OUT STD_LOGIC);END dff1;ARCHITECTURE setup_time_check OF dff1 ISBEGINPROCESS(clk)BEGINIF(clk='1′) AND (clk ′EVENT) THENq5ns) --条件为真,向下执⾏REPORT "SETUP VIOLATION" --条件为假,报告错误信息: 建⽴时间不符合要求SEVERITY ERROR; --出错等级:ERROR。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
端口模式用来说明数据传输通过该端口的方向.端口模式有以下几类:
IN(输入):仅允许数据流进入端口.主要用于时钟输入,控制输入,单向数据输入.
OUT(输出):仅允许数据流由实体内部流出端口.该模式通常用于终端计数一类的输出,不能用于反馈.
BUFFER(缓冲):该模式允许数据流出该实体和作为内部反馈时用,但不允许作为双向端口使用.
2选1 数据选择器
d1
d0
q
sel
u2
u1
u3
tmp1
tmp2
tmp3
例8 用带保护条件的BLOCK语句描述一个锁存器的结构.
ENTITY latch IS
PORT(d, clk : IN STD_LOGIC;
q, qn : OUT STD_LOGIC);
END latch;
ENTITY comp4 IS
PORT(a, b: IN STD_LOGIC_VECTOR(3 downto 0);
y: OUT STD_LOGIC);
END comp4;
--结构体 1:
ARCHITECTURE behavior OF comp4 IS
BEGIN
Comp: PROCESS(a, b)
包体中的子程序及其相应的说明是专用的,不能被其它VHDL单元所引用;而包集合中的说明是公用的,它可以独立地编译并插入设计库中.包集合体是次级设计单元,只有在其对应的主设计单元编译并插入设计库之后,才可独立地编译并插入到设计库中.
程序包举例(见vhdl程序example )
2.1.1.5 库(LIBRARY)
out
out
buffer
inout
mode
mode
模式及其信号源
类属参数说明的格式为:
GENERIC(端口名{,端口名}:[IN] 子类型 [:=初始值]
{;端口名{,端口名}: [IN] 子类型 [:=初始值]} );
例2:加入类属说明的2输入的与门的逻辑描述
ENTITY and2 IS
库是用来放置可编译的设计单元的地方,通过其目录可查询和调用. VHDL中的库大致可归纳为5种:IEEE库,STD库,ASIC矢量库,WORK库和用户定义库.
IEEE库.常用的资源库.IEEE库包含经过IEEE正式认可的STD_LOGIC_1164包集合和某些公司提供的一些包集合,如STD_LOGIC_ARITH(算术运算库),STD_LOGIC_UNSIGNED等.
2.1.1 VHDL程序基本结构
实体部分描述设计系统的外部接口信号(即输入/输出信号)
结构体用于描述
系统的内部电路
配置用于从库中选取所需元件安装到设计单元的实体中
包集合存放各设计模块能共享的数据类型,常数,子程序等
2.1.1.1 实体(ENTITY)
实体的一般格式为:
ENTITY 实体名 IS
2.1.1.3 配置(CONFIGURATION)
配置的基本格式为:
CONFIGURATION 配置名 OF 实体名 IS
[配置说明];
END 配置名;
配置语句描述了层与层之间的连接关系,以及实体与构造体之间的连接关系.设计者可以利用配置语句选择不同的构造体,使其与要设计的实体相对应;在仿真某一个实体时,可以利用配置选择不同的构造体进行性能对比实验,以得到性能最佳的构造体.
GENERIC (rise,fall:time);
PORT(a,b : IN STD_LOGIC;
y : OUT STD_LOGIC);
END and2;
ARCHITECTURE and2x OF and2 IS
SIGNAL u: BIT;
BEGIN
u<=a AND b;
y<=u after(rise) when u='1' else u after(fall) ;
and2
b
类属参数说明是可选部分.如果需要,可使用以"GENERIC"语句来指定该设计单元的类属参数(如延时,功耗等).
实体名,端口名等均应为符合VHDL命名规则 的标识符.
端口说明的一般格式为:
PORT(端口名{,端口名}:端口模式 数据类型;
端口名{,端口名}:端口模式 数据类型);
BLOCK语句中所描述的各个语句是可以并行执行的,它和书写顺序无关.
一个大规模的电原理图通常可以分割成多张子原理图,以便于设计和存档.同样,在VHDL程序设计中,构造体对应整个电原理图,而构造体可由多个BLOCK块组成,每一个BLOCK块则对应一张子原理图.电原理图的分割关系和VHDL程序中用BLOCK块分割构造体的关系是一一对应的.
[类属参数说明];
[端口说明];
END;
ENTITY,IS,END是VHDL的关键字(保留字).
实体中的每一个I/O信号被称为端口,其功能对应于电路 图符号的一个引脚.端口说明则是对一个实体的一组端口的定义,即对基本设计实体与外部接口的描述.端口是设计实体和外部环境动态通信的通道.
a
y
END and2x;
例3: 四位加法器实体说明程序
ENTITY add4 IS
PORT(a, b: IN STD_LOGIC_VECTOR(3 downto 0);
Ci: IN STD_LOGIC;
Sum: OUT STD_LOGIC_VECTOR(3 downto 0);
Co: OUT STD_LOGIC);
END add4;
由实体说明画出四位加法器add4的电路图如下所示.
add4 aຫໍສະໝຸດ 3..0] b[3..0]
Sum[3..0]
Ci
Co
2.1.1.2 结构体(ARCHITECTURE )
结构体的一般格式如下:
ARCHITECTURE 结构体名 OF 实体名 IS
[结构体说明部分];
BEGIN
cale: BLOCK
BEGIN
tmp1<=d0 AND sel;
tmp2<=d1 AND (not sel);
tmp3<=tmp1 OR tmp2;
q<=tmp3;
END BLOCK cale;
END amux;
上述结构体中只有一个 BLOCK块,若电路复杂时可由几个BLOCK块组成.
BEGIN
IF a=b THEN
y<='1';
ELSE
y RETURN '0';
WHEN 'Z'=> RETURN 'Z';
END CASE;
END invert;
END BODY;
一个包集合说明至多可以带一个包体,包体和包头使用相同的名字.包体的内容是基本说明和子程序体说明.但要注意,若包集合中含有子程序说明时,必须将子程序放在对应的包体中.
D C
d
clk
在BLOCK块中的两个信号传送语句都写有前卫关键词guarded,表明只有clk='1'为真时,这两个语句才能执行.
例1 一个2输入的与门的逻辑描述
LIBRARY ieee; --库说明语句
USE ieee.std_logic_1164.ALL; --程序包说明语句
ENTITY and2 IS
PORT(a,b : IN STD_LOGIC;
y : OUT STD_LOGIC);
END and2;
ARCHITECTURE and2x OF and2 IS
BEGIN
y<=a AND b;
END and2x;
实体部分
结构体部分
VHDL设计文件的
两个基本组成部分
实体
(Entity)
结构体
(Architecture)
配置
(Configuration)
包集合
(Package)

(Library)
一个完整的
VHDL程序
库 用于存放已编译的实体,结构体,包集合和配置
上述5类库中,除了STD库和WORK库之外的其它库均为资源库.资源库是存放常规元件和标准模块的库,使用时需预先说明.
库说明语句的语法形式为:
LIBRARY 库名; --说明使用什么库
USE 包集合名; --说明使用库中哪一个包集合及包集
合中的项目(如过程名,函数名等)
包集合名最多为三个层次,即 :
ARCHITECTURE latch_a OF latch IS
BEGIN
g1:BLOCK(clk='1')
BEGIN
q<=guarded d after 5ns;
qn<=guarded not(d) after 7ns;
END BLOCK g1;
END latch_a;
q
nq
Q
INOUT(双向):可以允许数据流入或流出该实体.该模式也允许用于内部反馈.
如果端口模式没有指定,则该端口处于缺省模式为:IN .
数据类型原则上可以是任何标准的数据类型和用户自定义类型.
PORT (a,b : IN STD_LOGIC;
y : OUT STD_LOGIC);
in
in
in
STD库.VHDL的标准库.库中存放有称为"standard"的标准包集合,其中定义了多种常用的数据类型,均不加说明可直接引用.STD库中还包含有称为"textio"的包集合.在使用"textio"包集合中的数据时,应先说明库和包集合名,然后才可使用该包集合中的数据.
相关文档
最新文档