【Sync FIFO介绍及基于Verilog的实现】

2024-05-24 20:28
文章标签 实现 介绍 verilog fifo sync

本文主要是介绍【Sync FIFO介绍及基于Verilog的实现】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Sync FIFO介绍及实现

  • 1 Intro
  • 2 Achieve
    • 2.1 DFD
    • 2.2 Intf
    • 2.3 Module

本篇博客介绍无论是编码过程中经常用到的逻辑–FIFO;该FIFO是基于单时钟下的同步FIFO;
FiFO分类:同步FiFO VS 异步FiFO;

1 Intro

FIFO可以自己实现,但是因为FiFO太常用,为了减少造轮子和出错率,基本上每个公司都有自己的CBB库,直接调用即可;
个人认为,自己作为入门者,学习尤其亲自实践造轮子,对自己的技能提升很有帮助;
FiFO是first in first out的数据行为;相比SRAM来说可能是少了灵活性,但是在设计逻辑上却是最经常用到FIFO的行为逻辑;
FIFO基于sram上wrapper控制逻辑的module;

2 Achieve

三种基本读写场景:

  • push && !pop
  • psh && pop
  • pop && !push

2.1 DFD

通过wr_ptr和rd_ptr来进行以动array的index;
!](https://img-blog.csdnimg.cn/direct/83dce5833ef1442aa970a44eec2e2af2.png)
在这里插入图片描述

2.2 Intf

下图是Sync_fifo的上下游接口框图;
在这里插入图片描述

2.3 Module

以下为伪代码实现,还未经过语法编译和功能验证,供大家思路参考

//--Auther	:colonel
//--Date		:2024-05-23
//--Function:sync_fifo meet
//--History	:Description
//--05/22	:Firstly create the file
//
module sync_fifo#(parameter DEPTH = 4,parameter WIDTH = 8,parameter PTR_WIDTH = 2
)(input clk,input rst_n,input push,input wire[WIDTH -1:0] data_in,output full, input pop,output empty,output reg[WIDTH -1:0] data_out 
);reg[WIDTH -1:0][DEPTH -1:0] fifo;		//sync_fifo based on the register
reg[PTR_WIDTH -1:0] cnt;reg[DEPTH -1:0] wr_ptr;
reg[DEPTH -1:0] rd_ptr;//--waddr 
always@(posedge clk or negedge rst_n) begin:waddr_logicif(!rst_n) beginwr_ptr <= 0;end else beginif(push && ! full) beginwr_ptr <= wr_ptr + 1;end else beginwr_ptr <= wr_ptr;endend
end//--raddr
always@(posedge clk or negedge rst_n) begin:raddr_logicif(!rst_n) beginrd_ptr <= 0;end else beginif(pop && !empty ) beginrd_ptr <= rd_ptr + 1;end else beginrd_ptr <= rd_ptr;endend
end//--wdata
integer i;
always@(posedge clk or negedge rst_n) beginif(!rst_n) beginfor(i=0;i<DEPTH;i=i+1) beginfifo[i] <= 0;endend else beginif(push) beginfifo[wr_ptr] <= data_in;end else beginfifo[wr_ptr] <= fifo[wr_ptr];endend
end//--rdata
always@(posedge clk or negedge rst_n) beginif(!rst_n) begindata_out <= 0;end else beginif(pop) begindata_out <= fifo[rd_ptr];end else begindata_out <= data_out;endend
end//--cnt logic
always@(posedge clk or negedge rst_n) beginif(!rst_n) begincnt <= 0;end else beginif(push && !pop && !full) begincnt <= cnt + 1;end else if(!push && pop && !empty) begincnt <= cnt - 1;end else begincnt <= cnt;endend
end//full && empty logic
assign empty = (cnt==0) ? 1:0; 
assign full = (cnt==DEPTH) ? 1:0; endmodule

【Reference】
[1] https://blog.csdn.net/zyp626/article/details/131620099

这篇关于【Sync FIFO介绍及基于Verilog的实现】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/999439

相关文章

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作