跨时钟域设计方法-握手协议、异步FIFO

这篇具有很好参考价值的文章主要介绍了跨时钟域设计方法-握手协议、异步FIFO。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、握手协议

当由快时钟跨到慢时钟时,为了避免采不到信号这种情况,通常运用电平展宽、脉冲同步器、或者是握手处理。

异步信号跨时钟域处理握手,fpga开发
图中所示,发送端时钟是clk1,接收端时钟是clk2,当发送端接收到外部传过的数据时,准备就绪时拉高t_req,向接收端发送该信号表示我准备好传输了你准备好接收了吗,该信号到达接收端后进行两级同步器,为什么两级同步,主要是如果是快转慢,你需要用这种方式来展宽信号电平,这里由于是慢转快,仅仅两级同步就是 为了减小亚稳态发生的概率,两级同步时在接收端的时钟clk2下发生的,两级同步后得到t_req_rr,在下一个clk2时钟沿来时发现t_req_rr为高,进行拉高ack,表示我接受到你的请求了,同时开始采集数据,此时的数据最稳定,当发送端接收到这个ack信号后,进行同步处理,同样是两级同步得到re_ack_rr信号,在clk1上升沿识别到该信号为1后,在下一个时钟沿,时拉低req,表示发送端不在向接收端请求发送;半握手结束;
接下来进行全握手的部分:
当拉低的req信号,再次经过clk2两级同步后得到req_rr为0时,下一个时钟沿拉低ack信号,表示以及完成接收任务,该信号经过clk1发送时钟的两级同步后的ack_rr为0,下一个时钟沿来的时候进行下一次数据的传输,如果检测到总线有数据要传输,下一个时钟拉高req,重复以上传输;

异步信号跨时钟域处理握手,fpga开发

快时钟,转慢时钟时,如图所示:
当监测到总线上要传输数据时,传输器拉高req,req经过接收器的时钟des_clk的两级同步后得到des_req_syn2,在下一时钟上升沿拉高des_ack,且同时接收器开始采集数据,此时发送端通过将ack信号在发送端时钟下打两拍得到src_ack_sync2,后下一次时钟上升沿拉低req,同样马上接收端在就知道他拉低了req,经过两拍后再下一时钟沿拉低ack,ack信号在发送端时钟下经过两拍后再下一拍开始下一个数据的传输,同理如果有下一个数据则经过一拍拉高req请求传输。

二、代码

1.>top层:

module asynchronous_data(
input tclk,
input rclk,
input rstn,
input rrstn,
input [4:0] data_in,
output[4:0]data_out
);
 
 
wire req;
wire ack;
reg [4:0]tx_data;
 
tx tx_module(
.tclk(tclk),
.rstn(rstn),
.ack(rrstn),
.data_in(data_in),
.req(req),
.tx_data(tx_data)
);
 
rx rx_1(
.rclk(rclk),
.rrstn(rrstn),
.req(req),
.data_in(tx_data),
.ack(ack),
.rx_data(data_out)
);
 
endmodule


2.>t发送端:


module tx(
input tclk,
input rstn,
input ack,
input [4:0] data_in,
output req,
output reg[4:0]tx_data
);
 
 
wire ack_sync;
reg ack_sync1;
reg req_reg;
wire ack_syn_negedge;
always@(posedge tclk or negedge rstn)begin
	if(!rstn)begin
		tx_data<=0;
	end
	else if(ack_syn_negedge)begin
		tx_data<=data_in;
	end
end
 
reg_module reg_module1(
								.clk(tclk),
								.sig(ack),
								.rstn(rstn),
								.sig_reg(ack_sync)
							);
							
							
always@(posedge tclk or negedge rstn)begin
	if(!rstn)begin
		ack_sync1<=0;
	end
	else if(ack_syn_negedge)begin
		ack_sync1<=ack_sync;
	end
end
		
assign ack_syn_negedge=!ack_sync&ack_sync1;
 
 
always@(posedge tclk or negedge rstn)begin
	if(!rstn)begin
		req_reg<=0;
	end
	else if(ack_sync)begin
		req_reg<=0;
	end
	else begin
		req_reg<=1;
	end
end
	
assign req=	req_reg;
endmodule


3.接收端

module rx(
input rclk,
input rrstn,
input req,
input [4:0] data_in,
output ack,
output reg [4:0]rx_data
);
 
wire req_sync;
 
always@(posedge rclk or negedge rrstn)begin
	if(!rrstn)begin
		rx_data<=0;
	end
	else if(req_sync)begin
		rx_data<=data_in;
	end
end
 
reg_module reg_module1(
								.clk(rclk),
								.sig(req),
								.rstn(rrstn),
								.sig_reg(req_sync)
							);
		
assign ack =req_sync;
 
endmodule

4.调用两级同步

module reg_module(
input clk,
input rstn,
input sig,
output reg sig_reg
);
 
reg sig_reg0;
 
always@(posedge clk or negedge rstn)begin
	if(!rstn)begin
		sig_reg0<=0;
		sig_reg<=0;
	end
	else begin 
		sig_reg0<=sig;
		sig_reg<=sig_reg0;
	end
end
endmodule

总结

握手协议主要就是,我的信号传给你,要在你的时钟下进行两级同步后,参考我这个信号做出反映,反映后的信号传给我,我经过我的时钟下两级同步后,通过观测信号修改我刚刚的反映,这样,就不会传错了,但是由于每次信号交互都要两级同步,所以延迟较大,浪费不少资源,适合传输速度叫慢的进行传输。
引用:https://blog.csdn.net/yueqiu693/article/details/125073144文章来源地址https://www.toymoban.com/news/detail-656859.html

到了这里,关于跨时钟域设计方法-握手协议、异步FIFO的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FIFO】异步 FIFO 设计

    目录   写在前面 简介 传递多个异步信号 同步 FIFO 指针 异步FIFO指针 二进制 FIFO 指针注意事项 FIFO测试问题 格雷码计数器 ‑ 样式 #1 格雷码模式 格雷码计数器基础 额外的格雷码计数器注意事项 格雷码计数器 ‑ 样式 #2 处理满空情况 产生空标志 产生满标志 不同的时钟速度

    2024年02月02日
    浏览(62)
  • 跨时钟域处理(三)---握手

    在跨时钟域(一)中,我们介绍了 打两拍 的方法,尽管这个方法可以有效处理单bit跨时钟域信号的亚稳态问题,但是当发送方的时钟比接收方的时钟快时,有可能出现信号有效时间过段,接收方采样不到的情况。 握手 就是解决这一问题的有效方法,同时, 握手 还可以解决多

    2024年02月12日
    浏览(39)
  • FPGA中FIFO的应用(二)——异步FIFO设计

    ⭐️作者简介: 小瑞同学 ,一个努力精进的 FPGA 和通信学习者。 🍎个人主页:小瑞同学的博客主页 🌻个人信条:越努力,越幸运! ⏰日期:2023.12.3 🔍来源:自学经历 📖文章内容概述:介绍了 异步FIFO 的基本工作原理和深度计算,通过仿真观察了其读写过程。 连载系列

    2024年02月03日
    浏览(44)
  • IC设计入门——异步FIFO

    在异步FIFO中,数据读取和写入操作使用不同的时钟频率。由于写入和读取时钟不同步,因此称为异步FIFO。通常,这些用于数据需要从一个时钟域传递到另一个时钟域的系统中,这通常称为“时钟域交叉”。因此,异步FIFO有助于在两个工作于不同时钟的系统之间同步数据流。

    2024年02月19日
    浏览(43)
  • FIFO设计笔记(双口RAM、同步FIFO、异步FIFO)Verilog及仿真

    0.1、FIFO FIFO (First-In-First-Out) 是一种先进先出的数据缓存器,在数字ASIC设计中常常被使用。在实际开发中,多数都是直接使用公司经过top-out验证的FIFO IP或者是ISE/Vivado工具自带的FIFO IP,并不需要自己造轮子。但是,作为设计者,必须要掌握FIFO的设计方法,这样可以适配于各种

    2023年04月09日
    浏览(45)
  • FPGA的Verilog设计(二)——异步FIFO

    阅读本文前,建议先阅读下面几篇文章: 同步FIFO 二进制转格雷码的实现   在上篇文章同步FIFO中简要介绍了FIFO的基本概念以及同步FIFO的实现。本篇文章将重点介绍异步FIFO的工作原理以及硬件实现。   异步FIFO的读写时钟不同,FIFO的读写需要进行异步处理, 异步FIFO常用

    2024年02月04日
    浏览(50)
  • 可综合的异步FIFO的设计与仿真

    目录 综述 同步FIFO 异步FIFO 格雷码与二进制计数器 二进制计数器 格雷码 二进制双向箭头↔格雷码之间的相互转换 异步FIFO的代码实现 整体框图 格雷码做多bit信号同步 空满生成模块 存储器模块 读写指针同步模块 顶层模块 仿真 仿真情景1:写满 仿真情景2:读空 仿真情景3:

    2024年02月05日
    浏览(36)
  • <FPGA>异步FIFO的Verilg实现方法

            在上篇文章:同步FIFO的两种Verilog设计方法(计数器法、高位扩展法)中我们介绍了FIFO的基本概念,并对同步FIFO的两种实现方法进行了仿真验证。而异步FIFO因为读写时钟不一致,显然无法直接套用同步FIFO的实现方法,所以在本文我们将用Verilog实现异步FIFO的设计。

    2024年02月07日
    浏览(67)
  • 关于异步FIFO设计,这7点你必须要搞清楚

            在这篇文章,默认您已经对异步FIFO的设计方法有了基本的了解。         如果不了解异步FIFO设计的基本方法,可参考:异步FIFO的Verilg实现方法         格雷码是美国学者Frank Gray于1947年提出的一种二进制编码方式,后面这种编码方式就以他的名字命名。实际

    2024年02月07日
    浏览(61)
  • AXI4协议学习:架构、信号定义、工作时序和握手机制

    UG1037 不是 高级微控制器总线结构(advanced micro controller bus architecture,AMBA)ARM AXI4规范 的替代品,而是说明: 可用于创建基于AXI的IP的Xilinx工具。 被Xilinx采用的AXI功能。 将现有设计改为AXI接口的向导文件。 XIlinx 从Spartan-6和Virtex-6开始使用 高级可扩展接口(Advanced eXtensible In

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包