当前位置:文档之家› vhdl语言

vhdl语言

vhdl语言
vhdl语言

第6章 VHDL硬件描述语言本章要点

VHDL语言的数据结构

VHDL语言的顺序语句和并行语句

VHDL程序设计

6.1 VHDL概述 6.1.1 VHDL的特点

(1)作为HDL的第一个国际标准,VHDL具有很强的可移植性。

(2)具有丰富的模拟仿真语句和库函数。

(3)VHDL有良好的可读性,接近高级语言,容易理解。

(4)系统设计与硬件结构无关。

(5)支持模块化设计。

(6)用VHDL完成的一个确定设计,可以利用EDA工具自动地把VHDL描述转变成门电路级网表文件。

(7)设计灵活,修改方便。

用VHDL设计电路主要的工作过程是:编辑、编译、功能仿真(前仿真)、综合、布局、布线、后仿真(时序仿真)。

6.1.2 VHDL的基本结构

一个VHDL程序必须包括实体(ENTITY)和结构体(ARCHITECTURE)。除实体和结构体外,多数程序还要包含库和程序包部分。实体中定义了一个设计模块的外部输入和输出端口,即模块(或元件)的外部特征,描述了一个元件或一个模块与其他部分(模块)之间的连接关系,可以看作是输入输出信号和芯片管脚信息。结构体主要用来说明元件内部的具体结构,即对元件内部的逻辑功能进行说明,是程序设计的核心部分。库是程序包的集合,不同的库有不同类型的程序包。程序包用来定义结构体和实体中要用到的数据类型、元件和子程序等。

【例6-1】用VHDL设计一个非门(反向器)。

非门即 y = a,设反相器的VHDL的文件名是not1.vhd,其中的.vhd是VHDL程序文件的扩展名。程序结构如下:--库和程序包部分

LIBRARY IEEE; --打开IEEE库

USE IEEE.STD_LOGIC_1164.ALL; --调用库中STD_LOGIC_1164程序包

--实体部分

ENTITY not1 IS --实体名为 not1

PORT ( --端口说明

a:IN STD_LOGIC; --定义端口类型和数据类型

y:OUT STD_LOGIC);

END not1: --实体结束

--结构体部分

ARCHITECTURE inv OF not1 IS --结构体名为 inv

BEGIN

y <= NOT a; --将a取反后赋值给输出端口y

END inv; --结构体结束

这是一个完整的VHDL源程序实例。其中的第一部分是库和程序包,是用VHDL编写的共享文件,定义结构体和实体中要用到的数据类型、元件、子程序等,放在名为IEEE的库中。第二部分是实体,相当于定义电路单元的管脚信息。第三部分是结构体,用来描述电路的内部结构和逻辑功能。两条短划线是注释标识符,其右侧内容是对程序的具体注释,并不执行。所有语句都是以“;”结束,另外程序中不区分字母的大小写。

6.1.3 VHDL的库和程序包

1.库库是专门用于存放预先编译好的程序包的地方,对应一个文件目录,程序包的文件就放在此目录中,其功能相当于共享资源的仓库,所有已完成的设计资源只有存入某个“库”内才可以被其他实体共享。常用的库有IEEE库、STD库和WORK库。库语句格式如下:

LIBRARY 库名;

2.程序包程序包是用VHDL语言编写的一段程序,可以供其他设计单元调用和共享,相当于公用的“工具箱”,各种数据类型、子程序等一旦放入了程序包,就成为共享的“工具”,类似于C语言的头文件,使用它可以减少代码的输入量,使程序结构清晰。程序包分为包头和包体两部分。

程序包格式如下。

包头格式:PACKAGE 程序包名 IS

[包头说明语句]

END 程序包名;

包体格式:

PACKAGE BODY 程序包名 IS

[包体说明语句]

END 程序包名;

调用程序包的通用模式为:USE 库名.程序包名.ALL;

常用预定义程序包有以下四个:

(1)STD_LOGIC_1164程序包

(2)STD_LOGIC_ARITH程序包

(3)STD_LOGIC_SIGNED程序包

(4)STD_LOGIC_UNSIGNED程序包

6.1.4 VHDL的实体

VHDL描述的对象称为实体,是设计中最基本的模块。实体的格式如下:

ENTITY 实体名 IS

[GENERIC(类属说明)]

[PORT(端口说明)]

END 实体名;

1.类属说明类属说明是实体说明的一个可选项(可选项用[…]表示),主要为设计实体指定参数,可以用来定义端口宽度、实体中元件的数目、器件延迟时间等。

类属说明语句的格式如下:

GENERIC(常数名1:数据类型1:= 设定值1;

……;

常数名n:数据类型n:= 设定值n);

2.端口说明端口说明也是实体说明的一个可选项,负责对实体中输入和输出端口进行描述。端口说明语句格式如下:

PORT(端口信号名1:端口模式1 数据类型1;

……;

端口信号名n:端口模式n 数据类型n);

6.1.5 VHDL的结构体

结构体用来描述设计实体的内部结构或行为,是实体的一个重要组成部分,定义了实体的具体功能,规定了实体中的信号数据流程,确定了实体中内部元件的连接关系。结构体用三种方式对设计实体进行描述,分别是行为描述、寄存器传输描述和结构描述。其格式如下:

ARCHITECTURE 结构体名 OF 实体名 IS

[结构体说明部分;]

BEGIN

功能描述语句;

END 结构体名;

【例6-4】通过中间信号m实现输入端到输出端的数据传输。

ENTITY mybody IS --实体名为mybody

PORT( in1 :IN BIT; --定义端口

output1 :OUT BIT );

END mybody;

ARCHITECTURE myprog OF mybody IS --结构体名为myprog

SIGNAL m:BIT; --定义中间信号m

BEGIN

m <= in1; --输入信号传送给中间信号

output1 <= m; --中间信号送给输出信号

END myprog;

6.2 VHDL的数据结构

VHDL定义了常量、变量和信号三种数据对象,并规定每个对象都要有唯一确定的数据类型。

6.2.1 标识符

标识符是书写程序时允许使用的一些符号(字符串),主要由26个英文字母、数字0~9及下划线“_”的组合构成,允许包含图形符号(如回车符、换行符等)。可以用来定义常量、变量、信号、端口、子程序或参数的名字。标识符的命名规则如下:

l 第一个字符必须以字母开头;下划线不能连用;最后一个字符不能是下划线;对大小写字母不敏感(英文字母不区分大小写);长度不能超过32个字符。

6.2.2 数据对象

VHDL中凡是可以赋予一个值的对象都可称为数据对象。

1.常量常量是在设计实体中保持某一特定值不变的量。常量的格式如下:

CONSTANT 常量名:数据类型:= 表达式;

注意:数值和单位之间要留空格

常量一旦赋值之后,在程序中就不能再改变了。常量的使用范围取决于被定义的位置。常量所赋的值应该与定义的表达式数据类型一致,否则将会出现错误。

2.变量变量属于局部量,主要用来暂存数据。变量只能在进程和子程序中定义和使用,可以在变量定义语句中赋初值,但变量初值不是必需的。格式如下:

VARIABLE 变量名:数据类型约束条件:= 表达式;3.信号

信号是描述硬件系统的基本数据对象,是设计实体中并行语句模块间的信息交流通道。通常可认为信号是电路中的一根连接线。信号有外部端口信号和内部信号之分:外部端口信号是设计单元电路的管脚或称为端口,在程序实体中定义,有IN、OUT、INOUT、BUFFER四种信号流动方向,其作用是在设计的单元电路之间实现互连。外部端口信号供给整个设计单元使用,属于全局量;信号描述格式如下:

SIGNAL 信号名:数据类型约束条件:= 初始值;

在程序中,信号赋值使用符号<=,变量赋值使用符号:=,信号与变量都能被连续地赋值,其主要区别如下:

l 信号赋值有附加延时,变量赋值则没有。

l 信号可看成硬件的一根连线,变量在硬件中没有类似的对应关系。

l 对于进程语句,进程只对信号敏感,不对变量敏感。

l 信号除了具有当前值外还具有一定的历史信息(保存在预定义属性中),变量只有当前值。

l 在进程中,信号和变量的赋值是不同的,信号的赋值在进程结束时起作用,而变量赋值是立即起作用。6.2.3 数据类型

对于常量、变量和信号这三种数据对象,在为每一种数据对象赋值时都要确定其数据类型。VHDL对数据类型有着很强的约束性,不同的数据类型不能直接运算,相同的类型如果位长不同也不能运算。根据数据产生来源可将数据类型分为预定义类型和用户自定义类型两大类,这两类都在VHDL的标准程序包中作了定义,设计时可随时调用。

1.预定义数据类型

该类型是最常用、最基本的一种数据类型,在标准程序包STANDARD和STD LOGIC_ 1164及其他程序包中作了定义,已自动包含在VHDL源文件中,不必通过USE语句进行显示调用。

具体类型如下:

(1)整数类型(INTEGER)(2)自然数(NATURAL)和正整数(POSITIVE)类型(3)实数(REAL)类型(4)位(BIT)类型(5)位向量(BIT_VECTOR)类型(6)布尔量(BOOLEAN)类型(7)字符(CHARACTER)类型(8)字符串(STRING)类型(9)时间(TIME)类型(10)错误等级(SEVERITY LEVEL)类型

2.用户自定义数据类型

用户定义的数据类型格式如下:

TYPE 数据类型名 IS 数据类型定义 OF 基本数据类型;

或写成下面的格式:

TYPE 数据类型名 IS 数据类型定义;

VHDL允许用户定义的数据类型主要有枚举类型、数组类型和用户自定义子类型三种。

(1)枚举类型(ENUMERATED)

枚举类型是在数据类型定义中直接列出数据的所有取值。其格式如下:

TYPE 数据类型名 IS(取值1,取值2,…);

(2)数组类型(ARRAY)

数组类型是将相同类型的数据集合在一起所形成的一个新数据类型,可以是一维的,也可以是多维的。数组类型定义格式如下:

TYPE 数据类型 IS ARRAY 范围 OF 数据类型;

(3)用户自定义子类型

用户若对自己定义的数据作一些限制,由此就形成了原自定义数据类型的子类型。对于每一个类型说明,都定义了一个范围。子类型的格式如下:

SUBTYPE 子类型名 IS 基本数据类型名 [范围限制];

6.2.4 VHDL的表达式

VHDL的表达式是将操作数用不同类型的运算符连接而成,其基本元素包括运算符和操作数。

1.运算符

VHDL与其他高级语言相似,有着丰富的运算符,以满足描述不同功能的需要。主要有四类常用的运算符,分别是逻辑运算符、算术运算符、关系运算符和连接(并置)运算符。

(1)逻辑运算符

VHDL有7种逻辑运算符:AND、OR、NAND、NOR、XOR、XNOR、NOT。

(2)关系运算符

VHDL有6种关系运算符,是将两个相同类型的操作数进行数值相等比较或大小比较,要求这些关系运算符两边的数据类型必须相同,其运算结果为BOOLEAN类型,即表达式成立结果为TURE、不成立结果为FALSE。(3)移位运算符

移位运算符是VHDL_94新增的运算符,其中SLL(逻辑左移)和SRL(逻辑右移)是逻辑移位、SLA(算术左移)和SRA(算术右移)是算术移位、ROL(循环左移)和ROR(循环右移)是循环移位。

(4)符号运算符

+(正号)、-(负号)与日常数值运算相同,主要用于浮点和物理类型运算。

(5)连接运算符

连接运算符也称为并置运算符,只有一种符号,用&表示。

(6)算术运算符

算术运算符中,单目运算(ABS、**)的操作数可以是任何数据类型、+(加)、-(减)的操作数为整数类型、*(乘)、/(除)的操作数可以为整数或实数。

2.操作数

操作数是运算符进行运算时所需的数据,操作数将其数值传递给运算符进行运算。操作数种类有多种,最简单的操作数可以是一个数字,或者是一个标识符,如一个变量或者信号的名称。操作数的类型有:常量、变量、信号、表达式、函数、文件等。

6.3 VHDL的顺序语句

VHDL语句用来描述系统内部硬件结构、动作行为及信号间的基本逻辑关系,这些语句不仅是程序设计的基础,也是最终构成硬件的基础。

6.3.1 赋值语句

赋值语句是将一个值或者一个表达式的结果传递给某一个数据对象。数据在实体内部的传递以及对端口外的传递都必须通过赋值语句来实现。主要有变量赋值语句和信号赋值语句两种。

1.变量赋值语句

变量的说明和赋值都限定在其定义区域内,无法传递到所定义的区域外,因此具有局部性。

变量赋值语句的语法格式如下:

目的变量:= 变量表达式(赋值源);

【例6-5】给变量a赋值。

PROCESS --进程

VARIABLE a: BIT; --在进程中定义变量a

BEGIN

a :='0'; --给变量a赋值为0

END PROCESS;

2.信号赋值语句

信号赋值语句具有全局特征,不但可以使数据在设计实体内传递,还可以通过信号的赋值操作与其他实体进行数据交流。

信号赋值语句的语法格式如下:

目的信号名:< = 信号表达式(赋值源);

【例6-6】设计一个二输入与门电路,输入信号为a、b,输出信号为y。

ENTITY andg IS

PORT(a,b:IN BIT;

y:OUT BIT);

END andg;

ARCHITECTURE data OF andg IS

BEGIN

PROCESS

BEGIN

y < = a AND b; --信号a、b与运算后,赋值给信号y

END PROCESS;

END data;

6.3.2 IF语句

IF语句是根据所指定的一种或多种条件来决定执行哪些语句的一种重要顺序语句,因此也可以说成是一种控制转向语句。一般有三种格式:

(1)跳转控制。格式如下:

IF 条件 THEN

顺序语句;

END IF;

(2)二选一控制。格式如下:

IF 条件 THEN

顺序语句;

ELSE

顺序语句;

END IF;

(3)多选择控制语句。格式如下:

IF 条件 1 THEN 顺序语句1;

ELSIF 条件2 THEN 顺序语句2;

……;

ELSIF 条件n THEN 顺序语句n;

ELSE 顺序语句 n+1;

END IF;

注意:每个IF语句必须有一个对应的END IF语句。

6.3.3 CASE语句

CASE语句和IF语句的功能有些类似,是一种多分支开关语句,可根据满足的条件直接选择多个顺序语句中的一个执行。CASE语句可读性好,很容易找出条件和动作的对应关系,经常用来描述总线、编码和译码等行为。CASE语句的格式如下:

CASE 表达式 IS

WHEN 条件选择值1=> 顺序语句1;

WHEN 条件选择值2=> 顺序语句2;

WHEN 条件选择值3=> 顺序语句3;

…… ;

WHEN OTHERS => 顺序语句n;

END CASE;

其中WHEN的条件选择值有以下几种形式:

l 单个数值,如WHEN 3。

l 并列数值,如WHEN 1 | 2,表示取值1或者2。

l 数值选择范围,如WHEN(1 TO 3),表示取值为1、2、或者3。

l 其他取值情况,如WHEN OTHERS,常出现在END CASE之前,代表已给出的各条件选择值中未能列出的其他可能取值。

注意:语句中的=>不是运算符,只相当于THEN的作用。

6.3.4 WAIT语句

进程在执行过程中总是处于两种状态:执行或挂起。进程中的敏感信号能够触发进程执行,WAIT语句也能起到与敏感信号同样的作用。

(1)无限等待。不设置停止挂起条件的表达式,表示永远挂起。格式如下:

WAIT;

(2)等待敏感信号变化。格式如下:

WAIT ON 信号名[,信号名…];

(3)等待条件满足。格式如下:

WAIT UNTIL 布尔表达式;

(4)超时等待。格式如下:

WAIT FOR 时间表达式;

注意:已经列出敏感信号的进程不能使用任何形式的WAIT语句。

6.3.5 子程序

子程序是由一组顺序语句组成的, 可以在程序包、结构体和进程中定义,只有定义后才能被主程序调用,子程序将处理结果返回给主程序,主程序和子程序之间通过端口参数关联进行数据传送,其含义与其他高级语言相同。 VHDL中的子程序有两种类型:过程和函数。

1.过程(PROCEDURE)

过程的定义语句由两部分组成,即过程首和过程体。过程定义的格式为:

PROCEDURE 过程名参数列表 --过程首

PROCEDURE 过程名参数列表 IS --过程体

说明部分;

BEGIN

顺序语句

END 过程名;

调用过程语句的格式为:过程名参数列表;

2.函数(FUNCTION)

函数语句分为两个部分:函数首和函数体。在进程和结构体中,函数首可以省略,而在程序包中,必须定义函数首,放在程序包的包首部分,而函数体放在包体部分。格式如下:

FUNCTION 函数名(参数列表) --函数首

RETURN 数据类型名;

FUNCTION 函数名(参数列表) --函数体

RETURN 数据类型名IS

说明部分;

BEGIN

顺序语句;

RETURN 返回变量;

END 函数名;

调用函数语句的格式为:

y <= 函数名(参数列表);

6.3.6 LOOP语句

LOOP语句可以使程序有规则地循环执行,循环次数取决于循环参数的取值范围。常用的循环语句有FOR 和WHILE两种。

1.FOR循环

FOR循环是一种已知循环次数的语句,其格式如下:

[循环标号]:FOR 循环变量 IN 循环次数范围 LOOP

顺序语句;

END LOOP [循环标号];

2.WHILE循环

WHILE循环是一种未知循环次数的语句,循环次数取决于条件表达式是否成立。其格式如下:

[循环标号]:WHILE 条件表达式 LOOP

顺序语句;

END LOOP [循环标号];

6.3.7 返回语句

返回语句是一段子程序结束后,返回主程序的控制语句,返回语句只能用在子程序中。其格式有两种:(1)RETURN;

(2)RETURN 表达式;

第一种格式语句只能用于过程,无条件地结束过程,不返回任何值;第二种格式语句只能用于函数,其表达式提供函数返回值,每一函数必须包含一个或多个返回语句,但在函数调用时只有一个返回语句能将返回值带回。

可见,RETURN语句在函数和过程中的使用是有区别的。过程中的RETURN语句不能含有表达式,而在函数中的RETURN语句必须含有一个表达式,同时RETURN语句也是结束函数执行的惟一条件。

6.4 VHDL的并行语句

并行语句是VHDL区别于传统软件描述语言最显著的一个方面。各种并行语句在结构体中是同时并发执行的,也就是说,只要某个信号发生变化,都会引起相应语句被执行而产生相应的输出,其执行顺序与书写顺序没有任何关系。在结构体中并行语句的位置如下:

ARCHITECTURE 结构体名 OF 实体名 IS

说明语句;

BEGIN

并行语句;

END 结构体名;

在结构体中常用的并行语句有:并行信号赋值语句、进程语句、元件例化语句、块语句和生成语句等。

6.4.1 并行信号赋值语句

并行信号赋值语句有三种形式:简单信号赋值语句、条件信号赋值语句和选择信号赋值语句。其共同点是赋值目标必须都是信号,这三种语句与其他并行语句一样,在结构体内是同时执行的。

1.简单信号赋值语句

简单信号赋值语句的格式为:信号 < = 表达式;

2.条件信号赋值语句

条件信号赋值语句是一种并行信号赋值语句,可以根据不同的条件将不同的表达式值赋给目标信号。格式如下:

信号 <= 表达式1 WHEN 赋值条件1 ELSE

表达式2 WHEN 赋值条件2 ELSE

……

表达式n;

使用条件信号赋值语句时,应该注意以下几点:

(1)只有当条件满足时,才能将该条件前面的表达式的值赋给目标信号。

(2)对条件进行判断是有顺序的,位置靠前的条件具有较高的优先级,只有不满足本条件的时候才会去判断下一个条件。

(3)条件表达式的结果为布尔类型数值。

(4)最后一个表达式后面不含有WHEN子句。

(5)条件信号赋值语句允许条件重叠。

3.选择信号赋值语句

选择信号赋值语句是一种条件分支的并行语句,格式如下:

WITH 选择选择表达式 SELECT

目标信号 < = 信号表达式1 WHEN 选择条件1,

信号表达式2 WHEN 选择条件2,

……,

信号表达式n WHEN 选择条件n;

使用选择信号赋值语句时,应该注意以下几点:

(1)只有当选择条件表达式的值符合某一选择条件时,才将该选择条件前面的信号表达式赋给目标信号。(2)每一个信号表达式后面都含有WHEN子句。

(3)由于选择信号赋值语句是并发执行的,所以不能够在进程中使用。

(4)对选择条件的测试是同时进行的,语句将对所有的选择条件进行判断,而没有优先级之分。这时如果选择条件重叠,就有可能出现两个或两个以上的信号表达式赋给同一目标信号,这样就会引起信号冲突,因此不允许有选择条件重叠的情况。

(5)选择条件不允许出现涵盖不全的情况。如果选择条件不能涵盖选择条件表达式的所有值,就有可能出现选择条件表达式的值找不到与之符合的选择条件,这时编译将会给出错误信息。

注意:每条WHEN短句表示并列关系用逗号,最后一句用分号。

6.4.2 块语句

块语句是一种并行语句的组合方式,可以使程序更加有层次、更加清晰。在物理意义上,一个块语句对应一个子电路;在逻辑电路图上,一个块语句对应一个子电路图。块语句的格式如下:

块标号:BLOCK

说明语句;

BEGIN

并行语句;

……;

END BLOCK 块标号;

6.4.3 进程语句

一个结构体内可以包含多个进程语句,多个进程之间是同时执行的。进程语句本身是并行语句,但每个进程的内部则由一系列顺序语句构成。进程语句的格式如下:

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

进程说明; --说明用于该进程的常数,变量和子程序

BEGIN

变量和信号赋值语句;

顺序语句;

END PROCESS [进程名];

进程语句的主要特点归纳如下:

(1)同一结构体中的各个进程之间是并发执行的,并且都可以使用实体说明和结构体中所定义的信号;而同一进程中的描述语句则是顺序执行的,并且在进程中只能设置顺序语句。

(2)为启动进程,进程的结构中必须至少包含一个敏感信号或包含一个WAIT语句,但是在一个进程中不能同时存在敏感信号和WAIT语句。

(3)一个结构体中的各个进程之间可以通过信号或共享变量来进行通信,但任一进程的进程说明部分不允许定义信号和共享变量。

(4)进程语句是VHDL中的重要的建模语句,进程语句不但可以被综合器所支持,而且进程的建模方式直接影响仿真和综合的结果。

6.4.4 元件声明语句和元件例化语句

元件声明语句和元件例化语句就是在一个结构体中定义元件和实现元件调用的两条语句,元件声明语句放在结构体的ARCHITECTURE和BEGIN之间,指出该结构体调用哪一个具体的元件。元件例化语句是指元件的调用,语句中的PORT MAP是端口映射的意思,表示结构体与元件端口之间交换数据的方式(元件调用时要进行数据交换)。两种语句的格式如下:

(1)元件声明语句(COMPONET)格式如下:

COMPONET 元件名

PORT 元件端口说明(与该元件源程序实体中的PORT部分相同)

END COMPONET;

(2)元件例化语句(PORT MAP)格式如下:

例化名:元件名 PORT MAP(元件端口对应关系列表);

当采用PORT MAP语句进行元件端口信号映射时,信号之间有位置映射和名称映射两种映射(关联)方式。l 位置映射:就是被调用元件端口说明中信号的书写顺序及位置和PORT MAP语句中实际信号的书写顺序及位置一一对应。例如某元件的端口说明为:PORT(a,b:IN BIT;c:OUT BIT);调用该元件时可使用:com1:u1 PORT MAP(n1,n2,m);显然n1对应a,n2对应b,m对应c,com1是例化名,u1是元件名。

l 名称映射:该映射就是将库中已有的模块的端口名称赋予设计中的信号名。上例可改为:com1:u1 PORT MAP(a => n1,b => n2,c => m);

6.4.5 生成语句

生成语句是一种循环语句,具有复制电路的功能。当设计一个由多个相同单元模块组成的电路时,利用生成语句复制一组完全相同的并行组件或设计单元电路结构,避免多段相同结构的重复书写,以简化设计。生成语句有FOR工作模式和IF工作模式两种。

1.FOR工作模式的生成语句

FOR工作模式常常用来进行重复结构的描述,格式如下:

[生成标号:] FOR 循环变量 IN 取值范围 GENERATE

并行语句;

END GENERATE [生成标号];

2.IF工作模式的生成语句

IF工作模式的生成语句常用来描述带有条件选择的结构。格式如下:

[生成标号:] IF 条件 GENERATE

并行语句;

END GENERATE [生成标号];

FOR工作模式生成语句常用来进行重复结构的描述,其循环变量是一个局部变量,取值范围可以选择递增和递减两种形式;IF工作模式生成语句主要用于描述含有例外情况的结构,如边界处发生的特殊情况。该语句中只有IF条件为TURE时,才执行结构体内部的语句。由于两种工作模式各有特点,因此在实际的硬件数字电路设计中,两种工作模式常常可以同时使用。

基于VHDL语言译码器的设计

基于V H D L语言译码 器的设计 公司内部档案编码:[OPPTR-OPPT28-OPPTL98-OPPNN08]

《EDA技术》课程实验报告 学生姓名:黄红玉 所在班级:电信100227 指导教师:高金定老师 记分及评价: 一、实验名称 实验4:3-8译码器的设计 二、任务及要求 【基本部分】4分 1、在QuartusII平台上,采用文本输入设计方法,通过编写VHDL语 言程序,完成3-8译码器的设计并进行时序仿真。 2、设计完成后生成一个元件,以供更高层次的设计调用。 3、实验箱上选择恰当的模式进行验证,目标芯片为ACEX1K系列 EP1K30TC144-3。 【发挥部分】1分 修改设计,完成3-6译码器的设计,并进行时序仿真。 三、实验程序 library ieee;

use use entity decoder is port(en:in std_logic; a,b,c:in std_logic; y:out bit_vector(7 downto 0)); end entity decoder; architecture art4 of decoder is signal sr:std_logic_vector(2 downto 0); begin sr<=c&b&a; process(sr)is begin case sr is when"000"=>y<="00000001"; when"001"=>y<="00000010"; when"010"=>y<="00000100"; when"011"=>y<="00001000"; when"100"=>y<="00010000"; when"101"=>y<="00100000"; when"110"=>y<="01000000"; when"111"=>y<=""; when others=>y<="00000000"; end case;

VHDL语言的主要描述语句

VHDL语言的主要描述语句 按照语句的执行顺序对VHDL语言进行分类,包含两类语句: ●并行描述语句该语句的执行与书写顺序无关,总是同时被执行 ●顺序描述语句从仿真的角度,该语句是顺序执行的 进程语句(PROCESS)是最典型的并行语句,一个构造体内可以有几个进程语句同时存在,而且并发执行。但是进程内部的所有语句都是顺序语句。 一、顺序描述语句 顺序描述语句只能用在进程和子程序中,它和其他高级语言一样,其语句是按照语句的出现的顺序加以执行的。如下分别介绍有关的顺序描述语句. 1.WAIT语句 进程在执行过程中总是处于两种状态:执行或挂起,进程的状态变化受等待语句的控制,当进程执行到等待语句,就被挂起,并等待再次执行进程. 等待语句的格式: *WAIT 无限等待 *WAIT ON 敏感信号变化 *WAIT UNTIL 条件满足 *WAIT FOR 时间到 (1)WAIT ON 格式:WAIT ON 信号[,信号] 例5-1 PROCESS(a,b) BEGIN y<=a AND b; END PROCESS; 该例中的进程与下例中进程相同: 例5-1 PROCESS BEGIN y<=a AND b; WAIT ON a,b; END PROCESS; 例5-2 PROCESS(a,b) BEGIN y<=a AND b; WAIT ON a,b; END PROCESS;

(2)WAIT UNTIL 直到条件满足 格式: WAIT UNTIL 布尔表达式 当进程执行到该语句时,被挂起;若布尔表达式为真时,进程将被启动. 例: WAIT UNTIL ((x*10)<100) (3)WAIT FOR 等到时间到 格式: WAIT FOR 时间表达式 当进程执行到该语句时,被挂起;等待一定的时间后,进程将被启动. 例: WAIT FOR 20 ns; WAIT FOR (a*(b+c); (4)多条件WAIT 语句 例: WAIT ON nmi,interrupt UNTIL ((nmi=TRUE) OR (interrupt=TRUE)) FOR 5 us 该等待有三个条件: 第一,信号nmi和interrupt 任何一个有一次刷新动作 第二, 信号nmi和interrupt 任何一个为真 第三, 已等待5 us 只要一个以上的条件被满足,进程就被启动. *注意:多条件等待时,表达式的值至少应包含一个信号量的值。 (5) 超时等待 例 5-3

vhdl语言的基本知识点罗列.doc

VHDL语言的基本知识点罗列 1 VHDL语言的标识符 VHDL中的标识符可以是常数、变量、信号、端口、子程序或参数的名字。使用标识符要遵守如下法则: a)标识符由字母(A…Z;a…z)、数字和下划线字符组成。 任何标识符必须以英文字母开头。λ 末字符不能为下划线。λ b)不允许出现两个连续下划线。 标识符中不区分大小写字母。λ VHDL定义的保留子或称关键字,不能用作标识符。λ c) VHDL中的注释由两个连续的短线(--)开始,直到行尾。 以下是非法标识符: -Decoder —起始不能为非英文字母 3DOP —起始不能为数字 Large#number —“#”不能成为标识符的构成符号 Data__bus —不能有双下划线 Copper_ —最后字符不能为下划线 On —关键字不能用作标识符。 注:在AHDL语言中标识符要区分大小写,但在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语言的EDA实验报告(附源码)

EDA 实验报告 ——多功能电子钟 姓名:张红义 班级:10级电科五班 学号:1008101143 指导老师:贾树恒

电子钟包括:主控模块,计时模块,闹钟模块,辅控模块,显示模块,蜂鸣器模块,分频器模块。 1.主控模块: 主要功能:控制整个系统,输出现在的状态,以及按键信息。 源代码: libraryieee; use ieee.std_logic_1164.all; useieee.std_logic_arith.all; useieee.std_logic_unsigned.all; entity mc is port(functionswitch,k,set,lightkey: in std_logic; chose21,setout: out std_logic; lightswitch:bufferstd_logic; modeout,kmodeout : out std_logic_vector(1 downto 0); setcs,setcm,setch,setas,setam,setah:outstd_logic); end mc; architecture work of mc is signalmode,kmode:std_logic_vector(1 downto 0); signal light,chose21buf:std_logic; signalsetcount:std_logic_vector(5 downto 0); begin process(functionswitch,k,set,lightkey) begin iffunctionswitch'event and functionswitch='1' then mode<=mode+'1'; end if; iflightkey'event and lightkey='1' then lightswitch<=not lightswitch; end if; if mode="01" thenchose21buf<='0'; else chose21buf<='1'; end if; ifk'event and k='1' then if mode="01" or mode="11" then kmode<=kmode+'1'; end if;end if; if set='1' then if mode = "01" then ifkmode="01" then setcount<="000001"; elsifkmode="10" thensetcount<="000010"; elsifkmode="11" then setcount<="000100";

VHDL语言的基本要素(大全)

VHDL语言的基本要素 一、数据对象 VHDL语言的主要数据对象有信号,变量,常量。 信号—信号是电路中的物理量,对应于电路的连线、节点;信号说明全局量,用于描述中的构造体(Architecture), 实体(Intity),程序包(package)。 变量—变量是程序运算中的中间量,并不对应电路中的物理量。变量说明局部量,用于进程语句(process), 函数(Function), 过程(procedure)。 常量—常数也不对应电路中的物理量,当常量说明全局量,在构造体(Architecture), 实体(Intity),程序包(package),进程语句(process), 函数(Function), 过程(procedure)中均可使用。数据对象的定义格式: signal 信号名:数据类型,约束条件,表达式 Variable 变量名:数据类型,约束条件:=表达式 Constant 常量名:数据类型,约束条件:=表达式 例如:Variable count:INTEGER RANGE 0 TO 255:=10 Constant Daly:Time:=100ns 信号代入和变量赋值的区别:两者形式不同,操作过程也不相同。变量赋值符“:=”,信号的代入符“<=”。 在变量的赋值语句中,该语句一当执行,其值立即将赋予变量;而信号的代入,其语句执行后不会立即使信号发生代入,在下条语句

执行时,仍使用原来的信号值,如进程语句中的敏感表的信号代入就是如此。 二、数据类型 VHDL语言中的数据类型,一般而言可分为:标量类型和组合类型。在实际使用中,也可分成予定义类型和用户定义类型。VHDL语言是强类型的语言,主要可按如下分类和变换处理。 ①标准数据类型 ⑴整数⑵实数(浮点数)-1.0E+38~+1.0E38 ⑶位bit (0,1) ⑷位矢量⑸布尔量,“假”,“真”⑹字符(ASCⅡ)字符 ⑺时间 ⑻错误等级⑼自然数(大于等于0的整数)⑽字符串 (字符矢量) ②用户定义的数据类型 TYPE 数据类型名{数据类型名} 数据类型定义 ⑴枚举类型⑵整数类型⑶实数类型⑷数组类型 ⑸存取类型⑹文件类型⑺记录类型⑻时间类型③用户定义子类型 SUBTUPE 子类型名IS 数据类型名[范围] 例:SUBTYPE digit is INTEGER RANGE 0 TO 9 ④数据类型转换 数据类型的变换函数通常由“STD_LOGIC_1164”,

基于VHDL语言的简易洗衣机控制器

电子课程设计 ——简易洗衣机控制器设计 学院: 班级: 姓名: 学号: 指导老师: 2013年12月

目录 第一部分:设计任务与要求 (1) 第二部分:总体框图 (1) 第三部分:选择器件 (2) 第四部分:功能模块 (3) 4.1时间预置编码寄存模块(settime) (3) 4.2减法计数器模块(counter) (4) 4.3数码管显示模块(showtime) (7) 4.4时序电路模块(analyse) (9) 4.5译码器模块(move)……………………………………… 1 1 第五部分:总体设计电路图 (13) 5.1总体(顶层)设计电路图 (13) 5.2顶层文件仿真 (13) 5.3管脚分配图 (14) 5.4硬件实验效果图 (14) 第六部分:课程设计心得体会 (15)

简易洗衣机控制器设计 一、设计任务与要求 设计一个洗衣机洗涤程序控制器,控制洗衣机的电动机按下图所示的规律运 转: 时间到 用两位数码管预置洗涤时间(分钟数),洗涤过程在送入预置时间后开始运转,洗涤中按倒计时方式对洗涤过程作计时显示,用LED 表示电动机的正、反转,如果定时时间到,则停机并发出音响信号。 二、总体框图 RUN REV PAUSE time_over clk K5 start K6 load K1 K2 K3 K4 各个部分的具体功能描述如下: (一)预设时间和编码电路(settime ):接受用户通过按钮预置的时间信息,编码 译码驱动模块(move) clk out_1 out_2 start 时序电路模块(analyse) clk time_over start 十进制减法计数器模块(counter) 洗涤预置时间编码寄存电路模块(settime) 报警信号 时间显示模块(showtime ) 定时启动 停止 正转 暂停 反转 暂停

基于VHDL语言的秒表综合设计

设 计 报 告 课程名称 _______ 设计题目 _______ 指导老师 _______ 学 生 _______ 学 号 ___ 现代电子技术综合实验 数字式秒表设计与实现

目录 1 引言…….......................................................................................... 1.1课程设计的内容及要求.................................................................. 2 VHDL简介…….............................................................................. 2.1硬件描述语言——VHDL……...................................................... 2.1.1 VHDL语言的特点……............................................................. 2.1.2 VHDL语言的设计流程……..................................................... 3 秒表设计过程……............................................................................ 3.1原理框图…….................................................................................. 3.2设计思路模块化….......................................................................... 3.3模块的功能简述……...................................................................... 3.3.1分频器…..................................................................................... 3.3.2计数器……................................................................................. 3.3.3数据锁存器…….......................................................................... 3.3.4显示译码模块….......................................................................... 3.3.5控制模块…….............................................................................. 3.3.6按键消抖模块……...................................................................... 3.3.7顶层文件…….............................................................................. 4 模块电路仿真……................................................................................ 4.1 分频器 4.2计数器

VHDL语言学习

(本学习以MAXPLUS10为工具软件) 第一章、 VHDL程序的组成 一个完整的VHDL程序是以下五部分组成的: 库(LIBRARY):储存预先已经写好的程序和数据的集合 程序包(PACKAGE):声明在设计中将用到的常数、数据类型、元件及子程序 实体(ENTITY):声明到其他实体或其他设计的接口,即定义本定义的输入输出端口 构造体(ARCHITECTUR):定义实体的实现,电路的具体描述 配置(CONFIGURATION):一个实体可以有多个构造体,可以通过配置来为实体选择其中一个构造体 库 库用于存放预先编译好的程序包(PACKAGE)和数据集合体,可以用USE语句调用库中不同的程序包,以便不同的VHDL设计使用。 库调用的格式: LIRARY 库名 USE 库名.所要调用的程序包名.ALL 可以这样理解,库在硬盘上的存在形式是一个文件夹,比如库IEEE,就是一个IEEE的文件夹,可以打开MAX PLUSR安装源文件夹,进入VHDL93的文件夹,就可以看到一个IEEE的文件夹,这就是IEEE库,而里面的文件就是一个个对程序包或是数据的描述文件,可以用文本打开来查看文件的内容。 例如在VHDL程序里面经常可以看到“USE ”,可以这样解释这句话,本序里要用到IEEE 文件夹下程序包STD_LOGIC_1164,而STD_LOGIC_1164是可以在IEEE文件夹的文件里面看到的,用文本打开,可以看到有一名为“”PAKAGE定义。 简单的来说,库相当于文件夹,而程序包和数据就相当于文件夹里面的文件的内容(注意:不是相当于文件,因为程序包和数据都是在文件里面定义的,而文件名是和实体名相同的,可以说实体相当于文件)。

第四章 VHDL的语言要素

第四章VHDL的语言要素 4.1 VHDL的数据对象 与其他高级语言一样,VHDL中把用来承载数据的容器叫做VHDL的数据对象,VHDL的数据对象主要有信号、常量和变量三类。 1 常量 在VHDL中,常量是一种不变的量,它只能在对它定义时进行赋值,并在整个程序中保持该值不变。常量的功能一方面可以在电路中代表电源、地线等,另一方面可提高程序的可读性,也便于修改程序。常量定义的格式为: CONSTANT 常量名:数据类型:=表达式; [例3.4] 常量定义举例 CONSTANT V: INTEGER:=8; 2 变量 变量是临时数据的容器,它没有物理意义,并且只能在进程和子程序中定义,也只能在进程和子程序中使用。变量一旦赋值立即生效。变量定义的描述格式为:VARIABLE 变量名:数据类型[:=表达式]; [例3.5]变量定义举例 VARIABLE y: INTEGER; 3 信号 信号是VHDL的一种重要数据对象,它定义了电路中的连线和元件的端口。其中端口和内部信号定义的差别是在端口定义中多了一个端口模式的定义。信号是一个全局量,可以用来进行各模块之间的通信。信号定义的格式为: SIGNAL 信号名:数据类型; [例3.6]信号定义举例 SIGNAL A: STD_LOGIC; 4.2 VHDL的数据类型 VHDL是一种强类型的语言,每一个数据对象都必须具有确定的数据类型定义,并且只有在相同数据类型的数据对象之间,才能进行数据交换。VHDL预定义了大量的数据类型,下面介绍几种最常用的数据类型。 1 整数数据类型(INTEGER) 整数类型的数有正整数负整数和零,在VHDL中其取值范围是:

基于VHDL语言38译码器

3-8译码器的设计 1 设计目的与要求 随着社会的进一步发展,我们的生活各个地方都需要计算机的参与,有了计算机,我们的生活有了很大的便利,很多事情都不需要我们人为的参与了,只需要通过计算机就可以实现自动控制。由此,计算机对我们的社会对我们每个人都是很重要的。所以我们要了解计算机得组成,内部各种硬件,只有了解了计算机基本器件已经相应的软件,才能促进社会的发展。编码器和译码器的设计是计算机的一些很基础的知识,通过本次对于编码器和译码器的设计,可以让我知道究竟这种设计是如何实现的,这种设计对我们的生活有什么帮助,这种设计可以用到我们生活的哪些方面,对我们的各种生活有什么重大的意义。 1.1 设计的目的 本次设计的目的是通过简单的译码器的设计掌握基本的计算机的一些有关的知识,通过查资料已经自己的动手设计去掌握EDA技术的基本原理已经设计方法,并掌握VHDL硬件描述语言的设计方法和思想。以计算机组成原理为指导,通过将理论知识,各种原理方法与实际结合起来,切实的亲手设计,才能掌握这些非常有用的知识。通过对编码器和译码器的设计,巩固和综合运用所学知识,提高IC设

计能力,提高分析、解决计算机技术实际问题的独立工作能力。也能通过这种自主设计,增强自己的动手能力,将理论知识切实应用的能力,这对我们将来的发展是很有帮助的。 1.2 设计要求 根据计算机组成原理中组合逻辑电路设计的原理,利用VHDL设计计算机电路中译码器的各个模块,并使用EDA 工具对各模块进行仿真验证和分析。译码器由三-八译码器为实例代表。 关键词:输入、输出、译码 2 VHDL的简单介绍 2.1 VHDL的简介 VHDL语言是一种用于电路设计的高级语言。它在80年代的后期出现。最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。 VHDL翻译成中文就是超高速集成电路硬件描述语言,主要是应用在数字电路的设计中。目前,它在我过的应用多数是用在FPGA/CPLD/EPLD的设计中。当然在一些实力较为雄厚的单位,它也被用来设计ASIC。VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部

基于VHDL语言的VGA程序

library ieee; use ieee.std_logic_1164.all; entity vgactr is port( c lk:in std_logic; rst:in std_logic; red:out std_logic; green:out std_logic; blue:out std_logic; H_Sync:out std_logic; V_Sync:out std_logic); end vgactr; architecture behavioral of vgactr is signal cnt_H:integer range 0 to 799; signal cnt_V:integer range 0 to 520; signal clk_H:std_logic:='0'; signal clk_V:std_logic:='0'; signal colorbuf:std_logic_vector(0 to 2); begin red<=colorbuf(0); green<=colorbuf(1); blue<=colorbuf(2); --50MHz分频为25MHz,作为水平扫描信号的时钟process(clk) variable n:integer range 0 to 1; begin if rising_edge(clk)then clk_H<=not clk_H; end if; end process; --水平扫描计数,并产生竖直扫描计数的时钟 process(clk_H,Rst) begin if rst='1' then cnt_H<=0; clk_V<='1'; elsif rising_edge(clk_H)then if cnt_H=799 then cnt_H<=cnt_H+1; end if;

03第三章VHDL语言基础习题答案.doc

填空题 1、一个标准的VHDL语言程序由库、实体和结构体组成。 2、个完整的VHDL语言描述是以对一个功能元件的完整描述为基础的 3、实体相当于电路图中一个器件符号。 4、端口说明( PORT )是对设计实体与外部接口的描述,也可以说是设计实体的外 部引脚的名称,它为实体与外部环境的动态通信提供通道 5、缓冲( BUFFER )端口描述模式和 INOUT 双向模式的区别在于只能接受一个驱动源,不允许多重驱动。 6、 VHDL语言的结构体的这些子结构互相之间是并行的。 7、将 VHDL语言的行为描述语句转换为门级描述由VHDL开发工具自动完成,是 VHDL 语言综合器的任务。 8、数据流描述也称为RTL (寄存器传输级)描述方式,它类似于布尔方程,它既 表示某种行为,又隐含结构信息,主要指非结构化的并行语句描述。 9、在结构描述中,元件间的连接是通过定义的端口界面来实现的。 10、结构描述的缺点是程序表示的是电路的结构连接关系,不能直观的得到设计电 路的逻辑功能。 综述题 1、写出实体的结构。 答案: ENTITY 实体名IS [GENERIC( 类属表 );] [PORT( 端口表 );] END ENTITY实体名; 2 、在 IEEE 库中定义了哪四种VHDL 语言的端口模式? 答案: IN :输入。 OUT :输出。 INOUT :双向,输入输出。 BUFFER :缓冲,其实质也是双向的,但是只能接受一个驱动源。 3、写出结构体的结构。

?2 ? 答案: ARCHITECTURE 结构体名OF 实体名IS [ 说明语句 ] BEGIN [ 功能描述语句] END ARCHITECTURE结构体名; 4 、写出结构体的功能性描述语句的 5 种子结构。 答案: 块语句、进程语句、子程序调用语句、信号赋值语句和元件例化语句。 5 、 VHDL 有哪四种描述风格? 答案: 行为描述、数据流描述、结构描述以及由前三种组合的混合描述。 实验题 实验【一】编写一个实体 实验目的:熟悉实体的编写方法。 实验任务:在 Quartus II 中建立一个 VHDL 语言文件,编写一个实体,该实体要求如下: 实体名: TEST 。 输入端口: INPUTA , INPUTB ,数据类型为BIT 。 输出端口: OUTPUT ,数据类型为BIT 。 没有类属说明。 答案: ENTITY TEST IS -- 实体 PORT( INPUTA,INPUTB: in bit; OUTPUT: out bit); --2 个输入引脚,类型BIT --1 个输出引脚,类型BIT END TEST; 实验【二】编写一个结构体 实验目的:熟悉结构体的编写方法。

#基于VHDL语言的数据采集系统

用VHDL语言设计数据采集系统 摘要 随着计算机技术的发展和普及,数字设备正越来越多地取代模拟设备,将模拟信号 转换成数字信号以及将数字信号转换成模拟信号就成了重要环节。本系统以多路数据的 采集及监测为例,介绍了可编程逻辑器件在模数转换、数模转换及数据监控及处理中的 设计方法。实现数据采集的方法有很多,如单片机、CPLD、C语言等,但相比各种方法,运用VHDL硬件描述语言开发的数据采集系统具有具有设计方便高效、体积小、功耗低、可靠性高、易于修改、设计周期短等特点。VHDL硬件描述语言采用自顶而下的设计方法 可以对模型进行及时修改,以改进系统或子系统的功能,更正设计错误,从而提高目标 系统的工作速度,减小面积耗用,降低功耗和成本等。本文介绍了基于Altera公司的 集成开发环境MaxplusII,使用VHDL设计开发数据采集系统的基本方法。 [关键词] VHDL ADC0809 DAC0832 EDA 数据采集; Abstract With the development of computer technology and popularization, Digital devices are increasingly replacing analog equipment,and converted the analog signals into digital signals, as well as digital signal into analog signal will become an important link.for example,this syestem depend on one multi-channel data acquisition and monitoring,introduce a programmable logic device in the analog-digital conversion, digital-analog conversion and data monitoring with handling methods in the design. There are many ways to collect data, such as SCM, CPLD, C language,and so on. But compared with various methods,using the VHDL hardware description language to design the data acquisition system is the best. Because of its facilitate ,efficient, small size, low power consumption, high reliability, easy to modify, and shorter design cycle characteristics. VHDL hardware description language using the top-down design method ,that can be the model for timely changes to improve the system or subsystem functions, design error correction, so as to enhance the work of the target system’s speed, reducing the area of cons umption, and lower the power consumption costs. In this paper,we introduce a integrated development environment which based on Altera's MaxplusII,and the basic method to develop a data acquisition system design by using VHDL language. [Key words]:VHDL EDA ADC0809 DAC0832 Data Acquisition 目录 前言 (1) 1 EDA技术及开发环境 (3) 1.1 EDA技术 (3) 1.2 VHDL (4)

VHDL语言介绍与设计

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

#基于VHDL语言的数字钟设计

一.程序代码及其仿真: 1.cnt60子模块代码: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY V_cnt60 IS PORT ( clk :IN std_logic; Q0,Q1,Q2,Q3,Q4,Q5,Q6,QC :OUT std_logic); END V_cnt60; ARCHITECTURE func OF V_cnt60 IS SIGNAL count1 :std_logic_vector(3 downto 0); SIGNAL count2 :std_logic_vector(3 downto 0); SIGNAL carryin:std_logic; BEGIN Q0 <= count1(0); Q1 <= count1(1); Q2 <= count1(2); Q3 <= count1(3); Q4 <= count2(0); Q5 <= count2(1); Q6 <= count2(2); QC <= carryin; process(clk) BEGIN if (clk'event AND clk='1') then carryin<='0'; if(count1="1001")then count1<="0000"; count2<=count2+1; else count1<=count1+1; END if; if(count2="0101"AND count1="1001")then count2<="0000"; count1<="0000"; carryin<='1'; END if; END if; END process; END func; cnt60仿真波形:

VHDL语言学习

VHDL学习 (本学习以MAXPLUS10为工具软件) 第一章、VHDL程序的组成 一个完整的VHDL程序是以下五部分组成的: 库(LIBRARY):储存预先已经写好的程序和数据的集合 程序包(PACKAGE):声明在设计中将用到的常数、数据类型、元件及子程序 实体(ENTITY):声明到其他实体或其他设计的接口,即定义本定义的输入输出端口 构造体(ARCHITECTUR):定义实体的实现,电路的具体描述 配置(CONFIGURATION):一个实体可以有多个构造体,可以通过配置来为实体选择其中一个构造体 1.1库 库用于存放预先编译好的程序包(PACKAGE)和数据集合体,可以用USE语句调用库中不同的程序包,以便不同的VHDL设计使用。 库调用的格式: LIRARY 库名 USE 库名.所要调用的程序包名.ALL 可以这样理解,库在硬盘上的存在形式是一个文件夹,比如库IEEE,就是一个IEEE的文件夹,可以打开MAX PLUSR安装源文件夹,进入VHDL93的文件夹,就可以看到一个IEEE 的文件夹,这就是IEEE库,而里面的文件就是一个个对程序包或是数据的描述文件,可以用文本打开来查看文件的内容。 例如在VHDL程序里面经常可以看到“USE IEEE.STD_LOGIC_1164”,可以这样解释这句话,本序里要用到IEEE文件夹下程序包STD_LOGIC_1164,而STD_LOGIC_1164是可以在IEEE 文件夹的STD1164.vhd文件里面看到的,用文本打开STD1164.vhd,可以看到有一名为“IEEE.STD_LOGIC_1164”PAKAGE定义。

基于VHDL语言的电子表

基于VHDL语言的电子表

1.上述三题任选一题,采用标准的作业考核类封面,A4打印。 2.第一题40分,液晶+3分,个性化界面+3分。 3.第二题45分,幅度调整+3分,频率测量及显示+5分。 4.第三题48分,频率分段设置+3分,频率微调+5分,频率范围酌情加分。 5.雷同的程序和算法满分值只计原题分值的三分之二,将依据设计报告 的质量和实验结果的描述计分。设计上的创新会酌情加分,实现上的 偏离会酌情扣分。 6.本门课程成绩中,实验操作和实验报告占50%,本次作业考核占50%。

目录 一、设计要求 (1) 二、设计思路 (1) 三、程序设计 (2) 1.置数还是计数 (2) 2.在哪一位置数 (2) 3.计数单位 (2) 4.秒 (3) 5.分 (4) 6.时 (4) 7.数码管显示 (5) 四、仿真结果 (6) 五、实验结果 (8) 1.连线 (8) 2.设计结果 (8) 六、实验心得 (9) 电子表源程序 (10)

设计制作电子表 一、设计要求 利用VHDL语言设计一个电子时钟,可以显示时、分、秒,具有时间设置功能,要求走时误差不大于每天10秒。可采用数码管或液晶显示,最好设计出个性化显示界面。 二、设计思路 电子表其实质为计数器,计数单位为1秒。由秒,分,时组成,秒和分是60进制,用十进制和六进制组成,时是24进制,直接设计一个24进制计数器即可。要让结果显示出来,则用七段式数码管输出显示计数值。此电子表需要有置数功能,加一个控制开关,当开关为低电平时计数,当开关为高电平时置数。设计思路如下图所示:

三、程序设计 1.置数还是计数 电子表有计数和指数两种状态,工作时执行计数还是执行置数则由一控制使能端EN决定,当EN为低电平时,电子表计数,当EN为高电平时,电子表置数。 2.在哪一位置数 该电子表有秒低位,秒高位,分低位,分高位,时低位,时高位组成,共有六位,置数由位选决定给哪一位置数。设置一个三位的二进制开关p2,p1,p0,通过编码电路实现选择置数位。 ①当p2p1p0为“000”时,不选择任何位,此时电子表只是停止计数, 不置数。 ②当p2p1p0为“001”时,秒低位置数。 ③当p2p1p0为“010”时,秒高位置数。 ④当p2p1p0为“011”时,分低位置数。 ⑤当p2p1p0为“100”时,分高位置数。 ⑥当p2p1p0为“101”时,时低位置数。 ⑦当p2p1p0为“110”时,时高位置数。 关键程序: if t'event and t='1' then if en='0' then 计数语句 elsif en='1' and p="001" then s0<=num; end if; end if; 3.计数单位 首先脉冲频率要足够大,提供一个较快的扫描频率,时数码管稳定地显示计数值。计数单位为1秒,对脉冲clk 进行分频,得到周期为1秒的计数单位t。

基于VHDL语言的数字钟设计

信息与通信工程学院 数字电路与逻辑设计 实验题目:基于VHDL语言的数字钟设计 班级: 姓名: 学号: 日期: 指导教师:

一.摘要 数字钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。它的基本功能是计时,计时周期为24小时,显示满刻度23时59分59秒;或者计时周期为12小时并配有上下午指示,显示满刻度为11时59分59秒,通过六个七段数码管显示出来。 本实验主要在理论分析和具体的软硬件实现上,基于VHDL语言编写源代码,使用软件Quartus II 进行处理,再配合具体电路连接,实现一个多功能的数字钟。 关键词:数字钟;VHDL语言;七段数码管 二.设计任务要求 设计实现一个数字钟。 1.24小时制,显示刻度从0:0:0到23:59:59 。 2.12小时制,显示刻度从0:0:0到11:59:59 。 3.12/24小时制可切换,12小时制下上下午有不同显示(上午发光二极管不亮, 下午发光二极管亮)。 4.可手动校对时间,能对时和分进行校正。 5.整点报时功能。 6.闹铃功能,可设置闹铃时间,当计时到预定时间时,蜂鸣器发出闹铃信号, 闹铃时间为5秒,可提前终止闹铃。 7.可认为设置时间为倒计时模式 8.可切到屏保模式,六个数码管显示为“supper”字样。 三.设计思路和总体设计框图 1.设计思路 程序设计主要分为四个模块,第一部分,做分频器,分出一秒的时钟用来计数,再分出一个中频时钟用来扫描显示数码管,我选择的频率是50kHZ;第二部分,做计数器,秒随时钟沿计数进1,分钟随着秒计数60次进一,而小时,由于有12/24小时制的切换,时的计数有两个信号来进行,一个信号hour1是分60进一在0到23循环计数,另一个信号hour2是分60进一在0到11循环计数;第三部分,做扫描显示六个七段数码管,通过选通信号6矢量cat来依次使六个数码管亮,数码管每两位对应相应的时分秒;第四部分,其他输入输出单元,比如数字钟的时间修正,闹铃等,这些都是基于前三个部分,做起来难度不大。 设计的关键是做好计数器和数码管显示,这是本实验最核心的部分。

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