FPGA Asynchronous FIFO设计思路

将一个多位宽,且在不停变化的数据从一个时钟域传递到另一个时钟域是比较困难的。

同步FIFO的指针比较好确定,当FIFO counter达到上限值时候,FIFO为满,当FIFO counter为0时,FIFO为空。

异步FIFO有writer pointer 和 read pointer两个指针,writer pointer 总是指向下一个要被写入的位置,read pointer 总是指向下一个将被读出的数据。没有必要使用这样一种机制:接受端的用户逻辑先给一个时钟周期到FIFO,使得指针指向将要读出的数,然后接收端在用一个时钟周期来锁存读出的数据。

怎样判定FIFO的空满,当写指针追上读指针时候,FIFO为满,当读指针追上写指针时候,FIFO为空,既然当FIFO为空和满的时候,都是读指针和写指针相等,那该怎么判断空满呢,在读写指针前面多加一位,当读写指针走过FIFO最后一个地址的时,并从头再来,这个时候最高位进行翻转,其他地址位进行清零处理。如果,读写指针最高位相同,说明他们翻转的次数相同,这种情况只有读在写指针的后面,快要空。如果读写指针最高位不同,说明他们翻转的次数不同,这种只能是写指针在读指针的后面,快要满。

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: chensimin
//
// Create Date: 2018/10/24 17:31:22
// Design Name:
// Module Name: beh_fifo
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////// module beh_fifo #( parameter ASIZE = ,
parameter DSIZE = )
( input wire wclk,
input wire wrst_n,
input wire winc,
input wire [DSIZE- : ] wdata, output wire wfull,
output wire rempty, input wire rclk,
input wire rrst_n,
input wire rinc,
output wire [DSIZE- : ] rdata ); //--------------------------------------------------------------
//写一个数据,指针加一
parameter MEMDEPTH = << ASIZE;
reg [ASIZE : ] wptr;
reg [DSIZE- : ] ex_mem [ : MEMDEPTH-]; always @(posedge wclk or negedge wrst_n)
begin
if(!wrst_n)
wptr <= ;
else if(winc && !wfull)
begin
ex_mem[wptr[ASIZE- : ]] <= wdata;
wptr <= wptr + ;
end
end //--------------------------------------------------------------
//将rptr读指针,同步到wclk时钟域,打了三拍
reg [ASIZE : ] wrptr3;
reg [ASIZE : ] wrptr2;
reg [ASIZE : ] wrptr1; always @(posedge wclk or negedge wrst_n)
begin
if(!wrst_n)
{wrptr3, wrptr2, wrptr1} <= ;
else
{wrptr3, wrptr2, wrptr1} <= {wrptr2, wrptr1, rptr};
end //--------------------------------------------------------------
//读指针加一
reg [ASIZE : ] rptr;
always @(posedge rclk or negedge rrst_n)
begin
if(!rrst_n)
rptr <= ;
else if(rinc && !rempty)
rptr <= rptr + ;
end //--------------------------------------------------------------
//将写指针同步到读指针时钟域
reg [ASIZE : ] rwptr3;
reg [ASIZE : ] rwptr2;
reg [ASIZE : ] rwptr1; always @(posedge rclk or negedge rrst_n)
begin
if(!rrst_n)
{rwptr3, rwptr2, rwptr1} <= ;
else
{rwptr3, rwptr2, rwptr1} <= {rwptr2, rwptr1, wptr};
end //-------------------------------------------------------------- assign rdata = ex_mem[rptr[ASIZE- : ]];
assign rempty = (rptr == rwptr3);
assign wfull = (( wptr[ASIZE-:] == wrptr3[ASIZE-:] ) &&
( wptr[ASIZE] != wrptr3[ASIZE] )); endmodule

以上只是一个很粗糙的FIFO模型,并不能拿来综合和使用。(待续................)

FPGA Asynchronous FIFO设计思路的更多相关文章

  1. FPGA Asynchronous FIFO设计思路(2)

    FPGA Asynchronous FIFO设计思路(2) 首先讨论格雷码的编码方式: 先看4bit的格雷码,当MSB为0时,正向计数,当MSB为1时,即指针已经走过一遍了,最高位翻转,此时的格雷码是 ...

  2. FPGA学习:VHDL设计灵活性&不同设计思路比较

    概要 由于VHDL编程实现数字电路具有很高的灵活性,为多种不同的思路编写实现同一种功能提供了可能.这些不同的设计思路,在耗费资源,可靠性,速度上也有很大的差异,往往需要我们根据实际需求和资源条件选择适 ...

  3. 基于FPGA的异步FIFO设计

    今天要介绍的异步FIFO,可以有不同的读写时钟,即不同的时钟域.由于异步FIFO没有外部地址端口,因此内部采用读写指针并顺序读写,即先写进FIFO的数据先读取(简称先进先出).这里的读写指针是异步的, ...

  4. 小梅哥FPGA数字逻辑设计教程——基于线性序列机的TLC5620型DAC驱动设计

    基于线性序列机的TLC5620型DAC驱动设计 目录 TLC5620型DAC芯片概述:    2 TLC5620型DAC芯片引脚说明:    2 TLC5620型DAC芯片详细介绍:    3 TLC ...

  5. FPGA异步时钟设计中的同步策略

    1 引言    基于FPGA的数字系统设计中大都推荐采用同步时序的设计,也就是单时钟系统.但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免. ...

  6. TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析

    TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...

  7. 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路

    最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...

  8. ENode框架单台机器在处理Command时的设计思路

    设计目标 尽量快的处理命令和事件,保证吞吐量: 处理完一个命令后不需要等待命令产生的事件持久化完成就能处理下一个命令,从而保证领域内的业务逻辑处理不依赖于持久化IO,实现真正的in-memory: 保 ...

  9. WebGIS中快速整合管理多源矢量服务以及服务权限控制的一种设计思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在真实项目中,往往GIS服务数据源被其他多个信息中心或者第三方 ...

随机推荐

  1. ecside中<c:table>使用

    <ec:table action="sjzc/tbWaterproject!list.do" items="objList" var="tbWa ...

  2. [python3.6+opencv] 02 imwrite-打开图像后保存退出还是不保存退出的问题

    加载一个灰度图,显示图片,按下’s’键保存后退出, 或者按下 ESC 键退出不保存 # -*- coding: utf-8 -*- import numpy as np import cv2 as c ...

  3. 认识enum

    今天在看别人代码的时候发现他的使用enum的方法,我是不会用的,因此记录一下. 这个是一个语音合成,今天改为使用百度的语音,可以免费支持离线.在线. 在语音合成的使用,会使用许多的词句让其合成语音,用 ...

  4. 【POI】java对excel的读写操作

    在工作中需要将mongo中的数据导出到excel中,所以根据需要学习了poi.以下为学习内容的总结: 1.POI是什么? poi是Apache团队开发的专门面对用java处理Excel文档的工具. 官 ...

  5. xcode10 出现iPhone has denied the launch request

    一般的处理这里不介绍,只要介绍因为证书的问题导致这个原因的.我的现象是,模拟器可以,iOS12以下设备可以,证书全部更新了一遍,只有一个没更新,还真是那个没更新的问题. 从钥匙串查看自己的证书配置,看 ...

  6. linux 常用命令及实例

    转载:https://www.cnblogs.com/xiaoyafei/p/9163976.html 在linux中,绝大多数命令都参照 命令 选项 参数 选项:适用于调整命令的功能的 参数:指的是 ...

  7. 【转】干货 | 【虚拟货币钱包】从 BIP32、BIP39、BIP44 到 Ethereum HD Wallet

    虚拟货币钱包 钱包顾名思义是存放$$$.但在虚拟货币世界有点不一样,我的帐户资讯(像是我有多少钱)是储存在区块链上,实际存在钱包中的是我的帐户对应的 key.有了这把 key 我就可以在虚拟货币世界证 ...

  8. Python标准库之textwrap模块

    textwrap通过调整换行符的位置来格式化文本:以下是全部方法 __all__ = ['TextWrapper', 'wrap', 'fill', 'dedent', 'indent', 'shor ...

  9. ubuntu18.04LTS修改键盘键位

    在Linux中为了敲命令方便,所以需要做一下键盘键位调整: 1.Esc键和`(即数字键1前面的那个键)对换: 2.Caps Lock键和左Control键对换: 编辑键位文件: sudo vim /u ...

  10. timestamp时间格式

    时间戳(timestamp),通常是一个字符序列,唯一地标识某一刻的时间. 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的 ...