Avalon总线burst_read_master使用经历


最近在调试burst_read_master读sdram的时候遇到了一个问题,大概是现在水平太差,才后知后觉的遇上这个问题,因为网上搜索没有碰到同样问题的,废话少说直接说事。

一、涉及类容:

  avalon总线,sdram control,burst_read_master,sdram;

二、结构图

 

 

三、简述

quartus II的这个sdram control不支持突发读写,而我的sdram是支持突发读写的,这一点一定要分清楚。还有就是burst_read_master这个是avalon总线里面的连续读(也叫突发读吧),这个的效率比latency_aware_read_master的效率要高很多,原因就是burst_read_master给一次地址可以读多个(可设置的突发长度)数据,latency_aware_read_master给一个地址读取一个数据效率相对较低,同理burst_write_master也是比write_master的效率高很多。

四、问题点

在使用突发时,首地址连续读出两次对应地址的值,直接上图,说可能说不清楚。备注:向sdram 0-639事先写入值0-639,突发长度设置为8,设置读取总长度640。

 

 

 理论上在第一次读有效产生后,读的是地址0-7的数据,maste_readdata输出0-7八个有效数据,master_adress会加8然后读8-15地址的数,对应值输出值8-15.实际是在第一次读有效后master_adress没有加8,导致maste_readdata在第二次输出的值还是0-7,后面地址正常累加,输出的值也符合预期,实际最后多出了八个数,fifo中有648个数。多出的数据是地址0-7读了两次的那几个数。

五、原因

反复查看burst_read_master文件,对比avalon总线协议:

一开始以为是burst_read_master里面逻辑问题,查看代码发现逻辑正常,经过一段时间思考,发现有可能是master_waitrequest==0的时候,设备在下一个时钟上升沿没有正常的获取到这个变化。导致这次master_adress没有累加。最后想到avalon总线上的时钟我给的是100MHZ,而控制control_go的时钟是24MHZ,在burst_read_master中持续了两个周期,导致第一个master_waitrequest==0的时候,control_go还是高电平,address没有累加。

六、总结

从这次调试中发现,时钟真的很关键,要小心应用,希望为后面同样遇到问题的你提供一个参考(菜鸡的第一次分享,欢迎吐槽)。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM