展开

关键词

同步FIFO和异步FIFO

FIFO的分类根均FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟。在时钟沿来临时同时发生读写操作。 异步FIFO是指读写时钟不一致,读写时钟是互相独立的。  FIFO设计的难点 FIFO设计的难点在于怎样判断FIFO的空满状态。 为了保证数据正确的写入或读出,而不发生益处或读空的状态出现,必须保证FIFO在满的情况下,不 能进行写操作。在空的状态下不能进行读操作。怎样判断FIFO的满空就成了FIFO设计的核心问题。 1.同步FIFO之Verilog实现  同步FIFO的意思是说FIFO的读写时钟是同一个时钟,不同于异步FIFO,异步FIFO的读写时钟是完全异步的。 时钟,输入,用于同步FIFO的读和写,上升沿有效;2. 清零,输入,异步清零信号,低电平有效,该信号有效时,FIFO被清空;3.

34900

FIFO系列(一):FIFO深度计算

本系列分为以下部分:1、FIFO深度计算2、同步fifo设计3、fifo与格雷码计划分三次更新完毕,本次为FIFO深度计算。 FIFO最小深度计算背景当异步FIFO读写端口的throught-put(吞吐量)不同时,会遇到数据丢失的问题,需要考虑FIFO中的深度问题,即为满足读写流畅不卡顿(数据不丢失)时,FIFO的deepth FIFO主要是用于数据的缓存,用在读慢写快的场景下。异步FIFO读写不同频,选用的FIFO要能够在极端的情况下仍然能够保证数据的不溢出。 倘若写快读慢的场景下,写数据流是连续的,那再大的FIFO都会有写满的时候,因此无法避免数据的溢出。当写快读慢时,FIFO便可被用作系统中元件或队列。 因此FIFO的大小其实也就暗示了所需缓存数据的容量,该容量取决于读写数据的速率。据统计,系统的数据速率取决于系统的负载能力。因此为了保证FIFO的大小,需要考虑FIFO传输的最坏情况。

44130
  • 广告
    关闭

    云产品限时秒杀

    云服务器1核2G首年50元,还有多款热门云产品满足您的上云需求

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    FIFO系列(三):fifo与格雷码以及异步fifo设计

    本系列分为以下部分:1、FIFO深度计算2、同步fifo设计3、fifo与格雷码以及异步fifo设计计划分三次更新完毕,本次为本系列终结篇!本次增加异步FIFO设计,异常有趣! 格雷码的相关知识关于同步fifo的设计疑惑了半天,本以为这个代码是错的,后来自己又写了一遍,但是写到最后又觉得这个是正确的,主要是wr_cnt和rd_cnt的理解。 1、格雷码是什么英文名Grey Code,在一组数的编码中,任意的两个相邻的代码只有一位二进制数不同,即为格雷码,常用于异步操作中,比如异步fifo,读数据侧使用数据读取时钟,写数据侧使用数据写入时钟, 十进制计数容易产生毛刺,多个bit变化容易导致潜在的竞争和冒险,异步操作时使用格雷码可有效消除竞争和冒险,比如异步fifo,当发生状态跳转时,只会有一位会发生变化,可有效降低由于建立时间和保持时间导致的误差 保留二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码的其他位与次高位的求法类似,即:assign gray=(binary>>1)^(binary);4、异步fifo

    87550

    ​同步FIFO

    同步 FIFO 简介FIFO 即先进先出队列,FIFO 一般作为不同时钟域的缓冲器。FIFO 根据读和写的时钟是否为同一时钟分为同步 FIFO 和异步 FIFO 。 异步 FIFO 相比同步 FIFO 来说,设计更加复杂一点。?设计 FIFO 的时候一般需要考虑的有两点:FIFO 的大小FIFO 的大小就是指双端口 ram 的大小,这个可以根据需要来设置。 FIFO空满状态的判断FIFO 空满状态的判断通常有两种方法FIFO 中的 ram 一般是双端口 ram ,所以有独立的读写地址。 设置一个计数器,当写使能有效的时候计数器加一;当读使能有效的时候,计数器减一,将计数器与 ram 的 size 进行比较来判断 FIFO 的空满状态。 这种方法设计比较简单,但是需要额外的计数器,就会产生额外的资源,而且当 FIFO 较大时,会降低 FIFO 最终可以达到的速度。

    22530

    异步FIFO

    异步FIFO简介结构框图 image.png 如上图所示的同步模块synchronize to write clk,其作用是把读时钟域的指针rptr采集到写时钟wr_clk域,然后和写时针wptr进行比较从而产生或撤销写写满标志 写满、读空当FIFO为满或为空时,写入指针和读取指针都是相等的。但我们需要将“满”与“空”区分,当FIFO工作时,写指针在前,读指针紧跟写指针。 当FIFO为满时,写指针往前移动,返回并等于后面紧跟的读指针,这就是所谓的套圈。这个时候我们再增加1bit给读写指针,可以通过这个bit为0还是1来显示“满”或“空”。 二进制计数异步FIFO读写指针需要在数学上的操作和比较才能产生准确的空满标志位,但由于读写指针属于不同的时钟域及读写时钟相位关系的不确定性,同步模块采集另一时钟域的指针时,此指针有可能正处在跳变的过程中 跨时钟域的同步解决读时针是属于读时钟域的,写指针是属于写时钟域的,而异步FIFO的读写时钟域不同,是异步的。如果将rclk的读指针和wclk的写指针直接比较肯定是错误的,我们需要进行同步处理进行比较。

    25330

    FIFO原理

    FIFO(First Input First Output),即先进先出队列。在超市购物之后会提着我们满满的购物车来到收银台排在结账队伍的最后,眼睁睁地看着前面的客户一个个离开。 图1 先进先出队列FIFO是队列机制中最简单的,每个接口上都存在FIFO队列,表面上看FIFO队列并没有提供什么QoS(Quality of Service,服务质量)保证,甚至很多人认为FIFO严格意义上不算做一种队列技术 ,实则不然,FIFO是其它队列的基础,FIFO也会影响到衡量QoS的关键指标:报文的丢弃、延时、抖动。 先进先出(FIFO)置换算法  这是最早出现的置换算法。该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。 fifo = new FIFO(); for(int i=0; i《iter.length; i++) { fifo.trans(iter[i]); fifo.showMemoryBlock(); System.out.println

    32910

    FIFO系列(二):同步FIFO的verilog设计

    本系列分为以下部分:1、FIFO深度计算2、同步fifo设计3、fifo与格雷码4、异步fifo设计(新增)计划分三次更新完毕,本次为同步FIFO设计。 由于本次过于简单,第四次增加异步FIFO设计,异常有趣! 同步FIFO设计关于同步fifo的设计疑惑了半天,本以为这个代码是错的,后来自己又写了一遍,但是写到最后又觉得这个是正确的,主要是wr_cnt和rd_cnt的理解。 在本实例中,wr_cnt并非读写数据的计数器,不是说fifo中写入了多少个数据,而是指的写数据指针,在每次写入数据后写指针自动加一,写入16个数据后fifo写指针数值为4b1111。 没什么好讲的,异步fifo的设计才是有趣,异步fifo的设计代码在第三节格雷码更新完毕后更新。

    1.4K30

    异步FIFO设计

    本文首发于个人博客 1.设计目标设计一个参数可配置的异步FIFO,要求:FIFO深度从4开始在2的幂次方连续可配(4、8、16、......)读写时钟域相位差、频率差任意(同步器参数可配)2.参数列表 read_port.pngread_req信号拉高表示请求读数据,若此时FIFO非空(fifo_empty为低),FIFO将会将数据置于read_data上,同时拉高read_valid信号。 若在FIFO空的情况下,写操作发生,写指针的变化延迟传递到读时钟域,在传递的若干个周期内状态为“假空”“假满”和“假空”状态均不影响异步FIFO的正常工作,仅为略微降低FIFO的工作效率4.2.3.同步器同步器是一种跨时钟域数据传输的方法 5.实现细节5.1.写FIFO部分写FIFO部分包括以下几个组件:同步器:将读指针从读时钟域同步到写时钟域,使用两级同步器写指针:指示写入地址的指针,当满信号拉低且写请求拉高时加1写指针二进制转格雷码: fifo_full)5.2.读FIFO部分读FIFO部分包括以下几个组件:同步器:将写指针从写时钟域同步到读时钟域,使用两级同步器读指针:指示读取地址的指针,当空信号拉低且读请求拉高时加1读指针二进制转格雷码

    53730

    FIFO、UART、ALE解释

    FIFO存储器 FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器。   在系统设计中,以增加数据传输率、处理大量数据流、匹配具有不同传输率的系统为目的而广泛使用FIFO存储器,从而提高了系统性能。 FIFO存储器是一个先入先出的双口缓冲器,即第一个进入其内的数据第一个被移出,其中一个存储器的输入口,另一个口是存储器的输出口。对于单片FIFO来说,主要有两种结构:触发导向结构和零导向传输结构。 触发导向传输结构的FIFO是由寄存器阵列构成的,零导向传输结构的FIFO是由具有读和写地址指针的双口RAM构成UART是一种通用串行数据总线,用于异步通信。

    41230

    FIFO深度计算

    要理解数据的突发长度,首先我们来考虑一种场景,假如模块A不间断的往FIFO中写数据,模块B同样不间断的从FIFO中读数据,不同的是模块A写数据的时钟频率要大于模块B读数据的时钟频率,那么在一段时间内总是有一些数据没来得及被读走 ,如果系统一直在工作,那么那些没有被读走的数据会越累积越多,那么FIFO的深度需要是无穷大的,因此只有在突发数据传输过程中讨论FIFO深度才是有意义的。 要确定FIFO的深度,关键在于计算出在突发读写这段时间内有多少个数据没有被读走。也就是说FIFO的最小深度就等于没有被读走的数据个数。 在讨论之前我们假定模块A向FIFO写数据的时钟频率为fa,模块B从FIFO读数据的时钟频率为fb。 下面我们来推导一下FIFO深度的求解公式,假设:写时钟频率为fwr读时钟频率为frd在写时钟周期内,每m个周期内就有n个数据写入FIFO在读时钟周期内,每x个周期内可以有y个数据读出FIFO那么:首先必须满足

    42430

    ADC的FIFO功能

    这段时间项目都在使用NXP的KE系列MCU, KE02和KE06以及KEA系列的ADC都有FIFO功能,不使用FIFO功能的话,在多路采集的话,ADC会频繁进中断,这样对MCU来说是负担,所以经常需要开启 FIFO功能,这样在所有通道采集完后进一次中断。 而具体来说呢,不同系列像KE02和KE06在FIFO功能使用上有一些不同,主要是配置的寄存器有些区别,所以在写驱动时候需要特别注意。如在KE06上寄存器如下 ?而在KE02上? 如果自己来写这个驱动,如果只是对一种片子使用可以直接按照手册来配置,如果想做到通用,也可以参照SDK,甚至可以直接使用SDK,按照你自己的硬件来配置初始化,通道,时钟,是否使用FIFO,中断,转换模式等就可以使用了 在配置FIFO深度时候需要注意,如果是8级FIFO,深度就配置为7。Kinetis最大ADC的FIFO深度为8级,使用时候需要注意。跟FIFO配置相关的结构体可以参照SDK定义?

    41020

    实现交易(fifo)

    Integer.valueOf(t.get(i).split(-)); cal the buy before sell for (int j = 0; j < i; j++) { sell shares, use FIFO 联系邮箱:huyanshi2580@gmail.com更多学习笔记见个人博客——>呼延十 var gitment = new Gitment({ id: 实现交易(fifo), 可选。

    21420

    FIFO解析攻略

    FIFO是队列机制中最简单的,每个接口上只有一个FIFO队列,表面上看FIFO队列并没有提供什么QoS保证,甚至很多人认为FIFO严格意义上不算做一种队列技术,实则不然,FIFO是其它队列的基础,FIFO 03满、空标志:满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。   空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。   04FIFO分类根据FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟。在时钟沿来临时同时发生读写操作。 异步FIFO是指读写时钟不一致,读写时钟是互相独立的。05FIFO设计的难点FIFO设计的难点FIFO设计的难点FIFO设计的难点在于怎样判断FIFO的空满状态。

    16710

    异步FIFO设计

    概述前面提及到同步FIFO的设计,同步FIFO。 ----异步FIFO常见问题好的FIFO设计的基本要求是写满而不溢出,读空又不多读。 本文采用比较读写指针来判断FIFO的空满,如果FIFO的深度是n-1位线所能访问到的地址空间,那么此设计所要用的指针位宽就比实际多出一位,也就是n位,这样做有助于判断FIFO是空还是满。 空标志的产生当FIFO中的读指针赶上了写指针,也就是rd_ptr完全等于wr_ptr时,可以断定,FIFO里的数据已被读空,而且只有在两种情况下,FIFO才会为空:第一种是系统复位,读写指针全部清零;另一种情况是在 FIFO不为空时,数据读出的速率快于数据写入的速率,读地址赶上写地址时FIFO为空。

    32120

    FIFO深度计算

    由于平时我们工作中,FIFO都是直接调用IP核,对于FIFO深度选择并没有很在意,而在笔试面试过程中,经常被问及的问题之一就是如何计算FIFO深度。 缓存开大了会浪费资源,开小了会丢失数据,如何去计算最小FIFO深度是本文的重点。本文涵盖了FIFO最小深度计算所有情况:? 那么那些没有被读走的数据会越累积越多,那么FIFO的深度需要是无穷大的; 但是若写操作是连续的数据流,那么再大的FIFO都无法保证数据不溢出。 即FIFO的最小深度就等于没有被读走的数据个数。 通过上述讨论可以知道Case2的FIFO最小深度应该比场景1的FIFO最小深度45略大。

    30031

    调度模式(FIFO&FAIR)

    spark的调度模式分为两种:FIFO(先进先出)和FAIR(公平调度)。默认是FIFO,即谁先提交谁先执行,而FAIR支持在调度池中再进行分组,可以有不同的权重,根据权重、资源等来决定谁先执行。 模板如下: FAIR 1 2 FIFO 2 3 其中:name:调度池名字,可在程序中根据spark.scheduler.pool来指定使用某个调度池,未指定则使用名字为default的调度池。 一个spark应用程序包含一个TaskScheduler,一个TaskScheduler包含一个唯一的RootPool,FIFO只有一层Pool,包含TaskSetMagager,而FARI包含两层Pool 对于FIFO而言,parentPool都是RootPool,而FAIR,TaskSetMagager的parentPool都是RootPool的子Pool。 Use FAIR or FIFO instead. throw new IllegalArgumentException(msg) } }FIFO模式的算法类是FIFOSchedulingAlgorithm

    82520

    ARM(三).UART with FIFO(1)

    与蜂鸣器等相关控制与基础进行了演示这里再对嵌入式通讯过程中常用的 UART (Universal Asynchronous ReceiverTransmitter) 即 通用异步收发传输器 接口进行探究----概要----带 FIFO 的串口通讯要求使用 ARM 板 UART 的 FIFO 模式读写数据 (与电脑串口交互信息)UART 电路原理图创建项目创建项目的总体过程就是新建文件夹创建项目文件项目中添加入源代码只有以下几个方式稍微注意一下选择三星 EQU 0x50000000 ;UART 0 Line controlUCON0 EQU 0x50000004 ;UART 0 ControlUFCON0 EQU 0x50000008 ;UART 0 FIFO EQU 0x50004000 ;UART 1 Line controlUCON1 EQU 0x50004004 ;UART 1 ControlUFCON1 EQU 0x50004008 ;UART 1 FIFO EQU 0x50008000 ;UART 2 Line controlUCON2 EQU 0x50008004 ;UART 2 ControlUFCON2 EQU 0x50008008 ;UART 2 FIFO

    8720

    ARM(三).UART with FIFO(2)

    8410

    ARM(三).UART with FIFO(3)

    #define rEP1_FIFO (*(volatile unsigned char *)0x520001c7) Endpoint 1 FIFO#define rEP2_FIFO (*(volatile unsigned char *)0x520001cb) Endpoint 2 FIFO#define rEP3_FIFO (*(volatile unsigned char *)0x520001cf) Endpoint 3 FIFO#define rEP4_FIFO (*(volatile unsigned char *)0x520001d3) Endpoint 4 FIFO#define rEP1 unsigned char *)0x520001c8) Endpoint 2 FIFO#define rEP3_FIFO (*(volatile unsigned char *)0x520001cc) Endpoint 3 FIFO#define rEP4_FIFO (*(volatile unsigned char *)0x520001d0) Endpoint 4 FIFO#define rEP1

    9050

    FPGA FIFO深度计算

    ,如果系统一直在工作,那么那些没有被读走的数据会越累积越多,那么FIFO的深度需要是无穷大的,因此只有在突发数据传输过程中讨论FIFO深度才是有意义的。 要确定FIFO的深度,关键在于计算出在突发读写这段时间内有多少个数据没有被读走。也就是说FIFO的最小深度就等于没有被读走的数据个数。 在讨论之前我们假定模块A向FIFO写数据的时钟频率为fa,模块B从FIFO读数据的时钟频率为fb。 通过上述讨论可以知道场景2的FIFO最小深度应该比场景1的FIFO最小深度45略大。 下面我们来推导一下FIFO深度的求解公式,假设:写时钟频率为fwr读时钟频率为frd在写时钟周期内,每m个周期内就有n个数据写入FIFO在读时钟周期内,每x个周期内可以有y个数据读出FIFO那么:首先必须满足

    18531

    扫码关注云+社区

    领取腾讯云代金券