type
status
date
slug
summary
tags
category
Property
Nov 30, 2023 02:46 PM
icon
password
属性
属性 1
描述
Origin
URL
 

一、异步FIFO

1.异步FIFO的基本概念

对于异步FIFO,主要是实现不同时钟域之间的数据交互。
与同步FIFO有着明显的区别,同步FIFO是使用一个时钟,读写在同一个时钟域内。而异步FIFO使用两个时钟,读/写在不同时钟域内,这个过程就涉及了跨时钟域处理的过程,跨时钟域又会产生亚稳态问题,所以这是异步FIFO设计的一个重点,与同步FIFO一样,通过空满标志衡量存储器的使用情况,那么在异步FIFO中,空满标志产生的条件和方式是什么呢,这也是设计的重点。
notion image

2.异步FIFO的作用

  1. 为什么需要异步FIFO? 用于在不同的时钟域(clock domain)之间安全地传输数据。而同步FIFO主要是解决数据传输速率匹配问题。
  1. 同步器(synchronizer)
notion image
对于跨时钟域之间的信号传输,需要进行同步(synchronize)处理;一般来讲,我们可以采用同步器(由2~3级FF组成)对单bit的信号进行同步操作。注意,这里的打拍子是针对单bit信号而已的。
那么为什么不能用简单的同步器(synchronizer)对数据总线 ( 大于1bit)进行同步呢?下面分析一下。
notion image
问※题 :那么对于多bit信号的跨时钟域同步,可采用异步FIFO或者双口RAM。
 
异步最经典的问题:
(1)在clk0域一个稳定信号,由于designer改变了设计,在ck1域以为仍然稳定,假设是enable=1,其实是变化了的,需要用synal同步。 (2)忽略了ck的频率,打两拍采信号(不同频率是否采到信号慢的采信号可能采不到) (3)上升沿a&(~ady)下降沿(~a)&ady,沿出来之后触发信号变成电平方便检测。脉冲同步。 (4)同步一个bus,两个模块之间的data交互,要用到异步fifo。

3.异步FIFO的读/写指针

  • 写指针(write pointer)
  • ▷ 始终指向下一次将要写入的数据的地址;
  • ▷ 系统复位后(FIFO为空),写指针指向0地址;
  • ▷ 每写入一笔数据,写指针地址加1;
  • 读指针(read pointer)
  • ▷ 始终指向当前要读出的数据的地址;
  • ▷ 系统复位后(FIFO为空),读指针指向0地址;
  • ▷ 此时的数据是无效的,因为还没有数据写入,空标志有效;

4.异步FIFO空/满标志

notion image
  • 空标志(empty)
  • ▷ 情形一,复位时,两指针都为0;
  • ▷ 情形二,当读指针和写指针相等时,空标志=1;
  • 满标志(full)
  • ▷ 当写指针和读指针最高位不同,其他相等时,满标志=1;
  • ▷ 例如,写入的速度快,写指针转了一圈(wrap around),又追上了读指针;
  • 空满标志处理
    • notion image
▷ 把读、写指针都额外增加1bit,假如FIFO的深度为8,理论上指针位只需要[2:0]。为了能够正确甄别空、满,需要将指针都扩展到[3:0]。
▷ 其中额外引入的最高位[3],用于辅助甄别是否已经发生了回环(wrap around)的情形。当指针计满FIFO的深度,折回头重新开始时,最高位MSB加1,其它位清0。
▷ 如果读写指针的最高位不同,就意味着写指针速度快,并已经多完成一次回环。
▷ 如果两个指针的最高位相同,就意味着双方完成了相同次数的回环。

5.指针计数器的选择

notion image
  • 普通二进制计数器(Binary counter)
💡
1.在异步FIFO的设计中,读写两边要互相参考对方的指针,以便生成空、满标志;
💡
2.数据同步问题:> 1 bit,从一个clock domain到另一个clock domain,由于亚稳态现象的出现,会导致数据出错; 极端情形:所有的数据位都变化;
💡
3.解决办法:采用sample & hold机制,引入保持寄存器和握手机制,以确保接收端正确地采集到想要的数据,之后通知发送端,进行下一轮的数据传输;
notion image
  • 格雷码计数器(Gray code counter):每次当从一个值变化到相邻的一个值时,有且仅有一位发生变化;
由于格雷码的这种特性,我们就可以通过简单的synchronizer对指针(多位宽)进行同步操作了,而不用担心由于发生亚稳态而出现数据错误的情形;但是对于我们习惯了二进制码的风格,这种码易读性稍差;对于2的整数次幂的FIFO,采用格雷码计数器器; 接近2的整数次幂的FIFO, 采用接近2的幂次方格雷码修改实现;如果这两种都满足不了,就设计一种查找表的形式实现。所以,一般采用2的幂次方格雷码实现FIFO,会浪费一些地址空间,但可以简化控制电路;需要注意:格雷码计数器适用于地址范围空间为2的整数次幂的FIFO,例如8, 16, 32, 64…

6.二进制与格雷码相互转换

二进制到格雷码:二进制码字整体右移一位,再与原先的码字按位做异或操作。
  • 二进制转格雷码
notion image
  • 格雷码转二进制
notion image

三、Spec

(1)Function descripton

Asynchronization First in First out 通过控制两个不同时钟域的读/写操作,完成了两个时钟域之间数据的同步处理。

(2)Feature list

  1. 存储器采用宽度为16,深度为8的regs
  1. FIFO宽度、深度可配置
  1. 写时钟为3MHz,读时钟为2MHz

(3)Block Diagram

notion image
☛ 模块设计可细分为写入接口(Push Interface)、读出接口(Pop Interface)、同步器(sync)和存储介质RAM(regs_array)

(4)Interface description

Signal Name
Width
Direction
Description
1
input
write clock,2MHz
1
input
write reset signal
1
input
write enable signal
16
input
write data
1
output
full flag of regs_array
1
input
read clock,3MHz
1
input
read reset signal
1
input
read enable signal
16
input
write data
1
output
empty flag of regs_array

(5)Timing

  • Write timing
notion image
  • Read Timing
notion image

四、Design and Verification

(1)RTL

(2)Test bench

(3)Analyse

bug1:可以看到本该同步到异时钟域的格雷码写指针和格雷码读指针,却在自己的时钟域下打拍,导致后面产生的空满标志错误。
notion image
定位到读/写指针格雷码同步代码块
两处更改了对应的时钟沿触发条件

notion image
 
 
bug2:在只读情况下,写满之后,没有产生满标志。
notion image
 
 
定位到空满标志代码块
更改满标志的条件,因为在这里是比较格雷码,和原来二进制比较不同,二进制是高位取反,然后所有位相等即产生满标志。格雷码是最高位和次高位取反,然后所有位相同,即产生满标志。
notion image

五、Result

(1)Write

notion image
在只读阶段,读使能,写指针和写地址开始递增,并将data_i依次写入regs_array。在地址增加到写满了8个地址(0~7)后,写指针继续增加(回环,表示第二圈了),写地址回到第一个地址,并产生满标志。(写指针总指向将要写入的地址,前面有说)

(2)Read

 
notion image
 
在只读阶段,这个阶段regs_array已经存满,开始读出数据,读指针和读地址开始递增,当读到regs_array的第八个存储地址(0~7)后,读指针继续增加(回环,表示第二圈了),读地址回到第一个地址,并产生空标志。(读指针总指向将要读出的地址,前面有说)

(3)Write&Read

 
notion image
 
在读/写同时使能的时候,写操作依次往存储单元里面写入新数据,读操作依次往存储单元里读出数据,结果见上图。

(4)假满假空现象

 
notion image
 
由上图标号1可以知道,在满标志拉低时刻之前,其实regs_array是一个假满的状态,因为这时刻之前,已经读出了三个数据了;由上图标号2可以知道,读空的时候,产生了空标志,其实regs_array是一个假空的状态,因为这时刻之前,写操作已经写入了两个数据。
※原因:因为在格雷码指针同步的时候,格雷码指针信号在两个时钟域之间存在两个时钟周期的延时,但这并不会影响FIFO的正常工作逻辑。

异步FIFO测试点

  1. 同时读写,读写数据正确检查
  1. FIFO满标志位检查
  1. FIFO空标志位检查
  1. 写过程中发生写复位,写数据和FIFO满标志位被清空
  1. 读过程中发生读复位,读数据和读空标志位被清空
  1. 读写时钟相位相同,异步FIFO能正常工作
  1. 读写时钟相位不同,异步FIFO能正常工作
  1. 写时钟等与读时钟,异步FIFO能正常工作
  1. 写时钟快于读时钟,异步FIFO能正常工作
  1. 写时钟慢于读时种异步FIFO能正常工作
  1. 写过程中发生写复位以后,异步FIFO能继续正常工作
  1. 读过程中发生读复位以后,异步FIFO能继续正常工作
  1. FIFO满以后,继续往FIFO写数据,异步FIFO不会被卡死,数据被读走以后,异步步FIFO能继续正常工作。
异步FIFO设计:

常见问题

同步复位与异步复位原理
同步复位原理:同步复位只有在时钟沿到来时复位信号才起作用,则复位信号持续的时间应该超过一个时钟周期才能保证系统复位。
异步复位原理:异步复位只要有复位信号系统马上复位,因此异步复位抗干扰能力差,有些噪声也能使系统复位,因此有时候显得不够稳定,要想设计一个好的复位最好使用异步复位同步释放。
同步复位与异步复位的区别主要看是否有时钟信号参与。异步复位不需要时钟参与,一旦信号有效立即执行复位操作;同步信号需要时钟参与,只有有效的时钟信号出现,复位信号才有效。
一、同步复位与异步复位的特点:
同步复位:顾名思义,同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。用Verilog描述如下:
异步复位:它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。用Verilog描述如下:
二、同步复位和异步复位的优缺点分析:
1、总的来说,同步复位的优点大概有3条:
a、有利于仿真器的仿真。
b、可以使所设计的系统成为100%的同步时序电路,这便大大有利于时序分析,而且综合出来的fmax一般较高。
c、因为他只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。他的缺点也有不少,主要有以下几条:
a、复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk skew,组合逻辑路径延时,复位延时等因素。
b、由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。
2、对于异步复位来说,他的优点也有三条,都是相对应的
a、大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源。
b、设计相对简单。
c、异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。
缺点:
a、在复位信号释放(release)的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。
b、复位信号容易受到毛刺的影响。
下面我用verilog来演示下同步复位与异步复位。同步复位的verilog程序如下:
综合后的RTL级电路图如下:
notion image
异步复位的verilog程序如下:
 
综合后的RTL级电路图如下:
notion image
通过比较显然异步复位消耗的逻辑资源要少些,因此通常的设计中都采用异步复位的方式,需要进一步的学习的话,可以再研究下其它的资料。
三、总结:
所以说,一般都推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。这样就可以两全其美了。
 

项目流程

FIFO的基本概念

 
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
 

确定VO

notion image
notion image

lab1验证环境搭建

notion image
notion image

建立项目目录

notion image
notion image

在SVTB下建立interface.sv

notion image

建立fifo_top

notion image

更新验证环境

notion image

加入时钟信号和复位单元

notion image

建立clk gen

notion image
notion image
notion image

建立reset gen

notion image
notion image

更新环境

notion image
notion image

lab2 验证环境升级

notion image
notion image

建立env

notion image
notion image
notion image

更新top

notion image
notion image
notion image

实现写操作

notion image

实现读操作

notion image

lab3

建立driver

notion image
notion image
notion image

建立monitor

notion image
notion image

lab4

更新fifo_params.sv

notion image
notion image

建立genertor

notion image

修改driver

notion image
notion image

修改monitor

notion image

建立scb

notion image
notion image
notion image

更新env

notion image
notion image
notion image
notion image

lab5

理解并添加coverage

notion image
notion image

建立coverage

notion image
notion image
notion image
 
 

参考资料

参考资料

02【Verilog实战】异步FIFO设计和功能验证(附源码)_xlinxdu的博客-CSDN博客_异步fifo
脚 本: makefile 工 具:vcs 和 verdi 文 章:1. 同步FIFO的设计和功能验证(附源码)     2. Verilog的亚稳态现象和跨时钟域处理方法     博文的代码附Bug解决方法or自行下载( 完整代码 )   在写同步FIFO的时候,已经讲过FIFO的相关概念,可以参考( 点击直达 )。 对于同步FIFIO,主要是实现速率匹配,起到数据缓冲的作用。设计的关键在于array存储阵列或RAM空满标志的产生。设计的思路大概可以描述为:设置计数器elem_cnt,计数器的最小计数值为0,最大计数值,是array的最大存储深度。当写使能时,计数器计数+1,读使能时,计数器计数-1,读/写同时使能时,计数器计数值不变。当计数器的值为0时,表明此时的array没有存储数据,产生空标志;当计数值为最大存储深度值时,array存满了,此时产生满标志。详细可参考文章《 同步FIFO设计与功能验证 》   对于异步FIFO,主要是实现不同时钟域之间的数据交互。与同步FIFO有着明显的区别,同步FIFO是使用一个时钟,读写在同一个时钟域内。而异步FIFO使用两个时钟,读/写在不同时钟域内,这个过程就涉及了跨时钟域处理的过程,跨时钟域又会产生亚稳态问题,所以这是异步FIFO设计的一个重点,与同步FIFO一样,通过空满标志衡量存储器的使用情况,那么在异步FIFO中,空满标志产生的条件和方式是什么呢,这也是设计的重点。 为什么需要异步FIFO?    用于在不同的时钟域(clock domain)之间安全地传输数据。而同步FIFO主要是解决数据传输速率匹配问题。 同步器(synchronizer)   对于跨时钟域之间的信号传输,需要进行同步(synchronize)处理;一般来讲,我们可以采用同步器(由2~3级FF组成)对 单bit 的信号进行同步操作。注意,这里的打拍子是针对单bit信号而已的。 那么为什么不能用简单的同步器(synchronizer)对数据总线 ( 大于1bit)进行同步呢?下面分析一下。 问※题 :那么对于多bit信号的跨时钟域同步,可采用异步FIFO或者双口RAM。详细可参考另一篇文章《亚稳态和跨时钟域处理》。 写指针(write pointer) ▷ 始终指向下一次将要写入的数据的地址; ▷ 系统复位后(FIFO为空),写指针指向0地址; ▷ 每写入一笔数据,写指针地址加1; 读指针(read pointer) ▷ 始终指向当前要读出的数据的地址; ▷ 系统复位后(FIFO为空),读指针指向0地址; ▷ 此时的数据是无效的,因为还没有数据写入,空标志有效; 空标志(empty) ▷ 情形一,复位时,两指针都为0; ▷ 情形二,当读指针和写指针相等时,空标志=1; 满标志(full) ▷ 当写指针和读指针最高位不同,其他相等时,满标志=1; ▷ 例如,写入的速度快,写指针转了一圈(wrap around),又追上了读指针; 空满标志处理 ▷ 把读、写指针都额外增加1bit,假如FIFO的深度为8,理论上指针位只需要[2:0]。为了能够正确甄别空、满,需要将指针都扩展到[3:0]。 ▷ 其中额外引入的最高位[3],用于辅助甄别是否已经发生了回环(wrap around)的情形。当指针计满FIFO的深度,折回头重新开始时,最高位MSB加1,其它位清0。 ▷ 如果读写指针的最高位不同,就意味着写指针速度快,并已经多完成一次回环。 ▷ 如果两个指针的最高位相同,就意味着双方完成了相同次数的回环。 在异步FIFO的设计中,读写两边要互相参考对方的指针,以便生成空、满标志; 数据同步问题:> 1 bit,从一个clock domain到另一个clock domain,由于亚稳态现象的出现,会导致数据出错; 极端情形:所有的数据位都变化; 解决办法:采用sample & hold机制,引入保持寄存器和握手机制,以确保接收端正确地采集到想要的数据,之后通知发送端,进行下一轮的数据传输; 格雷码计数器(Gray code counter):每次当从一个值变化到相邻的一个值时,有且仅有一位发生变化; 由于格雷码的这种特性,我们就可以通过简单的synchronizer对指针(多位宽)进行同步操作了,而不用担心由于发生亚稳态而出现数据错误的情形; 但是对于我们习惯了二进制码的风格,这种码易读性稍差; 对于2的整数次幂的FIFO,采用格雷码计数器器; 接近2的整数次幂的FIFO ...
02【Verilog实战】异步FIFO设计和功能验证(附源码)_xlinxdu的博客-CSDN博客_异步fifo
UART模块同步FIFO的设计与验证
  • Twikoo
  • Waline
  • Giscus
  • Cusdis
  • Utterance
Conor
Conor
一个野生的技术宅
公告
type
status
date
slug
summary
tags
category
Property
Nov 25, 2023 06:32 AM
icon
password
属性
属性 1
描述
Origin
URL
🎉持续更新中🎉