异步fifo_跨时钟域同步(异步FIFO)

06a194c563c494556f22d8c2926d4603.png

本文使用 Zhihu On VSCode 创作并发布

跨时钟域同步(异步FIFO)

之前学习了跨时钟域下的单bit信号同步的方法,这些单bit信号多是作为控制信号或者标志信号来使用,再实际的项目中,处理多bit数据也是十分常见的,即数据的同步。
异步FIFO的实现其实本质上和双口RAM是一样的,其实现思路就是将数据在src_clk的时钟下写入自己设定大小的ram中,然后通过读时钟des_clk从ram中将数据读出来即可。
本次还是以一个具体的例子来说明其实现,现在我们从一个较低的时钟域进入到一个较高的时钟域中,低时钟域的数据信号为8bit数据,现在需要将其缓存,并转换成32bit的信号送入32位宽的总线上进行传输。具体实现代码如下:

module nsync_fifo(input src_clk,input rst_n,input des_clk,input [8-1:0] fifo_data_in,input fifo_data_in_vaild,output reg  fifo_data_out_vaild,output [32-1:0] fifo_data_out);// write fifo
reg [1:0] buffer_wr_addr;
reg [32-1:0] temp_buffer;
always @(posedge src_clk or negedge rst_n)
beginif (!rst_n)beginbuffer_wr_addr <= 2'b00;endelsebeginbuffer_wr_addr <= (fifo_data_in_vaild) ? buffer_wr_addr + 1'b1 : buffer_wr_addr;end
endalways @(posedge src_clk)
beginif (fifo_data_in_vaild)begincase(buffer_wr_addr)2'd0:temp_buffer[0+:8] <=  fifo_data_in;2'd1:temp_buffer[8+:8] <=  fifo_data_in;2'd2:temp_buffer[16+:8] <=  fifo_data_in;2'd3:temp_buffer[24+:8] <=  fifo_data_in;endcaseend
end//gen wr_fifo signal && sync
reg fifo_wr;
reg fifo_wr_sync;
wire fifo_wr_clr;
reg fifo_wr_dfb;
always @(posedge src_clk)
beginfifo_wr <= (&buffer_wr_addr & fifo_data_in_vaild);
endassign fifo_wr_clr = !rst_n | fifo_wr_sync;  // feed backalways @(posedge fifo_wr or posedge fifo_wr_clr)
beginif (fifo_wr_clr)beginfifo_wr_dfb <= 1'b0;endelse beginfifo_wr_dfb <= 1'b1;end
endalways @(posedge des_clk)   // under des_clk sampled
beginfifo_wr_sync <= fifo_wr_dfb;
end// recv fifo
wire recv_fifo_wr;
reg [1:0] recv_fifo_wr_addr;assign recv_fifo_wr = fifo_wr_sync;
always @(posedge des_clk or rst_n)
beginif (!rst_n)beginrecv_fifo_wr_addr <= 2'b00;endelsebeginrecv_fifo_wr_addr <= (recv_fifo_wr) ? recv_fifo_wr_addr + 1'b1 : recv_fifo_wr_addr;end
end// sync fifo data
reg [32-1:0] fifo_0;
reg [32-1:0] fifo_1;
always @(posedge des_clk)
beginif (recv_fifo_wr)  // only buffer_wr_addr == 3 genbegincase (recv_fifo_wr_addr[0])1'b0 : fifo_0 <= temp_buffer;1'b1 : fifo_1 <= temp_buffer; endcaseend
end// read data from recv fifo
wire [1:0] recv_fifo_cnt;
wire recv_fifo_full;
wire recv_fifo_ready;
reg [1:0] recv_fifo_rd_addr;
assign recv_fifo_ready = | recv_fifo_cnt;
assign recv_fifo_full = recv_fifo_cnt[1]; // 2'b11 = 3
assign recv_fifo_cnt = recv_fifo_wr_addr - recv_fifo_rd_addr;always @(posedge des_clk or negedge rst_n)
beginif (!rst_n)beginrecv_fifo_rd_addr <= 2'b00;endelsebeginrecv_fifo_rd_addr <= (recv_fifo_ready) ? recv_fifo_rd_addr + 1'b1 : recv_fifo_rd_addr;end
endreg [32-1:0] recv_fifo_data;
always @(*)
begincase(recv_fifo_rd_addr[0])1'b0 : recv_fifo_data = fifo_0;1'b1 : recv_fifo_data = fifo_1;endcase
end// out 
assign fifo_data_out = recv_fifo_data;
always @(posedge des_clk or negedge rst_n)
beginif(!rst_n)beginfifo_data_out_vaild <= 1'b0;endelsebeginfifo_data_out_vaild <= recv_fifo_ready;end
endendmodule

从上面的代码可以发现,我这里将src_clk中的写信号fifo_wr通过上章讲解的单bit反馈同步方法同步到了des_clk的时钟域下fifo_wr_sync;这样后续的信号处理造作就可以在我们的目标时钟des_clk下进行操作了。因为这里需要缓存的数据很少,地址线就显得比较简单了,通过一个简单的乒乓操作不断将数据从buffer中写入fifo_0和fifo_1中;只要fifo不空,就开始读数据。时序如下:

5a7adf61e1d5d0df09557063f70aeadd.png
Image

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dumpbin发现没有入口函数_JavaScript基础之入口函数-2020版

JavaScript基础之入口函数-2020版1.入口函数window.onload function(){ 内部放js}这个函数的意思就是说&#xff0c;当我们页面加载完毕之后(就是说等页面的结构 样式 节点等加载完毕)&#xff0c;采取执行函数体里面的js部分。也就是说可以使用此方法&#xff0c;就不用考…

农委系统先进集体推荐报告_来自司法行政的他们,荣获上海档案系统表彰!

为表彰先进、弘扬正气&#xff0c;激发全市各级档案部门和广大档案工作者的积极性和创造性&#xff0c;进一步推进上海档案事业创新发展&#xff0c;经各地区、各部门、各单位民主推荐&#xff0c;市人力资源社会保障局和市档案局审核同意&#xff0c;决定授予50家集体“上海市…

java如何获得wlan mac_Android M 如何获取 Wifi MAC地址

今天在撸代码时发现&#xff0c;之前能获取mac地址的方法在nexus 6上返回了“02:00:00:00:00:00”&#xff0c;进入设置查看mac地址&#xff0c;结果不相同&#xff0c;肯定有问题&#xff0c;于是就开始上网查资料一探究竟。原先获取mac地址的代码段&#xff1a;6.0之前获取ma…

我的世界java多大内存_我的世界电脑版内存多大

下载方法如下&#xff1a;1&#xff0c;百度搜索 我的世界电脑版&#xff0c;即可找到下载。2&#xff0c;直接点击普通下载&#xff0c;即可下载。3&#xff0c;我的世界电脑版硬件要求如下&#xff1a;最低配置&#xff1a;CPU&#xff1a;1.5G GHz多和处理器/2.0GHz单核处理…

天正双击墙体不能编辑_今日设计分享:CAD常用快捷键、Ps快捷键大全、天正快捷键总结!...

▶今天记忆一个技巧&#xff0c;成就明天一个大师&#xff01;▶同行小可爱们&#xff0c;加油吧&#xff01;CAD最常用快捷键L直线&#xff1b;PL多段线&#xff1b;U回车Ctrlz后退&#xff1b;D修改&#xff0c;调整&#xff1b;REC矩形&#xff1b;C圆&#xff1b;TR修剪&am…

odoo tree视图过滤数据_数据存储结构 LSM Tree PK B TREE (从底层了解数据库设计)...

随着使用数据库的深度和理解能力的提升&#xff0c;有一个问题硬件的提升,与数据量的变化是否对数据库底层的架构有冲击。 我们公认的BTREE BTREE 是否还能面对现在的硬件的变化。 BTREE 到底是为那种硬件逻辑来服务的&#xff0c;这点是需要搞清楚的在MYSQL 中使用的BTREE的改…

java rpm包安装_rpm包安装java jar开机自启

1.下载jdk2.安装jdk&#xff1b;rpm -ivh jdk-8u201-linux-x64.rpm3.检查安装&#xff1a;java -version输出Java版本&#xff0c;则不用第4步和第5步4.配置jdk路径打开/etc/profile增加以下内容&#xff1a;export JAVA_HOME/usr/java/jdk1.8.0_201export JAVA_BIN/usr/java/j…

java电脑类的接口_java 一个类实现两个接口的案例

直接用英文逗号分隔就可以了&#xff0c;比如&#xff1a;?12345678910111213141516171819inerface IHello {String sayHello(String name);}interface IHi {String sayHi(String name);}class ServiceImplimplements IHello, IHi {// 实现三个四个。。。n个接口都是使用逗号分…

基于java二手书论文_java毕业设计_springboot框架的二手书交易管理与实现

今天介绍一个java毕设题目, 题目内容为springboot框架的二手书交易管理与实现, 是一个采用b/s结构的javaweb项目, 采用java语言编写开发工具eclipse, 项目框架jspspringbootmybatis, 二手书交易管理与实现的信息存储于mysql中, 并基于mybatis进行了orm封装, 该二手书交易管理与…

java怎么给list集合排序_java list集合排序按某一属性排序操作

我就废话不多说了&#xff0c;大家还是直接看代码吧~public List sortList(List list){Collections.sort(list, new Comparator(){Overridepublic int compare(FreightM o1, FreightM o2) {if(o1.getType()0){return -1;}else{return 1;}}});return list;}实现compareTo()方法&…

java字符流实际上也是字节,[Java教程]Java字节流与字符流的区别

[Java教程]Java字节流与字符流的区别0 2017-05-22 12:00:42字节流与和字符流的使用非常相似&#xff0c;两者除了操作代码上的不同之外&#xff0c;是否还有其他的不同呢&#xff1f;实际上字节流在操作时本身不会用到缓冲区(内存)&#xff0c;是文件本身直接操作的&#xff0c…

php获取html中文本框内容_小猿圈Python入门之批量获取html内body内容的方法

对于人工智能你了解有多少&#xff1f;你知道Python的使用吗&#xff1f;这个对于大部分初学者来说都是很难的&#xff0c;小猿圈Python讲师会每天为大家选择分享一个知识点&#xff0c;希望对你学习Python有所帮助&#xff0c;今天分享的就是批量获取html内body内容的方法。现…

php改名下载,PHP如何给上传的文件改名

PHP如何给上传的文件改名发布时间&#xff1a;2020-08-03 16:07:39来源&#xff1a;亿速云阅读&#xff1a;72作者&#xff1a;LeahPHP如何给上传的文件改名&#xff1f;相信很多没有经验的人对此束手无策&#xff0c;为此本文总结了问题出现的原因和解决方法&#xff0c;通过这…

python 循环 覆盖之前print内容_Python爬虫第二战---爬取500px图片

前言&#xff1a;如今的高速网络极大促进了信息的展示方式&#xff0c;高清图片&#xff0c;视频等成就了我们的视听盛宴。但是&#xff0c;我们获取到的图片或者视频可能是被压缩过的&#xff0c;所以总体上还是有点小瑕疵&#xff0c;今天呢&#xff0c;我给大家带来一篇使用…

php字符串分割tp模板,ThinkPHP 模板substr的截取字符串函数详解

ThinkPHP 模板substr的截取字符串函数在Common/function.php加上以下代码/**** 截取中文字符串**/function msubstr($str, $start0, $length, $charset"utf-8", $suffixtrue){if(function_exists("mb_substr")){$slice mb_substr($str, $start, $length, $…

vscode中如何创新建php文件,vscode如何创建代码模板

选择菜单里的 文件 > 首选项 > 用户代码片段选择你需要自定义模板的文件&#xff0c;以vue为例配置对应文件json把代码片段写在json里。每个代码段都是在一个代码片段名称下定义的&#xff0c;并且有prefix、body和description。prefix是用来触发代码片段的。使用 $1&…

php 利用个人邮箱,利用 Composer 完善自己的 PHP 框架(二)——发送邮件

利用 Composer 完善自己的 PHP 框架(二)——发送邮件2014-10-18 / 阅读数&#xff1a;23506 / 分类&#xff1a; PHP回顾上一篇文章中&#xff0c;我们手工建造了一个简易的视图加载器&#xff0c;顺便引入了错误处理包&#xff0c;让我们的 MFFC 框架在 M、V、C 三个方面都达到…

启动马达接线实物图_东元伺服驱动马达

东元伺服驱动马达&#xff0c;我公司主营德国SEW&#xff0c;德国法勒VAHLE, 德国UNING&#xff0c;德国同驰Tschan&#xff0c;意大利威卡WESTCAR&#xff0c;德国久茂JUMO&#xff0c;瑞士ABB等几大世界品牌产品。东元伺服驱动马达&#xff0c; 工业机器人电动伺服系统的一般…

三维数据平滑处理_黑白象片的密度信息 卫星数据处理 遥感制图 三维建模 善图科技...

黑白象片的密度信息象片上的黑白变化&#xff0c;可划分为若干等级&#xff0c;此等级称之为灰阶。象片上的灰阶数受洗印技术及目视分辨能力的限制&#xff0c;一般不超过10个灰阶。灰阶较多时&#xff0c;象片上层次分明易于分辨一些细节。但灰阶的增多必导至对比度相对下降&a…

oracle左连接数据会对不上吗,一周工作总结–左连接造成的一些问题-Oracle

一周工作总结–左连接造成的一些问题今天有同事告诉我&#xff0c;有个SQL执行了好久好久执行不出来&#xff0c;我说好就是多久&#xff1f;她说一天左右了。真是令人咋舌的SQL。于是我要来了SQL看了看执行计划&#xff0c;确实让人咋舌。下图中就是执行计划的截图&#xff1a…