求助:关于FIFO的输出端重复读取数据的问题。
wrclk=2MHz,
rdclk=50MHz,
目的:FIFO作为ADC的缓存器,将ADC采集的数据经过输入端din,从而将输入数据转换到另一个时钟域。
问题:由于读时钟比读时钟快25倍,导致输出端dout重复输出同一个数25次,比如输入为1,输出就会出现25个1.请问如何解决这个问题?
这会有什么问题么?你只读一次又不是读25次,输出一直是1又没有关系 本帖最后由 lcw_swust 于 2014-7-29 09:39 编辑
为什么读那么快?
让rdclk的平均频率为2MHz就行了。
一般FIFO至少会有两个标志引脚,一个是空标志,一个是满标志,用于指示FIFO数据状态。
(有些FIFO会还有半满标志)
如果空标志有效,说明FIFO内没数据了,那就不能读了。 发现一个数字用户,围观 lcw_swust 发表于 2014-7-29 09:36
为什么读那么快?
让rdclk的平均频率为2MHz就行了。
一般FIFO至少会有两个标志引脚,一个是空标志,一个是 ...
但因为采集的数据用于后续算法的计算,速度越快越好,所以频率才这么高 yuloong 发表于 2014-7-29 09:56
但因为采集的数据用于后续算法的计算,速度越快越好,所以频率才这么高 ...
wrclk=2MHz,每us写入2字节
rdclk=50MHz,每us读取50字节
就是说,1us里写入了2个字节,但要读取50字节,这多读出的来48字节数据从哪来?
楼主怎么想的? lcw_swust 发表于 2014-7-29 10:02 wrclk=2MHz,每us写入2字节 rdclk=50MHz,每us读取50字节 就是说,1us里写入了2个字节,但要读取50字节, ...
数字用户+大字体,看图片文件说明。还是让lz自己考虑他的问题吧。 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次的问题。 yuloong 发表于 2014-7-29 10:31
这50字节是同一个数,也可以这样理解,写时钟为2MHz,周期为500ns,那么,FIFO输出口数据保持时间是500ns ...
即然楼主明白这个问题,那楼主想怎么解决?
想解决什么问题?
我认为简单的方法是改变“后续算法”
按楼主的逻辑,明明知道1+1=2,确想问如何让1+1=3,有点混乱啊。 wye11083 发表于 2014-7-29 09:37
发现一个数字用户,围观
如何看出是数字用户? lcw_swust 发表于 2014-7-29 10:47
即然楼主明白这个问题,那楼主想怎么解决?
想解决什么问题?
我认为简单的方法是改变“后续算法”
我的问题是:现在重复读同一个数25次,能不能用什么方法只读一次? yuloong 发表于 2014-7-29 10:57
我的问题是:现在重复读同一个数25次,能不能用什么方法只读一次?
rdclk从哪来?
当FIFO空标志有效时,关断rdclk即可 RUANJI 发表于 2014-7-29 10:51 如何看出是数字用户?
图片描述是数字软件小助手截图。对数字实在是太恶心,没办法。 lcw_swust 发表于 2014-7-29 11:02
rdclk从哪来?
当FIFO空标志有效时,关断rdclk即可
通过PLL输出一时钟给rdclk 本帖最后由 lcw_swust 于 2014-7-29 11:22 编辑
yuloong 发表于 2014-7-29 11:13
通过PLL输出一时钟给rdclk
后续算法怎么知道来了一个字节的数据?通过rdclk?
后续是由FPGA处理还是单片机处理? yuloong 发表于 2014-7-29 10:57
我的问题是:现在重复读同一个数25次,能不能用什么方法只读一次?
还是不明白LZ的重复读同一个数是什么意思,是读写间隔内dout口会保持的意思吗?如果读时钟那么快的话早就读空了。
如果LZ的本意是想在一个rdclk输出一个采集到的数据的话建议采用双FIFO,而且读写时钟都要差不多才行。 lcw_swust 发表于 2014-7-29 11:21
后续算法怎么知道来了一个字节的数据?通过rdclk?
后续是由FPGA处理还是单片机处理? ...
后续算法的时钟和rdclk是同一时钟,,用fpga执行算法 yuloong 发表于 2014-7-29 11:55
后续算法的时钟和rdclk是同一时钟,,用fpga执行算法
那就相当简单了,用wrclk代替rdclk就行了。FIFO都省了。 后续算法必须要加上判断fifo的empty的逻辑. putty 发表于 2014-7-29 13:03
后续算法必须要加上判断fifo的empty的逻辑.
已经加了,当empty==1时,不读,empty==0时,读数据,
想问的是:由于读时钟大于写时钟,造成多次读同一个数据,这是正常现象?不是的话,有什么方法可以避免吗? yuloong 发表于 2014-7-29 14:12
已经加了,当empty==1时,不读,empty==0时,读数据,
想问的是:由于读时钟大于写时钟,造成多次读同一 ...
你写的慢,读得快读同一地址当然是同一数据啊,时钟一直再走啊亲。
你要读一个很简单,IP加入读使能信号控制就行了 加一个读使能就可以了,但是最好是满了读,一次性读完。像这样子: 楼主还没了解什么叫FIFO
不是你想的这样
凡事不要自己乱想,不要意淫
找到文档手册,好好看看什么叫FIFO yuloong 发表于 2014-7-29 14:12
已经加了,当empty==1时,不读,empty==0时,读数据,
想问的是:由于读时钟大于写时钟,造成多次读同一 ...
empty信号应该是与读时钟同步的,一旦读一次后,立刻无效.
看你的描述,empty是跟写时钟同步的,那么肯定会有问题.好好看看fifo模块的各种配置参数吧.
页:
[1]