当前位置:文档之家› VHDL与可编程逻辑器件设计详解

VHDL与可编程逻辑器件设计详解

VHDL与可编程逻辑器件设计详解
VHDL与可编程逻辑器件设计详解

VHDL与可编程逻辑器件设计

山西师范大学物理与电子信息工程学院

李竹

Email:sxlizhu@https://www.doczj.com/doc/f49292191.html,

目录

第一章可编程逻辑器件和VHDL简介 (2)

1.1 可编程逻辑器件 (2)

1.2 VHDL简介 (5)

1.3 VHDL设计过程 (6)

第二章VHDL程序基本结构 (7)

2.1 库(Library) (7)

2.1.1库的种类 (8)

2.1.2库的使用 (9)

2.2 程序包(Package) (10)

2.3 实体(Entity) (12)

2.3.1类属和端口说明 (12)

2.3.2端口模式 (13)

2.3.3数据类型(TYPES) (13)

2.4 结构体(Architecture) (15)

2.4.1结构体命名 (16)

2.4.2定义语句 (16)

附录A词汇索引 (19)

参考文献及相关网站 (20)

第一章可编程逻辑器件和VHDL简介

本章主要介绍可编程逻辑器件和EDA发展,可编程逻辑器件的设计流程,最后简要介绍VHDL在可编程逻辑器件设计中的应用。

1.1 可编程逻辑器件

在20世纪中期之后,数字集成电路经历了小规模集成电路(SSI,Small Seale Integrated Circuit )、中规模集成电路(MSI,Middle Seale Integrated Circuit)、大规模集成电路(LSI,Large Seale Integrated Circuit)、超大规模集成电路(VLSI,Very Large Seale Integrated Circuit)以及许多具有特定功能的专用集成电路(ASIC,Application Specific Integrated Circuit)的演变历程。随着微电子技术的发展,设计集成电路的任务已经不能也没有必要全部由器件生产商来独自承担,而许多研发单位和科研机构的工程师都可参与设计,因此出现了可编程逻辑器件(PLD, Programmable Logic Device)。同时,随着世界电子产业的快速发展,电子设计自动化(EDA,Electronic Design Automation)也得到了充分的促进。

可编程逻辑器件PLD是20世纪80年代发展起来的器件,是一种由用户根据自己的需求来设计逻辑功能并可对此器件进行编程的器件。目前我们常用的可编程逻辑器件具有体系结构和逻辑单元灵活、集成度高以及实用范围宽等特点。它们又具有研发周期短、电路成本

低、开发便利等优点。这些器件的出现使得我们的电子电路系统的设计有了很大的方便。具体它有如下优点:

(1)电子系统的器件使用大大减小。

目前器件的生产成本中最大部分是封装和测试,利用一片集成度高的可编程逻辑器件可以代替许多个TTL逻辑器件,这样带来的好处是:实现同样的逻辑功能可编程逻辑器件所花费的成本较低,而且随着目前系统的逐渐扩大化,利用可编程逻辑器件也可以使得电路系统的面积减小,电路板的布局和布线简单、电源功耗降低、调试方便。

(2)设计灵活

如果用分立的TTL元件来设计电路,一旦做好了印刷电路板(PCB,Printed Circuit Board),要想更改其功能,必须通过跳线。而且作为一个成品,为了系统的稳定安全,一般不允许跳线。而用可编程逻辑器件代替分立元件,即使有部分功能需要更改,也不需要对器件的外部管脚进行处理,而是通过对器件的内部功能进行重新编程即可。

(3)高性能和高可靠性

可编程逻辑器件采用了最新的生产工艺和技术,性能优于一般的器件,速度比一般器件甚至高2个数量级。采用可编程逻辑器件,可以使得电路板上的器件大大减少,自然稳定性也有很高的提高。

下面介绍目前常用的可编程逻辑器件,且简要介绍它们的结构。

1.复杂可编程逻辑器件(CPLD,Complex Programmable Logic Device)

CPLD允许具有许多的输入输出信号、乘积项和宏单元,内含多个逻辑块。这些逻辑块可以利用可编程内连线的布线来实现相互间的连接,它有效节约了硅片使用面积,提高性能,降低成本。CPLD的结构如图1-1

图 1-1 CPLD结构

由CPLD的结构图可知,其内部主要包含:可编程内连线(Programmable Interconnect)、逻辑块(Logic Block)和输入/输出单元(I/O cells)三部分。

(1)可编程内连线

可编程内连线用于I/O到逻辑块输入、逻辑块的输出到自身输入、逻辑块的输出到其它逻辑块的输入的信号连线。有的逻辑块有自身的内部反馈,不需要把输出反馈到可编程内连线上。

(2)逻辑块

CPLD中的一个逻辑块就类似于一个PLD,它包含乘积项阵列(Product-Term Array)、

乘积项分配机构(Product-Term Distribution Scheme)、宏单元(Macro-cell)。

乘积项阵列说明的是可编程与门(乘积项)。其阵列的容量大小是一个重要的指标,它定义了每个宏单元乘积项的平均数量和每个逻辑块乘积项的最大数量。

乘积项分配机构是分配乘积项到各个宏单元的规定和机构。乘积项分配机构允许一个扩展乘积项(Expander Product Terms)可以单独地分配给某一个宏单元或者多个宏单元。这就给设计者的设计但来很好的灵活性,而且这些机构对那些用于如何利用逻辑资源的软件算法也带来灵活性。

宏单元通常包含一个寄存器(触发器)和具有极性控制的组合通路,以及一个和多个反馈通路。所谓的极性控制就是指能够实现一个表达式的“原函数”或它的“反函数”,以便采用最少的乘积项来实现逻辑功能。通常CPLD还包含I/O宏单元、隐埋宏单元和输入宏单元。

逻辑块的主要指标是逻辑块的大小,逻辑块的大小是指逻辑块的逻辑容量,就是在其中能够实现多少逻辑。用宏单元的数目典型的表示逻辑块的大小,一般一个逻辑块包含4~20个宏单元,当逻辑块中所包含的宏单元高于16个时,意味着16位的函数就可以在单个逻辑块中实现。

(3)输入输出单元

输入输出单元是用来描述I/O缓冲器结构和输出使能控制的灵活性的。大多数的输入/输出单元仅仅用来根据其输出使能状态来驱动信号从器件输出,以及为输入的外来信号提供一个输入数据通路。

2.现场可编程门阵列(FPGA,Field Programmable Gate Array)

如图1-2所示,FPGA是由一系列逻辑模块的阵列构成,通过可编程连线阵列可以将逻辑模块与逻辑模块、逻辑模块与可编程I/O模块进行互连。FPGA利用密布的可编程开关来实现布线的连接。

水平通路

垂直通路

逻辑模块

图1-2 FPGA结构

它主要由三个基本部分组成:可配置逻辑模块CLB(Configurable Logic Block)、输入/输出模块I/OB(Input/Output Block)、可编程内连线PI(Programmable Interconnect)以及由它组成的编程开关矩阵PSM(Programmable Switch Matrix)。可配置逻辑模块以方阵的形式布置在器件的中央,它包含多种逻辑功能部件,使它既能实现组合逻辑电路和时序逻辑电路,又能实现包括静态随机存储器的各种运算电路。输入/输出模块分布在芯片的四周,它是提供外部封装引脚和内部信息的接口电路。可编程内连线分布在可配置逻辑模块的周围和可配置逻辑模块与输入/输出模块之间,它们的主要作用是完成可配置逻辑模块之间的逻辑连接以及将信息传递到输入/输出模块。

目前,主要有两类主流技术可供在FPGA的开发中选择,一种是基于静态随机存储器(SRAM,Static Random Access Memory)工艺技术的FPGA,另一种是基于反熔丝工艺技术的FPGA。市场上相对而言,基于SRAM工艺技术的FPGA器件所占份额相对较多。

尽管FPGA和CPLD都是可编程逻辑器件,但是由于它们结构上的差异,因此很多方面还有一定的差异:

1>应用领域:CPLD是属于粗粒结构的可编程逻辑器件,它具有丰富的逻辑资源(即逻辑门与寄存器的比例高)和高度灵活的路由资源,适合完成各种算法和组合逻辑;FPGA 是属于细粒结构的可编程逻辑器件,其基本单元和路由结构都比CPLD的小,它具有丰富的寄存器资源(即寄存器与逻辑门的比例高),更适合于完成时序逻辑。

2>布线方面:CPLD是基于逻辑块编程的,通过修改具有固定可编程内连线的逻辑功能来编程,其连续式布线结构决定了它的时序延迟是均匀的和可预测的;FPGA是基于逻辑门编程的,主要通过改变内部连线的布线来编程,其分段式布线结构决定了其延迟的不可预测性。

3>编程方式:CPLD主要是基于E2PROME或FLASH存储器编程,编程次数可达1万次,优点是系统断电时编程信息也不丢失,CPLD又可分为在编程器上编程和在系统编程两类;FPGA大部分是基于SRAM编程,编程信息在系统断电时丢失,每次上电时,需从器件外部将编程数据重新写入SRAM中,其优点是可以编程任意次,可在工作中快速编程,从而实现板级和系统级的动态配置。

4>其它方面:一般情况下,CPLD的功耗要比FPGA大,且集成度越高越明显;FPGA 的集成度比CPLD高,具有更复杂的布线结构和逻辑实现;CPLD保密性好,FPGA保密性差。

1.2 VHDL简介

VHDL(Very High Speed Integrated Circuit Hardware Description Language,超高速集成电路硬件描述语言)最早是由美国国防部为描述电子电路所开发的一种语言。电路设计的表示可分为不同的层次,一般有5个抽象的层次:系统级(System Level)、算法级(Algorithmic Level)、寄存器传输级(Register Level)、门级(Gate Level)、电路级(Circuit Level),VHDL 囊括了如上的所有层次的设计。VHDL提供高阶电路描述语言的方式可以让复杂的电路通过它轻而易举得到实现,因此它毫无疑问成为硬件设计工程师的必备工具。

VHDL作为硬件描述语言,具有如下特点:

1>功能与灵活性

VHDL具有功能强大的语言结构,可用简洁明确的代码描述来进行复杂控制逻辑的设计。为了有效控制设计的实现,它还具有多层次的设计描述功能,支持设计库和可重复使用的元件生成,它支持阶层设计,且提供模块设计的创建。

2>非依赖器件

VHDL不需要首先选择一个用来实现设计的器件,而是可以直接先生成一个设计。而且对于同一个设计描述,也可以采用多种不同器件结构和方法来实现其功能。若需对设计进行优化,主要精力可集中到设计构思上,同时它也支持多种形式的设计描述。

3>可移植性

VHDL允许设计者可对需要综合的设计描述进行仿真,如果功能不是很完善,可以通过修改就可以在设计实现之前解决了问题,因为它是一个标准的语言,所以不同的工具不影响设计的正确性。因此移植性指的就是从一个设计工具到另一个设计工具的移植、一个工作平台到另一个工作平台的移植。

4>性能评估

对设计的文件通过编译后,可以分析器件硬件资源的占用率,从而可适当的选择器件。对算法进行设计的时候,可通过多次更改设计技术(如流水线技术)来分析延时和工作频率,

尤其对于数字信号处理方面更是需要注意的地方。

5>设计周期

在传统的硬件设计过程中,往往要求设计者在设计电路之前写出该电路的逻辑表达式或真值表(或时序电路的状态表)。这一工作是相当困难和繁杂的,特别是当系统比较复杂时更是如此。而且利用小规模的集成电路时,还有PCB制作过程中封装、布局、布线等必不可少的工作量。而利用VHDL语言设计硬件电路时,就可以使设计者免除编写逻辑表达式或真值表之苦,从而大大降低了设计的难度,也缩短了设计的周期。

1.3 VHDL设计过程

利用VHDL设计一般需要如下几个设计过程:设计输入、编译、仿真、编程与验证。设计过程如图1-3所示:

图 1-3 VHDL设计过程

1>设计输入

在从事设计进行编写代码工作之前,必须先对你的设计目的和要求有个确切的认识。例如:要设计的功能是什么?系统工作的频率要求多高?是否需要采用模块化设计?是否需要参数化设计?只有明确了这些需求,才会在设计过程中不会走弯路,然后才能选择到适当的设计方式和相应的器件。

有了设计的需求分析后,可以尝试编写设计代码。许多设计人员往往只是简单地参照和修改一些现成的设计方案来实现目的,因此为了目前的工作成果以后可以便利的使用,因此在设计过程中最好使用模块化和参数化的设计方法是值得提倡的。

2>编译

根据VHDL的语法和语义结构设计完成文本文件之后,需要检测是否有语法错误,此时需要采用编译的措施。一个复杂的VHDL程序往往对于一般的设计者而言,总是难免有一定的语法错误,此时根据编译所报告的错误针对性的进行修改,每纠正一处语法错误,随后再次编译,再次纠正,反反复复,直到不再有语法错误的报告出现。

作为一个学习或者是使用VHDL 的人员,应该出现错误之后,记录出错的报告文字和纠正的措施,为以后进一步设计打下基础。

3>仿真

虽然编译通过,但是并不一定代表所设计的文本文件符合要求,还必须通过仿真才能给出判断。仿真包括功能仿真和时序仿真两种。功能仿真又叫前仿真,这种仿真不考虑信号的延时,主要检验逻辑功能的正确性。时序仿真又叫后仿真,是进行布局布线后进行的仿真。

它在进行仿真时将信号在器件中的延时考虑进去,因此可以模拟器件实际工作时的情况。在仿真过程中先进行功能仿真,随后再进行时序仿真,任何一种仿真不能符合目的要求,都需要重新设计。重新设计后再仿真,直到仿真达到目的要求。

4>编程和验证

器件的编程是设计的最终目的,需要器件生产商提供的专用编程器,当然现在许多器件生产商提供了编程器的电路原理图和参数,设计人员也可以自己制作比较廉价的器件编程器。将编程电缆和计算机正确连接之后,PCB加电就可以对器件进行编程。

编程以后还需要验证,在加入实际激励的情况下,检验是否设计能够完成预定的功能。如果不能完成预定的功能需要重新进行如上的过程。一般仿真通过的设计,都可以通过实际的验证。

第二章VHDL程序基本结构

一个完整的VHDL程序,或者说设计实体,通常包含5个部分:库(Library)、程序包(Package)、实体(Entity)、结构体(Architecture)、配置(Configuration)。

库存放已经编译的实体、结构体、包集合和配置,库可以重复使用。程序中所使用的library,就如同C语言程序中的include。在设计过程中,设计一个大规模的硬件电路,不需要从门级逐步设计,而是可以利用在库中保存的预先设计的或者软件自身所带的模块,这样可以使得设计成果达到共享,因此可以大大减少了设计的工作量,缩短了开发周期。

程序包集合存放各设计模块都能共享的数据类型、常数、子程序和元件定义。多个程序包可以并入一个VHDL库中,使之适用于更一般的访问和调用。

实体是一个VHDL程序的基本单元,表现为一个设计的外貌,它是设计实体对外的一个通信界面,它用于描述所设计的系统的外部输入输出接口以及一些用于结构体的参数定义。VHDL程序结构的一个显著特点就是任何一个完整的设计实体都可以分成内外两个部分,外面的部分成为可视部分,实体名和端口组成了设计实体的外面部分。

结构体和实体构成了设计实体的基本组成部分。它用于描述系统内部的结构和行为、系统数据的流程或者系统组织结构形式。每个实体可以有多个结构体,每个结构体对应着实体不同的结构和算法实现方案,它们的地位是同等的,共同来实现实体的行为。

配置用于描述层与层之间的连接关系和实体与结构体之间的连接关系。

2.1 库(Library)

在利用VHDL语言设计工程时,库主要用来存放已经编译的实体、结构体、程序包和配置。为了提高设计效率且遵循统一的语言标准和数据格式,就有必要利用一个或者几个库来包含有用的信息,这些信息可以是数据类型、子程序包、各种已经设计好设计实体,因此也可以将库看作一个用来存放预先设计好的程序包和数据类型包的仓库。当一个设计需要使用库中的单元时,要在每个设计的源代码的起始部分说明所引用的库,同时使用use子句指明要使用库中的哪一个设计单元。

2.1.1库的种类

VHDL语言中的库包含STD库、IEEE库、WORK库、VITAL库和用户自定义库,它们可以分为两大类:设计库和资源库,设计库对当前设计实体是永远可见的,如STD库和WORK库;资源库用来存放常规元件和模块,它和器件的厂商有直接的联系,在使用该库的时候,必须在VHDL的源代码起始部分显式表达出来,如IEEE库、VITAL库和用户自定义库。下面对它们分别介绍。

1)STD库

STD库是VHDL的标准库,包含了两个标准的程序包STANDARD和TEXTIO。程序包STANDARD中定义了BIT、BIT_VECTOR、CHARACTER、TIME等数据类型;程序包TEXTIO主要包含了文本文件进行读写操作的过程和函数。因为程序包STANDARD符合VHDL语言标准,在使用时不需要说明,但是在使用程序包TEXTIO时,库和程序包必需说明。

如:程序包TEXTIO的说明

LIBRARY STD;

USE STD.TEXTIO.ALL;

该程序包主要在测试中使用。而没有必要对程序包STANDARD进行说明,如:

LIBRARY STD;

USE STD. STANDARD.ALL;

2)IEEE库

IEEE库是VHDL设计时,应用频率最高的库,它包含符合IEEE标准的程序包和非IEEE 标准但支持工业标准的程序包。符合IEEE标准的程序包包含STD_LOGIC_1164、NUMERIC_BIT、NUMERIC_STD等,其中程序包STD_LOGIC_1164是设计是最常用和最重要的包。非IEEE标准但是并入IEEE库的程序包有STD_LOGIC_ARITH、STD_LOGIC_SIGNED、STD_LOGIC_UNSIGNED等。一般VHDL设计时,主要用到了四个程序包:STD_LOGIC_1164、STD_LOGIC_ARITH、STD_LOGIC_SIGNED、STD_LOGIC_UNSIGNED。值得注意的时,符合IEEE标准的程序包并非符合VHDL语言标准,因此使用程序包STD_LOGIC_1164时,需要显式表达出来。如

LIBRARY IEEE;

USE STD_LOGIC_1164.ALL;

3)WORK库

WORK库是使用者现行工作库,当设计者保存和编译一个设计时,自动默认为存放在WORK库中,设计者就可以将已经编译过的元件和模块保存到WORK库中,以便以后设计时调用该库中的元件和模块。因为该库中的元件和模块是设计者在VHDL环境下生成的,所以该库是符合VHDL语言标准的,而且该库是可见的,所以在使用该库时,不需要显式说明,实际上VHDL的源代码起始部分已经隐含了如下代码:

LIBRARY WORK;

4)VITAL库

VITAL(VHDL initiative towards ASIC library)库,用来提高仿真VHDL门级时序的精度,它只是在仿真器中使用,库中包含了两个程序包VITAL_TIMING和VITAL_PRIMITIVES,VITAL库已经并入到IEEE库中,成为IEEE标准。实际上各可编程器件生产厂商都能为自己生产的芯片生成含有时序信息的门级网表,用这些网表就可以得到非常精确的时序仿真结果,因此,在FPGA/CPLD设计开发设计中,一般不需要VITAL库

中的程序包。

5)自定义库

就像设计者设计实体一样,设计者也可以设计自己的库,这种库称为自定义库或者用户库。自定义库主要包含公用包集合、实体或者通过交流得到的设计实体。它可以灵活地使用用户自己定义的一些单元,在使用自定义库时,需要在VHDL源代码的起始部分显式表达出来。

2.1.2库的使用

库说明语句的书写格式如下:

LIBRARY <库名>;

以保留字LIBRARY开始,紧跟其后的就是设计实体需要可见的库的名字。除了将库打开,对库中的哪一个设计单元调用时,还需要在设计的VHDL源代码的起始部分进行说明,说明语句为USE语句,USE语句的书写格式如下:

USE <库名>.<程序包>.ALL;

USE <库名>.<程序包>.<项目名>;

其中库名就是前面库说明语句中已经说明过的库;程序包名就是设计实体要使用的库中的设计单元;ALL表示使用程序包中的所有项目;项目名表示使用程序包中的特定项目。值得注意的是,程序包名所标志的程序包必须存放在前面所说明的库中,否则编译出错。具体实例如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_1164.STD_ULOGIC;

另外,库语句和USE语句一旦说明之后,整个设计实体就可以访问和调用。当一个设计系统要求多个设计实体时,必须每一个设计实体都有自身的库语句和USE语句。具体实例如下:

LIBRARY IEEE; --第一个设计实体库使用说明

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY half_adder IS

......

END half_adder;

ARCHITECTURE a OF half_adder IS

......

END a;

LIBRARY IEEE; --第二个设计实体库使用说明

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY xor_gate IS

......

END xor_gate;

ARCHITECTURE b OF xor_gate IS

......

END b;

2.2 程序包(Package)

在实体说明和结构体内部定义的数据类型、常量及子程序对其它设计单元是不可见的,即不可以在其它设计单元中使用,为了使数据类型、常量及子程序对若干个设计单元可见,VHDL提供了程序包机制。程序包是一个库单元,也就是设计单元,它包含有可用于其它设计单元的一系列说明。

程序包的内容主要由以下四种基本结构组成,因此一个程序包中至少应包含以下结构中的一种。

常数说明:在程序包中的常数说明结构主要用于预定义系统的宽度,如数据或地址总线通道的宽度。

数据类型说明:主要用于在整个设计中通用的数据类型,例如通用的地址总线数据类型定义。

元件定义:元件定义主要规定在设计中参与元件例化的对外接口界面。

子程序:并入程序包的子程序有利于在设计中任一处进行方便地调用。

一个程序包可以分为两个单元:说明单元与包体单元。说明单元为程序包定义接口,其方式与实体定义模块接口相类似;包体单元规定程序的实际功能,其方式与模块的结构体语句方法相类似。程序包说明是主设计单元,它可以独立编译并插入设计库中。程序包体是次级设计单元,它可以在其对应的主设计单元编译并插入设计库之后独立进行编译并也插入设计库中。

程序包说明单元及其对应的包体单元的一般格式如下所示:

PACKAGE 程序包名IS

--说明单元

END [PACKAGE] [程序包名];

PACKAGE BODY 程序包名IS

--说明单元

END [PACKAGE BODY] [程序包名];

程序包结构中,程序包包体并非是必须的,程序包说明可以独立定义和使用。

【例2.1】不需要包体的完整程序包

Library ieee;

Use ieee.std_logic_1164.all;

Use ieee.std_logic_unsigned.all;

package mypack1 is --程序包说明开始

constant pai:real:=3.1415; --定义常数圆周率

type bcd is range 0 to 9; --定义数据类型

subtype doublebit is bcd range 0 to 3; --定义子类型

signal aa: doublebit; --定义信号

end mypack1; --程序包说明结束

本程序包中,因为没有定义元件和子程序,所以不需要程序包体来具体规定实现的功能。

【例2.2】需要包体的完整程序包

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

package mypack2 is

max(in1,in2:in std_logic_vector) return std_logic_vector;--定义函数

procedure vec_to_int (input: in std_logic_vector(3 downto 0);

output:out integer); --定义过程end mypack2; --程序包说明结束package body mypack2 is --程序包包体开始function max(in1,in2:in std_logic_vector) return std_logic_vector is --函数描述

variable maximum:std_logic_vector(3 downto 0);

begin

if (in1

else maximum:=in1;

end if;

return maximum;

end max;

procedure vector_to_int(signal input: in std_logic_vector(3 to 0); --过程描述

output: out integer) is

variable power:integer:=1;

variable temp:integer:=0;

begin

for i in 1 to 3 loop

power:=power*2;

if input(i)='1' then

temp:=temp+power;

end if;

end loop;

if input(0)='1' then

temp:=temp+1;

end if;

output:=temp;

end procedure;

end mypack2; --包体结束

例2.2中定义了一个取最大值的函数和一个将向量转换为整数的过程。因为在程序包的说明中,只定义了接口对于函数和过程而言,只是提供了接口,设计时还必须将其内部的功能行为描绘出来,因此本程序包必需包含程序包包体。

包体说明的标识符是不可见的,只有在程序包说明单元中说明的标识符才在程序包之外可见。另外,程序包中说明的标识符也不是自动对其它的设计可见的,而是需要使用USE 子句调用的。使用方法同在库章节中讨论的一样。

下面给出一个访问例2.2的例子:

【例2.3】调用例2.2中的取最大值函数

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

use work.mypack2.all;

entity mypack2_exam1 is

port (a,b: in std_logic_vector(3 downto 0);

c:out std_logic_vector(3 downto 0));

end;

architecture behave of mypack2_exam1 is

begin

c<=max(a,b);

end behave;

仿真结果如下:

图 2-1 例2.3仿真结果

至于VHDL自身所带的程序包这里不在叙述,可以参看库(2.1)章节里的相关内容,想要更深入的了解可以阅读VHDL93文件夹下的各种程序包文件。

2.3 实体(Entity)

实体说明定义了一个设计元件的输入和输出接口,或者与外界电路连接时的参数,它反映的是模块的对外特性。如果所设计的为顶层模块,则实体说明给出了芯片的外部引脚定义。一个设计可以包括多个实体,顶层模块就是处于最高层的实体模块,而底层的实体就成为整个设计的组件。

实体是由如下5部分构成:实体名、类属表、端口表、实体说明部分、实体语句部分。实体的一般格式为:

ENTITY 实体名IS

[GENERIC(类属表);]

[PORT(端口表);]

实体说明部分;

[BEGIN

实体语句部分;]

END [ENTITY] 实体名;

下面具体介绍实体的各个组成:

2.3.1类属和端口说明

类属说明是实体说明中的可选项,放在端口说明之前,格式如下:

GENERIC ([CONSTANT] 名字表:[IN] 子类型标识[:=静态表达式],…);

例如:generic (sel: integer:=2; n: integer:=9);

该参数说明是指实体所对应的构造体中的参数sel和n的值分别为2和9。

类属为实体和其外部通信的静态信息提供通道,特别是用来规定端口的大小、实体的定时、计数的模值、选择的标号等重要属性。当所设计的顶层模块中含有类似的底层实体时,只要将底层实体说明中的参数值修改就能满足设计。

端口说明是对基本设计实体与外部接口的描述,是设计实体和外部环境动态通信的通道,其功能对应于电路芯片的一个引脚。每个端口必须有一个名字、一个通信模式和一个数

据类型。端口说明的一般格式为:

PORT([SIGNAL] 名字:[模式] 子类型标识[BUS] [:=静态表达式],…)

SIGNAL:因为端口中定义的必须是信号类的,所以略去关键字SIGNAL也不会引起歧义。

名字:是赋于每个外部引脚的名字,名字的含义要尽量和惯例相匹配,如sel表示选择信号的名字,这样容易理解程序。

模式:芯片的信号或数据具有流向,而在实体设计中,模式说明就是连接点和流向的结合问题。VHDL中端口的模式有IN、OUT、INOUT、BUFFER。

2.3.2端口模式

输入(IN):仅允许数据或者信号流入端口,而不允许流出端口。输入数据或者信号由外部实体向该设计实体内驱动。主要用于输入的一般有时钟信号、控制信号、数据总线、地址总线等。如果设计中有的输入不利用,一般接地避免噪声干扰。

输出(OUT):仅允许数据或者信号流出端口,而不允许流出端口。输出数据或者信号由设计实体内向设计实体外驱动。输出的数据或者信号不能被设计实体中应用,对于设计实体输出端口在实体内是不能作为驱动的。

缓冲(BUFFER):缓冲模式的端口与输出模式的端口相类似,只是缓冲模式允许内部引用该端口的信号,缓冲端口既能用于输出,也能用于反馈。缓冲不允许多重驱动,不与其它实体的双向端口、输出端口相连。缓冲模式用于在实体内部建立一个可读的输出端口,例如计数器输出,计数器的现态用来决定计数器的次态。实体既需要输出,又需要反馈,这时设计端口模式应为缓冲模式。

双向模式(INOUT):它可以代替输入、输出和缓冲模式。在设计实体的数据流中,有些数据是双向的,数据可以流入该设计实体;也有数据从设计实体流出,这时需要将端口模式设置为双向模式。双向模式的端口允许引入内部反馈,所以双向模式端口还可以作为缓冲模式使用,因此,双向端口是一个完备的端口模式。虽然双向端口可以代替其它端口模式,但是不提倡这样设置。为了设计的易读性,惯例上输入、输出端口仍然不是用双向端口来设置,只有纯双向的数据信号才设置为双向模式。

2.3.3数据类型(TYPES)

端口说明除了定义了端口的标识名称和端口模式,还需要说明端口的数据类型。下面介绍VHDL语言的IEEE1706/93标准规定的数据类型。

在数字电路怀中的信号大致可分为逻辑信号和数值信号,而针对VHDL所提供的基本数据类型而言,可进行如下分类:信号包含逻辑信号和数值信号,而逻辑信号包含布尔代数、位、标准逻辑;数值信号包含整数和实数。下面讲分别说明每部分的主要功能及其用法。

布尔代数(boolean)

布尔代数信号定义为:

TYPE BOOLEAN IS (FALSE,TRUE)

所以它的信号形式包含两种:FALSE和TRUE。在应用上可以将这种信号来代表某种动作是否完成,即代表某种情况的标志信号例如可以在进程中定义变量为布尔类型:PROCESS

V ARIABLE fi:BOOLEAN:=false;

位(bit)

位信号定义为:

TYPE BIT IS(‘0’,’1’)

所以它的信号形式包含两种:0和1类型。这种信号类型0可看作数字电路里的低电平,而1可看作数字电路的高电平。例如可以在端口定义中使用位类型:

PORT(-----

a: out bit;

--------);

标准逻辑(STD_LOGIC)

标准逻辑信号的定义为:

TYPE STD_LOGIC IS (‘X’,--forcing unknown ;浮接不定

‘0’,--forcing 0 ;低电位

‘1’,--forcing1 ;高电位

‘Z’,--high impedengce ;高阻抗

‘W’—weak unkown ;弱浮接

‘L’,--weak 0 ;弱低电位

‘H’,--weak 1 ;弱高电位

‘-’, --don’t care ; 不必理会);

逻辑序列信号

以数字电路而言,有许多时候是将几个信号合成一组代表特定功能的序列信号,例如:数据总线(DATA BUS)、地址总线(ADDRESS BUS)等。序列信号有两种逻辑序列BIT_VECTOR和STD_LOGIC_VECTOR,可以按照如下使用:

INDATA: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

定义了8位的数据信号输出。而且依照它的定义,第一条线应该是INDATA(7),随后依此类推。如果括号内为(0 to 7),则第一条应该是INDATA(0)。

序列信号的分解与合并

在序列信号的处理上,语法接受信号的分解和合并,如下列语句:

C<=A(2 DOWNTO 1);-- 分解A(2~1)序列信号传递到C

B<=A(0)&B&D;-- 合并了A(0)、B、D信号传递给B

整数(INTEGER)

整数信号定义为:

TYPE INTEGER IS RANGE -2047483648 TO 2147483647

实际是一个32位的BIT_VECTOR所构成,所以数值范围也就可以看作是从

3131

--,不过通常不用这么大的数值,这时若不考虑适当调整范围,将造成硬件组2~21

件的不必要浪费。数值范围的限制方法,是用RANGE….TO命令完成的。如下面的使用:SIGNAL A: INTEGER; --32位整数定义

SIGNAL B: INTEGER RANGE 0 TO 7; --3位整数定义

SIGNAL C: INTEGER RANGE -1 TO 1; --2位整数定义

无符号整数(UNSIGNED)

本数据类型和前面的“标准逻辑”序列(STD_LOGIC_VECTOR)信号相似,定义时必须指明为无符号整数的位数,例如下面的定义:

SIGNAL A : UNSIGNED(3 DOWNTO 0); --4位无符号整数定义

这种数值信号类型用在诸如计数器、分频器等要作加减的数值运算时十分方便。该信

号类型除了具有数值运算的好处外,它还具有与“标准逻辑”序列信号相似的逻辑运算特性。无符号整数信号的序列编号是由高到底,所以一定要使用DOWNTO的序列形式定义。

范例如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY examp2 IS

PORT(

A: IN STD_LOGIC_VECTOR(1 DOWNTO 0);

B: IN UNSIGNED(1 DOWNTO 0);

C: OUT UNSIGNED(7 DOWNTO 0);

D: OUT STD_LOGIC_VECTOR(1 DOWNTO 0)

);

END;

ARCHITECTURE A OF examp2 IS

SIGNAL E,F,G :UNSIGNED(1 DOWNTO 0);

SIGNAL H : UNSIGNED(7 DOWNTO 0);

BEGIN

E<=UNSIGNED(A); --标准逻辑转化为无符号数

F<=B;

H(1 DOWNTO 0)<=E+F;

H(3 DOWNTO 2)<=E-F;

H(7 DOWNTO 4)<=E*F;

G(0)<=E(0) AND F(0);

G(1)<=E(1) OR F(1);

C<=H;

D<=STD_LOGIC_VECTOR(G); --无符号数转化为标准逻辑

END A;

实数(REAL)

实数信号形式定义为:

TYPE REAL IS RANGE -1.7E38 TO 1.7E38

实体说明部分定义的项目是该实体接口中的公共信息,如定义子类型、调用库、调用子程序等。实体语句部分是每一个实体接口的公共部分,它们只能是由并行语句构成,如并行断言语句、并行过程调用语句、被动进程语句,它的出现是以BEGIN开始位置为标志,直到整个设计实体中的END出现为止。

2.4 结构体(Architecture)

结构体是次级设计单元,它具体指明一个设计实体的结构或者行为,定义了设计实体的功能,规定了设计实体的数据流程,指定实体中内部元件的连接关系,把一个设计的输入和输出之间的关系建立起来。结构体对其基本设计单元的输入输出关系可以用四种方式进行描述,它们是:行为描述、数据流描述、结构描述、混合描述,不同的描述方式不同,但是结构体的结构是完全一样的。根据IEEE标准,一个结构体的具体结构描述如下:

ARCHITECTURE 结构体名OF 实体名IS

[定义语句]

BEGIN

[并行语句]

END[ARCHITECTURE][结构体名]

下面介绍结构体的各个组成部分:

2.4.1结构体命名

结构的名称是对结构体的命名,它由设计者自由明明,是结构体的唯一名称。在关键字OF之后的实体名表明了该结构体所对应的是哪一个实体,一个实体可以有多个结构体。

虽然结构体的名称可以由设计者自由地命名,但在大多数情况下,通常把结构体的名称命名为behavioral(行为)、dataflow(数据流)、structural(结构)。可以看出,这三种命名实际上对应结构的三种基本描述方式,当设计者采用某一种描述方式来描述结构体时,该结构体的结构名称就命名为对应的那一个名称,这样其他阅读程序的人员可以一目了然地了解设计者所采用的描述方式。例子如下:

ARCHITECTURE behavioral OF counter IS --暗示结构体中采用行为描述方式

ARCHITECTURE dataflow OF counter IS--暗示结构体中采用数据流描述方式

ARCHITECTURE structural OF counter IS--暗示结构体中采用结构描述方式

此外,还可以用其它方式来命名结构体,如,采用结构体所实现的功能和所采用的数据类型等来命名结构体。例子如下:

ARCHITECTURE stdlogic OF counter IS --暗示结构体中涉及的数据类型为std_logic ARCHITECTURE syncrons OF counter IS --暗示结构体中采用的是同步计数方式

2.4.2定义语句

定于语句位于关键字ARCHITECTURE和BEGIN之间,用于对结构体内部所使用的信号、常数、数据类型、和函数等进行定义。如:

ARCHITECTURE syncrons OF counter IS

SIGNAL countbuffer : INTEGER RANGE 0 to 15;

signal countlogic: std_logic_vector(3 downto 0);

BEGIN

LIBRARY ieee;

USE ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;

ENTITY counter IS

PORT

( inputdata : IN INTEGER RANGE 0 TO 15;

inclk : IN STD_LOGIC;

clear : IN STD_LOGIC;

enable : IN STD_LOGIC;

load : IN STD_LOGIC;

countoutput : OUT INTEGER RANGE 0 TO 15 ); END counter;

ARCHITECTURE a OF counter IS

SIGNAL countbuffer : INTEGER RANGE 0 to 15;

signal countlogic: std_logic_vector(3 downto 0);

BEGIN

PROCESS (inclk, clear)

BEGIN

IF clear = '0' THEN

countbuffer<= 0;

ELSIF (inclk'EVENT AND inclk= '1') THEN

IF load = '1' THEN

countbuffer <= inputdata;

ELSE

IF enable = '1' THEN

countbuffer<=countbuffer+1;

ELSE

countbuffer <=countbuffer;

END IF;

END IF;

END IF;

END PROCESS;

countoutput<= countbuffer;

END a;

LIBRARY ieee;

USE ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;

ENTITY counter IS

PORT

( inputdata : IN INTEGER RANGE 0 TO 15;

inclk : IN STD_LOGIC;

clear : IN STD_LOGIC;

enable : IN STD_LOGIC;

load : IN STD_LOGIC;

clk2 : out std_logic;

clk4 : out std_logic;

clk8 : out std_logic;

clk16 : out std_logic;

countoutput : OUT INTEGER RANGE 0 TO 15 ); END counter;

ARCHITECTURE a OF counter IS

SIGNAL countbuffer : INTEGER RANGE 0 to 15;

signal countlogic: std_logic_vector(3 downto 0);

BEGIN

PROCESS (inclk, clear)

BEGIN

IF clear = '0' THEN

countbuffer<= 0;

ELSIF (inclk'EVENT AND inclk= '1') THEN

IF load = '1' THEN

countbuffer <= inputdata;

ELSE

IF enable = '1' THEN

countbuffer<=countbuffer+1;

ELSE

countbuffer <=countbuffer;

END IF;

END IF;

END IF;

END PROCESS;

countoutput<= countbuffer;

countlogic<=conv_std_logic_vector(countbuffer,4);

clk2<=countlogic(0);

clk4<=countlogic(1);

clk8<=countlogic(2);

clk16<=countlogic(3);

END a;

带参数的任意进制加法器

LIBRARY ieee;

USE ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;

ENTITY counter IS

generic(number:integer:=10);

PORT

( inputdata : IN INTEGER RANGE 0 TO 15;

inclk : IN STD_LOGIC;

clear : IN STD_LOGIC;

enable : IN STD_LOGIC;

load : IN STD_LOGIC;

countoutput : OUT INTEGER RANGE 0 TO 15 );

END counter;

ARCHITECTURE a OF counter IS

SIGNAL countbuffer : INTEGER RANGE 0 to 15;

signal countlogic: std_logic_vector(3 downto 0);

BEGIN

PROCESS (inclk, clear)

BEGIN

IF clear = '0' THEN

countbuffer<= 0;

ELSIF (inclk'EVENT AND inclk= '1') THEN

IF load = '1' THEN

countbuffer <= inputdata;

ELSE

IF (enable = '1') and (countbuffer

countbuffer<=countbuffer+1;

ELSif (enable = '1') and (countbuffer>=number) then

countbuffer<=0;

else

countbuffer <=countbuffer;

END IF;

END IF;

END IF;

END PROCESS;

countoutput<= countbuffer;

END a;countbuffer<=0

附录A 词汇索引

FPGA

SSI Small Seale Integrated Circuit 小规模集成电路

SRAM Static Random Access Memory 静态随机存储器Architecture 结构体(2.4)

BEHABIORAL行为(2.4.1)

DA TAFLOW数据流(2.4.1)

STRUCTURAL结构(2.4.1)

要先安装驱动才能用的,具体;

WINXP添加驱动:

1)在控制面板中选择“添加硬件”

2)选择“添加硬件向导”,下一步

3)选择“是,硬件已连接好”,下一步

4)选择“添加新的硬件设备”

5)选择“安装我手动从列表中选择的硬件”

6)选择“声音、视频和游戏控制器”,下一步

7)选择“从磁盘安装”,下一步

8)在MaxPlus2->Drivers->Win2000下选择inf文件

9)在如下对话框中选择“Altera ByteBlaster”,按下“下一步”开始安装,安装完毕,需要重新启动电脑才能使

打开MAXPLUSII 在PROGRAMMER 状态下OPTION ---HARDWARE SETUP 选择BYTEBLASTER(MV)

参考文献及相关网站

[1] ALTER.max+pluss2 Handbook

[2] 朱明程,孙普译.可编程逻辑系统的VHDL设计技术/(美)斯凯希尔(Skahill,K.)编著.南京:东南大学出版社,1998

[3] https://www.doczj.com/doc/f49292191.html,

[4]

VHDL实验报告

《创新实验》实验报告 —基于VHDL的编程和硬件实现

一、实验目的 1.熟悉和掌握硬件描述语言VHDL的基本语法及编写; 2.掌握软件Xilinx ISE 10.1的使用; 3.熟悉SDZ-6电子技术实验箱的使用; 4.了解节拍脉冲发生器等基本电路的实现; 5.了解八位二进制计数器的功能与设计; 6.学习键盘和七段数码管显示的控制和设计。 二、实验内容 1.Xilinx ISE 10.1软件的使用; 2.节拍脉冲发生器等基本电路的实现; 3.八位二进制计数器的实现 4.键盘扫描及显示的实现 三、实验器材 1、PC机 2、SDZ-6电子技术实验箱 3、正负5V电源 4、I/O接口线 四、软件的使用 在安装Xilinx10.1软件时,需要一个ID号,其实这个ID号是可以重复使用的,几个同学在官网注册后就可以共享ID号了。 安装完成之后就可以使用这个软件编写相应的VHDL的程序。 1.新建工程 File—>New Project 弹出下面的对话框 输入工程名后单击Next。然后根据本实验的实验箱进行以下设置。

以后的步骤一般都是单击Next(有些资料上会介绍有些这些步骤的具体功能,但对于本实验不必用到),最后单击Finish,完成新建一个工程。在窗口的左边会出现刚刚新建的工程,如下: 2.新建一个VHDL的源文件。 在上图中,右击工程选择New Source ,弹出如下对话框。

在对画框的左边选择VHDL Module,输入文件的名字(改名字最好是你定义的实体的名字)。单击Next。出现下面的对话框。 该对话框主要是对外部端口的编辑。可以直接跳过,即单击Next,在源文件上编辑端口。然后在接下来的对话框中单击Finish。完成建立一个源文件。窗口右边就会出现刚才编辑的源文件。 3.编写和编译代码 将事先编好的代码复制到源文件里,然后保存文件。 选中左边的文件名,在窗体的左边出现如下编辑文档内容。

VHDL课程设计-PS2键盘

VHDL课程设计-PS2键盘

目录 一、课程设计的目的与任务 (3) 二、课程设计题目 (3) 1、指定题目: (3) 2、自选题目: (3) 三、课程设计的内容与要求 (3) 1、设计内容 (4) 2、设计要求 (4) 四、实验仪器设备 (4) 五、设计方案 (4) 1、PS2解码 (4) 2、设计思路 (6) 3、模块设计 (7) 4、各模块分析 (8) (1)PS2时钟检测模块 8 (2)PS2解码模块 10 (3)PS2组合模块 12 (4)控制LED模块 14 (5)PS2总的组合模块 16 六、综合与仿真 (17) 1、综合 (17) 2、仿真 (18) (1)电平检测模块仿真 (18) (2)LED灯控制模块仿真 (18)

(3)PS2_module总模块仿真 (19) 七、硬件下载 (23) 八、心得体会 (24) 九、参考文献 (24) 一、课程设计的目的与任务 (1)熟练掌握EDA工具软件QuartusII的使用; (2)熟练用VHDL硬件描述语言描述数字电路; (3)学会使用VHDL进行大规模集成电路设计; (4)学会用CPLD\FPGA使用系统硬件验证电路设计的正确性; (5)初步掌握EDA技术并具备一定的可编程逻辑芯片的开发能力; 二、课程设计题目 1、指定题目: 0 :多功能计数器;1 :数字秒表;2 :简易数字钟;3 :简易频率计; 4 :彩灯控制器; 5 :交通灯控制器; 6 :四路智力竞赛抢答器; 7 :简易微波炉控制器;8 :表决器;9 :数字密码锁; 我的的学号尾数是2,所以我要做的题目是简易数字钟。由于我之前已经学过Verilog HDL和VHDL,所以简易数字钟相对于我比较简单,我完成了简易数字钟并验收后,再选择了另一个自选题目来完成。 简易数字钟:设计一个以“秒”为基准信号的简易数字钟,显示时、分、秒,同时可实现整点报时和清零(我已经完成,而且已经验收了)。 2、自选题目: 在完成了数字钟的设计后,我选择了另一个设计的题目,那就是PS2键盘扫描。所以这次课程设计我的报告主要详细写的是PS2键盘扫描的程序,而不是简易数字钟。 PS键盘扫描:设计一个PS键盘扫描程序,能接受键盘的输入时钟和数据,区别哪一个键输入,同时解译通码和断码,使用LED灯来显示收到的数据。三、课程设计的内容与要求

VHDL实验报告03137

VHDL实验报告 60 庄炜旭实验三. 4位可逆计数器,4位可逆二进制代码-格雷码转换器设计 一.实验目的 学习时序电路的设计,仿真和硬件测试,进一步熟悉VHDL设计技术 1. 学习4位可逆计数器的设计 2. 学习4位可逆二进制代码-格雷码转换器设计 二.实验内容 设计4位可逆计数器,及4位可逆二进制代码-格雷码转换器,并仿真,下载。 [具体要求] 1.4位可逆计数器 a)使用CLOCK_50作为输入时钟,其频率为50MHz(对于频率大于50Hz的闪烁, 人眼会看到连续的光),因而,对其进行225的分频后,再用于时钟控制。(可 利用实验一) b)使用拨码开关SW17作为模式控制,置‘1’时为加法计数器,置‘0’时为减 法计数器,同时使用LEDR17显示SW17的值。 c)使用KEY3作为异步复位开关(按下时为0,不按为1),当为加法计数器时, 置“0000”,当为减法计数器时,置“1111”。 d)使用LEDR3,LEDR2,LEDR1,LEDR0作为转换后的输出结果显示,LEDR3为高 位,LEDR0为低位。 2.4位可逆二进制代码――格雷码转换器 a)使用拨码开关SW17作为模式控制,置‘1’时为二进制代码―>格雷码转换, 置‘0’时为格雷码―>二进制代码,同时使用LEDR17显示SW17的值。 b)使用拨码开关SW3, SW2, SW1, SW0作为输入的被转换数,SW3为高位,SW0 为低位。 c)使用LEDR3,LEDR2,LEDR1,LEDR0作为转换后的输出结果显示,LEDR3为高 位,LEDR0为低位。 三.管脚设定 SW[0]PIN_N25 SW[1]PIN_N26 SW[2]PIN_P25 SW[3] PIN_AE14 SW[17] PIN_V2 LEDR[0] PIN_AE23 LEDR[1] PIN_AF23 LEDR[2] PIN_AB21 LEDR[3] PIN_AC22 LEDR[17] PIN_AD12 KEY[3] PIN_W26

VHDL课程设计PS键盘

目录 一、课程设计的目的与任务 (1)熟练掌握EDA工具软件QuartusII的使用;

(2)熟练用VHDL硬件描述语言描述数字电路; (3)学会使用VHDL进行大规模集成电路设计; (4)学会用CPLD\FPGA使用系统硬件验证电路设计的正确性; (5)初步掌握EDA技术并具备一定的可编程逻辑芯片的开发能力; 二、课程设计题目 1、指定题目: 0 :多功能计数器; 1 :数字秒表; 2 :简易数字钟; 3 :简易频率计; 4 :彩灯控制器; 5 :交通灯控制器; 6 :四路智力竞赛抢答器; 7 :简易微波炉控制器; 8 :表决器;9 :数字密码锁; 我的的学号尾数是2,所以我要做的题目是简易数字钟。由于我之前已经学过Verilog HDL和VHDL,所以简易数字钟相对于我比较简单,我完成了简易数字钟并验收后,再选择了另一个自选题目来完成。 简易数字钟:设计一个以“秒”为基准信号的简易数字钟,显示时、分、秒,同时可实现整点报时和清零(我已经完成,而且已经验收了)。 2、自选题目: 在完成了数字钟的设计后,我选择了另一个设计的题目,那就是PS2键盘扫描。所以这次课程设计我的报告主要详细写的是PS2键盘扫描的程序,而不是简易数字钟。 PS键盘扫描:设计一个PS键盘扫描程序,能接受键盘的输入时钟和数据,区别哪一个键输入,同时解译通码和断码,使用LED灯来显示收到的数据。 三、课程设计的内容与要求 1、设计内容 (1)系统功能的分析; (2)实现系统功能的实际方案; (3)编写各功能模块的VHDL语言程序; (4)对各功能模块进行编译、综合、仿真、分析; (5)顶层文件设计 (6)对整个系统进行编译、综合、仿真、分析; (7)在CPLD\FPGA实验开发系统试验箱上进行硬件验证; (8)写实验报告;

实验三 时序逻辑电路的VHDL设计

实验三时序逻辑电路的VHDL设计 一、实验目的与要求 1、目的 (1)熟悉VHDL语言的编程方法 (2)学会利用VHDL语言设计实现时序逻辑功能器件的逻辑功能。 (3)总结体会VHDL语言的编程技巧方法 2、要求 (1)调试程序要记录调试过程中出现的问题及解决办法; (2)给出每个问题的算法或画出流程图; (3)编写程序要规范、正确,上机调试过程和结果要有记录,并注意调试程序集成环境的掌握及应用,不断积累编程及调试经验; (4)做完实验后给出本实验的实验报告。 二、实验设备、环境 PII以上计算机,装有QuartusII软件 三、方法与步骤 (一)教师简单回顾所需知识并演示较一个简单功能的实现过程。 1、简单回顾组合逻辑电路的特点及常用逻辑功能器件的功能 2、回顾QuartusII的VHDL操作步骤 3、以JKFF为例,重点演示该时序逻辑单元的VHDL设计过程。 (1)JKFF的参考VHDL源程序 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY JK_FF IS PORT(J,K:IN STD_LOGIC; CLK:IN STD_LOGIC; Q:OUT STD_LOGIC); END JK_FF; ARCHITECTURE A OF JK_FF IS SIGNAL QTMP:STD_LOGIC; SIGNAL J_K:STD_LOGIC_VECTOR(0 TO 1); BEGIN J_K<=J&K; PROCESS(CLK,J_K) BEGIN IF CLK'EVENT AND CLK='1' THEN CASE J_K IS WHEN "00"=>NULL;

实验二 组合逻辑电路的VHDL实现

实验二组合逻辑电路的VHDL实现 一、实验目的 掌握使用VHDL语言进行时序逻辑电路设计的方法。 二、实验设备及器件 IBM PC机一台 三、实验内容 (1)用VHDL 语言设计一个D触发器,对程序进行编译和仿真,并记录仿真波形。 CLK接收到上升沿信号时,输入端D的信号被传送到输 出端Q输出,否则输出端Q维持原来的状态不变。 实验代码: D触发器LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY DFF1 IS PORT (CLK : IN STD_LOGIC ; D : IN STD_LOGIC ; Q : OUT STD_LOGIC ); END ; ARCHITECTURE bhv OF DFF1 IS SIGNAL Q1 : STD_LOGIC ; --类似于在芯片内部定义一个数据的暂存节点 BEGIN PROCESS (CLK) BEGIN IF CLK'EVENT AND CLK = '1' THEN Q1 <= D ; END IF;

Q <= Q1 ; --将内部的暂存数据向端口输出 END PROCESS ; END bhv; (2)用VHDL语言设计一个十进制加法计数器,对程序进行编译和仿真,并记录仿真波形。 提示:十进制加法计数器的电路如下图所示,在时钟信号的驱动下,计数器进行累加,每次加1,其输出状态由0000变化到1001,加满回零。当复位输入端reset为低电平时,计数器复位,输出状态回到0000。 十进制加法计数器电路图 实验代码: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY jsq10 IS PORT(CLK,RESET:IN STD_LOGIC; Q:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0)); END jsq10; ARCHITECTURE ONE OF jsq10 IS BEGIN PROCESS(CLK,RESET) BEGIN IF(RESET='0') THEN Q<="0000"; ELSIF(CLK' EVENT AND CLK='1') THEN

VHDL课程设计报告

湖南科技大学 信息与电气工程学院 课程设计任务书 20 —20 学年第学期 专业:学号:姓名: 课程设计名称: 设计题目: 完成期限:自年月日至年月日共周设计依据、要求及主要内容(可另加附页): 指导教师(签字): 批准日期:年月日

目录 一、摘要 二、VHDL语言介绍 三、设计的目的 四、设计内容 五、电路工作原理 六、主要程序及仿真结果 七、对本次设计的体会和建议 八、参考文献

一、摘要 人类社会已进入到高度发达的信息化社会。信息化社会的发展离不开电子信息产品开发技术、产品品质的提高和进步。电子信息产品随着科学技术的进步,其电子器件和设计方法更新换代的速度日新月异。实现这种进步的主要原因就是电子设计技术和电子制造技术的发展,其核心就是电子设计自动化(EDA,Electronics Design Automation)技术,EDA技术的发展和推广应用又极大地推动了电子信息产业的发展。为保证电子系统设计的速度和质量,适应“第一时间推出产品”的设计要求,EDA技术正逐渐成为不可缺少的一项先进技术和重要工具。目前,在国内电子技术教学和产业界的技术推广中已形成“EDA热”,完全可以说,掌握EDA技术是电子信息类专业学生、工程技术人员所必备的基本能力和技能。EDA技术在电子系统设计领域越来越普及,本设计主要利用VHDL语言设计一个电子数字钟,它的计时周期为24小时,显示满刻度为24时59分59秒。总的程序由几个各具不同功能的单元模块程序拼接而成,其中包括分频程序模块、时分秒计数和设置程序模块、比较器程序模块、三输入数据选择器程序模块、译码显示程序模块和拼接程序模块。并且使用软件进行电路波形仿真。 关键词:数字钟EDA VHDL语言 二、VHDL语言介绍 1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL 设计环境,或宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,(简称93版)。现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。 三、设计的目的 本项实验通过六十进制计数器和数字钟的设计与仿真,学习VHDL语言及VHDL文本输入设计方法,编写六十进制计数器和数字钟源程序,应用VMAX+plusII软件进HDL文本输入设计与波形仿真。熟练地运用数字系统的设计方法进行数字系统设计,能进行较复杂的数字系统设计,按要求设计一个数字钟。 四、设计内容 1、60进制计数器计数器 60进制计数器计数器是一个用以实现计数功能的时序部件,它不仅可用来及脉冲数,还常用作数子系统的定时、分频和执行数字运算以及其它特定的逻辑功能。计数器种类很多。按

基于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课程设计

本科实验报告 实验名称:数字系统设计与实验(软件部分)

实验一 QuartusII9.1软件的使用 一、实验目的: 1、通过实现书上的例子,掌握QUARTUSII9.1软件的使用. 2、编程实现3-8译码电路以掌握VHDL组合逻辑的设计以及QUARTUSII9.1软件的使用。 二、实验内容 1.十进制加法计数器的VHDL文本及仿真 功能图: VHDL文本: library IEEE; use IEEE.std_logic_1164.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity count10 is port(clk,load,en:in std_logic; data_in:in std_logic_vector(3 downto 0); seg:out std_logic_vector(6 downto 0)); end count10; architecture beha of count10 is signal qout:std_logic_vector(3 downto 0); signal q_temp:std_logic_vector(3 downto 0); begin process(clk,load) begin if(load='1')then q_temp<=data_in; elsif(clk'event and clk='1')then

if(en='0')then qout<=qout; elsif(qout="1001")then qout<="0000"; else qout<=qout+1; end if; q_temp<=qout; end if; end process; process(q_temp) begin case q_temp is when"0000"=>seg<="1000000"; when"0001"=>seg<="1111001"; when"0010"=>seg<="0100100"; when"0011"=>seg<="0110000"; when"0100"=>seg<="0011001"; when"0101"=>seg<="0010010"; when"0110"=>seg<="0000010"; when"0111"=>seg<="1111000"; when"1000"=>seg<="0000000"; when"1001"=>seg<="0010000"; when others=>seg<="0001000"; end case; end process; end beha; 功能仿真流程及结果: 全编译通过后,进行仿真 新建波形文件,在其中添加所需节点。将clk设置为时钟信号,将en设置为高电平,将load 设置为低电平,将data_in设置为想要预置的数值。 运行Generate Functional Simulation Nest List命令产生能仿真的网标文件。点击Start Simulation开始模拟仿真 仿真结果:

组合逻辑电路的VHDL设计

组合逻辑电路的VHDL设计 学院及班级:信工院电子信息工程一班 学号: 2010550428 姓名:王尧 完成时间: 2012年10月11日

(1)实验目的: 熟悉QuartusⅡ的VHDL文本设计流程全过程,学习简单组合电路的设计、多层次电路设计、仿真和硬件测试。 (2)实验内容1:用VHDL语言设计2选1多路选择器。 提示:参考例3-1。 要求:首先利用QuartusⅡ完成2选1多路选择器的文本编辑输入和编译、仿真测试等步骤,给出时序仿真波形。选择目标器件EP1C3,建议选实验电路模式5,如附图1所示。用键1(PIO0,引脚号为1)控制s;a和b分别接clock0(引脚号为93)和clock2(引脚号为17);输出信号y接扬声器speaker(引脚号为129)。通过短路帽选择clock0接256Hz信号,clock2接8Hz信号。引脚锁定后进行编译、下载和硬件测试实验,通过键1控制s,可使扬声器输出不同音调。 (3)实验内容2:将此二选一多路选择器看成是一个元件mux21a,利用元件例 化语句描述图2所示电路,并将此文件放在同一目录中。 图2 双2选1多路选择器 要求:首先利用QuartusⅡ完成2选1多路选择器的文本编辑输入和编译、仿真测试等步骤,给出时序仿真波形。然后进行引脚锁定以及硬件下载测试。选择目标器件EP1C3,建议选实验电路模式5(附图1),用键1(PIO0,引脚号为1)控制s0;用键2(PIO1,引脚号为2)控制s1;a3、a2和a1分别接clock5(引脚号为16)、clock0(引脚号为93)和clock2(引脚号为17);输出信号outy仍接扬声器spker(引脚号为129)。通过短路帽选择clock0接256Hz信号,clock5接1024Hz,clock2接8Hz信号。通过选择键1、键2,控制s0、s1,可使扬声器输出不同音调。 (4)程序设计 程序示例1: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; entity mux21a is

VHDL实验报告

专用集成电路实验报告 13050Z01 1305024237 刘德文

实验一开发平台软件安装与认知实验 实验内容 1、本实验以三线八线译码器(LS74138)为例,在Xilinx ISE 9.2软件平台上完成设计 电路的VHDL文本输入、语法检查、编译、仿真、管脚分配和编程下载等操作。下载芯片选择Xilinx公司的CoolRunner II系列XC2C256-7PQ208作为目标仿真芯片。 2、用1中所设计的的三线八线译码器(LS74138)生成一个LS74138元件,在Xilinx ISE 9.2软件原理图设计平台上完成LS74138元件的调用,用原理图的方法设计三线八线译 码器(LS74138),实现编译,仿真,管脚分配和编程下载等操作。 源程序: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; -- Uncomment the following lines to use the declarations that are -- provided for instantiating Xilinx primitive components. --library UNISIM; --use UNISIM.VComponents.all; entity ls74138 is Port ( g1 : in std_logic; g2 : in std_logic; inp : in std_logic_vector(2 downto 0); y : out std_logic_vector(7 downto 0)); end ls74138; architecture Behavioral of ls74138 is begin process(g1,g2,inp) begin if((g1 and g2)='1') then case inp is when "000"=>y<="00000001"; when "001"=>y<="00000010";

EDA综合课程设计实验报告

EDA综合课程设计实验报告 题目:设计一个全双工UART电路院系:XXXX学院 学号:XXXXX 姓名:严XX 教师:林XX 时间:2012.06.02

1 课程设计的摘要原理 (2) 2 设计一个全双工UART电路,具体要求如下: (6) 3.UART设计 (7) 3.1 UART结构 (7) 3.2 UART的帧格式 (8) 4 UART的Verilog HDL语言设计 (9) 4.1 UART分频器 (9) 4.2UART发送模块 (10) 4.3 UART的接收模块 (14) 4.4 UART的硬件测试 (18) 5 课程设计总结 (19)

1摘要 UART协议是数据通信及控制系统中广泛使用的一种全双工串行数据传输协议,在实际工业生产中有时并不使用UART的全部功能。只需将其核心功能集成即可。波特率发生器、接收器和发送器是UART的三个核心功能模块,利用Vefilog-HDL语言对这三个功能模块进行描述并加以整合UART(即Universal AsynchronousReceiver Transmitter 通用异步收发器)是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信。串行外设用到RS232-C异步串行接口,一般采用专用的集成电路即UART实现。如8250、8251、NS16450等芯片都是常见的UART器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如FIFO),有时我们不需要使用完整的UART的功能和这些辅助功能。或者设计上用到了FPGA/CPLD器件,那么我们就可以将所需要的UART功能集成到FPGA内部。使用VHDL或Veriolog -HDL将UART的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文应用EDA技术,基于FPGA/CPLD器件设计与实现UART。 实际应用上,有时我们不需要使用完整的UART的功能和这些辅助功能。使用Verilog-HDL将所需要的UART的核心功能集成到FPGA/CPLD内部,就可以实现紧凑、稳定且可靠的UART数据传输。这样,既可以满足实际的应用,实现所要求的简单的通信和控制,又能够去除更多不需要的繁杂复杂的功能实现。 一、UART的原理 串行通信是指外部设备和计算机间使用一根数据线(另外需要地线,可能还需要控制线)进行数据传输的方式。数据在一根数据线上一位一位传输,每一位数据都占据一个固定的时间长度。与并行通信方式相比,串行通信方式的传输速度较慢,但这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,因此得到了广泛的应用。 基本的UART只需要发送和接收两条数据线就可以完成数据的全双工通信,其基本功能是在发送端将控制器通过总线传过来的并行数据,以设定的格式,设定的频率串行地传输出去,并同时在接收端将串行接收到的数据,转换成相应的并行数据发送出去。UART的基本帧格式如图1所示。其中,起始位总是逻辑O状态,停止位总是逻辑l状态,其持续时间可选为1位、1.5位或2位,其数据位可为5、6、7、8位,校验位可根据需要选择奇校验位,偶校验位或无校验位。

实验三vhdl时序逻辑电路设计

实验三 VHDL 时序逻辑电路设计 一、实验目的 1.熟悉用VHDL语言设计时序逻辑电路的方法 2.熟悉用Quartus文本输入法进行电路设计 二、实验所用仪器元件及用途 1.计算机:装有Quartus软件,为VHDL语言提供操作场所。 2.直流稳压电源:通过USB接口实现,为实验开发板提供稳定电源。 3.数字系统与逻辑设计实验开发板:使试验结果下载到开发板上,实现整个实验的最终结果。 三、实验内容 1.用VHDL语言设计实现一个8421码十进制计数器。 (1)实验内容及要求:在Quartus平台上设计程序和仿真题目要求,并下载到实验板上验证试验结果。 (2)试验结果:VHDL代码和仿真结果。 2.用VHDL语言设计实现一个分频系数为8,分频输出信号占空比为50%的分频器。 (1)实验内容及要求:在Quartus平台上设计程序和仿真题目要求。 (2)试验结果:VHDL代码和仿真结果。 3.用VHDL语言设计实现一个控制8个发光二极管亮灭的电路。 (1)实验内容及要求:在Quartus平台上设计程序和仿真题目要求,并下载到实验板上验证试验结果。 a.单点移动模式:一个点在8个发光二极管上来回的亮 b.幕布式:从中间两个点,同时向两边依次点亮直至全亮,然后再向中间 点灭,依次往复 c.通过拨码开关或按键控制两种模式的转换 (2)试验结果:VHDL代码和仿真结果。 四、实验设计思路及过程 1.8421码十进制计数器状态转移表 左图为8421码十进制 计数器的状态转移表,abcd 为初状态,ABCD为下一状 态,每当有“1”出现时, 相应的管脚就亮灯,从而从 0000到1001的灯依次出 现。 VHDL代码如下: LIBRARY IEEE;

实验一 组合逻辑电路的VHDL实现

实验一组合逻辑电路的VHDL实现 一、实验目的 掌握使用VHDL语言进行组合逻辑电路设计的方法。 二、实验设备及器件 IBM PC机一台 三、实验内容 按照Quartus II 软件的使用说明进行Quartus II 集成开发环境的仿真调试练习,然后按照以下内容建立文件并编译仿真调试。 (1)用VHDL 语言设计一个2选1多路选择器,对程序进行编译和仿真,并记录仿真波形。 提示:如右图所示,a和b分别为两个数据输入端,s 为通道选择控制信号输入端。当s为低电平时,a输入端的信号传送至y;当s为高电平时,b输入端的信号传送至y。 实验代码: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux21a IS PORT( a, b : IN BIT ; s : IN BIT; y : OUT BIT) ; END ENTITY mux21a ; ARCHITECTURE one OF mux21a IS BEGIN y <= a WHEN s = '0' ELSE b ; END ARCHITECTURE one ;

(2)用VHDL 语言设计一个1位半 加器,对程序进行编译和仿真,并 记录仿真波形。 提示:半加器真值表如右所示。 实验代码: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; ENTITY h_adder IS PORT(a,b:IN STD_LOGIC; so,co:OUT STD_LOGIC); END h_adder; ARCHITECTURE example2 OF h_adder IS BEGIN so<=a XOR b; co<=a AND b; END example2; (3)用VHDL 语言设计一个三态缓冲器,对程序进行编译和仿真,并记录仿真波形。 提示:三态缓冲器电路如右图所示,如果 缓冲器的使能端en 为1,缓冲器的输入端 in1的信号值被复制到输出端;如果使能端 en 为其它数值,缓冲器的输出为高阻态。 实验代码: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Threestategate IS PORT(IN1,EN:IN STD_LOGIC; 半加器真值表

vhdl实验报告--蜂鸣器

VHDL 实验报告 一、实验目的 1、掌握蜂鸣器的使用; 2、通过复杂实验,进一步加深对VHDL语言的掌握程度。 二、实验原理乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在蜂鸣器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让蜂鸣器能够发声是不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间。由此可见,乐曲中每个音符的发音频率及其持续的时间是乐曲能够连续演奏的两个关键因素。 乐曲的12 平均率规定:每2 个八度音(如简谱中的中音1 与高音1)之间的频率相差1 倍。在2个八度音之间,又可分为12个半音。另外,音符A(简谱中的低音6)的频率为440Hz, 音符B到C之间、E到F之间为半音,其余为全音。由此可以计算出简谱中从低音I至高音1 之间每个音符的频率,如表所示。 音名频率/Hz 音名频率/Hz 音名频率/Hz 低音1 中音1 高音1 低音2 中音2 高音2 低音3 中音3 高音3 低音4 中音4 高音4 低音5 392 中音5 784 高音5 1568 低音6 440 中音6 880 高音6 1760 低音7 中音7 高音7 表简谱音名与频率的对应关系 产生各音符所需的频率可用一分频器实现, 由于各音符对应的频率多为非整数, 而分频系数又不能为小数, 故必须将计算得到的分频数四舍五入取整。若分频器时钟频率过低, 则由于分频系数过小, 四舍五入取整后的误差较大;若时钟频率过高,虽然误差变小,但分频数将变大。实际的设计应综合考虑两方面的因素, 在尽量减小频率误差的前提下取合适的时钟频率。实际上,只要各个音符间的相对频率关系不变,演奏出的乐曲听起来都不会走调。 音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定。因此, 要控制音符的音 长,就必须知道乐曲的速度和每个音符所对应的节拍数, 本例所演奏的乐曲的最短的音符为四分音符,如果将全音符的持续时间设为1s 的话,那么一拍所应该持续的时间为秒,则只需要提供一个4HZ的时钟频率即可产生四分音符的时长。 本例设计的音乐电子琴选取40MHZ的系统时钟频率。在数控分频器模块,首先对时钟频率进行40分频,得到1MHZ的输入频率,然后再次分频得到各音符的频率。由于数控分频器 输出的波形是脉宽极窄的脉冲波, 为了更好的驱动蜂鸣器发声, 在到达蜂鸣器之前需要均衡占空比, 从而生成各音符对应频率的对称方波输出。这个过程实际上进行了一次二分频, 频率变为原来的二分之一即。 因此,分频系数的计算可以按照下面的方法进行。以中音1为例,对应的频率值为 523. 3Hz,它的分频系数应该为: 0.375MHZ 0.375 106 716 523.3 523.3

vhdl流水灯课程设计报告

院系: 姓名: 学号: 课程设计名称: 指导老师: 时间:

摘要 VHDL的特点 应用VHDL进行系统设计,有以下几方面的特点。 (一)功能强大 VHDL具有功能强大的语言结构。它可以用明确的代码描述复杂的控制逻辑设计。并且具有多层次的设计描述功能,支持设计库和可重复使用的元件生成。VHDL是一种设计、仿真和综合的标准硬件描述语言。 (二)可移植性 VHDL语言是一个标准语言,其设计描述可以为不同的EDA工具支持。它可以从一个仿真工具移植到另一个仿真工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台。此外,通过更换库再重新综合很容易移植为ASIC设计。 (三)独立性 VHDL的硬件描述与具体的工艺技术和硬件结构无关。设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。程序设计的硬件目标器件有广阔的选择范围,可以是各系列的CPLD、FPGA及各种门阵列器件。 (四)可操作性 由于VHDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需改变端口类属参量或函数,就能轻易地改变设计的规模和结构。 (五)灵活性 VHDL最初是作为一种仿真标准格式出现的,有着丰富的仿真语句和库函数。使其在任何大系统的设计中,随时可对设计进行仿真模拟。所以,即使在远离门级的高层次(即使设计尚未完成时),设计者就能够对整个工程设计的结构和功能的可行性进行查验,并做出决策。VHDL的设计结构 VHDL描述数字电路系统设计的行为、功能、输入和输出。它在语法上与现代编程语言相似,但包含了许多与硬件有特殊关系的结构。 VHDL将一个设计称为一个实体Entity(元件、电路或者系统),并且将它分成外部的可见部分(实体名、连接)和内部的隐藏部分(实体算法、实现)。当定义了一个设计的实体之后,其他实体可以利用该实体,也可以开发一个实体库。所以,内部和外部的概念对系统设计的VHDL是十分重要的。

实验《二》:组合逻辑与时序逻辑电路的VHDL模型实验

汕头大学实验报告 学院: 工学院系: 电子专业年级成绩: 姓名: 学号组: 实验时间: 2010-04-10 指导教师签字: _______________________________________________________________________________ 实验《二》:组合逻辑与时序逻辑电路的VHDL模型实验 一、实验目的: 1、掌握组合逻辑和时序逻辑电路的设计方法。 2、掌握组合逻辑电路的静态测试方法。加深FPGA设计的过程,并比较原理图输入和 文本输入的优劣。 3、了解通用同步计数器,异步计数器的使用方法。 4、理解积分分频器的原理。 二、硬件要求 1、拨位开关。 2、FPGA主芯片:EP1K30QC208。 3、LED显示模块。 三、实验原理 译码器是输入数码和输出数码之间的对应关系,也就是说,“输入码和输出码之间的对应表”这应该算是设计译码器的必须条件。 译码器常用来做码和码之间的转换器,也常被用于地址总线或用作电路的控制线。 例如下面为常见的3×8译码器的真值表: 实验中可根据需要,为3×8译码器加入使能控制脚。 一般的分频器可获得的分频频率种类分布不均匀,积分分频,能比较好的解决这个问题。 1、分频结果=来源频率×N/(2?-1); 2、频率波形不均匀。

四、实验内容及步骤 本实验内容是完成38译码器和5/8分频器的设计,然后将3×8译码器的结果在实验箱上实现,5/8分频器则能正确仿真、显示,实验步骤如下: 1、编写3×8译码器的VHDL代码。 2、用Quartus II对其进行编译仿真。 3、在仿真确定无误后,选择芯片ACEX1K EP1K30QC208。 4、给芯片进行管脚绑定,在此进行编译。 5、根据自己绑定的管脚,在实验箱上对键盘接口、显示接口和FPGA之间进行正确连 线。 6、给目标板下载代码,在开关输入键值,观看实验结果。 7、编写5/8分频器的VHDL代码。 8、用Quartus II对其进行编译仿真。 9、使用WaveForm进行波形仿真。 五、实验结果与分析 1、对于3×8译码器,设置了3位拨动开关为输入,8位LED为输出。时序仿真结果如下: 由图可知,A的三位为输入,Y的8位为输出。符合三八译码器真值表。经过验证,3位拨 动开关的不同组合输入,都会在LED上得到正确的输出。验证了38译码器的功能。 2、5/8分频器 由图可知,实现了5/8分频器的功能,仿真成功。

实验一 用VHDL语言设计组合逻辑电路

实验一用VHDL语言设计组合逻辑电路 一、实验目的:掌握用VHDL语言设计组合逻辑电路的方法。熟悉QuartusⅡ的 操作。 二、实验仪器:PC机一台 三、实验内容: 1.用VHDL语言设计4选1数据选择器。 2.用文本输入法输入 3.建立工程,编译,改错,直至编译通过 4.仿真,验证所设计电路的正确性 四、操作步骤: 1、在所使用的计算机数据盘里建立自己的文件夹 2、打开QuartusII 3、单击工具栏中的new,在出现的对话框中选择VHDL File,点击OK。 4、输入设计程序。 输入结束后,将程序保存在自己的文件夹中。注意:存盘的文件名应该跟实体名相同。 5、创建工程。创建工程有两种方法:第一种方法是在保存文件后出现的对话框 中点击‘是’,按提 示进行操作;

第二种方法是在出现的对话框点击‘否’。 第一种方法的具体过程: 点击‘是’,出项下面的框 点击‘Next’,出项 不需要任何修改,继续点击‘Next’,出项

继续点击‘Next’,在后面出现的框图中继续点击‘Next’,直到没有‘Next’选项,点击‘Finish’,这样就完成工程的创建。 第二种方法的具体过程:点击‘否’ 此时要创建工程,点击菜单File下的“New Preject Wizard”。出现框图: 点击‘Next’,出项

名,点击打开(或双击要创建工程的文件名),出现 项目名称和文件名称相同。点击‘Next’,出现

点击,在出现的对话框点击文件名,点击‘打开’,出现 点击右边的‘add’,出现

点击‘Next’,在后面出现的框图中继续点击‘Next’,直到没有‘Next’选项,点击‘Finish’,这样就完成工程的创建。 6、观察QUARTUS 界面 点击箭头所指图标,观察箭头上方的变化,点击+号,双击出项的文件

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