今日咱们来讲的是SDRAM的架构以及规划,这也是小墨榜首次触摸架构,也谈不上给咱们讲,便是把我了解的当做一个笔记共享给咱们,我也试着做了一个SDRAM 的架构word文档,在文章的后边,喜爱的朋友能够下载下来看一下,有什么过错也请活跃纠正,究竟我也是没有教师教,也是自己探索的,不免有些不合理的当地。
一、SDRAM 作业部分
1、上电初始化
咱们先来看榜首部分,上电初始化。上电初始化咱们知道,上电之后咱们需求等候200us的稳定时,这段时刻咱们能够用一个定时器来计数,这没什么问题,然后进入的是预充电部分,这个时分,预充电的时分,sdram_cmd模块会检测此刻的初始化状况机的状况,若处于预充电状况,那么sdram_cmd模块向SDRAM发指令,详细指令sdram的datasheet里边有,发的是一个precharge,即预充电,发完指令之后,需求等候一段时刻,来保证这个指令被SDRAM捕获,这等候的时刻,特权教师用的方法我觉得很好
用一个宏界说,当计数器计数到相应的时刻后,预充电完结参数置位 即end_trp 置位,下面的用法也是相同,即当初始化状况机进入预充电状况i_pre时,计数器敞开,开端计数,计数完结,也便是预充电完毕的时分,计数器复位,这个复位的操控,能够用case句子来检测初始化状况机的状况,在相应的状况给予相应的复位与置位
接下来是8个自改写,操作和预充电相同
到了方式寄存器的装备阶段,咱们需求选定L_bank,以及SDRAM作业方式的装备,当sdram_cmd模块检测到初始化状况机抵达方式寄存器装备阶段时,咱们的给SDRAM的sdram_bank端口赋相应的值,并且设置地址总线
当初始化完毕的时分,标志位init_done置位,告知作业状况机,初始化状况机现已完毕,进入作业状况。下面是我用word做的上电初始化的状况搬运图
2、自改写
初始化完毕之后,SDRAM为了避免数据丢掉,要进行自改写,上一篇文章现已讲过了,改写2^12行需求64ms,也便是每15us改写一行,也便是咱们需求每15us发送一次自改写恳求给SDRAM作业状况机,状况机一旦检测到自改写恳求信号,就告知sdram作业模块,然后作业模块就向SDRAM发送自改写指令,即CMD_A_PEF
下面是自改写的状况搬运图
3、读写状况
初始化完毕今后,SDRAM就处于作业状况,每15us进行一次自改写,这个时分,假如想要读或写数据的话,即向作业状况机sdram_work_FSM发送读写恳求,假如是读恳求,那么作业状况机进入行有用状况,也即激活状况w_active,此刻,sdram_cmd模块会发送别有用指令,即CMD_ACTIVEA
一起,咱们需求将咱们的12位行地址送给咱们的sdram地址总线sdram_addr,然后便是一个等候时刻段,TRCD,这个时刻段里咱们是不需求做什么作业的,只需等候TRCD完毕
TRCD完毕的时分,作业状况机进入读状况,此刻,咱们需求发送列地址选中咱们的存储单元,并告知sdram_cmd模块发送读指令,这个进程是读指令和列地址一起发送的。咱们知道,读指令宣布之后,会进入潜伏期TCL。
这个状况咱们也不需求做什么,由于咱们在方式寄存器装备阶段现已将各种参数装备好了,包含什么潜伏期长,突发读写长度之类的,比及潜伏期完毕之后,SDRAM会主动进行读数据,并且读的数据长度会跟咱们之前设置的相同长,这个读数据的状况需求时刻,即咱们的作业状况机作业在w_rd状况,等候8个时钟周期之后,一切的数据都现已被送到数据总线。
这个时分咱们需求等一会,由于咱们在发送读指令的时分,A10是置1的,也便是说,每次读写完之后要主动进行预充电,然后才能够翻开新的作业行,这时,咱们的作业状况机即进入了w_rwait状况,比及预充电完毕,才完结一次读操作,回来初始状况,等候下一个恳求的到来
下面是读写状况搬运图,由于写状况仅仅没有潜伏期,写完之后有一个写回延时,其他当地与读状况相同,我就不再介绍了
二、模仿信号发生部分
咱们先来想一下咱们的要想测验咱们的SDRAM操控器是否正确,都需求什么测验参数吧
1、 首要咱们需求发送读写地址对吧,可是咱们需求有一个距离,即每隔一段时刻发送一次写地址,为什么呢?由于咱们之前在方式寄存器装备的时分,界说了突发读写的长度为8,也便是咱们发送一个地址,那么sdram会在接连的8个地址中接连写8次数,咱们假如要再发送地址,需求比及这8次地址写完之后再发送下一个地址这个延时大约为640ns,也便是计数器为什么要计到3f的原因,下一个地址的发送就需求比之前的地址大8了,比方榜首次我发送的是0地址,那,隔一段时刻之后,我就需求发送8地址了。
读地址也相同,当写地址写满了之后,让地址清零,从零地址读起即可
还有再解释一下,特权教师为什么界说22位的模仿地址,22位的模仿地址包含2位的L_BANK的地址,12位行地址和8位列地址。有人会问,为什么是行地址和列地址分隔呢,不是队伍地址共用吗?留意这儿仅仅模仿地址,到时分咱们给地址总线赋值的时分是分隔赋值的
2、然后咱们需求发生递加数据,每640ns发生8个数即可
3、在发送递加数据之前,咱们需求发送写恳求信号,这个写恳求信号是要发送到咱们接下来要讲的FIFO里边,发送写恳求之后,数据进入FIFO,留意,这儿的写恳求是发送给FIFO的,不是发送到SDRAM的,SDRAM的写恳求是由FIFO宣布去的
有人会问,写恳求有了,是不是还该有读恳求,要知道,咱们的数据是先写到FIFO里边,再有SDRAM对FIFO进行读操作,将写进FIFO的数据再送到SDRAM,而咱们从SDRAM中读回的数据,相同要写到FIFO里边,然后咱们再从FIFO里边读。是不是有人会问,这不是多此一举吗?其实不然,要知道咱们的SDRAM是作业在100M的时钟频率下,并且是有相位偏移的,对咱们FPGA来说是一个异步时钟,假如咱们不选用FIFO的方式,那很容易发生亚稳态问题,导致体系不稳定
三、数据缓存部分
1、写FIFO
我来解释一下,写入时钟,也便是咱们FPGA的时钟,50MHZ,在这个时钟频率下,咱们需求给FIFO发送写恳求和递加数据,wrusedw反映了我写入FIFO的占用量,当sdram作业状况机检测到写恳求之后(FIFO宣布的写恳求),会发生一个呼应,告知FIFO要读数据了,这个呼应作为FIFO的读信号,在100MHZ的时钟频率下,将咱们写入的数据读走,送到SDRAM数据总线上
2、读FIFO
读FIFO跟写FIFO相反,写FIFO时钟为100MHZ,在这个时钟频率下,咱们将从SDRAM中读回的数据写到FIFO里边,留意这儿咱们还用了wrusedw,来反响写FIFO的占用量,也便是咱们从SDRAM里读了多少数据,然后在50MHZ的时钟下,将从SDRAM读回的数据收集下来,送到显现模块来验证是否是递加数据,这个显现模块咱们用数码管来显现,比较便利,为了调查清楚,咱们能够在数码管显现模块,每隔1S种发送一次读FIFO恳求,这样在数码管上,会每隔1秒钟显现一个递加的数据了