【日记】SRAM的读取操作
首先,想记录一下,以前对于inout引脚的概念就是网页上被转载很多次的标准版:
于是,非常愚笨的我,每次使用时都要定义一个类似link_data的寄存器,然后再对寄存器赋值。这可真是不会举一反三,比如这几天sram的程序中有这么一句:
assign sram_dq = (state == `wr_ready || state == `wr_delay) ? fifo1_dq_out : 8'hzz;
这样就不需要定义类似link_data的寄存器,而且很简洁。
下面是这几天我和哥们王奇一起做的sram读写实验的代码,或者截图,(其实我们是在练习SDRAM的操作时,做不来SDRAM,于是先拿SRAM撒气的,结果我被气着了。。。)我们就是想把菜鸟学习的点滴记录下来,让更菜的童鞋们有个阶段性的参考,想练习sram的使用时,可以参考我们的程序,省的网页上别人的程序复杂得花很大功夫看会。
1.感谢王奇(中北大学学生),我们一起开始做,一起读sram的英文datasheet,一起扣时序问题,他却比我早很多时间就已经做出来了,我在此期间因为做不出来,都被烦死了,最终还是在他的帮助下,修改好了时序才做出来。他自己的博客上面也有它的程序和实验过程。这里我写我的实验过程。
2.我的几个模块:
看上图,应该很清楚了,练习sram的使用之前,我还从来没用过FIFO,所以又练习了好多天的FIFO使用(没办法,我脑子不好),串口通信也没做过(虽然是学单片机的时候就应该会的,我当时懒,也没学),又专门写了串口的程序。期间磕磕绊绊,也就过来了。
3.这次实验的关键就是SRAM的读写程序,虽然是英文手册,其实最重要的就是引脚图、时间表、时序图。其他的看看也行。
看,最重要的就是不要将状态机写的复杂,写的过程就只有3个时钟周期,不需要写的太多时钟周期。地址给出的同时也要给出数据。读sram的时候,给出地址后,应在下一个时钟上升沿的时候写入第二个FIFO。读的过程也只有3个时钟周期。
4.在写状态机的时候,我就是受到了教科书上面的影响,上来就扒下来那个所谓经典的“current_state”、“next_state”的三段论状态机模型。结果,我感觉完全不适合这次的练习使用。我还是用了新的写法(参考哥们的)。具体来说,就是第一段的always块,仅仅定义了状态的相互转换,基本没有涉及到状态之外的变量。第二段大量使用assign语句,这样就避免的“posedge clk”和“<=”的约束。而且这种状态机的写法真的是很简单易懂啊。。。。
5.附上中心控制模块和串口模块的程序: