yuloong 发表于 2014-7-29 09:04:50

求助:关于FIFO的输出端重复读取数据的问题。


wrclk=2MHz,
rdclk=50MHz,
目的:FIFO作为ADC的缓存器,将ADC采集的数据经过输入端din,从而将输入数据转换到另一个时钟域。
问题:由于读时钟比读时钟快25倍,导致输出端dout重复输出同一个数25次,比如输入为1,输出就会出现25个1.请问如何解决这个问题?

DepravedLucien 发表于 2014-7-29 09:34:36

这会有什么问题么?你只读一次又不是读25次,输出一直是1又没有关系

lcw_swust 发表于 2014-7-29 09:36:42

本帖最后由 lcw_swust 于 2014-7-29 09:39 编辑

为什么读那么快?
让rdclk的平均频率为2MHz就行了。
一般FIFO至少会有两个标志引脚,一个是空标志,一个是满标志,用于指示FIFO数据状态。
(有些FIFO会还有半满标志)
如果空标志有效,说明FIFO内没数据了,那就不能读了。

wye11083 发表于 2014-7-29 09:37:07

发现一个数字用户,围观

yuloong 发表于 2014-7-29 09:56:56

lcw_swust 发表于 2014-7-29 09:36
为什么读那么快?
让rdclk的平均频率为2MHz就行了。
一般FIFO至少会有两个标志引脚,一个是空标志,一个是 ...

但因为采集的数据用于后续算法的计算,速度越快越好,所以频率才这么高

lcw_swust 发表于 2014-7-29 10:02:21

yuloong 发表于 2014-7-29 09:56
但因为采集的数据用于后续算法的计算,速度越快越好,所以频率才这么高 ...

wrclk=2MHz,每us写入2字节
rdclk=50MHz,每us读取50字节
就是说,1us里写入了2个字节,但要读取50字节,这多读出的来48字节数据从哪来?
楼主怎么想的?

wye11083 发表于 2014-7-29 10:15:39

lcw_swust 发表于 2014-7-29 10:02 wrclk=2MHz,每us写入2字节 rdclk=50MHz,每us读取50字节 就是说,1us里写入了2个字节,但要读取50字节, ...

数字用户+大字体,看图片文件说明。还是让lz自己考虑他的问题吧。

yuloong 发表于 2014-7-29 10:31:52

lcw_swust 发表于 2014-7-29 10:02
wrclk=2MHz,每us写入2字节
rdclk=50MHz,每us读取50字节
就是说,1us里写入了2个字节,但要读取50字节, ...

这50字节是同一个数,也可以这样理解,写时钟为2MHz,周期为500ns,那么,FIFO输出口数据保持时间是500ns,又读时钟为50MHz,即每读一个数时间为20ns,500/20=25,所以会出现重复读一个数25次的问题。

lcw_swust 发表于 2014-7-29 10:47:19

yuloong 发表于 2014-7-29 10:31
这50字节是同一个数,也可以这样理解,写时钟为2MHz,周期为500ns,那么,FIFO输出口数据保持时间是500ns ...

即然楼主明白这个问题,那楼主想怎么解决?
想解决什么问题?
我认为简单的方法是改变“后续算法”

按楼主的逻辑,明明知道1+1=2,确想问如何让1+1=3,有点混乱啊。

RUANJI 发表于 2014-7-29 10:51:36

wye11083 发表于 2014-7-29 09:37
发现一个数字用户,围观

如何看出是数字用户?

yuloong 发表于 2014-7-29 10:57:14

lcw_swust 发表于 2014-7-29 10:47
即然楼主明白这个问题,那楼主想怎么解决?
想解决什么问题?
我认为简单的方法是改变“后续算法”


我的问题是:现在重复读同一个数25次,能不能用什么方法只读一次?

lcw_swust 发表于 2014-7-29 11:02:38

yuloong 发表于 2014-7-29 10:57
我的问题是:现在重复读同一个数25次,能不能用什么方法只读一次?

rdclk从哪来?
当FIFO空标志有效时,关断rdclk即可

wye11083 发表于 2014-7-29 11:12:04

RUANJI 发表于 2014-7-29 10:51 如何看出是数字用户?

图片描述是数字软件小助手截图。对数字实在是太恶心,没办法。

yuloong 发表于 2014-7-29 11:13:24

lcw_swust 发表于 2014-7-29 11:02
rdclk从哪来?
当FIFO空标志有效时,关断rdclk即可

通过PLL输出一时钟给rdclk

lcw_swust 发表于 2014-7-29 11:21:15

本帖最后由 lcw_swust 于 2014-7-29 11:22 编辑

yuloong 发表于 2014-7-29 11:13
通过PLL输出一时钟给rdclk

后续算法怎么知道来了一个字节的数据?通过rdclk?
后续是由FPGA处理还是单片机处理?

sungngai 发表于 2014-7-29 11:25:08

yuloong 发表于 2014-7-29 10:57
我的问题是:现在重复读同一个数25次,能不能用什么方法只读一次?

还是不明白LZ的重复读同一个数是什么意思,是读写间隔内dout口会保持的意思吗?如果读时钟那么快的话早就读空了。
如果LZ的本意是想在一个rdclk输出一个采集到的数据的话建议采用双FIFO,而且读写时钟都要差不多才行。

yuloong 发表于 2014-7-29 11:55:33

lcw_swust 发表于 2014-7-29 11:21
后续算法怎么知道来了一个字节的数据?通过rdclk?
后续是由FPGA处理还是单片机处理? ...

后续算法的时钟和rdclk是同一时钟,,用fpga执行算法

lcw_swust 发表于 2014-7-29 11:57:18

yuloong 发表于 2014-7-29 11:55
后续算法的时钟和rdclk是同一时钟,,用fpga执行算法

那就相当简单了,用wrclk代替rdclk就行了。FIFO都省了。

putty 发表于 2014-7-29 13:03:36

后续算法必须要加上判断fifo的empty的逻辑.

yuloong 发表于 2014-7-29 14:12:11

putty 发表于 2014-7-29 13:03
后续算法必须要加上判断fifo的empty的逻辑.

已经加了,当empty==1时,不读,empty==0时,读数据,
想问的是:由于读时钟大于写时钟,造成多次读同一个数据,这是正常现象?不是的话,有什么方法可以避免吗?

aikimi7 发表于 2014-7-29 17:44:04

yuloong 发表于 2014-7-29 14:12
已经加了,当empty==1时,不读,empty==0时,读数据,
想问的是:由于读时钟大于写时钟,造成多次读同一 ...

你写的慢,读得快读同一地址当然是同一数据啊,时钟一直再走啊亲。
你要读一个很简单,IP加入读使能信号控制就行了

jiayue12450 发表于 2014-7-29 17:52:39

加一个读使能就可以了,但是最好是满了读,一次性读完。像这样子:

蓝色风暴@FPGA 发表于 2014-7-29 20:28:50

楼主还没了解什么叫FIFO
不是你想的这样
凡事不要自己乱想,不要意淫
找到文档手册,好好看看什么叫FIFO

putty 发表于 2014-7-29 23:03:47

yuloong 发表于 2014-7-29 14:12
已经加了,当empty==1时,不读,empty==0时,读数据,
想问的是:由于读时钟大于写时钟,造成多次读同一 ...

empty信号应该是与读时钟同步的,一旦读一次后,立刻无效.
看你的描述,empty是跟写时钟同步的,那么肯定会有问题.好好看看fifo模块的各种配置参数吧.
页: [1]
查看完整版本: 求助:关于FIFO的输出端重复读取数据的问题。