同步FIFO的verilog实现(1)——计数法
一、FIFO概述
1、FIFO的定义
FIFO是英文First-In-First-Out的缩写,是一种先入先出的数据缓冲器,与一般的存储器的区别在于没有地址线, 使用起来简单,缺点是只能顺序读写数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
2、FIFO的作用
(1)跨时钟域的数据传输
(2)对不同宽度的数据进行位宽转换
(3)数据缓存
3、FIFO的分类
根据FIFO工作的时钟域的不同,可以将FIFO分为以下两类
(1)同步FIFO:读时钟和写时钟为同一个时钟,在时钟沿来临时同时发生读写操作。常用于对不同宽度的数据进行位宽转换
(2)异步FIFO:读写时钟不一致,读写操作是互相独立的。常用于跨时钟域的数据传输
4、FIFO的一些重要参数
(1)FIFO宽度:指的是FIFO读写的数据位,就像MCU有8位和16位,ARM 32位等等,FIFO的宽度在单片成品IC中是固定的,也有可选择的,如果用FPGA自己实现一个FIFO,其数据位,也就是宽度是可以自己定义的。
(2)FIFO深度:指的是FIFO可以存储多少个N位的数据(假设FIFO宽度为N)。
(3)满标志(full):FIFO已满或将要满时由FIFO送出的状态信号,以阻止FIFO的写操作,避免数据溢出。
(4)空标志(empty):FIFO已空或将要空时由FIFO送出的状态信号,以阻止FIFO的读操作,避免数据读空。
(5)读时钟:读操作的时钟,在每个时钟沿来临时读数据。
(6)写时钟:写操作的时钟,在每个时钟沿来临时写数据。
(7)读指针:指向下一个要读出的地址,读完后自动加1。
(8)写指针:指向下一个要写入的地址,写完后自动加1。
读写指针其实就是读写的地址,只不过这个地址不能任意选择,而是连续的。
二、同步FIFO
FIFO设计的关键在于读写指针的设计和生成可靠的空满信号。
1、读写指针
- 读指针:总是指向下一个将要读取的单元,复位时指向第一个单元(编号为0)。
- 写指针:总是指向当前要被读出的数据,复位时指向第一个单元(编号为0)。
2、空/满信号
FIFO设计中最重要的是空(Empty)、满(Full)信号的判断。
当第一次读写指针相等时,表明FIFO为空,这种情况发生在复位操作时或者当读指针读出FIFO中最后一个字后,追赶上写指针时,此时读空信号有效:
当读写指针再次相等时,表明FIFO为满,这种情况发生在,当写指针转了一圈折回来(wrapped around)又追上了读指针:
两种方式都是以读写指针相等作为判断标志,所以我们需要寻找其它的方法进行判断。
三、计数法实现同步FIFO
在同步FIFO中,我们可以很容易的使用计数来判断FIFO中还剩下多少可读的数据,从而可以判断空、满
1、verilog实现
//------------------------<计数法设计同步FIFO>----------------------------
module sync_fifo#(
//-----------------------------<参数定义>---------------------------------parameter FIFO_WIDTH = 16, //FIFO宽度parameter FIFO_DEPTH = 16 //FIFO深度
)(
//-----------------------------<接口定义>---------------------------------input clk, //时钟信号input rst, //复位信号input [FIFO_WIDTH-1:0] din, //FIFO输入数据(写数据)input rd_en, //读使能信号 input wr_en, //写使能信号output reg [FIFO_WIDTH-1:0] dout, //FIFO输出数据(读数据) output empty, //FIFO空标志 output full, //FIFO满标志output reg [$clog2(FIFO_DEPTH):0] fifo_cnt //$clog2是以2为底取对数
); //-----------------------------<reg定义>---------------------------------reg [FIFO_WIDTH-1:0] fifo_buffer[FIFO_DEPTH-1:0]; //用二维数组实现RAM reg [$clog2(FIFO_DEPTH)-1:0] wr_addr; //写地址(写指针)reg [$clog2(FIFO_DEPTH)-1:0] rd_addr; //读地址(读指针) //-----------------------------<读操作>-----------------------------------
always@(posedge clk or posedge rst)begin if(rst)rd_addr <= 0;else if(rd_en && !empty)begin //读使能有效且FIFO非空rd_addr <= rd_addr + 1'd1; //读指针递增dout <= fifo_buffer[rd_addr]; //fifo读出数据endelse beginrd_addr <= rd_addr; dout <= dout;end
end//-----------------------------<写操作>-----------------------------------
always@(posedge clk or posedge rst)begin if(rst)wr_addr <= 0;else if(wr_en && !full)begin //写使能有效且FIFO非满wr_addr <= wr_addr + 1'd1; //读指针递增fifo_buffer[wr_addr] <= din; //数据写入fifoendelse beginwr_addr <= wr_addr; end
end//-----------------------------<fifo_cnt>-----------------------------------
always@(posedge clk or posedge rst)begin if(rst)fifo_cnt <= 0;else if(wr_en && !full && !rd_en) //只写不读且FIFO没有满,fifo_cnt递增fifo_cnt <= fifo_cnt + 1'd1; else if(rd_en && !empty && !wr_en) //只读不写且FIFO没有空,fifo_cnt递减fifo_cnt <= fifo_cnt - 1'd1; else //同时读写或者不读不写,fifo_cnt不变fifo_cnt <= fifo_cnt;
end//-----------------------------<空/满信号>-----------------------------------
assign full = (fifo_cnt == FIFO_DEPTH) ? 1'b1 : 1'b0; //满信号
assign empty = (fifo_cnt == 0) ? 1'b1 : 1'b0; //空信号endmodule
2、功能测试
`timescale 1ns/1ns
//-----------------------------<计数法同步FIFO测试>---------------------------------
module tb_sync_fifo();parameter WIDTH = 8;parameter DEPTH = 8;reg clk ;reg rst ;reg [WIDTH-1:0] din ;reg wr_en ;reg rd_en ;wire [WIDTH-1:0] dout ;wire full ;wire empty ;wire [$clog2(DEPTH):0] fifo_cnt;//-----------------------------<测试模块例化>---------------------------------
sync_fifo #(.FIFO_WIDTH (WIDTH), //FIFO宽度.FIFO_DEPTH (DEPTH) //FIFO深度
)
sync_fifo_u1(.clk (clk ),.rst (rst ),.din (din ),.rd_en (rd_en ),.wr_en (wr_en ),.dout (dout ), .empty (empty ), .full (full ),.fifo_cnt (fifo_cnt )
);//-----------------------------<模块测试>---------------------------------
initial beginclk = 1'b0; //初始时钟为0rst <= 1'b0; //初始复位din <= 'd0; wr_en <= 1'b0; rd_en <= 1'b0;
#10rst <= 1'b1;
#10 rst <= 1'b0;repeat(10)#10 beginwr_en <= 1'b1;rd_en <= 1'b0;din <= $random; //生成8位的随机数endrepeat(10)#10 beginwr_en <= 1'b0;rd_en <= 1'b1;end
$finish;
end//------------------------------<设置时钟>----------------------------------------
always #5 clk = ~clk; endmodule
3、测试结果
相关文章:
同步FIFO的verilog实现(1)——计数法
一、FIFO概述 1、FIFO的定义 FIFO是英文First-In-First-Out的缩写,是一种先入先出的数据缓冲器,与一般的存储器的区别在于没有地址线, 使用起来简单,缺点是只能顺序读写数据,其数据地址由内部读写指针自动加1完成&…...
python正则表达式笔记1
最近工作中经常用到正则表达式处理数据,慢慢发现了正则表达式的强大功能,尤其在数据处理工作中,记录下来分享给大家。 一、 正则表达式语法介绍 正则表达式(或 RE)指定了一组与之匹配的字符串;模块内的函…...
YOLO目标检测——口罩规范佩戴数据集+已标注xml和txt格式标签下载分享
实际项目应用:目标检测口罩佩戴检测数据集的应用场景涵盖了公共场所监控、疫情防控管理、安全管理与控制以及人员统计和分析等领域。这些应用场景可以帮助相关部门和机构更好地管理口罩佩戴情况,提高公共卫生和安全水平,保障人们的健康和安全…...
Android 13 - Media框架(9)- NuPlayer::Decoder
这一节我们将了解 NuPlayer::Decoder,学习如何将 MediaCodec wrap 成一个强大的 Decoder。这一节会提前讲到 MediaCodec 相关的内容,如果看不大懂可以先跳过此篇。原先觉得 Decoder 部分简单,越读越发现自己的无知,Android 源码真…...
23.09.5 《CLR via C#》 笔记5
第六章 类型和成员基础 类型可以定义0或多个以下成员:常量、字段、实例构造器、类型构造器、方法、操作符重载、转换操作符、属性、事件、类型类型的可见性分为public和internal(默认)C#中,成员的可访问性分为private、protected、internal、protected …...
laravel部署api项目遇到问题总结
laravel线上部署问题 一、Ubuntu远程Mysql 61“Connection refused”二、Ubuntu更新php8三、线上部署Permission denied3.1、部署完之后访问域名出现报错:3.2、The /bootstrap/cache directory must be present and writable. 四、图片访问404五、git部署线上文件 一…...
lintcode 1646 · 合法组合【字符串DFS, vip 中等 好题】
题目 https://www.lintcode.com/problem/1646 给一个单词s,和一个字符串集合str。这个单词每次去掉一个字母,直到剩下最后一个字母。求验证是否存在一种删除的顺序,这个顺序下所有的单词都在str中。例如单词是’abc’,字符串集合是{‘a’,’…...
【多线程】线程安全 问题
线程安全 问题 一. 线程不安全的典型例子二. 线程安全的概念三. 线程不安全的原因1. 线程调度的抢占式执行2. 修改共享数据3. 原子性4. 内存可见性5. 指令重排序 一. 线程不安全的典型例子 class ThreadDemo {static class Counter {public int count 0;void increase() {cou…...
【用unity实现100个游戏之11】复刻经典消消乐游戏
文章目录 前言开始项目开始一、方块网格生成二、方块交换三、添加交换的动画效果四、水平消除检测五、垂直消除检测六、完善删除功能七、效果优化(移动方块后再进行消除检测)八、方块下落十、方块填充十一、后续 源码参考完结 前言 欢迎来到经典消消乐游…...
若依cloud 修改包名等
一、项目的项目名。 先改pom 然后在重命名文件 1、 修改主pom.xml <artifactId>ruoyi-api</artifactId> 缓存 <artifactId>zxf-api</artifactId> <groupId>com.ruoyi</groupId> <groupId>com.zhixiaofeng</groupId> 2、…...
健康系统练习
健康系统 项目建构: 前后端分离,前端vue3,后端Java,springboot做跨域处理,前端将在vscode中 的tomcat下部署,后端将在ideal中集成的tomcat中部署 创建项目工程在ideal中直接选用springi…创建,…...
网络协议从入门到底层原理学习(一)—— 简介及基本概念
文章目录 网络协议从入门到底层原理学习(一)—— 简介及基本概念一、简介1、网络协议的定义2、网络协议组成要素3、广泛的网络协议类型网络通信协议网络安全协议网络管理协议 4、网络协议模型对比图 二、基本概念1、网络互连模型2、计算机之间的通信基础…...
centos密码过期导致navicat无法通过SSH登录阿里云RDS问题
具体错误提示:2013 - Lost connection to server at "hand hake: reading initial communication packet, system error: 0 解决办法:更新SSH服务器密码...
对于pytorch和对应pytorch网站的探索
一、关于网站上面的那个教程: 适合PyTorch小白的官网教程:Learning PyTorch With Examples - 知乎 (zhihu.com) 这个链接也是一样的, 总的来说,里面讲了这么一件事: 如果没有pytorch的分装好的nn.module用来继承的话,需要设计…...
和AI聊天:动态规划
动态规划 动态规划(Dynamic Programming,简称 DP)是一种常用于优化问题的算法。它解决的问题通常具有重叠子问题和最优子结构性质,可以通过将问题分解成相互依赖的子问题来求解整个问题的最优解。 动态规划算法主要分为以下几个步…...
微信小程序——使用插槽slot快捷开发
微信小程序的插槽(slot)是一种组件化的技术,用于在父组件中插入子组件的内容。通过插槽,可以将父组件中的一部分内容替换为子组件的内容,实现更灵活的组件复用和定制。 插槽的使用步骤如下: 在父组件的wx…...
大数据技术之Hadoop:使用命令操作HDFS(四)
目录 一、创建文件夹 二、查看指定目录下的内容 三、上传文件到HDFS指定目录下 四、查看HDFS文件内容 五、下载HDFS文件 六、拷贝HDFS文件 七、HDFS数据移动操作 八、HDFS数据删除操作 九、HDFS的其他命令 十、hdfs web查看目录 十一、HDFS客户端工具 11.1 下载插件…...
静态路由配置实验:构建多路由器网络拓扑实现不同业务网段互通
文章目录 一、实验背景与目的二、实验拓扑三、实验需求四、实验解法1. 配置 IP 地址2. 按照需求配置静态路由,实现连接 PC 的业务网段互通 摘要: 本实验旨在通过配置网络设备的IP地址和静态路由,实现不同业务网段之间的互通。通过构建一组具有…...
Python函数的概念以及定义方式
一. 前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 二. 什么是函数? 假设你现在是一个工人,如果你实现就准备好了工具,等你接收到任务的时候, 直接带上工…...
【数学建模竞赛】超详细Matlab二维三维图形绘制
二维图像绘制 绘制曲线图 g 是表示绿色 b--o是表示蓝色/虚线/o标记 c*是表示蓝绿色(cyan)/*标记 ‘MakerIndices,1:5:length(y) 每五个点取点(设置标记密度) 特殊符号的输入 序号 需求 函数字符结构 示例 1 上角标 ^{ } title( $ a…...
2023国赛数学建模E题思路代码 黄河水沙监测数据分析
E题最大的难度是数据处理,可以做一个假设,假设一定时间内流量跟含沙量不变,那么我们可以对数据进行向下填充,把所有的数据进行合并之后可以对其进行展开特性分析,在研究调水调沙的实际效果时,可以先通过分析…...
窗口延时、侧输出流数据处理
一 、 AllowedLateness API 延时关闭窗口 AllowedLateness 方法需要基于 WindowedStream 调用。AllowedLateness 需要设置一个延时时间,注意这个时间决定了窗口真正关闭的时间,而且是加上WaterMark的时间,例如 WaterMark的延时时间为2s&…...
发送HTTP请求
HTTP请求是一种客户端向服务器发送请求的协议。它是基于TCP/IP协议的应用层协议,用于在Web浏览器和Web服务器之间传输数据。 HTTP请求由以下几个部分组成: 请求行:包含请求方法、请求的URL和HTTP协议的版本。常见的请求方法有GET、POST、PUT、…...
高等工程数学张韵华版第四章课后题答案
下面答案仅供参考! 章节目录 第4章 欧氏空间和二次型 4.1内积和欧氏空间 4.1.1内积的定义 4.1.2欧氏空间的性质 4.1.3 正交投影 4.1.4 施密特正交化 4.2 正交变换和对称变换 4.2.1 正交变换 4.2.2 正交矩阵 4.2.3 对称变换 4.2.4 对称矩阵 4.3 二…...
wpf C# 用USB虚拟串口最高速下载大文件 每包400万字节 平均0.7s/M,支持批量多设备同时下载。自动识别串口。源码示例可自由定制。
C# 用USB虚拟串口下载大文件 每包400万字节 平均0.7s/M。支持批量多设备同时下载。自动识别串口。可自由定制。 int 32位有符号整数 -2147483648~2147483647 但500万字节时 write时报端口IO异常。可能是驱动限制的。 之前用这个助手发文件,连续发送࿰…...
代码随想录二刷day20
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣654. 最大二叉树二、力扣617. 合并二叉树三、力扣700. 二叉搜索树中的搜索四、力扣98. 验证二叉搜索树 前言 一、力扣654. 最大二叉树 /*** Definitio…...
Yolov5如何训练自定义的数据集,以及使用GPU训练,涵盖报错解决
本文主要讲述了Yolov5如何训练自定义的数据集,以及使用GPU训练,涵盖报错解决,案例是检测图片中是否有救生圈。 最后的效果图大致如下: 效果图1效果图2 前言 系列文章 1、详细讲述Yolov5从下载、配置及如何使用GPU运行 2、…...
设计模式之单列模式
单列模式是一种经典的设计模式,在校招中最乐意考的设计模式之一~ 设计模式就是软件开发中的棋谱,大佬们针对一些常见的场景,总结出来的代码的编写套路,按照套路来写,不说你写的多好,至少不会太差~ 在校招中…...
linux内核模块编译方法详解
文章目录 前言一、静态加载法1.1 编写驱动程序1.2 将新功能配置在内核中1.3为新功能代码改写Makefile1.4 make menuconfig界面里将新功能对应的那项选择为<*> 二、动态加载法2.1 新功能源码与Linux内核源码在同一目录结构下2.2 新功能源码与Linux内核源码不在同一目录结构…...
简介shell的关联数组与普通数组
本文首先介绍shell的关联数组,然后介绍shell的普通数组,最后总结它们的共同语法。 shell的关联数组 定义一个关联数组,并打印它的key-value对 #!/bin/sh# 声明一个关联数组 declare -A HASH_MAP# 给关联数组赋值 HASH_MAP["Tom"…...
想做网站去哪里做/2345浏览器下载
一仅仅猴子第一天摘下若干个桃子,当即吃了一半,还只是瘾。又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见仅仅剩下一个桃子了。问&…...
建设网站花都区/黑科技引流推广神器免费
flowplayer这是我编写的一些代码,试图在Flowplayer中的2个实时流之间进行同步。 代码 // param stream – Flowplayer视频流对象的名称。 Flowplayer.syncStream function(stream) { var syncThreshold 5; //流之间的最大长度为5秒 …...
wordpress 界面英文版/seo优化网页
上回我们已经会用基本的控件创建Windows窗体应用,这才我们再来认识一些高级控件并使用ADO.NET技术连接数据库来创建功能更坚强大的窗体应用! 菜单栏控件MenuStrip .NET中提供了一个MenuStrip(菜单栏控件)如图, 使我们…...
网站建设中iis/交换友情链接推广法
逆滤波法在图像复原中的应用吴雪垠;吴谨;张鹤【期刊名称】《信息技术》【年(卷),期】2011(000)010【摘要】针对逆滤波图像复原算法进行研究,在已知系统退化模型的情况下,对退化图像使用逆滤波算法进行复原,再对复原后的图像进行平滑处理,使其更接近于原始图像.文中使用VisualC6…...
网站源码在哪里/下载app
使用vim编辑文件时,如果想显示行号,可以在命令模式下输入:set nu,如下: 但这是针对单个文件操作,如果想在全局范围内使用vim 打开文件就显示行号,可以修改/etc/vim/vimrc(我用的ubun…...
白银网站建设熊掌号/神马搜索推广
在Linux系统中需要使用SSH远程登录到另一个Linux系统,可以使用SSH命令加用户和IP地址的方法。 ssh root192.168.0.100 ssh命令用于远程登录上的Linux主机。 常用格式:ssh [-l login_name] [ –p port] [userhostname] 例如 不指定用户: ssh 1…...