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. L362 When to Bring up Salary During the Job Interview Process

    Money is an awkward topic of conversation for many professionals—even more so when you’re busy tryin ...

  2. npm -g -D -s的区别

    npm install module-name 全局安装 npm install module-name -D 即 npm install module-name -save-dev  保存到devD ...

  3. 18-09-09 Linux 系统如何获取外部的数据例如 软件的2中方式

    方式一 利用U盘  手动挂载/卸载 U盘==========================================1, cat /proc/partitions查看U盘插入前后, 多出的 s ...

  4. git怎么fork一个仓库并pull request

    一.使用git push <-----------就是这个玩意 1.设置用户信息 当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址. 这样做很重要,因为每一个 Git 的提交都会 ...

  5. django 模型操作

    # 添加 Fruit.objects.create(name='Apple') # 更新 UserProfile.objects.filter(user=admin).update(**{'onlin ...

  6. USGS bulk批量下载工具

    最近美国EarthExplorer上批量下载遥感数据---官方给出了批量下载工具BULK 下载地址:https://earthexplorer.usgs.gov/bulk/ bulk 使用帮助文档 根 ...

  7. JAVA 集合 按照某个字段(依据一定条件)进行分组

    由于数据不能够在本地化实现, 无法通过sql语句得到对应的结果,小编只好在业务层处理.通过调用接口得到集合,拿到集合后,通过年来分组,以此来达到对应的Map集合... 在这里小编给大家提供一个封装了一 ...

  8. Feign源码解析系列-那些注解们

    开始 Feign在Spring Cloud体系中被整合进来作为web service客户端,使用HTTP请求远程服务时能就像调用本地方法,可见在未来一段时间内,大多数Spring Cloud架构的微服 ...

  9. 使用spark访问hive错误记录

    在spark集群中执行./spark-shell时报以下错误: 18/07/23 10:02:39 WARN DataNucleus.Connection: BoneCP specified but ...

  10. vue生命周期图片