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. 对yolo与fasterrcnn anchors的理解

    yolo: 通过聚类产生5个不同比例的anchors.最后一个特征层的输出(x,y,w,h)与这些不同比列的相乘,将网络层的输出转化为bbox(小尺寸),再通过(H,W)还原成原图大小.一共有5个bb ...

  2. VMware三种网络介绍

    前言 很多人安装虚拟机的时候,经常遇到不能上网的问题,而vmware有三种网络模式,对初学者来说也比较眼花聊乱,今天我就来基于虚拟机3种网络模式,帮大家普及下虚拟机上网的背景知识.(博文原创自http ...

  3. Linux三个网络监视器之《二》——nethogs

    当你想要快速了解谁占用了你的带宽时,Nethogs 是快速和容易的.以 root 身份运行,并指定要监听的接口.它显示了空闲的应用程序和进程号,以便如果你愿意的话,你可以杀死它. 1 1.在这个网址f ...

  4. PAT—优化Java从控制台读取信息的速度

    PAT对Scanner类很不友好,会花费大量时间,导致运行时间超时.可采用下列代码优化时间 BufferedReader bf = new BufferedReader(new InputStream ...

  5. json模块

    dic = {"name":"boke","age":"18"} #字典 data = json.dumps(dic) ...

  6. HDU - 6127: Hard challenge(扫描线,atan)

    pro:给定N个二维平面的关键点,保证两点连线不经过原点.现在让你安排一条经过原点,但是不经过关键点的直线,使得两边的和的乘积最大. sol:由于连线不经过原点,所以我们极角排序即可. 具体:因为我们 ...

  7. 爬虫基础之urllib库

    urllib库的基本使用 urlopen() # 导入urllib库 import urllib # 往指定url发送请求,返回一个响应对象 response = urllib.request.url ...

  8. .NET第一章

    1.介绍了.NET的作用和软件前景趋势 2.Visual studio .net 编程 3.介绍.net可以多种编程语言,通过公共语言类库存放 2.介绍C# 数据类型和变量设置,以及函数的使用 3.继 ...

  9. MySQL Workbench 创建数据库,添加新表,添加字段

    建立数据库 第一步: 第二步: 第三步: 如图弹出弹框,继续点击Apply按钮,最后点击Finish按钮完成数据库的建立 创建表与添加字段 双击!!!  一下刚刚建立好的数据库,然后再创建表,不然会出 ...

  10. SSH配置

    什么是SSH: SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH ...