异步FIFO的实现

异步FIFO是verilog中常见的设计,通常用于不同时钟域下的数据同步。

在实现 FIFO 时,无论是同步 FIFO 还是异步 FIFO ,通常会通过双口 RAM ( Dual Port RAM )并添加一些必要的逻辑来实现。双口 RAM的设计如下:

//双口RAM,注意没有读写同步,可能会发生对同一地址的读写冲突问题
//使用时一口仅用于读,另一口仅用于写module full_dp_ram
#(parameter DW = 8,       //数据位宽parameter AW = 4,       //地址位宽parameter SZ = 2**AW    //数据深度
)
(input           clk_a,input           wen_a,input           ren_a,input  [AW-1:0] addr_a,input  [DW-1:0] wdata_a,output [DW-1:0] rdata_a,input           clk_b,input           wen_b,input           ren_b,input  [AW-1:0] addr_b,input  [DW-1:0] wdata_b,output [DW-1:0] rdata_b
);reg [DW-1:0] mem [SZ-1:0];reg [DW-1:0] q_a;always @ (posedge clk_a) beginif (wen_a) beginmem[addr_a] <= wdata_a;endif (ren_a) beginq_a <= mem[addr_a];endendreg [DW-1:0] q_b;always @ (posedge clk_b) beginif (wen_b) beginmem[addr_b] <= wdata_b;endif (ren_b) beginq_b <= mem[addr_b];endendassign rdata_a = q_a;assign rdata_b = q_b;
endmodule

在异步FIFO的框图中,只需要加入读、写控制逻辑即可。在写逻辑中,用于产生写地址和写满信号; 在读逻辑中,用于产生读地址和读空信号。 读写控制逻辑还需要受到读写使能信号的控制。

空: 读空,读地址追上写地址;

满: 写满,写地址追上读地址。

问题来了: 怎么判地址断追上了呢? 如果地址相等那应该是追上了,即 raadr == waddr 或者 wddr == raddr 。 如果按照这种判断,显然这两个地址追上对方的判断是等效的,无法区分出来到底是写追上读还是读追上写。

因此一种方式是可以考虑: 使用 1 个标志位 flag 来额外指示写追上读还是读追上写。

以一个 4 深度的 FIFO 实例来说明, 4 深度原本需要 2 bit 的读写地址,现在扩展成 3 bit 。

使用低 2 位来进行双口 RAM 的地址索引,高位用于判断空满。 对于空信号,可以知道当 FIFO 里没有待读出的数据时产生。 也就是说,此时读追上了写,把之前写的数据刚刚全部都出,读地址和写地址此时指向相同的位置,即raddr == waddr

对于写满信号,当写入后还没被读出的数据恰好是 FIFO 深度的时候,产生满信号,即写地址 - 读地址 = FIFO 深度 = 4 。 对照下图可以发现,此时对于双口 RAM 的 2 bit 的地址来说,读写地址一致; 对于最高位来所,写是 1 而读是 0 。

再考虑下图所示的一种情况,写入待读出的数据仍然是 4 个,此时也是 4 深度的 FIFO 已经满了。 读写地址的低位相同,高位是写 0 读 1 。

异步FIFO设计代码如下所示:

//利用双口RAM实现异步FIFOmodule async_fifo
#(parameter DW = 8,        //数据宽度parameter AW = 4         //数据深度
)
(input           wclk,      input           rclk,  input           wrstn,input           rrstn,   input           wen,  input [DW-1:0]  wdata,  output          wfull,   //写满信号input           ren,  output [DW-1:0] rdata,output          rempty   //读空信号
);reg [AW:0] waddr;reg [AW:0] raddr;//sync_w2rwire [AW:0] wptr = waddr ^ {1'b0, waddr[AW:1]}; //转换为Gray Codereg  [AW:0] w2r_wptr1, w2r_wptr2;always @ (posedge rclk or negedge rrstn) begin  //用读时钟来同步写端信号if (!rrstn) beginw2r_wptr1 <= 0;w2r_wptr2 <= 0;endelse beginw2r_wptr1 <= wptr;w2r_wptr2 <= w2r_wptr1;endend//sync_r2wwire [AW:0] rptr = raddr ^ {1'b0, raddr[AW:1]};  //将二进制转换为Gray Codereg  [AW:0] r2w_rptr1, r2w_rptr2;always @ (posedge wclk or negedge wrstn) begin   //用写时钟来同步读端信号if (!wrstn) beginr2w_rptr1 <= 0;r2w_rptr2 <= 0;endelse beginr2w_rptr1 <= rptr;r2w_rptr2 <= r2w_rptr1;endend//statusassign rempty = (w2r_wptr2 == rptr);    assign wfull  = (wptr == {~r2w_rptr2[AW:AW-1], r2w_rptr2[AW-2:0]});  //写指针等于读指针最高位取反时表示满wire wr_flag = !wfull & wen;     //FIFO非满且写使能wire rd_flag = !rempty & ren;    //FIFO非空且读使能always @ (posedge wclk or negedge wrstn) beginif (!wrstn)waddr <= 0;else if (wr_flag)waddr <= waddr + 1'b1;elsewaddr <= waddr;endalways @ (posedge rclk or negedge rrstn) beginif (!rrstn)raddr <= 0;else if (rd_flag)raddr <= raddr + 1'b1;elseraddr <= raddr;endfull_dp_ram #(.DW          (DW),.AW          (AW)) ram (.clk_a       (wclk),.wen_a       (wr_flag),.ren_a       (1'b0),                //A口仅用于写.addr_a      (waddr[AW-1:0]),.wdata_a     (wdata),.rdata_a     (),.clk_b       (rclk),.wen_b       (1'b0),                //B口仅用于读.ren_b       (rd_flag),.addr_b      (raddr[AW-1:0]),.wdata_b     (0),.rdata_b     (rdata));endmodule

由于涉及异步时钟,因此需要读端到写端信号的同步和写端到读端的信号同步。异步FIFO在这里每个口只用作一种用途(读或写)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/34363.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

专题三:穷举vs暴搜vs深搜vs回溯vs剪枝

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是穷举vs暴搜vs深搜vs回溯vs剪枝&#xff0c;并且掌握其算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不…

停更期李子柒品牌线上破亿,电商内容营销策略怎样重塑升级?

11月13日&#xff0c;李子柒在接受新华网记者的专访时被问到了“未来的商业化考虑”。她表示&#xff1a;“肯定会有这方面的考虑&#xff0c;只是目前还没有特别明确的规划。我就想继续做我自己喜欢的事情&#xff0c;如果这件事情能够被认同&#xff0c;而且它是有价值的&…

2020年国赛高教杯数学建模E题校园供水系统智能管理解题全过程文档及程序

2020年国赛高教杯数学建模 E题 校园供水系统智能管理 原题再现 校园供水系统是校园公用设施的重要组成部分&#xff0c;学校为了保障校园供水系统的正常运行需要投入大量的人力、物力和财力。随着科学技术的发展&#xff0c;校园内已经普遍使用了智能水表&#xff0c;从而可以…

【SpringBoot】使用IDEA创建SpringBoot项目

1、使用SpringBoot脚手架创建 我们使用SpringBoot的脚手架Spring Initializr创建&#xff0c;如图所示&#xff1a; 2、选择SpringBoot版本 最开始做项目时候&#xff0c;组长说创建一个 springboot 2.5.4 的项目&#xff0c;mysql使用 5.6.X &#xff0c;maven使用是3.6.X…

MFC实现全屏功能

之前全屏都是参考&#xff1a; MFC单文档&#xff08;SDI&#xff09;全屏程序的实现 主要思路就是将各种菜单工具栏隐藏恢复。 随着MFC的升级&#xff0c;MFC框架本身就具备了全屏的功能。 微软有一个全屏实现类&#xff1a; CFullScreenImpl Class managing full-screen mod…

灰狼算法与蚁群算法的结合:一种新颖的优化方法

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Mybatis要点总结

MyBatis 是一款优秀的 持久层 框架 &#xff0c;用于简化 JDBC 的开发。 Java Data Base Connectivity&#xff08;Java语言连接数据库&#xff09; 数据库连接池 数据库连接池的好处&#xff1a; 资源重用 提升系统响应速度 避免数据库连接遗漏 常见的数据库连接池&…

前缀和(八)矩阵区域和

1314. 矩阵区域和 给你一个 m x n 的矩阵 mat 和一个整数 k &#xff0c;请你返回一个矩阵 answer &#xff0c;其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和&#xff1a; i - k < r < i k, j - k < c < j k 且(r, c) 在矩阵内。 示例 1&…

不一样的CSS(4)--icon图标系列之svg

序言 上一节内容我们讲解了如何利用css去画一个五角星&#xff0c;其中包括了使用svg的方法&#xff0c;有些小伙伴们对svg的使用不是很了解&#xff0c;那么本节内容我们主要来讲一下&#xff0c;关于svg标签的的使用。 目录 序言一、svg的介绍二、安装SVG扩展插件三、SVG基…

读取文件进度条

一、widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMenuBar> #include <QFileDialog> #include <QFile> #include <QDebug> #include <QTimer> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NA…

js this

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>this</title> </head> <body> <script>let fengfeng "枫枫"console.log(this)// alert("123")funct…

wordpress网站安装了Linux宝塔面板,限制IP地址访问网站,只能使用域名访问网站

一、Linux服务器安装Linux宝塔面板 这个步骤参考网上其他教程。 二、Linux宝塔面板部署wordpress网站 这个步骤参考网上其他教程&#xff0c;保证网站能够正常访问&#xff0c;并且使用Linux宝塔面板申请并部署了SSL证书&#xff0c;使用https协议默认443端口正常访问。 三…

软考高级架构-9.4.4-双机热备技术 与 服务器集群技术

一、双机热备 1、特点&#xff1a; 软硬件结合&#xff1a;系统由两台服务器&#xff08;主机和备机&#xff09;、一个共享存储&#xff08;通常为磁盘阵列柜&#xff09;、以及双机热备软件&#xff08;提供心跳检测、故障转移和资源管理功能的核心软件&#xff09;组成。 …

电子商务人工智能指南 1/6 - 搜索、广告和发现

介绍 81% 的零售业高管表示&#xff0c; AI 至少在其组织中发挥了中等至完全的作用。然而&#xff0c;78% 的受访零售业高管表示&#xff0c;很难跟上不断发展的 AI 格局。 近年来&#xff0c;电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…

论文 | EfficientRAG: Efficient Retriever for Multi-Hop Question Answering

1. 论文介绍与研究动机 本文提出了一个新的检索增强生成&#xff08;RAG&#xff09;方法——EfficientRAG&#xff0c;它专门用于解决复杂的多跳问题。在多跳问答中&#xff0c;问题的答案需要从多个信息源中检索并结合起来&#xff0c;远比单跳问题复杂&#xff0c;因此也更加…

超详细搭建PhpStorm+PhpStudy开发环境

刚开始接触PHP开发&#xff0c;搭建开发环境是第一步&#xff0c;网上下载PhpStorm和PhpStudy软件&#xff0c;怎样安装和激活就不详细说了&#xff0c;我们重点来看一看怎样搭配这两个开发环境。 前提&#xff1a;现在假设你已经安装完PhpStorm和PhpStudy软件。 我的PhpStor…

Linux U-Boot 启动流程详解

目录 一、引言 二、U-Boot 启动前的准备 三、U-Boot 的启动流程 1.第一阶段&#xff1a;SPL&#xff08;Secondary Program Loader&#xff09;启动 2.第二阶段&#xff1a;U-Boot 主程序初始化 3.第三阶段&#xff1a;内核加载 4.第四阶段&#xff1a;参数传递 5.第五阶…

[Redis#16] 事务 | vs Mysql | 命令 | WATCH的实现

目录 什么是事务 实现事务的方式 Redis 事务与 MySQL 事务的对比 应用场景&#xff1a;防止超卖 Lua 脚本增强 事务操作 MULTI & EXEC DISCARD WATCH WATCH 的实现原理 什么是事务 [MySQL#12] 事务(1) | ACID | commit | 回滚 | 常见操作 Redis 的事务和 MySQL…

day03-分析产品原型-课程

1. 开发流程 2. 分析产品原型 2.1 业务流程 产品原型图&#xff1a; 两个业务模块之间使用异步通信 2.2 查询课程列表-接口 https://apifox.com/apidoc/shared-3076deb7-ecde-4519-8e57-390d336aef4c 2.2.1 课表VO 前端课表的相关参数&#xff1a; 现在还不能一步到位&a…

电子商务人工智能指南 2/6 - 需求预测和库存管理

介绍 81% 的零售业高管表示&#xff0c; AI 至少在其组织中发挥了中等至完全的作用。然而&#xff0c;78% 的受访零售业高管表示&#xff0c;很难跟上不断发展的 AI 格局。 近年来&#xff0c;电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…