当前位置:首页 >> 信息与通信 >>

基于FPGA的I2C串行总线接口电路设计


本科毕业设计(论文)
题 目 基于 FPGA 的 I2C 串行总线接口电路设计

学生姓名: 专 指导教师: 完成日期:

史俊达

业:集成电路设计及集成系统
黄静 2013/5/30

诚 信 承 诺 书
本人承诺:所呈交的论文是本人在导师指导下进行的研究成果。 除了文中特别加以标注和致谢的地方外, 论文中不包含其他人已发表 或撰写过的研究成果。 参与同一工作的其他同志对本研究所做的任何 贡献均已在论文中作了明确的说明并表示了谢意。

签 名:

日 期:

本论文使用授权说明
本人完全了解南通大学有关保留、使用学位论文的规定,即:学 校有权保留论文及送交论文复印件,允许论文被查阅和借阅;学校可 以公布论文的全部或部分内容。 (保密的论文在解密后应遵守此规定)

学生签名:

指导教师签名:

日期:

南通大学毕业设计(论文)





I2C(Inter Integrated Circuits)总线是 Philips 公司开发的用于芯片之间连接的串行总线。现 场可编程门阵列(FPGA)设计灵活、 速度快, 在数字专用集成电路的设计中得到了广泛的应用。 I2C 串行总线接口电路设计的主要任务是根据 I2C 时序协议用 Verilog HDL 语言对 I2C 总线接 口电路的描述,其目的是通过在 FPGA 上来实现 I2C 接口电路来领会复杂数字电路的设计思 路和理念。 在对 I2C 总线的研究现状与发展进行了深入的调研的基础上,论文着重阐述了在 FPGA 上实现随机读/写的 I2C 接口电路的设计方案。首先,论文简单介绍了硬件描述语言(Verilog HDL)与现场可编程门阵列(FPGA)。其次,论文详细说明了 I2C 串行总线内部结构和数据 传输格式及其时序协议。基于此,论文重点阐述了接口电路的设计方案以及在 FPGA 开发板 上与外围 I2C 接口器件 E2PROM 实现数据传输的仿真与测试。经过多次实验验证,I2C 总线 接口电路已通过行为级仿真和综合及布局布线后门级时序仿真,满足系统要求。最后,论文 对所得的研究成果进行了总结。

关键词: Verilog_HDL;FPGA;I2C 串行总线;随机读/写;E2PROM

I

南通大学毕业设计(论文)

ABSTRACT
I2C (Inter Integrated Circuits) Bus is developed by Philips for the connection between the chip serial bus. In the digital ASIC design, Field-programmable gate array (FPGA) design has been widely used because of its flexibility and high speed. The main task of I2C serial bus interface circuit design is based on the I2C timing agreement with Verilog HDL language description of the I2C bus interface circuit, which aims to achieve I2C interface circuit up to comprehend complex digital circuit design ideas and concepts through the FPGA. Based on the in-depth research of the I2C bus status and development, the design scheme of the random read/write I2C interface circuit on FPGA was underlined in the paper. First,hardware description language (Verilog HDL) and field-programmable gate array (FPGA) were introduced slightly in the paper. Second, the internal structure and data transmission format of I2C serial bus and its timing protocol were illustrated in the paper in detail. Based on this, the interface circuit design in FPGA development board was emphasized in the paper.As well as, the simulation and test of data transmission with peripheral devices E2PROM with I2C interface were stressed. After several experiments, I2C bus interface circuit has passed the behavioral level simulation and synthesis and layout-level timing simulation backdoor to meet system requirements. Finally, the research results were summarized.

Keywords: Verilog_HDL; FPGA; I2Cserial bus ; Random read /write; E2PROM

II

南通大学毕业设计(论文)






要 ......................................................................................................................................... I

ABSTRACT ................................................................................................................................ II
第一章 绪 论 ............................................................................................................................... 1

1.1 本课题研究的意义 ............................................................................................................... 1 1.2 研究领域现状 ....................................................................................................................... 1 1.3 发展趋势 ............................................................................................................................... 1 1.4 所做的主要工作................................................................................................................... 2 第二章 Verilog HDL 和 FPGA 的综述 ........................................................................................ 3 2.1 硬件描述语---Verilog HDL ................................................................................................. 3 2.1.1 Verilog HDL 简介 .......................................................................................................... 3 2.1.2 Verilog HDL 的发展 ...................................................................................................... 3 2.1.3 Verilog HDL 用途 .......................................................................................................... 3 2.2 现场可编程门阵列--FPGA .................................................................................................. 3 2.2.1 FPGA 的概要 ................................................................................................................. 3 2.2.2 FPGA 的基本组成 ......................................................................................................... 4 2.2.3 FPGA 的基本特点 ......................................................................................................... 4 第三章 I2C 串行总线简介 ............................................................................................................. 6 3.1 I2C 串行总线的概述 ............................................................................................................. 6 3.2 I2C 总线特征 ......................................................................................................................... 6 3.3 I2C 总线的数据位传输 ......................................................................................................... 7 3.3.1 有效数据位的规定 ....................................................................................................... 7 3.3.2 起始和终止信号 ........................................................................................................... 7 3.4 I2C 总线上的数据传输 ......................................................................................................... 8 3.4.1 数据字节格式 ............................................................................................................... 8 3.4.2 应答确认 ....................................................................................................................... 8 3.4.3 I2C 总线的工作模式 ...................................................................................................... 9 3.5 I2C 总线的工作流程 ............................................................................................................. 9
III

南通大学毕业设计(论文)

3.5.1 I2C 总线的写操作 .......................................................................................................... 9 3.5.2 I2C 总线的读操作 ........................................................................................................ 10 3.6 仲裁和时钟同步................................................................................................................. 10 3.6.1 时钟同步 ..................................................................................................................... 10 3.6.2 数据仲裁 ..................................................................................................................... 11 第四章 I2C 串行总线接口电路设计 ........................................................................................... 13 4.1 I2C 串行总线接口电路的性能指标 ................................................................................... 13 4.2 I2C 串行总线接口电路的设计平台 ................................................................................... 13 4.3 I2C 串行总线接口电路的设计方案 ................................................................................... 13 4.3.1 I2C 串行总线接口电路的框图设计 ............................................................................ 13 4.3.2 I2C 串行总线接口电路的内部模块设计 .................................................................... 14 4.3.3 I2C 串行总线接口电路各模块的程序设计方法 ........................................................ 14 4.4 I2C 串行总线接口电路程序的综合 ................................................................................... 16 第五章 I2C 串行接口电路仿真与 FPGA 开发板测试............................................................... 17 5.1 电路仿真测试平台............................................................................................................. 17 5.1.1 电路仿真工具 .............................................................................................................. 17 5.1.2 电路开发板测试仪器 .................................................................................................. 17 5.1.3 外部测试芯片 ............................................................................................................. 18 5.2 外围电路的构建................................................................................................................. 21 5.2.1 E2PROM 电路构建 ...................................................................................................... 21 5.2.2 完整的测试电路 ......................................................................................................... 22 5.3 I2C 串行接口电路仿真结果 .............................................................................................. 23 5.3.1 I2C 串行接口电路写数据的功能仿真 ........................................................................ 23 5.3.2 I2C 串行接口电路读数据功能仿真 ............................................................................ 24 5.3.3 I2C 串行接口电路写数据时序仿真 ............................................................................ 25 5.3.4 I2C 串行接口电路读数据时序仿真 ............................................................................ 25 5.3.5 E2PROM 行为模块的反馈信息图 .............................................................................. 26 5.4 I2C 串行接口电路 FPGA 测试结果 ................................................................................... 26 结束语 ........................................................................................................................................... 31 参考文献 ....................................................................................................................................... 32
IV

南通大学毕业设计(论文)

致 谢 ........................................................................................................................................... 33 附 录 ........................................................................................................................................... 34

V

南通大学毕业设计(论文)

第一章
1.1 本课题研究的意义





随着电子科技的迅速发展,需要相互通信及与外界通信的IC电路变得越来越复杂。为了 简化电路设计,Philips公司开发了一种双向二线的串行I2C总线(Intel Integrated Circuit Bus)。 该总线具有通讯效率高、传输线少等特点。因为其简单的接口、控制简便,使用I2C总线的电 子电路设计工程师日益增多。I2C总线只提供两根线进行通信,所有具有I2C接口的器件都可 以挂在这两根线上直接通信。 目前,IC制造商提供的I2C总线应用芯片的功能越来越强大。I2C总线由主器件控制,增加 额外的I2C控制器需要额外的印制板面积,增加了成本。因此,在一些特殊应用条件下,使用 一种利用应用广泛的现场可编程门阵列(FPGA)实现与I2C总线器件无缝连接的方法,将是更 为经济的解决方案。 根据I2C总线的通讯协议,在Altera 公司的EP2C35F672C6型号的FPGA上实现与具有I2C 接口的外围芯片进行通信,具有易调试、灵活配置、高速传输等优点,这样大大地缩减了电 路系统的开发时间。

1.2 研究领域现状
单片机应用系统正向小型化、高可靠性、低功耗等方向发展。在一些功能较多的电路系 统中,经常需扩展多个外围接口器件。如果采用传统的并行传输方式,传输时间是缩短了, 但也增加了系统资源的消耗和系统的复杂度,关键是功耗的增大和成本的增加。现在,许多 公司采用了 Philips 公司开发的 I2C 总线,使单片机系统电路结构的复杂度大大减小,并且增 加了硬件的灵活性,缩短了产品开发周期,降低了成本。 自从I2C总线成为国际通用的总线标准后,I2C总线因为具有扩展方便、协议完善、支持 芯片多和连线少等优点,已经被很多集成电路厂商集成到微控制器集成电路中。I2C总线的应 用涉及通信、控制、家电、消费电子等众多领域,在很多器件上都配备有I2C 总线接口,而 且功能日益强大。

1.3 发展趋势
I2C总线以其结构简单、通信功能可制定、高抗干扰性、传输速度快等特点获得了广泛的 应用。I2C总线控制器是MPU与I2C器件之间的桥梁,它负责接收处理器的数据、地址以及控 制信号,而且反馈I2C器件的状态和数据给处理器,实现处理器与I2C器件之间的通信。 Philips 公司除了生产具有 I2C 总线接口的单片机外,还推出了许多具备 I2C 总线的外部
1

南通大学毕业设计(论文)

接口芯片,如 AT24CXX 系列的 EEPROM、128 字节的 SRAM 芯片 PCF8571、日历时钟芯片 PCF8563、4 位 LED 驱动芯片 SAA1064、160 段 LCD 驱动芯片 PCF8576 等多种类多系列接口 芯片。 随着可编程器件的飞速发展,用 FPGA 器件实现 I2C 总线控制器接口的设计可以带来很 多方面的便利。

1.4 所做的主要工作
由于现场可编程逻辑门阵列(FPGA)作为专用集成电路(ASIC)领域中的一种半定制 电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点, 深受硬件电路设计人员的喜爱,大大缩减了电路开发时间[5]。本论文要求在 FPGA 上实现 I2C 串行总线接口电路,要求实现基本的随机读写功能和显示、编写电路测试模块。 全文共分为五章,各章节的主要内容安排如下: 第一章为绪论,简要介绍了I2C串行总线接口电路的研究背景、意义和目前国内外研究现 状。 第二章对硬件描述语言Verilog HDL和现场可编程逻辑门阵列FPGA的综述,其中包括硬 件描述语言Verilog HDL及FPGA的起源、发展、应用等;Verilog HDL语言与FPGA的开发板 的结合在现在的半定制电路中应用很广泛,这样可以省去不少开发全定制的时间和成本等。 第三章对I2C串行总线接口电路进行了介绍,了解I2C串行总线的概念和其工作时序协议, 其中包括I2C串行总线接口的内部结构。 第四章阐述了 I2C 随机读/写串行接口电路设计,首先说明了 I2C 随机读/写串行接口电 路的设计框图,同时对这个电路进行分模块设计。遵循自顶向下(Top_Down)设计理念,将 复杂的时序电路分解成几个简单的小模块,使设计流程清晰化,这样也便于测试。 第五章为 I2C 随机读/写串行接口电路的仿真和测试,分别用软件对电路进行功能、时序 仿真和在 FPGA 开发板上测试。最后,把测试结果与实际值进行比较,进一步地确认电路的 正确性。

2

南通大学毕业设计(论文)

第二章 Verilog HDL 和 FPGA 的综述
2.1 硬件描述语----Verilog HDL
2.1.1 Verilog HDL 简介 Verilog HDL 是一种描述硬件的语言, 可以用文本编程的形式来描述硬件的内部结构和行 为。 它可以表示逻辑电路图、 逻辑表达式, 还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL 由 Gateway Design Automation 公司开发的。现在,Verilog HDL 和 VHDL 一样也是世界 上最流行的两种硬件描述语言之一,已经成为为 IEEE 标准。 2.1.2 Verilog HDL 的发展 Verilog HDL 语言原来是由 Gateway Design Automation 公司于 1983 年为其模拟器产品开 发的硬件建模语言,它还只是一种专用语言[2]。随着他们的模拟、仿真器产品被电子业界广 泛使用, Verilog HDL 作为一种便于使用而且实用的语言开始被越来越多的电路设计者所接受
[2]

。 Verilog HDL 语言在一次增加语言普及性的活动中被推向公众领域。 1992 年, Open Verilog

International 决定推广 Verilog OVI 标准成为 IEEE 标准,这一推广最终获得了成功。于 1995 年,Verilog 语言成为 IEEE 标准,称为 IEEE Std 1364-1995[2]。 2.1.3 Verilog HDL 用途 Verilog HDL 是目前应用最为广泛的硬件描述语言, 用于从算法级、 门级到开关级的多种 抽象设计层次的数字系统建模[14]。被建模的数字系统对象的复杂性可以介于简单的门和完整 的电子数字系统之间[14]。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模
[14]

。 Verilog HDL 可以用来进行各种层次的逻辑设计, 也可以进行数字系统的逻辑综合, 仿真

验证和时序分析等[14]。

2.2 现场可编程门阵列--FPGA
现场可编程门阵列(Field Programmable Gate Array:FPGA),它是在 PAL、GAL、CPLD 等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半 定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺 点[5]。 2.2.1 FPGA 的概要 目前以硬件描述语言(Verilog 或 VHDL)描述的逻辑电路,可以利用逻辑综合和布线工 具软件, 快速地烧录至 FPGA 上进行测试, 这一过程是现代 集成电路设计验证的技术主流[5]。
3

南通大学毕业设计(论文)

这些可编程逻辑元件可以被用来实现一些基本的逻辑门数字电路(比如与门、或门、异或门、 非门)或者更复杂一些的组合逻辑功能,比如译码器等[19]。大多数的 FPGA 里面包含记忆元 件,例如触发器(Flip-flop)或者其他更加完整的记忆块,从而构成时序逻辑电路[19]。 电路系统设计人员可以根据需要,通过编程下载的方式,把 FPGA 内部的逻辑块连接起 来,这样就完成了在 FPGA 芯片里构建你所要的电路。FPGA 内部的逻辑块和连接可以随着 设计者的需要而改变,所以 FPGA 能够成为数字电路设计人员在半定制电路中的第一选择。 一般来说,FPGA 比专用集成电路(ASIC)的速度要慢一点,无法完成更复杂的设计, 并且能耗也大。但是,FPGA 具有可以快速成品,而且其内部逻辑可以被设计者反复修改的 优点。此外,用 FPGA 调试的成本较低。 2.2.2 FPGA 的基本组成
?

静态随机存取存储器(SRAM):基于静态内存 Static memory 技术,系统内可编程 化和再程序化 (Re-programmable) 须要外部启动元件 , (External boot devices) CMOS。

?

Antifuse:可烧录一次。通常为 CMOS。 PROM(一次性可编程 EPROM):可编程化只读存储器技术,可烧录一次。使用塑 料封装,无窗,不能清除内容。

?

?

EPROM:可清除可编程化只读存储器技术,有窗,经紫外线照射可清除内容。 EEPROM:可电气清除可编程化只读存储器技术,可用电气信号清除内容。 闪存:一种特殊的 EEPROM。 熔丝:可烧录一次。通常为双极性的。

?

?

?

2.2.3 FPGA 的基本特点
? ? ? ? ? ?

采用 FPGA 设计 ASIC 电路,用户无需投片生产,就能得到组合的芯片。 做半定制电路的样品。 内部有大量的触发器和 I/O 引脚。 电路设计周期短、开发成本低、风险小。 采用高速、功耗低的 CHMOS 工艺,兼容 CMOS、TTL 电平。 能提高系统集成度和可靠性。 FPGA 内部 RAM 中的程序控制其工作过程。工作时,只需对片内的 RAM 进行编程,就

可以实现不同的功能。 加电时,FPGA 芯片将 EPROM 中数据读入片内编程 RAM 中,完成配置后,FPGA 进入 工作状态[3]。掉电后,FPGA 恢复成空白片,内部逻辑关系消失[3]。因此,FPGA 能够反复使
4

南通大学毕业设计(论文)

用。FPGA 的编程无须专用的 FPGA 编程器,只须用通用的 EPROM、PROM 编程器即可。当 需要修改 FPGA 功能时, 只需换一片 EPROM 即可[3]。 这样, 同一片 FPGA, 不同的编程数据, 可以产生不同的电路功能[3]。因此,FPGA 的使用非常灵活。

5

南通大学毕业设计(论文)

第三章
3.1 I2C 串行总线的概述

I2C 串行总线简介

I2C(Inter Integrated Circuit)总线是由 Philips 公司开发的两线式串行总线,用于连接微 控制器及其外围设备,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性 能串行总线[8]。 I2C 总线也是微电子通信控制领域广泛采用的一种总线标准。它不同于普通的同步通信, 具有输出线少,容易控制,传输速率快,抗干扰强等优点。 I2C总线定义了两根线:串行数据线SDA和串行时钟线SCL。如图3.1是I2C总线系统的示意 图。图中的单片机、SRAM或E2PROM、A/D或D/A转换器以及其他I2C外围设备都有它们各自 的地址。在数据传输过程中,通信双方分别称为I2C主控(I2C_Master)和I2C从设(I2C_Slave), 都可以作数据发送端和接收端。

图3.1 带有微控制器的I2C总线配置

迄今为止,飞利浦已开发出 150 余种,包括 CMOS 和双极型 I2C 总线兼容 IC,所有符合 标准的 I2C 总线接口的设备, 通过简单的双向两线总线, 以实现有效的控制和 IC 之间的通信。

3.2 I2C 总线特征
I2C总线是通过双向串行时钟线SCL和双向串行数据线SDA在器件之间传递信息的。 SDA、SCL的输出级必须是开漏或者开集电极输出,并在两根线上分别通过上拉电阻接到正 电源,以实现“线与”功能。如图3.2. 当总线处于空闲状态,SDA、SCL均保持为高电平。挂在总线上每个器件都有自己对应 的唯一地址,用来发送数据或接收数据。当主器件掌控总线时,为实现数据的传输,主器件 需要产生传输所需的时钟;被寻址的器件只能作为从器件。在标准模式下,I2C总线上数据的 传输速率可达100kbit/s,在快速模式下可达400kbit/s,在高速模式下可达3.4Mbit/s[7]。总线电 容(400pF)及地址的寻址范围决定连接到总线的器件数量。
6

南通大学毕业设计(论文)

图3.2 I2C标准模式器件和快速模式器件连接到I2C总线

在复杂的系统中,可能有多台主机同时启动总线,进行传输数据。通过总线仲裁,就可 以很好地控制哪一台主机来控制总线。

3.3 I2C 总线的数据位传输
3.3.1 有效数据位的规定 I2C总线进行数据传输时,串行时钟为高电平期间,数据线上的数据必须保持稳定,只有 在串行时钟为低电平期间,才允许数据线上的数据进行变化(即:高电平变低电平状态或者 低电平变高电平状态),如图3.3。

图3.3 I2C总线的数据位传输

3.3.2 起始和终止信号 串行时钟SCL为高电平期间,串行数据SDA出现下降沿,则表示本次传输的起始信号; SCL线为高电平期间,SDA线出现上升沿,则表示本次传输的终止信号,如图3.4。 主机负责向从设发送启动和停止信号,产生启动信号后,SDA总线被占用;产生停止信号 后,总线就释放总线。(即:处于空闲状态)。

7

南通大学毕业设计(论文)

图3.4 启动和停止信号

3.4 I2C 总线上的数据传输
3.4.1 数据字节格式 发送至SDA线上的每个字节必须为8位,每次传输的字节数不受限制,每个字节后必须跟 一位响应。被发送的数据第一位就是最高有效的数据位(MSB)。如图3.5。如果接收器在传 输途中去做其他事(比如:做一些中断程序),接收器将把SCL拉低,直到处理好它的事情 后才释放SCL,继续接收数据,在SCL被拉低的期间,主器件处于等待状态。

图3.5 数据字节格式

3.4.2 应答确认 每次发送的 8 位数据必须跟一位应答,此应答对应的时钟周期还是由主器件来产生。在 这个时钟周期里,主器件要释放 SDA,由从器件控制,主器件在这个期间需要检测从器件有 没有发送应答信号。 从器件必须在这个时钟周期的低电平期间拉低 SDA,这样主器件才能在时钟高电平期间 检测到应答信号。当然,SDA 的建立时间和保持时间也要考虑在内。 产生起始位后,总线就处于忙碌状态,产生停止位后,总线就进入空闲状态。在读数据 时,主机接收到最后一个字节就不产生响应位(SDA=1),以此告知从设不要再发送数据,等 待结束信号。如果不是最后一个数据字节,则主机发出的响应位为0(SDA=0)。当从设响应了 主机,在传输了一段时间后不能接收更多的数据字节,此时从机可以通过产生非响应来告知
8

南通大学毕业设计(论文)

主机终止当前传输,于是主机产生一个停止信号终止本次传输,或者产生重复起始信号开始 新的传输[13]。 3.4.3 I2C 总线的工作模式 (1)主器件发送从器件接收(写操作) 主器件发送开始信号之后,紧接着发送的第一个字节是控制字节。高七位为从器件的地 址片选信号。最低位为数据传输方向标示位 (1表示读从器件,0代表写从器件),如下图3.6。 应答后再发送从器件的片内地址。应答后,接着发送的是数据字节,数据可以是单个字节, 也可以是多个字节,取决于主器件。

图3.6 第一个字节格式

从器件每收到一个字节之后,在第九个SCL周期要反馈一个应答信号(SDA=0)。在应答 周期,主器件释放SDA线,从器件把SDA拉成低电平,作为对主器件的应答。 (2)从器件发送主器件接收(读操作) 发送开始信号之后,主器件发送写控制字节给从器件。如果从器件检测到这个控制字节 中的从器件地址与自身地址相一致, 并且方向位为1(R/W=1),则表示此次操作是读操作, 由从 器件反馈主器件一个应答。 然后,从器件把数据发送给主器件。若主器件在之前给从器件发过片内地址,则从器件 就从这个地址开始发送数据;若从器件没有收到片内地址,则从器件就从当前地址开始向主 器件发送数据。 从器件在发送一个字节数据后,若收到主器件的应答信号则继续发送下一个字节数据; 若没收到主器件的应答信号,从器件将停止发送数据,等待主器件的停止信号。从器件的发 送地址和字节数都由主器件决定。

3.5 I2C 总线的工作流程
3.5.1 I2C 总线的写操作 写操作的步骤: 1. 向从器件发启动信号 2. 向从器件发 I2C 器件特征码、页地址(3bit)和读写控制位(R/W=0) 3. 从器件发应答信号(低)
9

南通大学毕业设计(论文)

4. 向从器件发 8 位片内地址 5. 从器件发应答信号(低) 6. 向从器件发 8 位数据 7. 从器件发应答信号(低) 8. 若主器件仍需发送数据,就继续发,直到从器件没有应答信号(高) 9. 向从器件发停止信号 3.5.2 I2C 总线的读操作 读操作的步骤(读随机地址单元): 1. 向从器件发启动信号 2. 向从器件发 I2C 器件特征码、页地址(3bit)和读写控制位(R/W=0) 3. 从器件发应答信号(低) 4. 向从器件发 8 位地址 5. 从器件发应答信号(低) 6. 向从器件发启动信号 7. 向从器件发 I2C 器件特征码、页地址(3bit)和读写控制位(R/W=1) 8. 从器件发应答信号(低) 9. 从器件发数据(8 位) 10. 若主器件读单字节数据,则不给从器件应答(SDA=1)。若主器件需读多字节数据, 则给从器件发应答(SDA=0),直到读最后一个字节数据,才向从器件发应答 (SDA=1)。 11. 向从器件发停止信号

3.6 仲裁和时钟同步
3.6.1 时钟同步 在 I2C 总线上,所有的主器件产生他们自己的传输时钟来传输数据。数据只在串行时钟 的高电平器件有效。要得到一个确定的串行时钟就需要一位一位进行仲裁[7]。 时钟的同步就是利用 I2C 总线的线与功能。当有多个主机同时在 SCL 线上产生自己的时 钟信号时,这些时钟信号通过线与的方式来同步。如图 3.7,主器件 l 产生的串行时钟 CLK1 先变低,同步后的 SCL 线随之被拉低,主器件 2 内部的计数器被 SCL 的下降沿复位,同时 输出端导通, 两个主器件都对 SCL 的低电平开始计时。 主器件 1 首先计数完成并关闭输出端, 而主器件 2 没有完成计,输出端仍是导通,此时 SCL 仍为低电平,这时主器件 1 进入高电平
10

南通大学毕业设计(论文)

等待状态,直到主器件 2 完成计数并释放 SCL 线,SCL 变为高电平[7]。 当SCL变高时,两个主器件同时把计数器清0,然后开始对SCL线高电平计时,在图3.7 中,主器件l首先完成SCL线高电平计数并拉低SCL线,检测到SCL线下降沿后,两个主器件 的计数器同时清0,准备开始低电平的计时[13]。 综上所述,同步后SCL线低电平时间取决于时钟低电平时间最长的主机,高电平时间取 决于时钟高电平时间最短的主机[7]。

图3.7 时钟同步图

3.6.2 数据仲裁 主机只会在I2C总线空闲时产生起始位, 但是在起始位的保持时间tHD:STA内可能有多个主 机产生起始位,最终,总线上的起始位由它们之间的线与运算决定,仲裁只是对SDA线上传 输的数据进行仲裁。SCL为高时,在SDA线上发送低电平的主器件将会赢得仲裁,发送高电 平的主器件将会仲裁失败,并对SDA置高阻。如图3.8,两个主器件产生起始位后就开始对传 输的数据进行仲裁,第一个数据位,SCL为高时,两个主器件都输出高电平,继续仲裁,第 二个数据位,两个主器件都输出低电平,继续仲裁,到第三个数据位时,主器件l的SDA输出 高电平,而主器件2的SDA线输出低电平,于是,主器件2赢得仲裁,主器件l呈现高阻状态[7]。 仲裁可以持续几个数据位,若两个主器件传输的数据都是一样的,那么仲裁也会持续到 结束信号。在实际通信中,第一个进行仲裁往往是控制字字节部分(即:器件地址和传输方 向标示位),如果一个从器件被多个主器件寻找,那么比较数据位进行仲裁,直到传输结束。 赢得总线仲裁的主器件决定I2C总线上的地址和数据,因此传输的数据信息不会丢失[7]。

11

南通大学毕业设计(论文)

图 3.8 数据仲裁图

12

南通大学毕业设计(论文)

第四章

I2C 串行总线接口电路设计

4.1 I2C 串行总线接口电路的性能指标
本文设计要求实现一个严格遵循 I2C 协议的接口电路, 传输速率最高为 1MHz, 向下兼容 低速的 I2C 接口的设备,输入的数据是 8 位的,输入地址是 15 位的(高 7 位是器件地址,低 8 位是器件内地址),另外器件地址为 7 位,可以对 128 个有 I2C 接口的器件进行寻址,能与 I2C 接口的 E2PROM 进行数据传输,并支持对从设进行随机读、写。

4.2 I2C 串行总线接口电路的设计平台
Altera 公司的 Quartus Ⅱ软件是电路设计所用到的平台。Altera 公司的 Quartus II 集成 PLD/FPGA 开发软件, 支持原理图, VHDL, Verilog HDL 的 AHDL (Altera Hardware Description Language)和其他设计输入表单,以及嵌入式自身合成模拟器的硬件配置,可以完成从设计 输入完整的 PLD 设计过程。 除了使用 Tcl 脚本完成设计流程外,Quartus II 还提供了一个完善 的图形用户界面设计,具有编译速度快,界面功能多样,容易上手等优点。 Altera 的 Quartus II 支持的 IP 内核,包括 LPM/宏功能块库,使用户能够充分利用成熟的 模块,简化了设计的复杂性,加快了设计速度。第三方 EDA 工具的良好支持也使得用户在设 计过程中的各个阶段可以使用熟悉的第三方 EDA 工具。其可编程逻辑设计环境,由于其强大 的设计能力和直观的界面,越来越多的数字系统设计人员的欢迎[8]。

4.3 I2C 串行总线接口电路的设计方案
4.3.1 I2C 串行总线接口电路的框图设计 VCC VCC
DATA[7:0] ADDR[14:0] MPU CLK WR RD RST DATA[7:0] ACK I2C 串 行 接 口 I2C 设备 1 I2C 设备 2

图 4.1 I2C 接口电路的框图设计 在电路设计中,电路的整体外部框图的设计对整个电路设计起到了决定性作用。拥有一 个完整的、清晰的电路外廓对之后电路的各个部分的设计就有了清晰的把握。本次 I2C 接口 电路需要一边要与 MPU 进行通信,另一边要与带有 I2C 接口的设备进行数据传输,这样就构
13

南通大学毕业设计(论文)

成了一个简单的电路系统。电路框图设计如图 4.1。 4.3.2 I2C 串行总线接口电路的内部模块设计 I2C 串行接口电路的外部框图只是给出一个电路系统的轮廓图, 接口电路的内部结构如何 还要根据内部框图的设计。内部框图的设计将会决定接口电路的具体实现。 I2C 串行接口电路的程序设计是遵循了“自顶向下”的设计理念。利用层次化,结构化的 设计方法,使电路设计变得层次清晰,结构简单。这个电路设计被分为 7 个子模块,分别是: I2C 接口顶层模块、输入时钟分频模块、串行时钟产生模块、输入数据寄存器模块、地址寄存 器模块、控制寄存器模块和时序主状态控制模块。其中时序主状态控制模块是接口电路中核 心部分,它控制着电路有序的运作。每个模块实现各自的功能,把每个模块按照逻辑相连就 组成了一个电路整体。I2C 串行接口内部模块设计如图 4.2。

CLK_50 CLK_50
RST IC WR RD DATA[7:0] ADDR[14:0] 接 DATA[7:0] 口 顶 层 模 块 DATAOUT[7:0] ADDR[14:0] WR/RD
2

CLK_2M 分频器

RST

SCL 产生模块 SCL_EN 时

SCL

输入数据锁存

DATA[7:0] ADDR[14:0]

序 主 SDA

输入地址锁存 WR_FLAG

状 态 机 控 制

控制锁存器
DATAOUT[7:0] ACK CLK

RD_FLAG

ACK

接 4.2 图

I2C 接口电路的内部模块设计

4.3.3 I2C 串行总线接口电路各模块的程序设计方法 口 I2C 串行接口电路的程序设计利用层次化, 模块化的设计方法, 使电路设计变得层次清晰, 结构简单。这个电路设计被分为 7 个子模块,下面详细说一下各模块的设计方法。



层 I2C 接口顶层模块主要是用来对下一层子模块的实例调用, 要求子模块每个功能都能正确
地实现,并且子模块之间的输入/输出也要满足时序要求。它是整个设计流程中最高层次的一 模 个模块。


14

南通大学毕业设计(论文)

输入数据锁存器、地址锁存器、控制锁存器模块都属于输入锁存模块。它们的作用就是 用来协调设备与 CPU 之间的通信。由于 CPU 工作速度快,数据信号、地址信号、控制信号 只能保持一段时间有效。接口电路的输入锁存器就能很好地解决这个问题,当控制信号出现 时,其就把数据信号和地址信号锁入相应的锁存器。这块程序是采用组合逻辑来编写的。 输入时钟分频模块用来协调接口输入的时钟与 I2C 总线传输时序之间的不匹配的,加个 分频就能很好地解决这个问题。输入时钟为 50MHz,经过分频后输出的时钟频率是 2MHz。 这块程序是采用时序计数来分频的。

图 4.3 状态转移图

串行时钟产生模块就是使 I2C 总线的串行数据线 SDA 在串行时钟线 SCL 的配合下把数 据按照传输协议一位一位地传出去[7]。 这块程序也是采用时序来分频的, CLK 的下降沿 SCL 在 翻转,前提是要在 SCL 时钟产生信号有效。 时序主状态控制模块是时序电路,也是整个电路的核心电路。它直接控制着并行数据的 装载、 状态位标志和时序发送/接收的控制。 整个电路在它的控制下有条不紊地进行数据通信。 这块程序采用同步有限状态机(FSM)的设计方法。程序实际上就是一个主控状态机, 在主状态不同的状态下都控制着不同的任务和控制信号,在不同的输入信号与当前状态的情 况下构成复杂的有限状态机[1]。这个有限状态机的驱动时钟是频率为 2MHz 的 CLK。由于读
15

南通大学毕业设计(论文)

写操作的状态中有几个状态是一致的,用到了嵌套状态机。状态转移如下图 4.3。为了避免代 码重复,程序由一个发送的大任务和接收的大任务组成,状态编码采用独热码。

4.4 I2C 串行总线接口电路程序的综合
I2C 串行总线接口电路程序的综合是采用 QuartusⅡ自带的综合器进行综合的。各个模块 的程序均已通过了综合器的综合,也给出了整个电路程序的综合报告及综合出来的原理图。 综合报告如图 4.4。综合生成的原理图如图 4.5

图 4.4 电路的综合报告

图 4.5 综合生成的原理图

16

南通大学毕业设计(论文)

第五章

I2C 串行接口电路仿真与 FPGA 开发板测试

5.1 电路仿真测试平台
5.1.1 电路仿真工具 Mentor 公司的 ModelSim SE 10.1a 是本次 I2C 串行接口电路的仿真软件。ModelSim 是业 界最优秀的 HDL 语言仿真软件, 它能提供友好的仿真环境, 是业界唯一的单内核支持 VHDL 和 Verilog 混合仿真的仿真器[6]。它采用直接优化的编译技术、Tcl/Tk 技术、和单一内核仿真 技术,编译的代码与软件平台没有关系,编译和仿真速度快,便于保护 IP 核[6]。用户接口和 个性化的图形界面加快了用户的调错进程, ModelSim 是 FPGA/ASIC 设计的首选仿真软件[6]。 主要特点: 1. 本地编译结构, RTL 和门级优化, 编译和仿真速度快, 能够跨版本甚至跨平台仿真[6]; 2. 单内核支持 Verilog 和 VHDL 的混合仿真; 3. 直接支持 System C,可以任意混合 HDL; 4. 支持 System Verilog 的设计功能; 5. 全面支持系统级描述语言:SystemVerilog、SystemC、PSL; 6. 可以单独或同时进行行为(Behavioral)、RTL 级、和门级(Gate-level)的代码[6]。 5.1.2 电路开发板测试仪器 电路开发板测试的仪器是 Altera 公司的 DE2 教学开发板。DE2 开发板是以 672 针引脚 的包装的 Cyclone II EP2C35F672C6 为核心。板上所有重要的部件都与板上的芯片相连,使用 户能够控制板上各种的操作。DE2 板包括了很多开关(兼有拨动开关和按键),发光二极管 和七段数码管[3]。在更多进一步的实验中还用到了 SRAM,SDRAM,Flash 以及 16×2 的字 符液晶。需要进行处理器和 I/O 接口试验时,可以简单的用 Altera NiosII 处理器和象 RS-232 和 PS/2 标准接口。进行涉及音频和视频的实验时,也有标准 MIC、line-in、line-out 接口(24 位音频解编码器),Video-in(TV Decoder)和 VGA(10-bit DAC),这些特点都能够被用 来制作 CD 质量的音频应用程序和专业的视频图象[3]。为了能够设计更强大的项目,DE2 还 提供了 USB2.0 接口(包括主、从 USB),10/100M 自适应以太网,红外(IRDA)接口,以 及 SD 卡接口[3]。最后,可以通过两排扩展 I/O 口与其它用户自定义的板子相连。如图 5.1.

17

南通大学毕业设计(论文)

图 5.1 Altera DE2 教学开发板

5.1.3 外部测试芯片 外部测试芯片使用的是 Ateml 公司的 AT24C04 芯片。 AT24C04 是 Atmel 公司生产的 4Kbit (512Bytes)E2PROM 芯片,该芯片采用 I2C 总线设计,主要性能指标为:
?

容量为 4Kbit(512Bytes),分为两部分存储空间,每部分 256bytes。 有 2 个器件地址选择脚,最多能够挂接 4 个 AT24C04 器件。 32 页,每页 16 字节,每次可连续写入 16 字节数据。 WP 引脚为高电平时,AT24C04 的 0~255 地址空间的数据被写保护。 需要 9 位的地址进行数据寻址。 最高支持 1MBps,还向下兼容 100KBps 和 400KBps 两种传输速率。 器件地址高 4 位固定为“1010”,低 3 位为 A2,A1,P0。

?

?

?

?

?

?

A0 为空引脚,A1,A2 口为器件地址设定口,通过 A1,A2 口来设定 AT24C04 的器件地址 WP 口接低电平时,可以对整个 AT24C04 器件的 512 个字节进行读写操作。当 WP 口接高电 平后,器件前 256 个地址的数据被保护,只能读,不可写入,后 256 个字节数据可进行读写 操作。AT24C04 的数据空间由 P0 位决定,当 P0 为“0”时,将对 AT24C04 的 0~255 空间的 数据进行操作;当 P0 为“1”时,将对 AT24C04 的 256~511 空间的数据进行操作。
18

南通大学毕业设计(论文)

AT24C04 的引脚定义,如图 5.2 及表 5.1。
表 5.1 AT24C02 引脚定义

引脚定义 1. A0 2. A1,A2 3. GND 4. SDA 5. SCL
图 5.2 AT24C04 的引脚图

引脚定义说明 空引脚。 器件地址设定引脚。 电源地。 数据口。 同步时钟口。 写保护口。 电源。

6. WP 7. VCC

(1)写操作: AT24C04 的写操作有字节写和页写两种模式,可以一次写入一个字节或是一页(16 个字 节)。 两种操作模式的时序如图 5.3、 所示。 5.4 在字节写中, Master 向 AT24C04 写数据, AT24C04 响应 Master 的寻址后,Master 发送片内字节地址,AT24C04 响应后,Master 发送数据;若 AT24C04 接收数据, 则会反馈响应, Master 检测到后产生停止位, 结束写操作。 此时, AT24C04 开始擦写内部数据,不再响应外部信号。 在页写中,AT24C04 可一次写入 16 个字节:页写也是先发送从器件地址,然后送片内 字节地址;发送了一字节数据后检测到从器件的响应,主器件继续发送 15 个字节数据。 AT24C04 每收到 8 位数据后给主器件一位应答,片内地址自动加一,不然主器件将会停止传 输。如果主器件发了超过 16 个字节的数据,地址计数器将会指向当前页的开头继续加,覆盖 先前写入的数据。发送完 16 字节数据后,主器件产生停止位,AT24C04 接收到停止位后, 不再响应外部信号,启动内部擦写操作,如图 5.4 所示。

图 5.3 字节写时序图

19

南通大学毕业设计(论文)

图 5.4 页写时序图

此时, 主器件可以通过发送特定的 AT24C04 器件地址查询 AT24C04 内部擦写是否结束, 如果有应答,则说明 AT24C04 内部擦写已经结束,主器件可以进行下一步操作,否则应继续 等待。

(2)读操作: AT24C04 的读模式分为 CurrentAddress Read(当前地址读)、RandomRead(随机读)和 Sequential Read(顺序读)三种,时序如图 5.5 所示。读操作的初始化方式和写操作一样,也是 先发送 Slave 地址,不同之处在于 R/W 位等于 l。 在顺序读中,读地址是上次的读写操作地址加 1。AT24C04 输出一个字节的数据后,主 器件不应答,AT24C04 结束发送,主器件产生停止位。 随机读操作是主器件可以随意读取 AT24C04 任意地址的内容。主器件发送起始位后、继 续发从器件地址(R/W=0),AT24C04 应答,再发从器件片内地址,AT24C04 应答后,主器件 重新发送起始位和从器件地址(R/W=1),AT24C04 应答,然后输出一个字节数据,主器件 收到后不应答,产生停止信号结束传输,如图 5.6 所示。

图 5.5 当前地址读时序图

20

南通大学毕业设计(论文)

图 5.6 随机读时序图

顺序读可以由当前地址读或随机地址读操作启动,主器件收到一个字节后,要应答从器 件,AT24C04 收到响应后将继续发送下一个地址的数据,直到主器件不应答,并产生停止位 结束传输。读完最高地址的字节数据后,AT24C04 内部的地址计数器翻转,下一次读本页的 开头地址中的内容,如图 5.7 所示。

图 5.7 顺序读时序图

5.2 外围电路的构建
5.2.1 E2PROM 电路构建 AT24C04 型号 E2PROM 的 SCL、SDA 是漏极开路的,需要外接上拉电阻到 VCC。本次 需要用到两片 E2PROM,它们的器件地址不一样。如图 5.8、5.9 所示,E2PROM 1 的 A2,A1, A0 均接地,WP 接地,没写保护;E2PROM 2 的 A2 接 VCC,A1,A0 均接地,WP 接地,没 写保护。图中 SCLK,SDA 接到所设计的接口芯片的 SCL 和 SDA 输出端。

21

南通大学毕业设计(论文)

VCC_5V

SCLK A2 A1 A0 SCLK WP SDA VCC_5V
VCC_5V

SDA

VCC GND

图 5.8 E2PROM 1 外围电路

VCC_5V

SCLK A2 A1 A0 SCLK WP SDA VCC_5V
VCC_5V

SDA

VCC GND

图 5.9 E2PROM 2 外围电路

5.2.2 完整的测试电路 经过上面的外围电路的搭建,这节可以完成整个测试电路的构建。Altera 公司的 DE2 作 为 I2C 总线的主控器件, Atmel 公司的 AT24C04 作为从器件, 两个 AT24C04 E2PROM 相级联, 双方通过 DE2 的 IO 扩展口相连。如下图 5.10。

22

南通大学毕业设计(论文)

图 5.10 完整的测试电路

5.3 I2C 串行接口电路仿真结果
5.3.1 I2C 串行接口电路写数据的功能仿真 在 Quartus 里直接调用 Modelsim 进行功能仿真,模拟实际 I2C 电路向 E2PROM 的 00H、 01H 地址里写入 12H、34H 数据。仿真图如图 5.11:

图 5.11(a) 写数据的功能仿真图

23

南通大学毕业设计(论文)

图 5.11(b) 写数据的功能仿真图

5.3.2 I2C 串行接口电路读数据功能仿真 在 Quartus 里直接调用 Modelsim 进行功能仿真,模拟实际 I2C 电路向 E2PROM 的 00H、 01H 地址里分别读出写入的数据。仿真图如图 5.12:

图 5.12(a) 读数据功能仿真图

图 5.12(b) 读数据功能仿真图

24

南通大学毕业设计(论文)

5.3.3 I2C 串行接口电路写数据时序仿真 在 Quartus 里直接调用 Modelsim 进行时序仿真,模拟实际 I2C 电路向 E2PROM 的 00H、 01H 地址里分别写入 12H、34H 数据。仿真图如图 5.13。

图 5.13(a) 写数据时序仿真波形图

图 5.13(b) 写数据时序仿真波形图

5.3.4 I2C 串行接口电路读数据时序仿真 在 Quartus 里直接调用 Modelsim 进行时序仿真,模拟实际 I2C 电路向 E2PROM 的 00H、 01H 地址里读出写入的数据,仿真图如图 5.14。

图 5.14(a) 读数据时序仿真图

25

南通大学毕业设计(论文)

图 5.14(b) 读数据时序仿真图

5.3.5 E2PROM 行为模块的反馈信息图

图 5.15 Modelsim 反馈信息图

图 5.15 的反馈信息可以看出 I2C 串行接口电路已经向 E2PROM 的 00H 地址写入了数据 12H,向 01H 地址写入数据 34H。这些反馈信息可以说明 I2C 串行接口电路已经通过了功能 时序仿真。理论上,这个电路已经符合了本课题的设计要求,但是,还要在实物板上验证才 能最终确定电路正确。FPGA 开发板的验证将在下一节里提到。 5.4 I2C 串行接口电路 FPGA 测试结果 DE2 做为 I2C 主控器对器件地址为 1010000 的 E2PROM 1 和地址为 1010100 的 E2PROM 2 芯片进行随机读写操作。向 E2PROM 写入的数据是预先预存在 ROM 里的,数据类型是 16 进制的。地址是通过 DE2 上的拨码开关输入 15 位地址的。 操作按钮介绍: 开发板右下脚的第一个绿色按钮是 RESET,开发板右下脚的第二个绿色按 键是写按钮,第三个绿色按钮是读按钮。拨码开关就是在绿色按钮左边那排拨码开关。

26

南通大学毕业设计(论文)

对 E2PROM 1 的片内地址 00H 进行写操作: 按下写按钮,写入数据 12H,在右边的数码管上显示。如图 5.16。

图 5.16 E2PROM 1 的片内地址 00H 写入 12H

对 E2PROM 1 的片内地址 00H 进行读操作: 按下读按钮,读出 00H 的数据,并在左边的数码管上显示。如图 5.17。

图 5.17 E2PROM 1 的片内地址 00H 地址读数据

27

南通大学毕业设计(论文)

对 E2PROM 1 的片内地址 01H 进行写操作: 按下写按钮,写入数据 23H,在右边的数码管上显示。如图 5.18。

图 5.18 对 E2PROM 1 的片内地址 01H 进行写操作

对 EEPROM 1 的片内地址 01H 进行读操作: 按下读按钮,读出 01H 的数据,并显示在左边的数码管上。如图 5.19。

图 5.19 对 E2PROM 1 的片内地址 01H 进行读操作

28

南通大学毕业设计(论文)

对 E2PROM 2 的片内地址 00H 进行写操作: 按下写按钮,写入数据 34H,显示在右边的数码管上。如图 5.20。

图 5.20 对 E2PROM 2 的片内地址 00H 进行写操作

对 E2PROM 2 的片内地址 00H 进行读操作: 按下读按钮,读出 00H 的数据,并显示在左边的数码管上。如图 5.21。

图 5.21 E2PROM 2 的片内地址 00H 进行读操作

29

南通大学毕业设计(论文)

对 E2PROM 2 的片内地址 01H 进行写操作: 按下写按钮,写入数据 45H,显示在右边的数码管上。如图 5.22。

图 5.22 E2PROM 2 的片内地址 01H 进行写操作

对 E2PROM 2 的片内地址 01H 进行读操作: 按下读按钮,读出 01H 的数据,并显示在左边的数码管上。如图 5.23。

图 5.23 E2PROM 2 的片内地址 01H 进行读操作

30

南通大学毕业设计(论文)

结束语
I2C 总线是芯片之间通信的双向串行总线。目前,带有 I2C 接口的外围芯片种类也不在少 数,因其出众的性能、严格的规范、简单点的操作得到了电子行业的普遍认可和广泛应用。 I2C 总线采用两根串行线进行通信,适合长距离传输,抗干扰强,而且通信协议固定,程序编 写方便、易于实现模块化和标准化。现场可编程门阵列(FPGA)因其速度快,电路设计灵活, 是半定制电路中最佳的选择,在数字集成电路中得到广泛的应用。 论文的主要内容是探究怎样在 FPGA 上设计一个 I2C 串行总线接口电路,并且实现最基 本的随机地址读写功能, 并在数码管上显示传输的数据。 本次使用的 FPGA 开发板是 ALTERA 公司的 CycloneⅡ芯片的 DE2,外围器件是 Atmel 公司的 AT24C04 型号的 E2PROM。本次的 传输速度最高可达到 1MHz,向下兼容低速的接口器件。 本次接口电路设计的思想还是遵循 Verilog HDL 的自顶向下的设计理念,把设计分为几 个功能级的模块,测试通过后,再进行连线拼接成一个完整的电路。模块化的设计确实使电 路设计简单、清晰不少。状态机的使用使整个电路严格地按照时序要求来实行,这样不会出 现错乱。本次设计采用的是 FSM 状态机,使一次传输过程变得条理化、清晰化。不过,本次 的接口电路的不足之处是只支持单字节传输,多字节传输在测试时出现了问题,迟迟没得到 解决。 通过这次毕业设计,本人已经对I2C的接口标准、控制时序和结构等都已经有了比较详细 的理解。本人已更深一步地了解到了复杂数字电路设计的理念,以及如何巧妙地运用状态机 来实现时序控制电路。分层模块化的设计思想更是让本人耳目一新,本人学到了不少以前没 有涉及到的知识。

31

南通大学毕业设计(论文)

参考文献
[1] 夏宇闻. Verilog HDL 数字系统设计教程[M].第二版.北京: 北京航空航天大学出版社, 2008.6:226-251. [2]朱赤驹.FPGA 中 CLB 电路的设计研究[D].电子科技大学,2009 [3] 陈景,李建华.基于 FPGA 的 I2C 读写控制器的设计与实现[J]. 自动化技术与应用.2010, (2) 86-88. 29 : [4] 林兴隆,杨锁强,涂海洋.防止 I2C 总线锁死的研究[J]. 计算机与网络.2012.10:61-63. [5] 潘小冬,陈泽详,黄自力.FPGA 有限状态机模拟 I2C 总线设计[J].中国测试技术,2007,33(1) : 105-107. [6] 黄高峰.维特比译码器的 FPGA 实现[D].成都理工大学,2010 [7]刘蓓.基于 FPGA/HDL 的随机读写 I2C 串行总线接口电路设计[D].苏州大学,2008.6 [8]叶扬科,钱剑敏,成高.基于 I2C 总线的 I/O 口扩展设计[D]. 上海:东华大学信息科学与技术学院.2012.6 [9]陈涛.单片机应用及 C5l 程序设计[M].第 2 版.北京:机械工业出版社,2011 [10]范晓亮.FPGA 中 CLB 电路的设计研究[D].东北大学,2008 [11]张延伟,杨金岩,葛爱学. Verilog HDL 程序设计实例详解[M].北京:人民邮电出版社,2008 [12]田耘,徐文波,胡彬. Xilinx ISE Design Suite 10.x FPGA 开发指南——逻辑设计篇[M].北京:人民邮电 出版社,2008. [13]宁静,刘许亮.基于 FPGA 的 I2C 总线控制器设计[J]. 黄河水利职业技术学院学报,2009,21(2):46-49 [14]张宏伟.无线空间光通信多载波调制降低峰均比的研究与实现[D].西安理工大学,2008 [15]张奕.多功能视力检测仪的设计[D].重庆大学,2006 [16] Philips Semiconductors.The I2C BUS Specification[M],Version 2.1,January,2000. [17]Philips Semiconductor. I2C Bus Specification [S].version:2.1, January 2000 ; 8-38. [18] Thomas D, and PMoorby. The Verilog Hardware Description language [M]. Kluwer Academic, MA, 1999 [19]Chao- Huang Wei, Yun- Chung Lin.Implementation of local area digital audio broadcasting system upon I2C network: The 2004 47th Midwest Symposium on IEEE Circuits and Systems[C], Japan:IEEE, 2004:3,25- 28. [20]MOHAMMAD W,MAMOON E,CHIRAG S. Analysis and implementation of adaptive modem for SDR[C]//Proc. 2007 International Conference on Wireless Communications,Networking and Mobile Computing.[S]:IEEE Press,2007:1248-1251

32

南通大学毕业设计(论文)





本论文是在电子信息学院黄静老师的悉心指导下完成的。黄静老师作为一名优秀、经验 丰富的教师,具有丰富的电路设计方面的知识和教学经验,在整个论文实验和论文写作过程 中,对我进行了悉心的指导,并提出严格要求,引导我不断开阔思路,为我答疑解惑,鼓励 我大胆创新,使我在这一段宝贵的时光中,既增长了知识、开阔了视野、锻炼了心态,又培 养了良好的实验习惯和科研精神。在此,我向我的指导老师表示最诚挚的谢意! 在论文即将完成之际,我的心情久久无法平静,从选题到论文的完成,有不少老师、同 给予了我帮助,在此特地感谢他们。感谢南通大学电子信息学院提供的实验器材,感谢老师 给予我丰富的专业知识和各个方面的帮助,感谢合作组员的积极协助。同时也要感谢全体同 学,正是由于你们的帮助和支持,我才能一个一个克服困难、解明疑惑,直至本文顺利完成, 在这里请接受我诚挚的谢意!最后我还要感谢培养我长大含辛茹苦的父母,谢谢你们!

33

南通大学毕业设计(论文)


I2C 接口顶层模块的设计代码: module I2C_TOP( CLOCK_50, // DE2 50MHZ RESET, // key0 RD,WR, //key2,key1 ADDR, DATA, DATAOUT, SDA, //GPIO_1[0] SCL, //GPIO_1[1] ACK //LEDG7 ); input CLOCK_50,RESET,RD,WR; input [14:0]ADDR; input [7:0]DATA; output [7:0]DATAOUT; inout SDA; output SCL,ACK; wire SDA,SCL,clk,ACK; wire [7:0]DATAOUT; wire SCL_EN; wire [7:0]data_to_I2C; wire [10:0]addr_to_I2C; wire WR_FLAG; wire RD_FLAG; wire dataout_en; assign DATA=(dataout_en)?dataout:8'dz; scl_generater u2( .scl_en(SCL_EN), .clk(clk), .rst_n(RESET), .scl(SCL) ); pll u1( //div clk_frequence .reset(RESET), .inclk(CLOCK_50), .c0(clk) ); datain_register u3(
34



50MHZ

---2MHZ

南通大学毕业设计(论文)

.datain(DATA), .wr(WR), .data(data_to_I2C) ); addr_register u4( .addr_in(ADDR), .wr(WR), .rd(RD), .addr(addr_to_I2C) ); control_signal_register u5( .wr(WR), .rd(RD), .wr_flag(WR_FLAG), .rd_flag(RD_FLAG) ); I2C u6( .clk(clk), .reset(RESET), .rd_flag(RD_FLAG), .wr_flag(WR_FLAG), .data(data_to_I2C), .dataout(DATAOUT), .addr(addr_to_I2C), .sda(SDA), .scl(SCL), .scl_en(SCL_EN), .ack(ACK) ); endmodule

输入数据寄存器设计代码: module datain_register( input [7:0]datain,
35

南通大学毕业设计(论文)

input wr, output reg [7:0]data ); always @(wr or datain) if(!wr) data=datain; else data=data; endmodule 输入地址寄存器设计代码: module addr_register( input [14:0]addr_in, input wr, input rd, output reg [14:0]addr ); always @(wr or rd or addr_in) if((!wr) || (!rd)) addr=addr_in; else addr=addr; endmodule 输入控制信号寄存器设计代码: module control_signal_register( input wr, input rd, input ack, output reg wr_flag, output reg rd_flag ); always @(wr or rd or ack) if(!wr) begin wr_flag=1'b1; rd_flag=1'b0; end else if(!rd) begin rd_flag=1'b1; wr_flag=1'b0; end else if(ack) begin
36

南通大学毕业设计(论文)

wr_flag=1'b0; rd_flag=1'b0; end endmodule 输入时钟分频模块设计代码: module pll( reset, inclk, c0 ); input reset,inclk; output reg c0; reg [7:0]t; always @(posedge inclk or negedge reset) if(!reset) begin c0<=1'b0; t<=8'd0; end else if (t==8'd12) begin t<=t+8'd1; c0<=1'b1; end else if(t==8'd24) begin t<=8'd0; c0<=1'b0; end else t<=t+8'd1; endmodule 串行时钟产生模块设计代码: module scl_generater( input scl_en, input clk, input rst_n, output reg scl );

37

南通大学毕业设计(论文)

always @(negedge clk or negedge rst_n) if(!rst_n) scl<=1'b1; else if(scl_en) scl<=~scl; else scl<=1'b1; endmodule 时序主状态控制模块设计代码: module I2C ( clk,//2MHZ reset, rd_flag, wr_flag, data, dataout, addr, sda,//INOUT ,need a resistance to pull up,VCC is 5V scl,//1MHZ,need a resistance to pull up,VCC is 5V scl_en, ack );

input clk; input reset; input rd_flag; input wr_flag; input scl; input [14:0]addr; input [7:0]data; output reg[7:0]dataout; output reg scl_en; inout sda; output ack; reg ack; reg sf; reg sda_link; reg sda_reg; reg [1:0]cnt; reg [8:0]mainstate; reg [8:0]outstate; reg [8:0]instate; reg [7:0]shift;

//shift bite finish

38

南通大学毕业设计(论文)

parameter idle =9'b000000001, write_start =9'b000000010, ctrl_write =9'b000000100, addr_write =9'b000001000, data_write =9'b000010000, read_start =9'b000100000, ctrl_read =9'b001000000, data_read =9'b010000000, stop =9'b100000000; parameter d7=9'b000000001, d6=9'b000000010, d5=9'b000000100, d4=9'b000001000, d3=9'b000010000, d2=9'b000100000, d1=9'b001000000, d0=9'b010000000, release_sda=9'b100000000;

parameter sda7=9'b000000001, sda6=9'b000000010, sda5=9'b000000100, sda4=9'b000001000, sda3=9'b000010000, sda2=9'b000100000, sda1=9'b001000000, sda0=9'b010000000, transmit_unack=9'b100000000;

assign sda=(sda_link)?sda_reg:1'bz; always @(posedge clk or negedge reset) if(!reset) begin mainstate<=idle; cnt<=2'd0; sda_reg<=1'b1; sda_link<=1'b1; dataout<=8'd0; ack<=1'b0;

//mainstate machine

39

南通大学毕业设计(论文)

end else begin casex(mainstate) idle:if(wr_flag) begin sf<=1'b0; sda_reg<=1'b1;//sda is in idle ,value is 1 sda_link<=1'b1; ack<=1'b0; mainstate<=write_start; end else if(rd_flag) begin sf<=1'b0; sda_reg<=1'b1;//sda is in idle ,value is 1 sda_link<=1'b1; ack<=1'b0; mainstate<=write_start; end else mainstate<=idle; //scl-------//sda-----___ //start

write_start:if(scl) begin sda_reg<=0; sda_link<=1'b1; scl_en<=1'b1; shift[7:0]<={addr[14:8],1'b0}; mainstate<=ctrl_write; outstate<=d7; sf<=1'd0; end else mainstate<=write_start; ctrl_write : if(!sf) shiftout; else if(!sda) begin sf<=1'b0; shift[7:0]<=addr[7:0]; mainstate<=addr_write; outstate<=d7; end
40

//ctrlbyte

南通大学毕业设计(论文)

else if(cnt<3) begin cnt<=cnt+2'd1; mainstate<=idle; end else mainstate<=stop; addr_write:if(!sf) shiftout; else if(wr_flag&(!sda)) begin shift[7:0]<=data[7:0]; sf<=1'b0; mainstate<=data_write; outstate<=d7; end else if(rd_flag&(!sda)) begin mainstate<=read_start; end else mainstate<=stop; data_write:if(!sf) shiftout; else if(!sda) begin mainstate<=stop; end else begin mainstate<=stop; end read_start:if(!scl) begin sda_reg<=1'b1; sda_link<=1'b1; mainstate<= read_start; end else begin sda_reg<=1'b0; sda_link<=1'b1;
41

//start

南通大学毕业设计(论文)

shift<={addr[14:8],1'b1}; mainstate<= ctrl_read; outstate<=d7; sf<=1'b0; end ctrl_read:if(!sf) shiftout; else if(!sda) begin mainstate<=data_read; instate<=sda7; sf<=1'b0; end else begin mainstate<=stop; end data_read:if(!sf) shiftin; else begin mainstate<=stop; end stop:if(!scl) begin scl_en<=1'b0; sda_reg<=1'b0; sda_link<=1'b1; end else begin sda_reg<=1'b1; sda_link<=1'b1; ack<=1'b1; mainstate<=idle; end default:mainstate<=idle; endcase end

//scl------------

//sda____-----

42

南通大学毕业设计(论文)

task shiftout; begin case(outstate) d7:begin if(!scl) begin sda_reg<=shift[7];sda_link<=1'b1;outstate<=d6;end else outstate<=d7;end d6:begin if(!scl) begin sda_reg<=shift[6];outstate<=d5;end else outstate<=d6;end d5:begin if(!scl) begin sda_reg<=shift[5];outstate<=d4;end else outstate<=d5;end d4:begin if(!scl) begin sda_reg<=shift[4];outstate<=d3;end else outstate<=d4;end d3:begin if(!scl) begin sda_reg<=shift[3];outstate<=d2;end else outstate<=d3;end d2:begin if(!scl) begin sda_reg<=shift[2];outstate<=d1;end else outstate<=d2;end d1:begin if(!scl) begin sda_reg<=shift[1];outstate<=d0;end else outstate<=d1;end d0:begin if(!scl) begin sda_reg<=shift[0];outstate<=release_sda;end else outstate<=d0; end release_sda:begin if(!scl) begin sda_link<=1'b0;outstate<=d7;sf<=1'b1;end else outstate<=release_sda;end default:outstate<=d7; endcase end endtask

task shiftin; begin case(instate) sda7:if(scl) begin shift[7]<=sda; instate<=sda6;end else instate<=sda7; sda6:if(scl) begin shift[6]<=sda; instate<=sda5;end else instate<=sda6; sda5:if(scl) begin shift[5]<=sda; instate<=sda4;end else instate<=sda5; sda4:if(scl) begin shift[4]<=sda; instate<=sda3;end else instate<=sda4; sda3:if(scl) begin shift[3]<=sda; instate<=sda2;end else instate<=sda3; sda2:if(scl) begin shift[2]<=sda; instate<=sda1;end else instate<=sda2; sda1:if(scl) begin shift[1]<=sda; instate<=sda0;end else instate<=sda1; sda0:if(scl) begin shift[0]<=sda; instate<=transmit_unack;end else instate<=sda0; transmit_unack:if(!scl) begin dataout<=shift; sda_reg<=1'b1; sda_link<=1'b1; sf<=1'b1; instate<=sda7; end else instate<=transmit_unack; default:instate<=sda7; endcase
43

南通大学毕业设计(论文)

end endtask endmodule

显示数据的段码转化模块代码: module hex_seg ( data, hex0, hex1 ); input [7:0]data; output [6:0]hex0,hex1; reg [6:0]hex0,hex1; always @(data[3:0]) case(data[3:0]) 4'h0:hex0<=7'b1000000; 4'h1:hex0<=7'b1111001; 4'h2:hex0<=7'b0100100; 4'h3:hex0<=7'b0110000; 4'h4:hex0<=7'b0011001; 4'h5:hex0<=7'b0010010; 4'h6:hex0<=7'b0000010; 4'h7:hex0<=7'b1111000; 4'h8:hex0<=7'b0000000; 4'h9:hex0<=7'b0010000; 4'hA:hex0<=7'b0001000; 4'hb:hex0<=7'b0000011; 4'hc:hex0<=7'b1000110; 4'hd:hex0<=7'b0100001; 4'he:hex0<=7'b0000110; 4'hf:hex0<=7'b0001110; default:hex0<=7'b0000000; endcase always @(data[7:4]) case(data[7:4]) 4'h0:hex1<=7'b1000000; 4'h1:hex1<=7'b1111001; 4'h2:hex1<=7'b0100100; 4'h3:hex1<=7'b0110000; 4'h4:hex1<=7'b0011001; 4'h5:hex1<=7'b0010010; 4'h6:hex1<=7'b0000010;
44

南通大学毕业设计(论文)

4'h7:hex1<=7'b1111000; 4'h8:hex1<=7'b0000000; 4'h9:hex1<=7'b0010000; 4'hA:hex1<=7'b0001000; 4'hb:hex1<=7'b0000011; 4'hc:hex1<=7'b1000110; 4'hd:hex1<=7'b0100001; 4'he:hex1<=7'b0000110; 4'hf:hex1<=7'b0001110; default:hex1<=7'b0000000; endcase endmodule EEPROM 行为模块代码: `timescale 1us/1ns `define timeslice 5 module eeprom(scl,sda); input scl; //串行时钟线 inout sda; //串行数据线 reg out_flag; //sda 数据输出的控制信号 reg [7:0] memory[2047:0]; reg [10:0] address; reg [7:0] memory_buf; reg [7:0] sda_buf; //sda 数据输出寄存器 reg [7:0] shift; //sda 数据输入寄存器 reg [7:0] addr_byte; //eeprom 存储单元地址寄存器 reg [7:0] ctrl_byte; //控制字寄存器 reg [1:0] state; //状态寄存器 integer i; //------------------------------------------------------parameter r7=8'b10101111,w7=8'b10101110, //main7 r6=8'b10101101,w6=8'b10101100, //main6 r5=8'b10101001,w5=8'b10101010, //main5 r4=8'b10101111,w4=8'b10101000, //main4 r3=8'b10100111,w3=8'b10100110, //main3 r2=8'b10100101,w2=8'b10100100, //main2 r1=8'b10100011,w1=8'b10100010, //main1 r0=8'b10100001,w0=8'b10100000; //main0 //--------------------------------------------------------assign sda=(out_flag==1)? sda_buf[7]:1'bz; //----------------寄存器和存储器初始化-------------------------initial begin addr_byte=0; ctrl_byte=0; out_flag=0;
45

南通大学毕业设计(论文)

sda_buf=0; state=2'b00; memory_buf=0; address=0; shift=0; for (i=0;i<=2047;i=i+1) memory[i]=0; end //----------------启动信号----------always @(negedge sda) if(scl==1) begin state =state +1; if(state==2'b11) disable write_to_eeprom; end //-----------主状态机-------------always @(posedge sda) if (scl==1) stop_w_r; else begin casex(state) 2'b01:begin read_in; if(ctrl_byte==w7||ctrl_byte==w6||ctrl_byte==w5 ||ctrl_byte==w4||ctrl_byte==w3||ctrl_byte==w2 ||ctrl_byte==w1||ctrl_byte==w0) begin state=2'b10; write_to_eeprom;//写操作 end else state =2'b00; end 2'b11:read_from_eeprom; //读操作 default:state =2'b00; endcase end //主状态机结束 //--------------操作停止------------------task stop_w_r; begin state =2'b00; //状态返回为初始状态 addr_byte=0;
46

南通大学毕业设计(论文)

ctrl_byte=0; out_flag=0; sda_buf=0; end endtask //-------------------读进控制字和存储单元地址-------------task read_in; begin shift_in(ctrl_byte); shift_in(addr_byte); end endtask //------------eeprom 的写操作----------task write_to_eeprom; begin shift_in(memory_buf); address={ctrl_byte[3:1],addr_byte}; memory[address]=memory_buf; $display("eeprom------memory[%0h]=%0h",address,memory[address]); state=2'b00; end endtask //------------------eeprom 的读操作-----------task read_from_eeprom; begin shift_in(ctrl_byte); if(ctrl_byte==r7||ctrl_byte==r6||ctrl_byte==r5 ||ctrl_byte==r4||ctrl_byte==r3||ctrl_byte==r2 ||ctrl_byte==r1||ctrl_byte==r0) begin address={ctrl_byte[3:1],addr_byte}; sda_buf=memory[address]; shift_out; state=2'b00; end end endtask //-------sda 数据线上数据存入寄存器,数据在 scl 的高电平有效-----------task shift_in; output [7:0]shift; begin @(posedge scl)shift[7]=sda; @(posedge scl)shift[6]=sda; @(posedge scl)shift[5]=sda;
47

南通大学毕业设计(论文)

@(posedge scl)shift[4]=sda; @(posedge scl)shift[3]=sda; @(posedge scl)shift[2]=sda; @(posedge scl)shift[1]=sda; @(posedge scl)shift[0]=sda; @(negedge scl) begin # (`timeslice/2); out_flag=1; sda_buf=0; end @(negedge scl) begin # (`timeslice/2); out_flag=0; end end endtask //-------eeprom 存储器中的数据通过 sda 数据线输出,数据在 scl 低电平时变化----task shift_out; begin out_flag=1; for (i=6;i>=0;i=i-1) begin @(negedge scl); # (`timeslice/2); sda_buf=sda_buf<<1; end //@(negedge scl) #100 sda_buf[7]=1;//非应答信号输出 @(negedge scl) # (`timeslice/2) out_flag=0; end endtask endmodule 测试模块顶层代码: `timescale 1 ns/ 1 ps `include "./eeprom.vt" module I2C_TOP_TEST(); reg CLOCK_50; reg RD; reg RESET; reg WR; reg [14:0]ADDR; reg [7:0]DATA;

48

南通大学毕业设计(论文)

wire ACK; wire SCL; wire SDA; wire [7:0]DATAOUT; I2C_TOP i1 ( .ACK(ACK), .CLOCK_50(CLOCK_50), .ADDR(ADDR), .DATA(DATA), .RD(RD), .RESET(RESET), .SCL(SCL), .SDA(SDA), .WR(WR), .DATAOUT(DATAOUT) );

eeprom i2( .scl(SCL), .sda(SDA) );

initial begin CLOCK_50=1; RESET=1; WR=1; RD=1; #200 RESET=0; #200 RESET=1; DATA=8’h12; ADDR=15'b1010000_00000000; #400 WR=0; #400 WR=1; @(posedge ACK); ADDR=15'b1010000_00000000; #400 RD=0; #400 RD=1; @(posedge ACK); DATA=8’h34; ADDR=15'b1010000_00000001;
49

南通大学毕业设计(论文)

#400 WR=0; #400 WR=1; @(posedge ACK); ADDR=15'b1010000_00000001; #400 RD=0; #400 RD=1; end always # 10 CLOCK_50=~CLOCK_50; endmodule

50


相关文章:
(带有源代码)基于FPGA的模拟I2C接口设计与实现_图文
(带有源代码)基于FPGA的模拟I2C接口设计与实现_信息与通信_工程科技_专业资料。...内置集成电路总线)总线是一种由 PHILIPS 公 司开发的两线式串行总线,用于连接...
基于FPGA的模拟IIC接口设计与实现
I2C 总线是 Philips 公司推出的双向两线串行通讯标准,具有接口线 少、通讯效率...所以每个电路和模块都 2 基于 FPGA 的模拟 I2C 接口设计与实现 有唯一的地址,...
I2C总线接口电路设计
FPGA 与 I C 总线器件接口电路设计利用 FPGA 模拟 I2C 总线协议对 I2C 总线...I2C 总线协议 I2C 总线的两根通信线,一根是串行数据线 SDA,另一根是串行时钟线...
基于FPGA视频采集中的I2C总线设计与实现
基于FPGA 视频采集中的 I2C 总线设计与实现时间:2010...它是一 种简单、双向二线制同步串行总线硬件接口。...了设计数字控制电路时所遇到的许多接口问题, 大大...
基于FPGA的I2C接口程序实现课程设计 精品_图文
基于FPGA的I2C接口程序实现课程设计 精品_工学_高等...1.2 课题的主要工作 作为一款经典的串行通讯总线, ...QuartusⅡ软件对每一个模块进行编译生成单个电路模块...
基于FPGA的I2C接口程序实现课程设计_图文
基于FPGA的I2C接口程序实现课程设计_工学_高等教育_...1.2 课题的主要工作 作为一款经典的串行通讯总线,...QuartusⅡ软件对每一个模块进行编译生成单个电路模块...
基于FPGA的I2C接口程序实现课程设计1 精品_图文
基于FPGA的I2C接口程序实现课程设计1 精品_工学_...1.2 课题的主要工作 作为一款经典的串行通讯总线, ...QuartusⅡ软件对每一个模块进行编译生成单个电路模块...
I2C总线接口及其应用
I2C 总线接口及其应用一、I2C 总线介绍: ---由于大规模集成电路技术的发展, ...因此,采用串行总线大大简化了系统硬件设计。PHILIPS 公司早在十几 年就前推出了...
基于FPGA的I2C总线通信验证
基于FPGA的I2C总线通信验证_信息与通信_工程科技_...串行接口组成, 即 SCL 串行时总钟 线和 SDA 串行...不仅可以防止毛刺引起状态转移, 而且还可以提高电路的...
(强烈推荐)基于FPGA的I2C接口程序实现毕业论文
郑州轻工业学院 可编程数字系统设计 题 目 基于 FPGA 的 I2C 接口程序实现 吕...1.2 课题的主要工作 作为一款经典的串行通讯总线, IIC 总线接口 IP 核已被...
更多相关标签: