加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

FPGA双向端口调用外部SRAM注意三态门

(2015-10-07 19:39:29)
标签:

fpga_modelsim学习1

分类: FPGA学习

FPGA跟外部sram存储器相互通信,写入数据然后读出来,在这上面花了太多的时间和精力。现在就将这曲折的弯路记录下来,以后多学习。

外接sram存储器的数据端口和地址端口都只有一个,读写都是通过控制使能来实现的。FPGA跟外部存储器相互交换数据时,为了节省端口资源,调用了FPGA的INOUT端口,FPGA的双向端口就是必须要掌握的。

所使用的sram的型号是IS61WV102416BBLL,高速cmos结构,16M字节(bit)sram配置成了16位(bits)1024K字(words)ram

存储器引脚定义及功能:



http://s16/bmiddle/002pcoHFzy6W1nwT13F8f&690



http://s15/bmiddle/002pcoHFzy6W1nx3y349e&690

读时序:

http://s13/bmiddle/002pcoHFzy6W1nxhWCU3c&690

写时序:

http://s13/bmiddle/002pcoHFzy6W1nyaJ7mac&690

真值表:

http://s6/bmiddle/002pcoHFzy6W1nylIlTd5&690


在刚开始学习做的时候,非常注重芯片的控制时序,写的使能WE是上升沿和读的使能OE都按照时序图写的上升沿。可是尝试了很多次,能写进去,读不出来。因为我的代码是先写后读,程序烧进去以后,再讲代码改成只能读的时候,读出的数据没有问题。开始一直困惑,一直不知道问题出在什么地方。查资料找代码,都是Verilog的代码,自己写进去还是不行。


后来请教别人,似乎是自己没有注意双向端口的三态,后来专门查双向端口的资料,原来双向端口有个高阻态,我没有考虑这个,而是给存储器写入数据的时候写,读的时候直接读。

在网上的博客里终于找到了答案。



双向端口的硬件示意图:

http://s10/mw690/002pcoHFzy6W1olYNuxd9&690

z=0 ,上面输出的管子开通,此时数据可以从上面的管子中输出,这时双向端口就作为输出口;z=1 ,上面的管子被置为高阻态,数据不能从上面的管子输出,此时数据只可以从下面的管子由外向内输入,这时的双向端口是输入口。


Verilog语言例化一个简单的双向端口:

http://s2/bmiddle/002pcoHFzy6W1ouNuAV01&690

三态门选通信号z:input z;


z=1 ,把三态门置为高阻态,这时dinout 作为输入口用;z=0 ,开通三态门,这时dinout 作为输出口用。


三态门控制语句为: assign dinout=(!z)?din_reg:8'bz;


在三态门的控制中要注意高阻态,代码如下:

http://s13/bmiddle/002pcoHFzy6W1qjqffu5c&690


http://s12/bmiddle/002pcoHFzy6W1qbviFt0b&690
这样以后,

Signaltap 的结果为:

http://s13/bmiddle/002pcoHFzy6W1qzQtT65c&690

由图可知,数据存进去也可以读出来,但是尚有毛刺待解决。



心得:


多学习,遇到问题先要搞清楚问题出在什么地方,然后再去解决。


学习别人的东西,先要看清楚别人的优点,千万不可盲目崇拜。


Verilog在做底层驱动比VHDL有优势。


http://www/uc/myshow/blog/misc/gif/E___6743EN00SIGG.gifhttp://blog.sina.com.cn/s/blog_66c807290101d1nd.html

http://www/uc/myshow/blog/misc/gif/E___6743EN00SIGG.gifhttp://blog.csdn.net/lg2lh/article/details/7334423

注:双向端口只能放在顶层,例化模块里边的inout端口不能综合,在顶层中控制双向端口的三态,分别给输入输出模块。



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有