摘 要: 根据单片机i2c串行扩展的特点,在eda软件maxplusii的环境下,利用ahdl语言,建立ip核。此设计利用状态机实现,在给出设计的同时详细说明ip核的建立过程,并下载到芯片通过硬件试验验证。
关键词: 可编程逻辑器件 i2c串行扩展 ip核
由于cpld数字设计结构化的趋势,将出现针对cpld不同层次的ip(intellectual property)核。各个ip核可重复利用,可大大提高设计能力和效率。国外各大公司都推出了专门的ip核,我国也迫切需要发展自己的ip核。本文针对i2c的主方式串行扩展通信的特点,详细给出设计过程和结果。
1 ip核简介
ip核是指:将一些在数字电路中常用但比较复杂的功能块,如fir滤波器、sdram控制器、pci接口等等设计成可修改参数的模块,让其它用户可以直接调用这些模块,以避免重复劳动。随着cpld/fpga的规模越来越大,设计越来越复杂,使用ip核是一个发展趋势。许多公司推荐使用现成的或经过测试的宏功能模块、ip核,用来增强已有的hdl的设计方法。当在进行复杂系统设计的时侯,这些宏功能模块、ip核无疑将大大地减少设计风险及缩短开发周期。使用这些宏功能模块、ip核,就会将更多的时间和精力放在改善及提高系统级的产品方面,而不需要重新开发现成的宏功能模块、ip核。我国ip核库的建设已相当迫切,它是集成电路产业发展的一个重要目标。
2 i2c串行通信特点简介
philips公司推出的i2c软、硬件协议十分巧妙,在单主方式的i2c总线系统中,总线上只有一个单片机,其余都是带i2c总线的外围器件。由于总线上只有一个单片机成为主节点,单片系统永远占据了总线,不会出现竞争,主节点不必有自己的节点地址。只要每个外围器件有自己的器件地址,两根i/o口线scl(时钟线)和sda(数据线)就可以虚拟i2c总线接口。i2c总线上的数据传送如图 1所示。总线上传送的每一帧数据均为1个字节。启动总线后,要求每传送1个字节后,对方回应一个应答位。在发送时,首先发送最高位。每次传送开始有起始信号,结束时有停止信号。在总线传送完1个字节后,可以通过对时钟线的控制,使传送暂停,这时可在应答信号后使scl变低电平,控制总线暂停。 当主节点要求总线暂停时亦可采用同样的方法。图1是cpld向外围i2c器件发送01010011 和01001001这两个数据的情况。
3 在maxplusii环境下i2c串行扩展ip核的建立
maxplusii是美国altera公司用于cpld的eda软件,内部有许多常用的宏单元,如计数器、四则运算、各类逻辑门乃至rom、ram等。这些宏单元内具体的参数都可以由用户来自行设定,这就是上面提到的ip核形式。它避免了重复劳动,提高了效率。以下将要设计的是下位机的ip核。
maxplusii的ahdl(altera hard ware description language)是altera公司开发的完全集成于maxplusii中的一种模块化高级语言,特别适合于描述复杂的组合逻辑、组运算、状态机和真值表。本文利用ahdl,直接生成ip核。
设计的最终目标是生成如图 2所示的symbol。通过输入数据来达到控制sda和scl的目的,将信号按要求的时序传送给i2c器件。
设计思路是利用状态机实现时序。主要包括输入数据锁存、起始、数据传输、停止等状态机。通过状态机,在每一状态下确定下一状态sda和scl是高电平或者低电平,通过这种方式实现了i2c所需要的每一种时序。由于使用的是ahdl,这种状态机实现起来非常方便,程序简洁明了。由于篇幅限制,仅介绍数据传输的状态机。状态图如图3所示。
以下程序中,cmd_reg2为发送允许暂存位;sh_reg[]为数据锁存,通过左移,最高位数据sh_reg7为当前将发送数据,存入sda_tmp 。通过图 3对照程序,可以看到发送一个利用状态机数据位的详细过程。程序清单如下:
if cmd_reg2 then --若发送允许,则将sh_reg7作为当前发送位
sda_tmp = sh_reg7;
else
sda_tmp = vcc;
end if;
st.clk = sysclk;
st.ena = baudgen;
case st is --控制传输8位数据的状态机
when t0 =>
if cmd_reg2 or cmd_reg3 then
sda = sda_tmp; --开始传送数据
scl = gnd;
st = t1;
else
st = t0;
end if;
when t1 =>
scl = vcc;
sda = sda_tmp;
st = t1a;
when t1a =>
scl = vcc;
sda = sda_tmp;
st = t2;
when t2 =>
sh_reg[7..1] = sh_reg[6..0]; --数据左移,取高位
sh_reg[0] = gnd;
sh_reg[].ena = exu;
scl = gnd;
sda = sda_tmp;
if bit[] == 7 then --若8位传完,则发应答位;否则继续
st = t3;
else
st = t0;
end if;
when t3 => --发应答位
sda =gnd;
st = t4;
when t4 =>
sda = gnd;
scl = vcc;
st = t4a;
when t4a =>
sda = gnd;
scl = vcc;
st = t5;
when t5 =>
scl = gnd;
st = t6;
when t6 =>
sda = gnd;
finished = vcc;
st = t0;
end case;
bit[] = bit[] + 1; ――--传输完一位,已传输位数加一
图 4为仿真结果。起始信号给出以后,传输2个8位数据:每个数据后跟一个应答位,在输送完第一个数据要求的情况下,暂停一段时间,再输送第二个数据;2个数据输完以后,主机发出停止输送要求,即给出停止信号。这些信号,在sda和scl上完全符合i2c的时序要求。要使总线传输速率达到改进后的规范,即400 kb/s,因为根据以上叙述,每发送1位数据需要4个时钟周期,所以所给的时钟为1600 khz。图4中execute为执行信号,即它为高电平时,输入数据din[7..0]有效;exu为发送使能信号,只有当它为高电平时,方可输送串行数据到外围器件;start为开始控制信号,用于发生起始信号;stop用于告知总线数据传输结束,发生停止信号。
仿真以后,通过编程电缆将生成的pof文件用isp(在系统编程)方式下载到fpga板epm7128slc84-6,i/o口sda和scl挂上拉电阻,外接两片i2c器件saa1064(led显示i2c串入并出芯片)进行测试,结果cpld利用该i2c的ip核,工作正常,可以按照要求显示。
参考文献
1 altera. altera digital library 2000
2 何立民. 单片机高级教程. 北京:北京航空航天大学出版社, 2000
3 赵曙光. 可编程逻辑器件原理、开发与应用. 西安电子科技大学出版社, 2000
4 saa1064 product specification philps.
沪硅产业募资50亿元,用于300mm高端硅片研发
TE发布全新单/多通道硅静电放电(SESD)保护器件
常见的嵌入式程序加载方式介绍
控制器的常见种类有哪些
《“5G+北斗”的意义、路径和愿景》的主题报告
I2C器件接口IP核的CPLD设计
诺基亚6台湾版今日开卖了
医用动态电源管理模块设计方案
英飞凌与捷德携手批量供货符合CIPURSE开放式标准的非接触式智能卡
【底盘大PK】奥迪A6L/凯迪拉克XTS
太阳能路灯设计中超级电容的应用
华为Mate 20到底蕴含着怎样的黑科技
基于COM Express Mini和Qseven设计系统
“All in AI”的百度是怎样度过“水逆期”的
美军“敏捷作战部署”(ACE)信息技术研究分析
未来网络借助Wi-Fi6和5G融合,连接体验将完全无缝
指令周期的四个阶段详解
关于堆栈最经典的讲解
东芝推出采用新型封装的车载40V N沟道功率MOSFET,有助于汽车设备实现高散热和小型化
浅谈微软Azure Cobalt 100内核关键技术