利用VHDL语言在FPGA上实现I2C总线控制器的功能本科生毕业设计论文.docx
《利用VHDL语言在FPGA上实现I2C总线控制器的功能本科生毕业设计论文.docx》由会员分享,可在线阅读,更多相关《利用VHDL语言在FPGA上实现I2C总线控制器的功能本科生毕业设计论文.docx(29页珍藏版)》请在冰豆网上搜索。
![利用VHDL语言在FPGA上实现I2C总线控制器的功能本科生毕业设计论文.docx](https://file1.bdocx.com/fileroot1/2023-2/3/b3f4bceb-a5cb-4386-9609-70ce8103e652/b3f4bceb-a5cb-4386-9609-70ce8103e6521.gif)
利用VHDL语言在FPGA上实现I2C总线控制器的功能本科生毕业设计论文
摘要
随着微电子技术的发展,现场可编程逻辑门阵列FPGA(FieldProgrammableGateArray)可以实现数字电路系统设计的功能。
尤其现场可编程逻辑门阵列FPGA具有集成度高的优点,受到工程界高度的重视。
I2C总线以接口简单,成本底,可扩展性好在数字系统中得到了广泛的应用。
硬件描述语言是数字系统高层设计的核心,是实现数字系统设计新方法的关键技术之一。
本课题正是利用VHDL语言在FPGA上实现I2C总线控制器的功能。
首先研究了I2C总线的规范,又简要介绍了QuartusⅡ设计环境以及FPGA的设计流程。
在此基础上,重点介绍了I2C控制器的总体设计方案,以及在QuartusⅡ平台上的时序仿真。
关键词 QuartusII;I2C总线控制器;现场可编程逻辑门阵列;时序仿真
Abstract
WiththedevelopmentofmicroelectricandEDA(electronicdesignautomation)technology,FPGA(fieldprogrammablegatesarray)canrealizethefunctionofdigitalcircuitsystemdesign.FPGAhavethemeritoffiledprogrammabilityandHighintegrationrate,thereforeishighlyrecognizedforengineering.I2Cbusiswidelyappliedinthedigitalsystemassimpleinterface,expedientuse,lowcostandgoodexpansibility.VHDLisconsideredasacoreofdigitalsystemdesignandakeytechniqueofimplementdigitalsystem.
ThedesignrealizesthefunctionofI2CbusinterfaceontheFPGA.AtfirstthethesisdeeplyresearchI2Cbusspecification,thenbrieflyintroducetheQuartusIIdesignenvironmentandthedesignmethod,aswellasFPGAdesignflow.Inthisfoundation,I2CbuscontrollerdesignschemeandthetimingsimulationunderQuartusIIisparticularlyintroduced.
KeywordsQuartusII;I2Cbuscontroller;FPGA;timingsimulation
千万不要删除行尾的分节符,此行不会被打印。
在目录上点右键“更新域”,然后“更新整个目录”。
打印前,不要忘记把上面“Abstract”这一行后加一空行
第1章绪论
1.1课题背景
近年来,随着社会的发展,电子产品越来越多的进入人们的生活和工作中,成为了我们生活中必不可少的一部分,随着计算机的普及,以及电子设备之间相互沟通的更加频繁,为了更方便的实现器件与器件之间的通信,研发人员从消费者电子、电讯和工业电子中许多看上去不相关的设计中寻找到了他们的相似之处,例如几乎每个系统都包括:
(1)一些智能控制,通常是一个单片的微控制器。
(2)通用电路,例如LCD驱动器、远程I/O口、RAM、EEPROM或者数据转换器。
(3)面向应用的电路,譬如收音机和视频系统的数字调谐和信号处理电路。
为了使这些相似之处对系统设计者和器件厂商都得益,而且使硬件效率最大电路最简单,Philips开发了一个简单的双向两线总线,实现有效的IC之间控制,这个总线就称为I2C总线。
现在Philips包括超过150种CMOS和双极性兼容I2C总线的IC,可以执行前面提到的三种类型的功能。
所有符合I2C总线的器件组合了一个片上接口,使器件之间直接通过I2C总线通讯,这个设计概念解决了很多在设计数字控制电路时遇到的接口问题。
I2C总线具有以下优点:
(1)极低的电流消耗、抗高噪声干扰、电源电压范围宽以及较广的工作温度范围、简单性和有效性
(2)I2C总线占用的空间非常小(接口直接在组件之上),减少了电路板的空间和芯片管脚的数量,降低了互联成本
(3)支持主控,其中任何能够进行发送和接收的设备都可以成为总线,一个主控能够控制信号的传输和时钟频率(任何时间点只能有一个主控)
1.2I2C总线的产生及发展
I2C总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。
例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。
可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。
1.3FPGA的现状与展望
FPGA是英文Field-ProgrammableGateArray的缩写,即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。
FPGA经过70年的不断发展,由当初的1200门发展成为今天的百万门级。
通过不断更新优化产品架构和生产工艺,实现了更高的性能、更短的开发周期、更低的单位成本和功耗。
从前的“定论”是:
FPGA可编程,灵活性高,一直依赖都是用作建模的平台,而不适合进行量产,但是经过多年的研发,大大缩短了FPGA开发时间,降低了验证成本。
高集成度和灵活度从消费电子的发展来看,客户要求产品的更新换代的周期越来越短,并要求不段的继承更多的,层出不穷的,新的技术和应用,而且又要严格控制成本。
因此,FPGA在灵活性上就具备了天然的优势,且通过多年的努力,在高性能和低功耗方面也取得了显著地改进,现在的FPGA性能已经能够满足大多数应用的的需要。
1.4相关工作
为了设计基于FPGA的I2C总线控制器,包括数据传输时序、传输命令、传输格式。
首先要深入研究I2C总线的协议规范,在QuartusⅡ平台上,对设计进行分析、综合,功能和时序仿真,最后深入研究FPGA芯片的设计流程,并根据以上结果选择芯片,并配置到FPGA上,验证设计结果。
本文的章节安排如下;
1绪论,主要介绍课题研究的背景,I2C总线和FPGA的产生现状和发展
2I2C总线技术的研究,介绍I2C总线的特点以及工作原理
3VHDL语言的基础知识,简单的介绍了VHDL语言的特点和结构
4设计工具与设计方法,介绍了一种新的设计软件QuartusII,以及基于FPGA的数字电路的设计流程
5I2C总线的功能设计
6I2C总线的硬件时序仿真
7结论,对本文进行总结,在设计中遇到的问题以及从此次设计中学到的东西
双击上一行的“1”“2”试试,(本行不会被打印,请自行删除)
第2章I2C总线技术的研究
2.1I2C总线的概念
I2C总线是一种比较流行的总线,它的接受和发送在同一条数据线上。
I2C由串行数据(SDA)和串行时钟(SCL)两根线构成的。
总线上允许连接的设备数主要决定于总线上的电容量,一般设定为400pf以下。
SDA和SCL都是双向总线,它们都通过上拉电阻连接到电源上。
当总线处于停止(IDLE)状态,两根线都是高电平。
对于I2C总线来说,总线上连接的设备,例如LCD驱动器、存储器等都是有一个唯一的地址识别,而且都可以作为一个发送器或接收器。
至于是作为发送器还是接收器,主要取决于连接设备的具体功能。
例如LCD驱动只是一个接收器,而存储器则既可以接受又可以发送数据。
除了发送器和接收器外,设备在执行数据传输时也可以被看作是主机或从机。
主机是初始化总线的数据传输,并产生允许传输的时钟信号的设备,这时任何被寻址的期间都被认为是从机。
由于I2C总线使用两线的硬件接口简单,I2C总线的应用越来越广泛[1]。
下面,将I2C总线的通用术语进行介绍,如表2-1所示;I2C总线的典型接法如图2-1所示。
表2-1I2C总线的通用术语
术语
描述
发送器
发送数据到总线的器件
接收器
从总线接收数据的期间
主机
初始化发送、产生时钟信号和终止发送的器件
从机
被主机寻址的器件
多主机
同时有多于一个主机尝试控制总线,但不破坏报文
仲裁
是一个在有多个主机同时尝试控制总线,但只允许其中一个控制总线并使报文不被破坏的过程
同步
两个或多个器件同步时钟信号的过程
图2-1I2C总线信号连接示意图
2.2I2C总线的传输
由于I2C总线的器件有不同种类的工艺(CMOS、NMOS、双极性),逻辑‘0’(低)和‘1’(高)的电平不是固定的。
在I2C总线每传输一位数据就有一个时钟脉冲相对应,其逻辑“0”或“1”的信号电平取决于该节点的正端电源Vdd的电压。
2.2.1数据的有效性
在工作过程中,数据有效要求串行数据(SDA)线上的数据必须要在串行时钟(SCL)的高电平时钟周期期间保持稳定。
而只有在串行时钟(SCL)线的时钟信号是低电平的时候串行数据(SDA)上的数据才能发生变化(如图2-2所示)
2.2.2I2C总线数据传送的开始和停止条件
在I2C总线数据传送的整个过程中,需要先有开始条件引发,并由停止信号结束,这两个条件在数据线上的表示如图2-3所示。
开始条件:
当串行时钟(SCL)线上的时钟信号是高电平的时候串行数据(SDA)上的数据由高电平变为低电平,产生了一个下降沿,表示数据传输开始。
停止信号:
当串行时钟(SCL)线上的始终信号是高电平的时候串行数据(SDA)上的数据由低电平变为高电平,产生了一个上升沿,表示数据传输停止。
开始和停止条件一般由主机产生。
总线在开始条件后被认为处于忙的状态。
在停止条件的某段时间后,总线被认为再次处于空闲状态。
图2-2I2C总线的数据位传输
图2-3开始和停止条件
2.2.3I2C总线传输过程中的应答信号
数据传输必须带应答。
相应的时钟脉冲又主机产生。
在应答的时钟脉冲器件,发送机SDA输入端保持高电平,接收机将SDA输出端拉低,使它在这个时钟脉冲的高电平器件保持稳定的低电平。
当从机不能应答从机地址时,从机必须使数据线保持高电平,主机产生一个停止条件,终止传输或者产生重复起始条件开始新的传输。
如果执行写操作过程中,从机应答了从机地址,但是在传输了一段时间后不能接收更多数据字节,主机必须终止传输。
这个情况用从机在第一个字节后没有产生应答来表示,从机使数据线保持高电平,主机产生一个停止或重复起始条件。
如果执行读操作过程中,主机必须在从机传输最后一个字节之后产生一个不应答信号,之后产生停止条件,而从机必须将数据线保持高电平,允许主机产生一个停止或重复起始条件。
2.2.4I2C总线数据传送的重复开始条件
主机与从机进行通信时,有时需要切换数据的收发方向。
例如,访问某一具有I2C总线接口的存储器时,主机先向存储器输入存储单元的地址信息(发送数据),然后再读取其中的存储内容(接收数据)。
在切换数据的传输方向时,可以不必先产生停止条件再开始下次传输,而是直接再一次产生开始条件。
I2C总线在已经处于忙的状态下,再一次直接产生起始条件的情况被称为重复起始条件。
正常的起始条件和重复起始条件在物理波形上并没有什么不同,区别仅仅是在逻辑方面。
在进行多字节数据传输过程中,只要数据的收发方向发生了切换,就要用到重复起始条件。
2.2.5I2C总线的传输过程中的字节格式
总线传输时要按照规定的数据格式,发送到SDA线上的每个字节必须为8位,每次传输可以发送的字节数量不受限制,每个字节后必须跟一个应答信号。
首先传输的是数据的最高位(MSB)。
在开始条件发出之后,SDA输入端发送一个7位的从机地址,然后第8位为数据方向位(读/写位),数据方向表明主机和从机的数据传输方向。
“0”表示主机发送数据(写),“1”表示从机发送数据(读)。
如果从机要完成一些其他功能后才能接受或者发送下一个完整的数据字节,可以使时钟SCL保持低电平迫使主机进入等待状态。
当从机准备好接受下一个数据字节并释放时钟SCL后,数据传输继续。
数据传输由主机产生停止条件结束。
2.2.6I2C总线的器件子地址
带有I2C总线的器件除了有从机地址(SlaveAddress)外,还可能有子地址。
从机地址是指该器件在I2C总线上被主机寻址的地址,而子地址是指该器件内部不同部件或存储单元的编址。
某些器件(只占少数)内部结构比较简单,可能没有子地址,只有必须的从机地址,子地址与从机地址一样,子地址实际上也是像普通数据那样进行传输的,传输格式仍然是与数据相统一的,区分传输的到底是地址还是数据要靠收发双方具体的逻辑约定。
子地址的长度必须由整数个字节组成,可能是单字节(8位子地址),也可能是双字节(16位子地址),还可能是3字节以上,这要看具体器件的规定。
2.2.7I2C总线传输信号的时序
I2C总线数据传送分为读操作和写操作(图2-4),而读操作还分为按照当前位置进行读操作(图2-6)以及随即性读操作(图2-8),时序图如下
图2-4主机向从机发送了一个字节的时序
图2-5主机向从机连续发送多个字节的时序
图2-5所表示的是一个最简单的写操作的时序,主机向从机传送一个7位的地址数据,然后第8位为读/写位,在这个表示地址的字节传输结束之后,在串行时钟(SCL)的第9个时钟,由从机发送一个应答信号(此时串行数据SDA输入端在SCL为高电平期间内保持高电平,而SDA输入端输出为低电平,表示一个应答信号),接着主机继续向从机传输8位数据,之后再次由从近发送一个应答信号,这个时候如果还需要发送数据字节,可以继续发送(图2-5),每发送8位数据后都要由从机发送一个应答信号,当数据发送完毕后,在最后一个应答信号之后的那个SCL处于高电平的时钟周期内,将串行数据SDA输入端从低电平拉为高电平,表示数据传输停止。
图2-6主机向从机接收1个字节数据的时序
图2-7主机向从机连续接收多个字节数据的时序
图2-6所表示的是一个最简单的按照当前位置进行的读操作,前9个周期的时序与写操作的时序一致,不同的是当从机发送一个应答信号之后,由从机向主机传输8位数据,这个时候如果还需要发送数据字节,可以继续发送(图2-7),每发送8位数据后都要由主机发送一个应答信号,当数据发送完毕后,在最后一个数据字节传送结束之后的那个SCL处于高电平的时钟周期内SDA的输入端保持高电平,而SDA输入端输出也为高电平,表示一个不应答信号(图中Nack(Notacknowledge)表示),之后的一个时钟周期内产生停止条件,表示数据传输停止。
图2-8主机向从机随即接收多个字节数据的时序
图2-8所表示的是一个多字节的随机性读操作,选择性读操作允许主器件对寄存器的任意字节进行读操作,主机首先通过发送起始信号、从机地址和它想要读取的字节数据的地址执行一个伪写操作。
在从机应答之后,主机重新发送起始信号和从机地址,此时读/写位为“1”进行读操作,从机响应并发送应答信号,然后输出所要求的一个8位字节数据,主器件发送应答信号,这个时候如果还需要发送数据字节,可以继续发送,每发送8位数据后都要由主机发送一个应答信号,当数据发送完毕后,在最后一个数据字节传送结束之后的那个SCL处于高电平的时钟周期内SDA的输入端保持高电平,而SDA输入端输出也为高电平,表示一个不应答信号(图中Nack(Notacknowledge)表示),之后的一个时钟周期内产生停止条件,表示数据传输停止。
2.3本章小结
本章主要介绍了I2C的有关知识,从I2C总线的概念开始,介绍了I2C总线的开始和停止条件以及如何传输数据才有效,然后介绍了I2C总线传输过程中应答信号的产生和作用,以及位传输和字节传输需要注意的每个时钟周期代表的意义,最后,介绍了I2C总线工作的各种状态的时序,以便下面用语言对I2C总线进行设计与实现。
第3章VHDL语言的基础知识
3.1VHDL语言的概述
VHDL语言是一种用于电路设计的高级语言。
它在80年代的后期出现。
最初是由美国国防部开发出来供美军用于提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。
VHDL语言主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
3.2VHDL语言的特点
与其他的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了它成为系统设计领域最佳的硬件描述语言。
强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。
VHDL最初是作为一种仿真标准格式出现的,因此VHDL既是一种硬件电路描述和设计语言,也是一种标准的网表格式,还是一种仿真语言,其丰富的仿真语句和库函数,使得在任何大系统的设计早期,就能用于查验设计系统的功能可行性,随时可对设计进行仿真模拟。
即在远离门级的高层次上进行模拟,使设计者对整个工程设计的结构和功能的可行性做出决策。
VHDL语言的行为描述能力和程序结构决定了它具有支持大规模设计的分解和已有设计的再利用功能,符合市场所需求的,大规模系统高效、高速的完成必须由多人甚至多个开发组共同并行工作才能实现的特点。
VHDL中设计实体的概念、程序包的概念、设计库的概念为设计的分解和并行工作提供了有力的支持。
VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。
由于VHDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需改变端口类属参量或函数,就能轻易地改变设计的规模和结构[2]。
3.3VHDL语言的程序结构
一个完整的VHDL语言程序通常包括实体、构造体、配置、包集合和库5个部分。
3.3.1VHDL程序的库
库是经编译后的数据的集合,它存放包集合定义、实体定义、构造体定义和配置定义。
在VHDL语言中,库的说明总是放在设计单元的最前面:
LIBRARY库名;
这样,在设计单元内的语句就可以使用库中的数据。
由此可见,库的好处就在于使设计者可以共享已经编译过的设计结果。
在VHDL语言中可以存在多个不同的库,但是库和库之间是独立的,不能互相嵌套。
3.3.2包集合
包集合是用来罗列VHDL语言中所要用到的信号定义、常数定义、数据类型、元件语言、函数定义和过程定义等,它是一个可编译的设计单元,也是库结构的一个层次,要使用包集合时可以用USE语句说明。
例如:
useieee.std_logic_unsigned.all;
该语句表示在VHDL程序中要使用名为std_logic_unsigned的包集合中的所有定义或者说明项。
包集合的结构如下所示:
PACKAGE包集合名IS
[说明语句]
END包集合名;——包集合标题
PACKAGEBODY包集合名IS
[说明语句]
ENDBODY;——包集合体
一个包集合由两大部分组成:
包集合标题和包集合体、包集合体可以省略不写。
一般包集合标题列出所有项的名称,而包集合体具体给出各项的细节。
3.3.3实体说明
任何一个基本设计单元的实体说明都具有如下结构:
ENTITY实体名IS
[类属参数说明]
[端口说明]
END实体名;
其中类属参数说明必须放在端口说明之前,用于指定参数。
端口说明是对基本设计实体与外部接口的描述,也可以说是对外部引脚信号的名称,数据类型和输入、输出方向的描述。
其一般书写格式如下:
PORT(端口名:
方向数据类型名;
...
端口名:
方向数据类型名);
端口名是定义每个外部引脚的名称。
端口方向用来定义外部引脚的信号方向是输入还是输出,分为5种:
IN(输入),OUT(输出而且构造体内部不能再使用),INOUT(双向),BUFFER(输出而且构造体内部可以再次使用),LINKAGE(不指定方向,无论出入都可以连接)。
数据类型在逻辑电路设计中只用到两种:
BIT和BIT_VECTOR。
当端口被说明为BIT数据类型时,该端口的信号取值只可能是“0”或者“1”。
这里的“0”和“1”是指逻辑值。
当端口被说明为BIT_VECTOR数据类型时,该端口的取值可能是一组二进制位的值。
3.3.4构造体
构造体定义了设计单元具体的功能。
构造体对其基本设计单元的输入输出关系可以用3种方式进行描述,即行为描述、寄存描述和结构描述。
由于构造体是对实体功能的具体描述,因此它一定要跟在实体的后面。
一个构造体的具体结构描述如下:
ARCHITECTURE构造体名OF实体名IS
[定义语句]
BEGIN
[并行处理语句]
END构造体名;
构造体名是对本构造体的命名,是该构造体的唯一名称。
OF后面紧跟的实体名表明了该构造体所对应的是哪一个实体。
定义语句用来对构造体内部所使用的信号、常数、数据类型和函数进行定义,格式和端口说明的语句一样,但因为它是内部连接的信号,故没有也不需要有方向的说明。
并行处理语句具体的描述了构造体的行为[3]。
3.3.5配置
一个实体可以包含多个结构体,配置的作用就是根据需要选择实体的结构体。
配置语句描述层与层之间的连接关系以及实体与结构之间的连接关系,设计者可以利用这种配置语句来选择不同的构造体,使其与要设计的实体相对应。
在仿真某一实体时,可以利用配置来选择不同的结构体,进行性能对比试验以得到性能最佳的结构体。
配置语句的基本书写格式如下:
CONFIGURATION配置名OF实体名IS
[语句说明]
END配置名;
经常使用的配置有以下三类:
默认配置、元件配置和结构配置[4]。
3.4本章小结
本章主要介绍了VHDL的有关知识,,主要介绍了VHDL特点以及如何用VHDL语言编写程序,首先定义库函数,然后引入包集合,定义实体,构造体,注意构造体内可以包括子程序,最后定义配置。
第4章设计工具和设计方法
4.1设计工具
本次设计使用的是Altera公司的设计软件QuartusII,用VHDL语言编程实现的。
QuartusII软件是Altera提供的综合性开发软件,可以轻易地满足特定地设计需求。
它支持原理图、VHDL、VerilogHDL等多种设计输入形式,内有综合器以及仿真器,可以完成从设计输入到硬件配置的完整设计流程。
QuartusII软件允许用户在设计流程的每个阶段使用软件提供的软件图形用户界面、EDA工具界面或命令行方式。
其图形用户界面的功能分为:
设计输入、综合、布局布线、时序分析、仿真、编程、系统设计、软件开发、基于块