FPGA Asynchronous FIFO设计思路
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设计思路的更多相关文章
- FPGA Asynchronous FIFO设计思路(2)
FPGA Asynchronous FIFO设计思路(2) 首先讨论格雷码的编码方式: 先看4bit的格雷码,当MSB为0时,正向计数,当MSB为1时,即指针已经走过一遍了,最高位翻转,此时的格雷码是 ...
- FPGA学习:VHDL设计灵活性&不同设计思路比较
概要 由于VHDL编程实现数字电路具有很高的灵活性,为多种不同的思路编写实现同一种功能提供了可能.这些不同的设计思路,在耗费资源,可靠性,速度上也有很大的差异,往往需要我们根据实际需求和资源条件选择适 ...
- 基于FPGA的异步FIFO设计
今天要介绍的异步FIFO,可以有不同的读写时钟,即不同的时钟域.由于异步FIFO没有外部地址端口,因此内部采用读写指针并顺序读写,即先写进FIFO的数据先读取(简称先进先出).这里的读写指针是异步的, ...
- 小梅哥FPGA数字逻辑设计教程——基于线性序列机的TLC5620型DAC驱动设计
基于线性序列机的TLC5620型DAC驱动设计 目录 TLC5620型DAC芯片概述: 2 TLC5620型DAC芯片引脚说明: 2 TLC5620型DAC芯片详细介绍: 3 TLC ...
- FPGA异步时钟设计中的同步策略
1 引言 基于FPGA的数字系统设计中大都推荐采用同步时序的设计,也就是单时钟系统.但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免. ...
- TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析
TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...
- 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路
最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...
- ENode框架单台机器在处理Command时的设计思路
设计目标 尽量快的处理命令和事件,保证吞吐量: 处理完一个命令后不需要等待命令产生的事件持久化完成就能处理下一个命令,从而保证领域内的业务逻辑处理不依赖于持久化IO,实现真正的in-memory: 保 ...
- WebGIS中快速整合管理多源矢量服务以及服务权限控制的一种设计思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在真实项目中,往往GIS服务数据源被其他多个信息中心或者第三方 ...
随机推荐
- 小程序 onReachBottom 事件快速滑动时不触发的bug
一般在列表页面 会先加载一定数量的数据 触发上拉加载这个动作的时候再陆续加载数据 假如上拉一次加载10条数据 在小程序中 你快速滑动页面触发加载这个事件的话 你会发现小程序卡着不动了 刚开始以为数据加 ...
- vmware10.0.1安装redhat linux6.2每次启动vm崩溃问题解决!
最近在学习linux技术,安装了一套redhat linux6.2的环境,里面有软件若干,wmare用的是10.0.1的,最近每次出现登陆界面,输入root登陆后,wm就报错vmui不可恢复错误MEM ...
- 修改权限linux
1.更改目录所有者命令:chown -R 用户名称 目录名称2.更改目录权限命令:chmod -R 755 目录名称 nginx在不同目录下需要给与全部权限才可以
- 按照不规则多边形shp文件分割底层栅格文件tif,统计不同栅格的属性值
我想做到,按照voronoi多边形分割地图土地利用类型文件,统计每个多边形内不同地物的种类和数量.-----如图: 我的第一个想法是:首先用上层多边形将下层栅格图切割开来,然后就可以分别统计栅格内的地 ...
- Vue中使用mui方法
第一步 下载 下载网址:http://dev.dcloud.net.cn/mui/ui/ 点击GitHub进行下载 第二步 Vue中引入Mui 将下载好的文件解压 把文件中dist中的三个文件复制到自 ...
- 搭建vue的开发环境
随手笔记:win7 64bit 1.安装node,直接从node官网下载,安装即可. 2.命令行输入 node -v 查看是否安装成功,显示node的版本号即安装成功.安装成功后,输入node,进入n ...
- format() expandtabs() 输入表格数据
1 输入表格数据 format(self, *args, **kwargs): # known special case of str.format """ S.form ...
- 最近的AI
虚拟币和AI 两个大类怎么兴起?
- pytorch怎么抽取中间的特征或者梯度
for i, (input, target) in enumerate(trainloader): # measure data loading time data_time.update(time. ...
- Javascript仿贪吃蛇出现Bug的反思
bug现象: 图一