OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7141|回复: 6

跨时钟域问题 fifo

[复制链接]

29

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2016-8-10
在线时间
51 小时
发表于 2017-2-8 10:07:12 | 显示全部楼层 |阅读模式
1金钱
如果现在有两个时钟,即假设100MHZ APB总线时钟和波特率为115200的串口要建立连接的话,应该是使用fifo吧,那么APB总线一端的快时钟读fifo里面的数据,时钟很慢的串口往fifo里面写数据,是不是肯定会出现fifo为空的情况,这时候需要等待一段时间,直到fifo给APB总线发送了可读信号,APB总线才能够读取数据。那么问题是:APB执行过程只有两个周期,只要APB总线发生读操作,fifo很快就会空了,那么fifo要如何工作,才能最大的优化uart和APB总线之间的连接呢?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

62

帖子

0

精华

高级会员

Rank: 4

积分
705
金钱
705
注册时间
2016-6-19
在线时间
104 小时
发表于 2017-2-8 10:29:05 | 显示全部楼层
本帖最后由 Yyan 于 2017-2-8 10:35 编辑

对于设计上来说,FIFO你永远不能在满的时候去写,或者是空的时候去读,这个在设计上都是不对的。在FIFO快要空的时候,你就不能再去读了。你的提问也没有提到数据率是如何的,写进去和读出去的速率,一个100M的时钟,还有一个是多少M?
举个例子,如果读写是2倍的速率,你就把FIFO深度设大1倍即可。主要是看你的吞吐率。
跨时钟域的问题,建议用2级FIFO缓存,前级异步FIFO只做跨时钟域,然后直接读出来再存到同步FIFO。

回复

使用道具 举报

29

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2016-8-10
在线时间
51 小时
 楼主| 发表于 2017-2-9 14:38:42 | 显示全部楼层
Yyan 发表于 2017-2-8 10:29
对于设计上来说,FIFO你永远不能在满的时候去写,或者是空的时候去读,这个在设计上都是不对的。在FIFO快要 ...

如果是APB总线挂载一个串口的话 这个fifo要怎么设计? APB时钟100MHZ,串口的时钟是由APB时钟分频出来的,假如串口波特率115200的话,fifo有用吗? 那么他的工作流程是什么样的?为什么说读写是2倍的速率,你就把FIFO深度设大1倍即可? 假如读比写快两倍,那么写入1个数据时候,就读出了2个数据了,如果数据流很大的话,肯定在一定时间后读赶上了写的位置了,那么有没有办法让它不会赶上写的位置呢?
回复

使用道具 举报

0

主题

62

帖子

0

精华

高级会员

Rank: 4

积分
705
金钱
705
注册时间
2016-6-19
在线时间
104 小时
发表于 2017-2-9 17:07:11 | 显示全部楼层
你的设计是“慢时钟往FIFO里面写,快时钟读出对吗?”那也就是说你这个FIFO永远不会写满嘛。
那对于写来说,你就直接写.   assign  afifo_wr_en = (~afifo_full); 只要不满你就写。
对于读来说,不空你就读啊。
回复

使用道具 举报

29

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2016-8-10
在线时间
51 小时
 楼主| 发表于 2017-2-10 20:23:28 | 显示全部楼层
Yyan 发表于 2017-2-9 17:07
你的设计是“慢时钟往FIFO里面写,快时钟读出对吗?”那也就是说你这个FIFO永远不会写满嘛。
那对于写来说 ...

我知道,我的问题是有没有可能存在一种办法是fifo不会因为读的快而导致为空,而是能够使得APB总线不用等待fifo的写入呢?
回复

使用道具 举报

1

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2012-6-11
在线时间
8 小时
发表于 2017-2-10 21:39:42 | 显示全部楼层
ok407371195 发表于 2017-2-10 20:23
我知道,我的问题是有没有可能存在一种办法是fifo不会因为读的快而导致为空,而是能够使得APB总线不用等 ...

APB总线我记得应该有仲裁吧。对于每次操作,你读取N个字时,你让读方等待FIFO直到有N个数据再去读,就不会卡APB了。否则你应该在数据没有N个时暂停传输,直到数据够了。
切记不要去等FIFO。你等不起。
回复

使用道具 举报

29

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2016-8-10
在线时间
51 小时
 楼主| 发表于 2017-2-11 13:54:02 | 显示全部楼层
wye1102 发表于 2017-2-10 21:39
APB总线我记得应该有仲裁吧。对于每次操作,你读取N个字时,你让读方等待FIFO直到有N个数据再去读,就不 ...

哦,我之前也是这样想的,但是如果这样做,会不能实现两端读和写同步的话,总觉得有点什么瑕疵。打个比方如果现在芯片只做串口接收数据,那么读的太快,总会出现APB总线等待fifo存入数据的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-7-1 06:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表