基于verilog_hdl的异步fifo设计毕业设计(编辑修改稿)内容摘要:

页 静态随机存取存储器 SRAM(Static Random Access Memory)是一种非常重要的易失性存储器,它的速度非常快,并且能在快速读取和刷新时保持数据完整性。 SRAM 器件采用Hynix 公司的 HY64UD16322A。 HY64UD16322A 是高速、超低功耗 32 Mbit SRAM,内部具有 2 097 152 个 16 bit 字容量。 采用了 CMOS 制造工艺、 TTL 电平接口以及三态输出,具有较大的输入电 压和温度范围。 同时 HY64UD16322A支持 DPD(Deep Power Down)模式,保证其在待机模式下功耗进一步降低。 系统采用 CPLD 作为总控制器件。 根据 FIFO 的特点,需要将 SRAM 按地址存储用程序控制成先进先出的结构。 这里采用指针算法来实现这种结构设计:设置两个指针变量StartPos 和 EndPos。 分别作为进入数据头尾指针。 当有新数据写入时,数据从上一次存储最后位置的下一个位置开始存入一个数据, EndPos 就自动加 1,保持与最后数据位置同步。 当 EndPos 超过整个 RAM 的最大容量 (RAM_SIZE)时,就需要循环返回,从 0x000 位置存放,一直到 EndPos 与 StartPos 重合。 这时可以认为 RAM 已经存满。 同理,读出数据时。 起始位置 StartPos 自动加 1。 当 StartPos 超过整个 RAM 的最大容量时,就从 0x000 位置读取。 一直到 StartPos 与 EndPos 重合,这时可以认为 RAM 已经读空。 在这两个过程当中,CPLD 需要对地址线进行控制。 不难发现,写数据的时候 Address 与 EndPos 一致,读数据的时候 Address 与 StartPos 一致。 异步 FIFO设计中存在的问题及解 决办法 [1] 亚稳态 对于亚稳态的解决方法主要有三种: 1: 对写地址 /读地址采用格雷码。 由实践可知,同步多个异步输入信号出现亚稳态的概率远远大于同步一个异步信号的概率。 对多个触发器的输出所组成的写地址 /读地址可以采用格雷码。 由于格雷码每次只变化一位,采用格雷码可以有效地减少亚稳态的产生。 2: 采用两极触发器来同步异步输入信号。 信号同步的目的是防止新时钟域中第一级触发器的亚稳态信号对下级逻辑造成影响。 两级寄存器的同步化处理单元由两个触发器串联而成,中问没有其它组合电路。 这种设计可以保证后面的触发器 获得前一个触发器输出时,前一个触发器已退出了亚稳态,并且输出已稳定。 但是,这种方法同时带来了对输入信号的一级延时,需要在设计时钟的时候加以注意。 3: 在信号从快时钟域向慢时钟域过渡时,如果信号变化太快,慢时钟将可能无法对该信号进行正确采样,即采样失败。 所以在使用双锁存器法时,应该使原始信号保持足够长 的 时 间 , 以 便 另 一 个 时 钟 域 的 锁 存 器 对 其 进 行 正 确 的 采 样。 对上述问题 ,一般采用“结绳法”的设计方法,将慢时钟周期信号通过分频的方式将其周期增长,经过双锁存采样以后再使其恢复原来的时钟周期。 即用“结绳”将信号延 长,陕西理工学院毕业设计 第 14 页 共 39 页 用“同步”实现双 latch 采样,用“解绳”还原为原来的时钟,保证另一个时钟域也可以正确采样,而接收方用相反的流程送回响应信号。 空 /满指针的解决方法 空 /满标志产生的原则是:写满不溢出,读空不多读。 即无论在什么进修,都不应出现读写地址同时对一个存储器地址操作的情况。 在读写地址相等或相差一个或多个地址的时候,满标志应该有效,表示此时 FIFO 已满,外部电路应对 FIFO 发数据。 在满信号有效时写数据,应根据设计的要求,或保持、或抛弃重发。 同理,空标志的产生也是如此,即: 空标志 =(|写地址 读地址 |=预定值 )AND(写地址超前读地址) 满标志 =( |写地址 读地址 |=预定值) AND(读地址超前写地址 ) 最直接的做法是,采用读写地址相比较来产生空满标志。 当读写地址的差值等于一个预设值的时候,空 /满信号被置位。 这种实现方法逻辑简单,但它是减法器形成的一个比较大的组合逻辑,因而限制了 FIFO 的速度。 所以,一般只采用相等不相等的比较逻辑,避免使用减法器。 论文主要内容 第一章引言。 简单介绍了所研究题目的发展状况,以及它的研究有意义。 第二章 FIFO 工作原理简介。 通过简单的与原理图介绍了异步 FIFO 的实现框图以及设计的相关技术和简要工作原理。 第三章 FIFO 的实现方法及技术。 分析了异步 FIFO 的参数和设计的难点。 第四章异步 FIFO 实现及主要方法。 通过第二章第三章对异步 FIFO 具体介绍,在这张内容中,重点描述了异步 FIFO 的实现方法。 第五章总结。 对异步 FIFO 的设计方法作了简要的总结,简述了设计方法的不足之处,以及应采取的措施。 陕西理工学院毕业设计 第 15 页 共 39 页 2 异步 FIFO 工作原理简介 关于异步信号 [9] 在许多情况下,数据在跨越时钟域时需要 “ 堆积 ” 起来,因此使用单个保持寄存器无法完成工作。 例如一种情况是某 个传输电路猝发式发送数据,接收电路来不及采样。 另一种情况是接收电路采样速度超出传输电路发送数据的速度,但采样的数据宽度不够。 这些情况就要使用 FIFO 了。 基本上, 人们 使用 FIFO 有两个目的:速度匹配或数据宽度匹配。 在速度匹配时, FIFO 较快的端口处理猝发的数据传输,而较慢的端口则维持恒定的数据流。 但是,虽然访问方式和速度不同,但进出 FIFO 的平均数据速率必须是相同的,否则 FIFO 就会出现上溢(oveRFlow)或下溢 (underflow)问题。 与单寄存器设计相同, FIFO 将数据保存在 寄存器或存储器中,同时 同步 状态 信号 ,判断何时可以把数据写入 FIFO 或从 FIFO 中读出。 在速度匹配应用中,每个端口(读或写)的时钟不同。 FIFO 中的寄存器使用写端口时钟,就像保持寄存器使用电路时钟来改变寄存器内容一样。 信号同步 发生在指针逻辑中,而且比握手信号要复杂得多。 现在指针逻辑的设计有多种方法。 第一种方法是将读、写选通进行同步,同时在各个时钟域使用计数器来跟踪 FIFO 中可用的项。 计数器反映出可用于读写的 FIFO 项目号,计数器也与相应的端口同步。 读计数器跟踪包含有效数据的项数,而写计数器则跟踪可以存储数据的项数。 当对指针逻辑进行复位时,由于没有数据可读,读计数器从零起始。 写计数器则从 FIFO 中项的总数开始计数,即所有项均可用来存储数据。 读选通信号累减读计数器,并与写时钟域同步,因为它同时也累加写计数器。 写选通信号则累减写计数器,并与读时钟域同步,因为它同时也累加读计数器。 这种设计需要单时钟宽度脉冲以及用于读、写选通的脉冲同步器,因为当一个电平信号从一个时钟域跨越到 另一个更快的时钟域时,在较快时钟域中它能在更多的时钟周期中保持有效。 由于只要读或写信号是有效的,每个计数器就会发生变化,因此较快的时钟域就检测到更多的读、写,超出较慢时钟域实际发生的数量。 脉冲同步器可以将一个时钟域的时钟宽度脉冲转换为新时钟域的时钟宽度脉冲,每个脉冲都表示一次 FIFO 的读或写。 这种 FIFO 状态技术对读、写状态都不太 有利。 当 FIFO 中所有项均充满时,写端口状态指示为满,并在读选通触发后继续指示 FIFO 满,因为同步过程会使选通信号延迟送给写计数器。 读端口为空时也会出现这种情况,因为同步过程会使写选通信号延迟到达读计数器。 这种设计的另一种考虑是及时检测全满 /全空状态。 如果 FIFO 还有一项可用,并且有写选通触发,则 FIFO 必须立即置为全满状态。 这样才能提前一个时钟给出全满标志,使 FIFO 有足够时间防止下一个数据写入而产生溢出。 对 FIFO 的读端口也是这样。 这种陕西理工学院毕业设计 第 16 页 共 39 页 情况下,如果 FIFO 里只有一个数,并且 有读选通触发,则必须置全空状态,以给读电路足够的时间防止读空 FIFO。 这种指针逻辑限制电路在每个时钟周期中访问 FIFO,即使在慢速时钟域中也是这样。 这一功能的优点在于访问 FIFO 的电路至少有一个时钟周期来评估 FIFO 的状态。 FIFO 可以将所有项都填满数据,而不会出现数据被覆盖或全空无数据可读的情况。 这种设计的另一个优点是每一端都可以读其相应的计数器,来判断 FIFO 中还有多少项可用。 人们 可以将这种 FIFO 设计用在进行多次数据读 /写的电路中,而不会造成上溢或下溢的情况。 这种设计的不足 之处是由计数器来判断状态,而不是直接比较读、写指针。 对大型 FIFO 来说,这些计数器也很大。 而且,由于使用脉冲同步时,来自较快时钟域的读、写脉冲在较慢时钟域的脉冲间至少必须有两个时钟周期,因此平均数据速率为最低时钟频率的一半。 解决这些问题的一种方法是采用直接指针比较法。 在这种 FIFO 设计中,读、写指针的比较决定了 FIFO 的状态。 异步 设计中的指针比较更富有挑战 性,因为每个指针位于不同的时钟域中,对信号总线的同步要求在同步握手信号期间总线不发生改变。 将这种技术用于指针同步的 FIFO 设计可能会很慢。 要解决这个问题, FIFO 指针逻辑使用了格雷码,代替指针使用的二进制码。 格雷码 如 表 21所示, 在每一次计数增减时只改变其中的一位。 可以在格雷码总线上使用同步器,因为每一次总线改变时只有一根信号线有变化,于是就消除了格雷码总线各位通过不同同步器时的竞争情况。 这种设计的指针为格雷码计数器。 使用二进制指针时需要将其变换成格雷码后的同步指针,而使用变换逻辑会违反对同步 信号的限制,即同步的信号在跨越时钟域前要来自触发器。 Decimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Binary 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 Gray 0 1 11 10 110 111 101 100 1100 1101 1111 1110 1010 1011 1001 1000 表 21 格雷码与十进制,二进制的转换关系表 异步 FIFO芯片 简介 [3] FIFO 芯片是一种具有存储功能的高速逻辑芯片,可在高速数字系统中用作数据缓存。 FIFO 通常利用双口 RAM 和读写地址产生模块来实现其功能。 FIFO 的接口信号包括异步写时钟( wrclk)和读时钟( rdclk)、与写时钟同步的写有效( wren)和写数据( wrdata)、与读时钟同步的读有效( rden)和读数据( rddata)。 写地址产生模块一般还根据读地址和写地址来产生 FIFO 的满标志。 读地址产生模块一般根据读地址和写地址的差来产生FIFO 的空标志。 为了实现正确的读写和避免 FIFO 的上溢或下溢 ,通常还应给出与读时钟和写时钟同步的 FIFO 的空标志( empty)和满标志( full),以禁止读写操作。 写地址产陕西理工学院毕业设计 第 17 页 共 39 页 生模块通常根据写时钟和写有效信号来产生递增的写地址,而读地址产生模块则根据读时钟和读有效信号来产生递增的读地址。 FIFO 一般在操作时,首先在写时钟 wr clk 的上升沿且当 wren 有效时,将 wrdata 写入双口 RAM中写地址对应的位置中,然后将读地址对应的双口 RAM 中的数据输出到读数据总线上,这样就可实现先进先出功能。 读写操作一般会自动访问存储器中连续的存储单元。 从 FIFO 中读出的数据顺序与写入的顺 序相同,而地址的顺序则在内部已经预先定义好,因此,对 FIFO 芯片的操作不需要额外的地址信息。 另外, FIFO 芯片还能提供对读/写指针的复位功能。 这些结构上的特点使 FI- FO 的应用大大简化了电路的复杂程度,提高了系统的可靠性和稳定性。 FIFO 的一些重要参数 [7] FIFO 的宽度:也就是英文资料里常看到的 THE WIDTH,它只的是 FIFO 一次读写操作的数据位,就像 MCU 有 8 位和 16 位, ARM 32 位等等, FIFO 的宽度在单片成品 IC 中是固定的,也有可选择的,如果用 FPGA 自己实现一个 FIFO,其数据位 ,也就是宽度是可以自己定义的。 FIFO 的深度: THE DEEPTH,它指的是 FIFO 可以存储多少个 N 位的数据(如果宽度为N)。 如一个 8位的 FIFO,若深度为 8,它可以存储 8个 8位的数据,深度为 12 ,就可以存储 12个 8位的数据, FIFO 的深度可大可小,个人认为 FIFO 深度的计算并无一个固定的公式。 在 FIFO 实际工作中,其数据的满 /空标志可以控制数据的继续写入或读出。 在一个具体的应用中也不可能由一些参数算数精确的所需 FIFO 深度为多少,这在写速度大于读速度的理想状态下是可行的,但在实际中用到的 FIFO 深度往 往要大于计算值。 一般来说根据电路的具体情况,在兼顾系统性能和 FIFO 成本的情况下估算一个大概的宽度和深度就可以了。 而对于写速度慢于读速度的应用, FIFO 的深度要根据读出的数据结构和读出数据的由那些具体的要求来确定。 满标志: FIFO 已满或将要满。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。