1402
上面写了英文source may assert valid。
就是在这一段,上游可以把它设置为有效。
而红色的部分是,上游不能设置为有效。
这部分为什么呢?
这部分因为ready为低电平。
我们现在还没有看到退出呢。
我们只看到左边了。
红色的部分上游是无权叫停的。
上游有权叫停的,只在下游ready以后。所以说Altera做的这种模式,是下游主动的模式。
也有一些握手做下游的被动,或者是做其它的一些模式,但是这个ST是下游主动。
下游起主导作用。虽然下游是反制的,但是下游起主导作用。
下游ready为低电平的时候,上游就得停。
当下游ready为高电平的时候,上游才有权决定走和停。
进入是4拍。
1403
下游ready置为低电平,用4拍。
4拍以后,并不意味着上游就立即停数据。
因为管道里面仍然有4拍的数据。
这四拍的数据,就从输入无效到输出无效,仍然有四拍,仍然可以走数据。
这四拍里面,在这张时序图上,第三个数据加载了。
3以后,上游仍然可以选择叫停,仍然可以在这个期间叫停2拍。
最后一拍,上游选择走,走了一个数据。
走了数据以后,再出来就过了ready了,过了就绪潜伏期了。
过了下游发出的就绪潜伏期,就应该是进入就绪潜伏期的exit了,退出了。
上游就只能停了。
所以说这个灰色的部分,是上游可以叫停的区域,红色的部分是上游不能叫停的区域。
1404
而这个反制的过程,下游是主动的,下游想走就走,想停就停。
任何时候,上游要听从下游的。
只有下游ready了,上游才可以叫停。
这是就绪潜伏期的4拍。
另外呢,这张图上说的是就绪潜伏期的0拍。
这是就绪潜伏期的1拍。
2拍。
其它的说的并不多,文件上就这几个。
实际上流的信息量很大。
1405
下面我来说一下,我们今天下午的练习。
这个练习就不用做了,因为DDR2、DDR3我们将马上来讨论。
1406
我们做最后一个,做一个双端口的FIFO,双端口就是双时钟嘛。
一个写时钟,一个读时钟。
读时钟呢,我们称之为int_clk,内部的时钟,int_clk是200M。
这个FIFO,输入端口每一拍都有数据进入。
然后我们写一个控制器。
这个控制器呢,要求FIFO每写满256个字的时候,200M,用50M的时钟写。
然后呢,用200M的时钟,监测其中的标志,要满了或者几乎满的时候,一次性地把它读出来,256。
这个FIFO建议你做512,这样的话,你不会丢失。
到256的时候,你用它的用量,这上面没有。
就出来一个flag线。
你也可以用那个almost,回头我来说一下。
就是说快满的时候,到256的时候,让它为真。
这样的话呢,控制器每256的时候,读一次FIFO。
读多少呢,读256个字。
1407
然后呢,写到RAM里面去,RAM的深度就是256,我们用静态存储器来写。
这样的话呢,在50M的过程之中,每一拍都在写。
然后呢,内部的100M,只满了256,控制器会一次性地将FIFO读出来,然后再写到RAM里面去。
如果这一切做的是正确的话,那么我们相信RAM里面的数据应该是稳定的,对不对?
因为它每一次写256都应该是相同的值。
我们在testbench激励的时候,我们在in_data端,每一拍都有一个值,或者从0到255。
然后呢,我们再看RAM,在目标接口上,RAM的256个单元应该是每一拍的数据都是稳定的。
如果是固定的,说明我们做成了。
这是一个练习。
还有一个呢,我要找一下。
1408
我这个电脑上有一段用Avalon写的一个存储器的接口,然后呢,我们用它把这个突发读、突发写的控制过程做完。
回到时序图上。
1409
我先画到白板上。
这段代码,我稍后来找到,笔记本上应该有这段代码。
我们自己写了一个Avalon MEM的模型。
然后呢,我们把这张图,就是突发写的这张时序图,当然你也可以稍微做一点变化。
但是我们下午的要求就是,如果把这张图写了四个数,data1、data2、data3、data4,按照这张时序图写进去。
:)
1410
突发写,地址,writedata,beginbursttransfer。
