当前位置:网站首页 > 技术博客 > 正文

异步fifo设计思路



关于FIFO和异步处理我已经写过很多东西了:

这次因为保持代码手感的需要,重新写一次异步fifo。写的过程突然感觉自己成长了许多,毕业时候抠抠索索的照着教程写了好几天,到今天心里合了一下时序一个多小时就手撕代码完成,看来这几年班不是白上的啊~

整体的思路很常规,模块分为四个部分:写通路控制、读通路控制、异步单元、双口RAM。

写通路控制:负责产生ram写地址和写有效,产生wfull信号;

读通路控制:负责产生ram读地址和读有效,产生rempty信号;

异步单元:负责地址指针的跨异步处理;

双口RAM:负责存储数据;

整体结构图如下:

顶层如下:

 
  

我们来完成wctrl_path的构建,首先明确写这个模块的接口:

 
  

写时钟和写复位肯定是必须的,winc是外部的写有效。还有一个必要的输入信号是raddr_sync信号,这个信号的作用是和waddr一起产生写侧看到的fifo_cnt信号,进而得到wfull信号。那么考点1来了:为什么要在写时钟域产生wfull信号,在读时钟域产生rempty信号?

在“【异步FIFO的一些小事·1】空满判断与格雷码”这个博客中已经做过说明,简单而言就是:在写时钟域看到的读指针是有延迟的,对于wfull而言,晚一些看到有数据被读取走也不会影响数据,最多就是wfull信号晚一些撤销而已,而wfull晚撤销不会是数据被覆盖,只会影响到性能(多反压了一会),而性能的问题是可以通过计算一个合理的异步fifo深度开销进行弥补的。同理在读时钟域看到写指针也是有延迟的,因此rempty可能撤销不及时,不及时也没关系最多就是等一会反应过来再读,而不会读取错误数据。

好的,输入信号分析完成,输出信号显然有给ram的wenc和waddr,wdata直接从顶层过去不从这里过手了。还有就是刚刚说的wfull信号。

在“【芯片前端】保持代码手感——同步FIFO”里提到过,考点2:fifo中计算读写地址会用位宽扩一比特的计数器,最高比特作为标志位来判断绕圈,那么把这个模块做一下:

 
  

基于这个模块可以轻松的产生waddr,那么进一步得到wenc和wfull的逻辑就非常简单了:

 
  

注意这里的waddr还是扩充了一比特的地址,送给ram的时候要取[DEPTH -1:0],而送到跨异步模块时就直接全位宽送,因为计算fifo_cnt要用到全位宽。

和wctrl_path的思路一样,不赘述:

 
  

gary_sync_cell专门用来计数器跨异步,思路很简单:二进制输入,转格雷码打拍,跨异步打三拍,格雷码转回二进制输出。那么考点3又来了:为什么异步fifo里要用格雷码跨异步?

基于之前的积累“进阶之路——二进制与格雷码的相互转换模块设计” ,二进制转格雷码和格雷码转二进制的模块直接做:

 
  

OK,那么下一步就是对比特跨异步的问题了。下一个考点4自然就是:多比特如何跨异步?那在这里就不啰嗦了已经写过 ,欢迎指正。

要做多比特跨异步,当然要先有单比特跨异步模块:

 
  

拍数可配,默认是2拍建议配置为3拍,那么考点5:为什么现在跨异步打拍要打3拍?

基于单比特跨异步单元,我们进一步得到多比特跨异步单元:

 
  

注意千万要用目的时钟打拍啊。

ok,因此完成的gray_sync_cell的代码就有了:

 
  

用的是默认代码:

 
  

以上,完整的代码呈现。

因为主要是叙述个思路,没有做太细致的波形验证,就用auto_verification生成了个简单的验证环境,没有这个工具的请参见,工具有点些修改,最新的链接是:链接:https://pan.baidu.com/s/1CMptxDGketFHuLeNOLcV0Q,提取码:t6o8。

把所有文件放置于async_fifo目录下,键入auto_verification -f async_fifo,生成仿真环境,简单修改testbench,得到如下波形:

真的是很随意的仿了一下,如果大家发现有问题请不吝赐教~感谢~

  • 上一篇: 代码对比合并工具
  • 下一篇: autoconf命令
  • 版权声明


    相关文章:

  • 代码对比合并工具2025-07-14 08:01:03
  • left join select2025-07-14 08:01:03
  • oracle分区表的使用和查询2025-07-14 08:01:03
  • 网件4700刷openwrt2025-07-14 08:01:03
  • js clienty2025-07-14 08:01:03
  • autoconf命令2025-07-14 08:01:03
  • 什么算高并发2025-07-14 08:01:03
  • java集合大全2025-07-14 08:01:03
  • 请问安全测试是什么?2025-07-14 08:01:03
  • win系统找不到策略组2025-07-14 08:01:03