异步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,一经查实,立即删除!

相关文章

think python 2ed_Think Python 2ed 笔记(二)

第六章 有返回值的函数1. 返回值&#xff1a;没有返回值的函数返回None2. 增量式开发&#xff1a;增量式开发的目标&#xff0c;是通过每次只增加和测试少量代码&#xff0c;来避免长时间的调试。该函数的最终版不会在运行时显示任何东西&#xff0c;仅仅返回一个值。 我们之前…

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

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

java相等_Java 判断相等

1.除 float 和 double 外的原始数据类型 : 使用 long a (long) 1234567890;long b (long) 1234567890;if (a b) {System.out.println("基本数据类型相等");}2.包装类使用 equals 或者转换为基本数据类型再用 Long a (long) 1234567890;Long b (long) 1234567890;i…

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

为表彰先进、弘扬正气&#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…

python docx官网_【记录】尝试用DocxyGen为Python代码生成文档

【背景】之前折腾技术的时候&#xff0c;或多或少&#xff0c;知道一个东西&#xff1a;DocxyGen是用于从代码生成文档的。最近&#xff0c;又从&#xff1a;->该地址无效&#xff0c;但是自己手动输入地址&#xff0c;而找到&#xff1a;看到页面右下角&#xff0c;就显示了…

我的世界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…

java获取spring注解的实体_Spring 注解实体类中非数据库字段属性

今天要给一个实体类添加一个List集合属性&#xff01;private List childList new ArrayList();写完后get/set方法一写&#xff0c;启动就报错&#xff1a;org.hibernate.MappingException: Could not determine type for: java.util.List, at table: T_REVERTS, for columns:…

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

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

java s结尾的工具类_FilenameUtils工具类

commons-iocommons-io2.4import java.util.ArrayList;import java.util.List;import org.apache.commons.io.FilenameUtils;import org.apache.commons.io.IOCase;/*** org.apache.commons.io.FilenameUtils工具类笔记* author*/public class FilenameUtilsTest {public static…

python类继承返回值_python继承threading.Thread实现有返回值的子类实例

继承与threading.thread实现有返回值的子类mythread&#xff0c;废话不多说&#xff0c;大家直接看代码import threadingclass mythread(threading.thread):def __init__(self,func,args()):super(mythread,self).__init__()self.func funcself.args argsdef run(self):self.…

python继承super函数_Python中的super函数如何实现继承?

本篇文章给大家带来的内容是关于Python 中的super函数如何实现继承?有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。Py 2.x 和 Py 3.x 中有一个很大的区别就是类&#xff0c;无论是类的定义还是类的继承。Py 3.x 中类的继承可以直接使用…

java逸出_Java并发编程 - 对象的共享

编写正确的并发程序&#xff0c;关键问题在于&#xff1a;在访问共享的可变状态时需要进行正确的管理。同步代码块和同步方法可以确保以原子的方式执行操作&#xff0c;同步还有另一个重要的方面&#xff1a;内存可见性。可见性为了确保多个线程之间对内存写入操作的可见性&…

mgr未同步 mysql_mysql8.0 搭建mgr踩坑记录

启动总是报错&#xff1a;2020-08-21T04:52:36.332502Z 10 [System] [MY-010597] [Repl] CHANGE MASTER TO FOR CHANNEL group_replication_applier executed. Previous state master_host, master_port 3306, master_log_file, master_log_pos 4, master_bind. New state mast…

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…

idea 保存设置 新建项目_配置、创建IntelliJ IDEA Spring MVC 项目

前言步骤&#xff0c;下载安装 IntelliJ IDEA及Tomcat 客户端、服务端下载安装&#xff0c;这些都配置完之后准备创建项目点击下一步修改完项目名称其他的名称也跟项目名称一样&#xff0c;我就改了保存位置其他都跟项目名称一样的名字&#xff0c;点击Finish后会下载本框架需要…

java+中的final关键字有哪些用法_Java中的Final关键字用法汇总及简单示例

可能使用到final的情况有3种&#xff1a;数据、方法和类。一、final数据对于基本类型&#xff0c;final使数值恒定不变&#xff1b;而对于对象引用&#xff0c;final使引用恒定不变。一旦引用被初始化指向一个对象&#xff0c;就无法把它改为指向另一个对象。然而&#xff0c;对…

mr图像翻转的原因_MRI图像常见问题及对策

1MRI图像常见伪影及对策伪影是指MR图像中与实际解剖结构不相符的信号&#xff0c;可以表现为图像变形、重叠、缺失、模糊等。每一幅MRI图像都存在不同程度的伪影。MRI检查中伪影主要造成三个方面的问题&#xff1a;(1)使图像质量下降&#xff0c;甚至无法分析&#xff1b;(2)掩…

java icon动态变换,以编程方式自动更改ImageIcon [Java]

I am making a simple game right now. When a JButton is clicked, the ImageIcon of a JLabel is supposed to change. How can I accomplish this?解决方案Simple, just quickly run setIcon() on the JLabel via the action listener of the button.An example:if ("…