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

标签:
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端口不能综合,在顶层中控制双向端口的三态,分别给输入输出模块。