用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心解决方案电子通信

基于VHDL的I2C总线控制核设计

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-10 22:25:41
为了叙述上的方便,每个命令状态在时序上划分为5个子状态(A,B,C、D、IDLE)。I2C总线时序状态转移关系如图3所示,状态划分如图4所示。在实际中为了更精确地控制时序,对命令时序进行了更细的划分。START和STOP分为7位子状态(a~f,idle),WRITE和READ分为6个子状态(a~e,idle)。这个“6”也就是为什么在公式(2)中分母上有一个“6”。

SCL在Start命令的A状态时,保持原有电平不变,而在B状态时变为高电平,这样就可以实现Restart命令。系统时钟信号eclk由时钟尺度因子分频,得到状态转移的同步时钟使能信号(eclk_en)。在eclk和eclk_en的控制下进行状态移转,最后都转移到空闲状态(IDLE),并保持最后一个状态时的信号电平。图4中标注了每个命令的关键时刻。

3 中断信号的处理机制

I2C控制核作为I2C总线的主设备,是在DSP的控制下工作的。它采用中断机制与DSP通道。当一个读写命令完成后,主设备会向DSP发出一个中断申请信号eint(上升沿有效)。在DSP的中断服务程序中,置位命令寄存器的中断响应确认位(i_ack_r='1'),使主设备清除其发出的中断申请信号(eint='0'),而i_ack_r信号将在置位命令结束后的下一个时钟上升沿自动清除。这样,可以允许主设备发出下一个中断申请。

图5

    process(nReset,eclk)

begin

if(nReset='0')then

int<='0';i_ack_r<='0';

elsif(eclk'vent and eclk='1')then

if(nce='0'andnAwe='0')then

if(core_en='1'and eadd="001")then

--写入命令寄存器

i_ack_r<=cr(7);--写入'1'

end if;

else

i_ack_r<='0'; --自动清除

end if;

int<=cmd_done_ack and ien;

end if;

Eint<=int and(not i_ack_r_;end process;命令码

4 EDA综合结果与结论

使用Xilinx ISE6.1对I2C核的VHDL描述进行综合(synthesize)和实现(implement),目标器件采用Xilinx公司的高密度系统级FPGA-Virtex系列芯片v50cs144-6。设计的总体等效门数为1844门,系统时钟的最大频率为120.758MHz。图5为使用ModelsimXE5.6a对在目标器件上布局布线后的VHDL模块进行仿真(Simulate Post-Place & Route VHDL Module)的结果。其中,edat信号上“10010000”中的“1”依次是启动和写命令;“01100001”中的“1”依次是停止、读、中断清除命令。从图中可以看出,实现了从TMS320C6000 EMIF接口到I2C总线接口的转换功能,并实现发中断申请(eint=1)和清除中断申请的功能,完成了I2C总线通信协议的启动、写、确认,读、确认、停止操作的时序。



上一页  [1] [2] 

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:23,953.13000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号