用Verilog HDL实现I2C总线功能

发布者:书香墨意最新更新时间:2012-05-05 来源: dzsc关键字:I2C总线  FPGA  Verilog  时序 手机看文章 扫描二维码
随时随地手机看文章

开发FPGA时,利用EDA工具设计芯片实现系统功能已经成为支撑电子设计的通用平台,并逐步向支持系统级的设计方向发展。在软件设计过程中,越来越强调模块化设计。I2C总线是Philips公司推出的双向两线串行通讯标准,具有接口线少、通讯效率高等特点。把I2C总线设计成相应的模块,有利于相关FPCA的开发。 目前有一些介绍相关开发的资料,但都是利用VHDL语言或AHDL语言实现的。本文给出利用Verilog HDL语言设计的I2C总线模块。

1 I2C总线概述

I2C总线系统由两根总线即SCL(串行时钟)线和SDA(串行数据)线构成。这种总线可以设计成很多种通讯配置,但本文只讨论主从系统的应用。主器件控制总线通讯,开始/结束传送、发送信息并产生I2C系统时钟。在写操作过程中,从器件一旦被主控器件寻址,就执行特定的相应功能。在读操作过程中,主控器件从从器件那里获得数据。在整个主从传送过程中,所有的事件都通过主控器件的SCL时钟线达到同步。连到总线上的器件的接口形式必须是漏极开路或集电极开路输出状态。通过上拉电阻,使得两根总线在空闲的状态下都为高电平状态。因此I2C总线上具有线与功能,即总线上的所有器件都达到高电子状态时,I2C总线才能达到高电平状态,从而使总线上的高速器件和慢速器件工作同步。

在I2C协议中,从器件地址是一个唯一的7位地址。接下来是一个读写方向标志位,读状态是高电平、写状态是低电子。



2 I2C模块的设计与实现

根据I2C协议中传输过程的特点,I2C模块可以划分为字节发送模块、字节接收模块、开始条件模块、停止条件模块。其中,字节发送模块、字节接收模块和停止条件模块为基本模块。在开始条件模块中,因为需要发送从器件地址,所以要调用字节发送模块。

下面给出用Verilog HDL语言实现字节发送模块的关键程序。相关变量的声明在此略去。程序在Max+PlusII环境下编译、调试、仿真。

assign en_sdao=tempen_sdao;// 设置 SDA 三态输出使能

assign send_byte_over=tempsend_byte_over;

assign NO_ACK=tempNO_ACK;

assign sdao=tempsda;

assign sclo=tempscl;

always@(posedge send_byte_clk)

begin

case(send_byte_zt)

sendbit 1:

begin

if(send_byte_num==0)

begin

shiftdata[7:0]=indata[7:0];

end

shiftdata=shiftdata<<1;

tempsda=shiftdata[8];

tempscl=1; // 置 SCL 为高电平

send_byte_zt=delay_1;

send_byte_num=send_byte_num+1;

end

delay_1: // 延时三个周期

begin

if(delay_counter>=2)

begin

send_byte_zt=sendbit2;

delay_counter=0;

end

else

begin

delay_counter=delay_counter+1;

send_byte_zt=send_byte_zt;

end

end [page]

sendbit2:

begin

tempsc1=0; //SCL 置零

send_byte_zt=delay_2;

end

delay_2: // 延时三个周期

begin

if(delay_counter>=2)

begin

send_byte_zt=sendbit3;

delay_counter=0;

end

else

begin

delay_counter=delay_counter+1;

send_byte_zt=send_byte_zt;

end

end

sendbit3: // 判断是否字节中所有位都发送完毕

begin

if(send_byte_num<=8)

begin

send_byte_zt=sendbit1;

end

else

begin

send_byte_zt=ForACK1;

send_byte_num=0;

end

end

ForACK1:

begin

tempsda=1; // 释放数据线,等待应答信号

send_byte_zt=delay_ACK;

end

delay_ACK: // 延时

begin

if(delay_counter>=3)

begin

send_byte_zt=ForACK2;

delay_counter=0;

end

else

begin

delay_counter=delay_counter+1;

send_byte_zt=send_byte_zt;

tempscl=1;

end

end

ForACK2:

begin

send_byte_zt=AckYESNO;

tempen_sdao=0; // 输出 SDA 使能信号,控制 sdao 和 sdai

end

AckYESN

begin

if(sdai) // 如果应答信号 sdai 为1, NO_ACK 置1

begin

tempNO_ACK=1; // 设置未应答标志信号

end

tempsc1=0; // 终止应答位

send_byte_zt=Finish_delay;

end

Finish_delay: // 延时

begin

if(delay_counter>=2)

begin

tempsend_byte_over=1;

send_byte_zt=FinishACK1;

delay_counter=0;

end [page]

else

begin

delay_counter=delay_counter+1 ;

send_byte_zt=send_byte_zt;

end

end

FinishACK1:

begin

send_byte_zt=sendbit1;

send_byte_num=0;

end

default:

begin

send_byte_zt=sendbit1;

send_byte_num=0;

end

endcase

end



程序中sdao、sclo为输出信号,sdai为应答信号,en_sdao是对sdao和sdai进行切换的信号。I2C总线具有SDA和SCL两根信号线,所以在整个模块设计中,把sdao/sclo和sdai/scli作为两组信号。当需要向外部SDA信号线上输出信息时,sdao连到SDA信号线上;当需要从外部SDA信号线上读入信息时,置sdao成高阻态,sdai连到SDA信号线上。en_sdao信号作为这一过程的切换信号。在程序中定义了一些状态信号:NO_ACK、send_byte_over。其中,NO_ACK信号判断从器件是否对发送的信号给予了应答。send_byte_over信号判断字节是否传输完毕。这些信号可以传递给上一层设计模块,以控制程序的流程。为了使I2C总线能够有效地通讯,必须考虑信号的建立和保持时间,所以程序中设置了相应的延时部分。另外,在以clk为触发信号的过程模块中,定义send_byte_clk信号为时钟信号的两倍频信号,并加入字节发送模块使能信号start_send_byte控制模块工作于篇幅所限,略去该过程模块。

字节发送模块的仿真测试结果如图1所示。

根据I2C总线标准,利用Verilog HDL很容易实现字节接收模块、开始条件模块、停止条件模块这三个模块。图2是数据发送过程的仿真测试结果。从器件的7位地址为101011,向从器件发送的数据为00010111。aensclo和aensdao分别是sclo/scli和sdao/sdai的切换信号。

图3是数据接收过程的仿真测试结果。从器件的7位地址为0011001,从器件发送的数据为11111111。ensclo和ensdao分别是sclo/scli和sdao/sdai的切换信号。



将图2和图3所模拟的I2C总线时序与I2C总线协议中相关要求进行比较,满足I2C总线的时序要求。

对各个模块进行多层次处理,形成I2C总线模块。

以该I2C总线模块为基础,编写FPGA与AT24C01A(ATMEL公司生产的E2PROM)的通讯程序。然后把相关程序下载到EPF10Kl0LC84-3中,与AT24C01A进行实际通讯实验,效果良好。

关键字:I2C总线  FPGA  Verilog  时序 引用地址:用Verilog HDL实现I2C总线功能

上一篇:电力系统通信的音转接口设计
下一篇:用FPGA实现1553B总线接口中的曼码编解码器

推荐阅读最新更新时间:2024-05-02 22:02

莱迪思软件工具的主要优势
在电子行业,上市时间至关重要。本文介绍了莱迪思Propel™、Diamond™和Radiant™软件工具如何帮助客户缩短产品上市时间。 如今的电子行业竞争十分激烈。在各类市场和应用的消费和商业产品中,电子系统比以往任何时候都更加普遍。对硬件灵活性日益增长的需求让情况更加复杂。随着产品设计历经各种迭代,硬件可重新编程的特性变得非常有价值。 随着使用场景和器件的快速发展,其底层的技术也必须跟上步伐,对于意识到这一点的设计人员而言,适应性至关重要。随着创新步伐不断加快,工程师必须在设计阶段就考虑适应性的问题,便于产品在部署后更新,并确保设计持续发挥价值。这些行业格局让FPGA大受欢迎。作为低功耗可编程器件的领先供应商,莱迪
[嵌入式]
莱迪思软件工具的主要优势
利用FPGA实现多路话音/数据复接设备
1.引言   随着现代通信向着多业务方向发展,为了节省信道资源、降低调制解调设备的复杂度,数据复接设备得到了更充分的利用。它能将多路不同类型的数据流复接成一路高速数据流,通过信道传输,在收端分接出发端对应的数据流,以实现多业务双向通信。   这里利用了XILINX公司的VIRTEX-Ⅱ PRO系列FPGA实现了数据复接、数据分接及帧同步过程。之所以选用FPGA完成设计功能,是由于数据复接、分接涉及大量的时序过程,FPGA综合工具应用了广泛的时序调整与流水处理技术以改善时序电路性能。巧妙地应用流水处理技术,可以实现输入输出端口之间寄存器的移动和均衡实现逻辑的分隔,并且不会对原有设计引入额外的处理等待延迟,可以实现高性能设计
[嵌入式]
Cyclone V SoC FPGA硬核处理器系统简介
    SoC FPGA使用宽带互联干线链接,在FPGA架构中集成了基于ARM的硬核处理器系统(HPS),包括处理器、外设和存储器接口。Cyclone V SoC FPGA在一个基于ARM的用户可定制芯片系统(SoC)中集成了分立处理器、FPGA和数字信号处理(DSP)功能,帮助您降低了系统功耗、系统成本,减小了电路板面积,提高了系统性能。SoC FPGA同时实现了硬核知识产权(IP)的性能和低功耗特性以及可编程逻辑的灵活性。 结构图 HPS 特性 (1)800-MHz,双核ARM® Cortex™-A9 MPCore™处理器 (2)每个处理器内核包括: 32 KB的L1指令高速缓存,32 KB的L1数据高
[嵌入式]
TI FPGA应用电源简介
  为现场可编程门阵列 (FPGA) 设计电源系统可不是件容易的工作。FPGA是高度可配置的半导体器件,这种器件在大量应用和终端市场中使用。常见示例包括通信、汽车、工业、医疗、视频和国防等应用。由于它们的高度可配置性,可以在它们周围放置不同的组件,形成最终系统设计。虽然可能会有数不尽的应用和系统,但是所有设计的一个共同特性就是它们全都需要电源。   通常需要几个电压轨为FPGA供电。根据应用的不同,主输入电源可以采用背板电源、隔离电源、非隔离电源,甚至是电池供电的方式。这些主输入通常生成一个中间DC电压来为FPGA的主电压轨供电。这些中间电压通常为5V或12V的DC电压。表1和表2中列出了FPGA的某些典型电压轨、电压和容限值。
[电源管理]
TI <font color='red'>FPGA</font>应用电源简介
高云半导体低功耗μSOC FPGA蓝牙模块已通过韩国认证
广东高云半导体科技股份有限公司(如下简称:高云半导体)的GW1NRF-4 µSoC FPGA BLE模块获得韩国蓝牙认证,从而使得开发人员能够轻松快捷地完成产品开发和系统集成。 高云半导体是迄今为止唯一一家提供带有集成的蓝牙低功耗无线收发器的FPGA供应商。 此FPGA芯片为GW1NRF-4,采用小面积6x6mm QFN封装,提供4.6k LUT,32位功耗优化的ARC处理器和低功耗蓝牙低功耗模块。此外,高云半导体还提供一个19x20mm的小型PCB模块,该模块集成了GW1NRF-4 IC、无源器件、振荡器、天线和其他组件。根据韩国《无线电波法》第58-2条第2款,该模块已通过韩国国家无线电研究局的认证,适用于包括韩
[嵌入式]
高云半导体低功耗μSOC <font color='red'>FPGA</font>蓝牙模块已通过韩国认证
一种基于ARM和FPGA的嵌入式高速图像采集存储系统设计与实现
  现代化生产和科学研究对图像采集系统要求日益提高。传统图像采集系统大都是基于PC机上,而在一些特殊的场合,尤其是在实时性要求较高时,普通的PC机显然无法满足应用要求。它主要包括图像采集模块、图像处理模块以及图像存储模块等。    1 系统结构及工作原理   本系统的结构模型,如图1所示。图像采集模块负责采集原始图像,并将原始图像数据送给FPGA,采用了可编程视频输入处理器SAA7113H。一帧图像采集完成后,ARM将图像数据通过FPGA取出,进行必要的处理,并形成图片文件存到CF卡中,本系统选用了Philips公司的LPC2214。   图像采集芯片将原始图像数据传到FPGA,FPGA将图像原始数据暂存于SRAMl中,
[单片机]
一种基于ARM和<font color='red'>FPGA</font>的嵌入式高速图像采集存储系统设计与实现
示波器原来有这个秘密?你知道吗?
背景: 示波器是我们在物理试验、电路硬件调试、智能硬件开发等领域都能见到的一种仪器,就像是医生的听诊器,作为硬件研发工程师都要用的溜溜的。那么,里面到底是怎么样的一种构造呢?比较好奇的玩家可能已经想把实验室的示波器给拆开看看了,今天小编来满足一下比较好奇的小伙伴们,我们来一起看一下一款数字荧光示波器的内部构造。 今天拆的是Uni-T Ultra Phosphor UPO2104CS型号的示波器,如图.1所示,我们打开后竟然在示波器了发现了Xilinx Spartan-6 FPGA。是不是瞬间感觉自己也能做一台示波器出来,同时好奇这FPGA在示波器中的作用是什么?接着往下看细节,此示波器中的Spartan-6 LX45 FP
[嵌入式]
利用Xilinx FPGA和存储器接口生成器简化存储器接口
FPGA 设计人员在满足关键时序余量的同时力争实现更高性能,在这种情况下,存储器接口的设计是一个一向构成艰难而耗时的挑战。Xilinx FPGA 提供 I/O 模块和逻辑资源,从而使接口设计变得更简单、更可靠。尽管如此,I/O 模块以及额外的逻辑还是需要由设计人员在源 RTL 代码中配置、验证、执行,并正确连接到其余的 FPGA 上,经过仔细仿真,然后在硬件中验证,以确保存储器接口系统的可靠性。 本白皮书讨论各种存储器接口控制器设计所面临的挑战和 Xilinx 的解决方案,同时也说明如何使用 Xilinx软件工具和经过硬件验证的参考设计来为您自己的应用(从低成本的 DDR SDRAM 应用到像 667 Mb/sDDR2 SD
[嵌入式]
利用Xilinx <font color='red'>FPGA</font>和存储器接口生成器简化存储器接口
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved