tag 标签: 异步fifo

相关博文
  • 2017-6-6 22:01
    934 次阅读|
    0 个评论
    2.3)异步fifo 事实上所有的同步问题都可以用异步fifo来处理,以一个时钟域将数据写入fifo,另一个时钟域将数据读出来,但是为什么不这样做呢,而是只有大批量的数据要处理时才这样做呢。原因有一下几点,异步fifo的latency比较大;异步fifo一般需要配上对应的ram作为存储体,ram又需要对应的bist电路,所以面积也会比较大;异步fifo控制部分的逻辑设计起来有些难度,尤其是空满信号的判断,如果处理不好也会带来很大的麻烦。 上图是一般异步fifo的设计架构,下面我将对经典异步fifo的设计,使用,注意事项进行解读。 将要讲解的两种经典的异步FIFO的设计方案来自一篇文章《simulation and synthesis techniques for asynchronous FIFO design》,大家可自行下载,设计思路这篇文章里面介绍的很详细,解释的也很出色,我更多的是谈谈我的部分理解。 2.3.1)异步FIFO设计的难点在哪里 2.3.1.1)写地址和读地址处于不同的时钟域,如何比对写地址和读地址才能正确的产生空满信号; 2.3.1.2)当读写地址相同时,究竟是读空了还是写满了(因为存在你追我赶的情况,类似于一个圆环)。 2.3.2)处理思路 2.3.2.1)对于难点1大家自然想到采用同步处理的方式,具体为将写地址或者读地址同步(例如利用两级触发器)到对方的时钟域中,在相同的时钟域中进行地址的比对,但是由于写地址和读地址很多时候并不止1bit,同时进行同步处理会增大错误的概率(如地址按0111-1000跳变,此时4bit都在变化,DFF进行同步时就很容易出错),因而可以先将地址(二进制的)转换为格雷码(相邻数据之间只有一个bit在变化),然后再进行同步,最后进行对比,这样会大大减少错误的概率。 2.3.2.2)对于难点2可以在地址前面添加1bit用于标志位进行区分,例如复位时,读写地址的标志位都是0,如果写完1轮而开始新的一轮时就将写地址的标志位换为1(读也同样道理变换),这样可以通过判断标志位加上对比地址判断是空还是满,具体为当读写地址的标志位相同读写地址相同时为读空,具体为当读写地址的标志位不同读写地址相同时为写满;另外也可以利用格雷码的最高两位00-01-10-11进行相位的区分,具体参考我给出的文章或者网络资料,其实本质上和上面的是一个道理。 2.3.3)经典FIFO设计方案的解读 2.3.3.1)同步读写地址(经格雷码转换后)到对方的时钟域 相比于直接同步二信号进制地址(先用握手,然后同步二进制地址)好处是格雷码相邻数据之间只有一个bit在变化,而二进制由于写地址和读地址很多时候并不止1bit,同时进行同步处理会增大错误的概率(如地址按0111-1000跳变,此时4bit都在变化,DFF进行同步时就很容易出错);利用格雷码进行同步,即使发生同步的时出错也不会造成overrun和underrun的情况(因为同步后的数据必定小于等于同步前的数据,即只可能1被同步为0,而不可能0被同步为1),例如当前的读地址到了6,写地址到了8,地址8经过同步后出错而变成了6,这时会出现地址相同而判断为读空,不过没关系,读空则不读,至少不会出现underrun的情况,随着时间的推移地址8总会被采样到;然而格雷码也有缺点,只能连续变化递增或者递减(如果间隔变化就不符合格雷码的特点了),所以设计的深度必须是2^n,如果不是的话,需要重新产生编码格雷码,否则也会出现间隔变化不符合相邻之间只有1bit变化的特点。 2.3.3.2)将读写地址(经格雷码转换后)同步到一个组合逻辑电路中(异步比较)直接比较空满,然后将空满信号同步到各自对应的模块中 虽然这种电路会给fifo带来不好的状态,例如已经满了wfull==1,但是这个时候读走一个数据,由于同步的延时性,导致这一段时间内wfull==1一直不变(如果没有同步带来的延时应该变为0的),rempty也会遇到同样的问题,但是这种电路不会出现underrun和overrun的情况。 2.3.3.2)相比2.3.3.1)可能会节省面积,因为2.3.3.1)同步wptr 和rptr ,2.3.3.2)只需要同步afull_n,aempty_n; 2.3.3.1)的速率可能较2.3.3.2)会快些,2.3.3.2)中存在异步且组合逻辑比较,不利于时序的优化。
  • 2015-3-24 13:20
    266 次阅读|
    0 个评论
      随着显示屏技术的不断发展,真彩液晶显示屏以其高分辨率、高对比度及高清晰度等优势逐渐在嵌入式显示系统中占据重要地位。目前,基于嵌入式平台的LCD显控技术的实现主要有两种方式:ARM内嵌LCD控制器和独立的控制器件。但是这两种实现方式都存在着不足之处,内嵌控制器的使用可能增大处理器的负担和限制显示帧率,而外部控制器件不仅成本高,而且专用性比较强,很难适应不同类型的液晶屏。   据此存在的问题,这里提出一种基于ARM与FPGA的LCD控制器设计方案,该设计方案一方面能够通过操作LINUX OS下的Framebuffer设备提高显存的写入速率及减轻处理器的负担,另一方面用FPGA来实现LCD控制器的设计,开发周期短、功耗低,同时具有灵活的移植性,可应用于不同中小尺寸的液晶显示屏。    1 系统组成及工作原理   系统主要有微控制器、FPGA(LCD控制器)、存储单元以及外设接口组成,系统组成框图如图1所示。   系统的工作流程:在FPGA内部的时序发生电路所产生的时序控制信号作用下,LCD控制器通过Framebuffer接口从微控制器读出显示所需的数据存入显示缓存SRAM中。同时LCD显示屏从显存SRAM中读取显示数据,并通过数据格式转换电路直接将数据信息实时显示。    2 系统硬件设计   2.1 LCD控制器   LCD控制器是基于FPGA实现的。本方案采用Altera公司的Cvclone(飓风)系列EPlC6Q240。FPGA具有高速的数据传输I/O接口,可实现高速的显存读取速率,大大提高LCD显示的帧率。而同时FPGA是可编程逻辑器件,可实现复杂的逻辑运算及提供复杂的控制时序。LCD显示屏采用LQ035Q3DG01型的TFT-LCD液晶显示屏,分辨率为320×240,图像信号为RGB格式。   由于SRAM有较高的读写速度,该设计方案的显示缓存采用1片IS61LV51216AL型SRAM,其容量为512 KB,读写速度为10ns左右。而显示一帧图像的大小为125 KB(320x240x2/l024),FPGA对显存的读写速度约为200 ns,因此满足系统要求。图2为LCD控制器电路连接图。    2.2 ARM9微控制器   该系统设计的主控单元采用ATMEL公司的AT9lRM9200(简称9200)作为MCU,该处理器是基于ARM920T内核,工作主频为180 MHz。性能可达到200 MI/s,系统采用开源的LINUX OS。但是ARM9作为系统的控制终端,需要完成信息采集、处理以及与外部通信等多项工作,而LCD控制器如果也要从内存中读出数据显示,这就会造成处理器负担,从而降低显示缓存读入数据的速率,影响LCD的实时显示。因此这里提出一种基于LINUX 0S下的Framebuffer接口的应用方法,大大提升显存读入数据的速率,从而提升整个显示系统的实时性。图3为AT91RM9200接口电路连接。    3 系统软件设计   系统的软件设计主要分为基于FPGA的LCD控制器设计与LINUX OS下Framebuffer驱动程序设计2部分。    3.1 LCD控制器设计   3.1.1 LCD控制器组成   该设计方案的LCD控制器主要由缓存读写、MCU接口及LCD时序控制等模块组成,具体组成如图4所示。    3.1.2 LCD控制器设计原理   由TFT-LCD液晶屏显示原理可知,显示所需的主要控制信号有像素时钟信号、行/场同步信号以及使能信号。该方案的显示屏分辨率为320x240,要求设计液晶显示屏的刷新频率为60 Hz,即场同步信号(VSYNC)为60Hz,刷新一屏所需时间为1/60 s,而一场则由240个行同步信号组成,那么一个行同步信号的周期为1/(60x240)s,即可得行同步信号(HSYNC)为15 kHz。同理可得像素时钟信号(CK)为5MHz。   采用FPGA内置的锁相环IP模块(PLL)将FPGA 50 MHz时钟信号F_CLK 10分频为5 MHz的像素时钟信号。应用状态机方法,用Verilog硬件描述语言设计时序控制模块,它为LCD提供满足时序要求的控制信号VSYNC、HSYNC以及ENAB。设计完成后在QuatuslI环境下完成时序仿真,得到的仿真结果满足时序要求,仿真图如图5所示。 点击看原图   SRAM为显存模块,由图2可知LCD控制器与微控制器之间的数据传输是在ARM的时钟控制下读入,而同时LCD屏显则是在像素时钟信号CK的控制下从SRAM中读取数据。针对该异时钟域之间数据的传输问题本方案采用FPGA设计实现异步FIFO来完成。    3.2 Framebuffer驱动设计   Framebuffer是Linux内核中的一种驱动程序接 口,该接口将显示设备映射为帧缓冲区。平台使用Linux2.6.25内核。在Linux2.6内核当中,通常采用分层的驱动设计框架。对设备进行分层和分类管理,驱动底层为总线驱动,上层为具体设备驱动。在Framebuffer驱动程序中,其软件设计流程为:首先需要针对该具体的设备和硬件连接注册总线类型及申请系统总线资源;其次,将具体设备驱动程序注册进入总线链表,Linux内核根据设备驱动程序中提供的探测函数检测总线设备类型;最后在驱动探测函数中实现具体设备类型的注册。以下为其具体的实现过程。   1)资源申请 系统中,9200通过外部总线接口的BANK7与FPGA FIFO接口连接,采用16位静态总线方式对FIFO数据进行写入操作。根据驱动设计框架,驱动程序设计的第一步需要通过系统调用platform_device_register函数申请总线资源,示意代码如下:   2)驱动注册 在具体设备驱动中,通过使用module_init宏与module_exit定义驱动模块的加载与卸载方法,在模块注册函数中使用plat-form_driver_register函数将具体设备的platform_driver结构体注册进入系统总线链表,platform_driver中为总线提供具体设备的probe与remove等操作方法,其示意代码如下:   3)Framebuffer设备注册 在Linux中,通过fb_info结构体对帧缓冲设备信息进行描述。在fb_info中,较为重要的结构有fb_var_scree-ninfo、fb_var_screeninfo、fb_ops。其中,fb_var_screeninfo记录用户可修改的显示控制器参数,包括屏幕分辨率;fb_fix_screeninfo记录用户不能修改的显示控制器的参数,如屏幕缓冲区的物理地址等;fb_ops记录了具体显示设备IO操作的实现方法。驱动通过register_-framebuffer函数将fb_info记录的显示设备信息注册进Framebuffer设备链表。   在Linux文件系统中,Framebuffer设备的主设备号为29,次设备号为帧缓冲序号。Framebuffer设备注册后通过mknod指令在系统dev目录下创建Framebuffer设备文件节点,应用层程序可通过Framebuffer设备文件实现Framebuffer设备的访问和操作。    4 结束语   该设计方案的LCD控制器达到实时性及显示帧率的要求,每秒显示至少25帧。基于FPGA设计的LCD控制器技术具有应用广泛、移植性强、开发周期短以及成本低等优点,可以适用于众多的需要LCD液晶显示的系统或场合。
  • 热度 3
    2014-9-10 22:57
    930 次阅读|
    3 个评论
    写在前面: 无论是数据通讯或者 SOC (包括 FPGA 或者 ASIC 设计)设计,跨时钟域( clock domain crossing )处理都是一件让人很头疼的事情,无论是在设计的前端或者步入设计的后端,都没有很好的工具去做保证,只能靠设计人员的经验进行最大的保证,然而这个问题如果处理不好,你的整个设计可能就完全报废,而最怕的是你的设计时好时坏,有时稳定,有时出错,这个时候你甚至很难进行定位(尤其是上了 FPGA 开发板或者芯片已经 tapout 了)。 一般而言,处理跨时钟域的方法有这么几种(大家在网上也都能找到资料,这些资料大都来自几篇经典的论文,中文方面的资料大都是翻译过着理解这几篇论文而来):少量的数据用边沿检测电路,或者脉冲检测电路,或者电平检测电路,或者两级触发器;比较多的数据时用异步 FIFO 。   本文侧重讲解本人对异步FIFO的深入理解,讲解两种经典的异步FIFO的设计方案,这两种方案来自一篇文章《simulation and synthesis techniques for asynchronous FIFO design》,大家可自行下载,设计思路这篇文章里面介绍的很详细,解释的也很出色,我更多的是谈谈我的部分理解。 1 、异步 FIFO 设计的难点在哪里 1)写地址和读地址处于不同的时钟域,如何比对写地址和读地址才能正确的产生空满信号; 2)当读写地址相同时,究竟是读空了还是写满了(因为存在你追我赶的情况,类似于一个圆环)。   2 、处理思路     1)对于难点1大家自然想到采用同步处理的方式,具体为将写地址或者读地址同步(例如利用两级触发器)到对方的时钟域中,在相同的时钟域中进行地址的比对,但是由于写地址和读地址很多时候并不止1bit,同时进行同步处理会增大错误的概率(如地址按0111-1000跳变,此时4bit都在变化,DFF进行同步时就很容易出错),因而可以先将地址(二进制的)转换为格雷码(相邻数据之间只有一个bit在变化),然后再进行同步,最后进行对比,这样会大大减少错误的概率。 2)对于难点2可以在地址前面添加1bit用于标志位进行区分,例如复位时,读写地址的标志位都是0,如果写完1轮而开始新的一轮时就将写地址的标志位换为1(读也同样道理变换),这样可以通过判断标志位加上对比地址判断是空还是满,具体为当读写地址的标志位相同读写地址相同时为读空,具体为当读写地址的标志位不同读写地址相同时为写满;另外也可以利用格雷码的最高两位00-01-10-11进行相位的区分,具体参考我给出的文章或者网络资料,其实本质上和上面的是一个道理。   3 、经典 FIFO 设计方案的解读 1)同步读写地址(经格雷码转换后)到对方的时钟域 相比于直接同步二信号进制地址(先用握手,然后同步二进制地址)好处是格雷码相邻数据之间只有一个bit在变化,而二进制由于写地址和读地址很多时候并不止1bit,同时进行同步处理会增大错误的概率(如地址按0111-1000跳变,此时4bit都在变化,DFF进行同步时就很容易出错);利用格雷码进行同步,即使发生同步的时出错也不会造成overrun和underrun的情况(因为同步后的数据必定小于等于同步前的数据,即只可能1被同步为0,而不可能0被同步为1),例如当前的读地址到了6,写地址到了8,地址8经过同步后出错而变成了6,这时会出现地址相同而判断为读空,不过没关系,读空则不读,至少不会出现underrun的情况,随着时间的推移地址8总会被采样到;然而格雷码也有缺点,只能连续变化递增或者递减(如果间隔变化就不符合格雷码的特点了),所以设计的深度必须是2的n次幂,如果不是的话,需要重新产生编码格雷码,否则也会出现间隔变化不符合相邻之间只有1bit变化的特点。   2)将读写地址(经格雷码转换后)同步到一个组合逻辑电路中(异步比较)直接比较空满,然后将空满信号同步到各自对应的模块中   虽然这种电路会给fifo带来不好的状态,例如已经满了wfull==1,但是这个时候读走一个数据,由于同步的延时性,导致这一段时间内wfull==1一直不变(如果没有同步带来的延时应该变为0的),rempty也会遇到同样的问题,但是这种电路不会出现underrun和overrun的情况。   3)2)相比1)可能会节省面积,因为1)同步wptr 和rptr ,2)只需要同步afull_n,aempty_n;1)的速率可能较2)会快些,2)中存在异步且组合逻辑比较,不利于时序的优化。
  • 2010-12-29 17:59
    1807 次阅读|
    0 个评论
    IDT7203是一种小容量较为常用的异步FIFO存储器,2Kx9bit结构。IDT7203通常作为嵌入式系统控制命令或参数的缓冲器,在我们的一个PC104+ 线阵CCD图像采集系统中,使用2片IDT7203作为奇/偶数行图像“乒乓”缓冲器。使用过程中积累了如下经验: 1、在我们的系统中,奇数行写第1片FIFO、读第2片FIFO;偶数行写第2片、读第1片。每次读完一行后,要对相应的FIFO复位(RS),使读/写指针清零。对于IDT7203L50,复位脉冲宽度应50ns,复位时,逻辑电路(EPLD或FPGA)一定要保证相应的RD和WR保持高电平,否则会造成FIFO的读或写指针加1,并写入一个无效数据。  2、由于IDT7203是高速异步读写芯片,因此,在RD或WR信号上出现任何“毛刺”(干扰或噪声),都会导致一次无效的读写,使FIFO内部读写指针增加,反映到我们的图像采集系统的效果是导致“图像错位,仅影响视觉效果,还不是很严重,如果IDT7203是作为控制命令或参数缓冲区,效果就有可能很严重。为防止这种情况发生,可采取如下措施: (1)RD、WR印制板走线要尽量短,并最好”覆铜“。 (2)简单而又实用的办法是在RD、WR引脚上加一个小容量的滤波电容,电容大小根据RD、WR脉冲宽度(频率)决定,在我们的系统中,因RD宽度比WR窄,tRD=600ns, tWR=1.66us),WR上电容用100P,RD用30P,效果很好。
相关资源
  • 所需E币: 4
    时间: 2019-12-28 21:35
    大小: 336.64KB
    上传者: givh79_163.com
    分析了同步数字体系中2.048Mbps支路信号E1异步映射进VC-12的过程,并根据正/零/负码速调整原理确定了缓冲存储器的容量和正负码速调整的判定门限.通过对异步FIFO读控制实现了此异步映射过程的正/零/负码速调整.同时,为了在异步时钟域之间可靠地传递数据,采用格雷码实现读时钟域对写指针的采样.该设计通过了功能仿真、综合及FPGA验证.……
  • 所需E币: 3
    时间: 2019-12-25 09:53
    大小: 532.65KB
    上传者: 微风DS
    异步FIFO结构……
  • 所需E币: 5
    时间: 2020-1-4 23:45
    大小: 245.22KB
    上传者: 238112554_qq
    :绝大部分的ASIC设计工程师在实际工作中都会遇到异步设计的问题,本文针对异步时序产生的问题,介绍了几种同步的策略,特别是结绳法和异步FIFO的异步比较法都是比较新颖的方法。……
广告