原创 基于FPGA的IIC接口设计

2008-8-27 20:45 9030 11 19 分类: FPGA/CPLD

基于FPGAIIC接口设计<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


       这个设计做的比较痛苦,前前后后利用业余时间调试了应该是不下一个星期了。咬咬牙挺过来了,伴随着成功的喜悦而来的,更多的是自己在调试verilog代码过程中对HDL语言更深的认识和感悟。


       其实对于IIC通信协议自己早已是牢记在心,就是C语言的单片机读写AT24C02也是做过的。但是现在要做的是用硬件语言去读写AT24C02,可就不像软件驱动一样容易了。


       开始的时候我总是趋向于独立思考,结合协议来完成verilog的初稿,然后调试,不行就得参考别人的代码,反反复复琢磨修改,直到成功。第一次程序完成显然不会成功,参考代码,做修改,但是又不愿意照抄别人的代码,毕竟每个人的思路是不一样的,而且不管是硬件语言软件语言,一千个人可以有一千种的编程方式。当然了,话说回来,有些公认的经典的套路那还是应该尽量借鉴。关于这个IIC的程序我参考了两个程序代码风格截然不同,当然我的思路和他们的也不太一样,但最终的结果是一样的——读写EEPROM


       做得最困惑的一段莫过于功能仿真出来的时序和标准协议几乎是一模一样(和参考代码仿真的结果也是一模一样),但是下载仍然无法成功通过验证。然后想说一下这个后仿真(也就是布局布线后仿真),其实这个我想说的问题之前好像也有所涉及,有时下载到板子上明明可以正确无误的运行的程序在后仿真时的波形图里却乱得一塌糊涂,我就怀疑这个布局布线后仿真到底有什么用,既然他和下载后的实际情况相差悬殊那做这个后仿又有什么意义呢?带着这个困惑我在edacn.bbs上发帖了,当晚就有回帖道:我一般不做后仿,但是综合后的每一条warning我都不放过。这句话给了我很大启示,确实我该把更多的精力放在解决综合后的warning上,于是问题慢慢的就浮出水面了。那条警告显然是告诉我那个always语句里的敏感变量表不完全,这是个很值得探讨的问题,为什么呢?我想起来了在哪本书上看过关于敏感变量表不完全的问题,这是个应该尽量避免的情况,因为如果你试图想通过增加或者减少敏感变量来控制这个always的执行情况那么你就大错特错了。在仿真时也许结果似乎大多会和你预想的一样,但是下载到板子以后确实另一番景象,你认为不触发的变量其实都会触发的。就是说即使你每写全敏感变量表,最终下载后硬件执行起来也许会是以一个完全的敏感变量表在执行,这样只能得到一个你意想不到的结果了。所以要么把敏感变量表写全,要么采用时序逻辑设计,我的组合逻辑里涉及的敏感变量太多了如果综合考虑以后设计难度加大,所以只能是改成时序逻辑设计了。这算是这个实验下来的两大感悟吧,当然调试过程中还有很多细节上的问题要注意,这个只有每个人在实践中自己慢慢体会。


       老规矩,感慨完发图发程序:


       24C02写一个字节的仿真时序图:(蓝线表示高阻态,说明sda口此时作为输入口)


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


点击看大图


 


       24C02任意指定地址读一个字节的仿真时序图:(sda口连续的10高阻脉冲表示两个应答输入和一个字节8bit的输入数据)



 点击看大图


代码打包上传:


                         rar


       实现功能是往指定地址写一个数据,然后读出这个数据,再把这个数据的低4位表现在4LED上。


 

PARTNER CONTENT

文章评论8条评论)

登录后参与讨论

用户1374706 2011-8-19 15:43

特权老师,连续读写怎么写更加方便呢,如果读10个地址的一直将状态机写下去太麻烦了啊,有没有好的方法啊?

huotingtu_505472073 2010-11-5 00:56

支持 哈哈

用户1584993 2010-11-1 15:04

航航哥继续加油啊!

用户248364 2010-7-18 22:52

综合后状态机怎么不对呢

ilove314_323192455 2010-3-24 16:08

读写方式请参看AT24CXX的datasheet,testbench的设计IIC从机可以自己设置一些数组进行少量数据的存储。

用户270790 2010-3-24 10:52

我想请教下如果要连续读写EEPROM16次,是不是从ADD2开始循环16次?还有在testbench中如何填写eeprom中的地址和数据?

用户170449 2008-9-11 16:06

确实是ad芯片毫无反应 写入地址字后AD芯片根本没有从sda线上返回低电平的应答信号 按照你的思路把一个scl周期细分为5000份,这样难道还会有时钟延时的问题么?

用户170449 2008-8-31 14:55

晕 我光注意你的程序了 仔细看了你的总结,受益匪浅啊。以后就常驻你的blog咯

ilove314_323192455 2008-8-31 09:31

呵呵,谢谢你的支持 先说第一点吧,always@(cnt or negedge rst_n)这个语句是不合法的,就是说无法综合的,你可以试试。要么你用电平触发要么你用边沿触发。而我的代码主要是在做时序逻辑,组合逻辑(以电平触发为主)用的少。你说的地方是在状态机那一部分吗?如果是,那么用cnt和rst_n的电平做敏感变量是一个不完全的敏感变量表,出现的问题我上面的总结里说了,具体你可以再看看。 第二个问题确实如你所言,因为做的比较仓促,我省了应答位的控制,其实做的通信是最简单的读写所以没有太认真的按协议规定来做,如果你感兴趣可以做的更规范些

用户170449 2008-8-31 09:07

太感谢你了! 这个程序对我启发很大! 有几个地方我不太明白: 1.在程序的第99行 是否应将always@(posedge clk or negedge rst_n)改为always@(cnt or negedge rst_n)呢?否则因为cnt=3持续的clk周期数远大于8,在发出一位数据之后就因为num>7而跳出循环输出值这begin-end了。在ADD2,ADD3,DATA中也是如此 2.根据I2C协议在STOP前应该有个非应答输出吧,就是把sda拉高,但在你的程序里没找到 我是新手,另外开发板前几天被我弄坏了在维修中所以没法把你的程序验证一下,有错误的地方请多多指教!
相关推荐阅读
特权ilove314 2016-06-30 21:16
例说FPGA连载6:FPGA开发所需的技能
例说FPGA连载6:FPGA开发所需的技能 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   前面的文字已经做了很多铺垫,相信读...
特权ilove314 2016-06-28 21:09
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-28 21:05
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-26 22:11
例说FPGA连载4:FPGA语言与厂商介绍
例说FPGA连载4:FPGA语言与厂商介绍 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   Verilog与VHDL 说到FP...
特权ilove314 2016-06-23 21:26
例说FPGA连载3:FPGA与其它主流芯片的比较
例说FPGA连载3:FPGA与其它主流芯片的比较 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   FPGA、ASIC和ASSP...
特权ilove314 2016-06-21 20:32
例说FPGA连载2:FPGA是什么
例说FPGA连载2:FPGA是什么 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   2015年伊始,Intel欲出资百亿美金收...
EE直播间
更多
我要评论
8
11
关闭 站长推荐上一条 /3 下一条