跨时钟域处理(三)---握手

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

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

同步握手

同一时钟控制下的握手过程比较简单,这里以著名的AXI4协议为例,如下图所示
跨时钟域握手,数字IC设计,FPGA,fpga开发,数字ic设计,systemverilog
发送方要发送数据的时候,就拉高VALID信号,同时把要发送的数据放到数据总线上,接受方看到VALID信号为高,并且自己也有时间接受数据,于是拉高READY信号,表示数据已经被接收,发送方看到接受方已完成数据的接收,于是拉低VALID信号,同时接收方也拉低READY信号,一次握手完成。可以看到,在上图的情况中,数据的读取发生在VALID和READY信号同为高的时候,这就是一个典型的握手过程。

异步握手

在跨时钟域的情况下,握手的过程略有不同,首先,为了防止亚稳态的出现,我们必须将VALID信号同步到接收方的时钟域中,同时,接收方拉高的READY信号也必须同步到发送方的时钟域中,才能被使用。与此同时,接收方在拉高READY信号之后,还需经过几个周期才会同步到发送方的时钟域,因此VALID信号不会马上拉低,进而接收方同步过来的VALID信号也不会马上拉低,这会导致接收方以为是下一个VALID信号的到来。因此,为了解决这个问题,我们不检测VALID的高电平信息,转而检测VALID的上升沿信息,同理READY信号同步的时候也这么做。
RTL代码如下:
sender.sv

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/02/22 20:50:31
// Design Name: 
// Module Name: sender
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module sender(
input logic sclk,
input logic rst,
input logic start,
input logic [31:0] data,
output logic valid,
output logic [31:0]sdata,
input logic ready                            //从另一个时钟域来的ready信号 
    );
logic ready_ff1;
logic ready_ff2;
logic ready_ff3;
logic pulse;
assign pulse=ready_ff2&&~ready_ff3;                        //检测read_ff3上升沿
always_ff@(posedge sclk,posedge rst)
if(rst)
begin
    ready_ff1<=0;
    ready_ff2<=0;
    ready_ff3<=0;
end
else
begin
    ready_ff1<=ready;
    ready_ff2<=ready_ff1;
    ready_ff3<=ready_ff2;
end
//valid
always_ff@(posedge sclk,posedge rst)
if(rst)
   valid<=0;
else if(start)
   valid<=1;
else if(pulse)
   valid<=0;
//sdata
always_ff@(posedge sclk,posedge rst)
if(rst)
   sdata<=0;
else if(start)
   sdata<=data;

endmodule

上述代码中的pulse信号就是对VALID上升沿的检测。
receiver.sv

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/02/22 21:15:54
// Design Name: 
// Module Name: receiver
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module receiver(
input logic rclk,
input logic rst,
input logic [31:0]sdata,                 //来自另一个时钟域的sdata
input logic valid,                       //来自另一个时钟域的valid
output logic ready,
output logic [31:0] dout
    );
logic valid_ff1;
logic valid_ff2;
logic valid_ff3;
logic pulse;
//valid信号同步至rclk时钟域
always_ff@(posedge rclk)
begin
    valid_ff1<=valid;
    valid_ff2<=valid_ff1;
    valid_ff3<=valid_ff2;
end
//pluse
always_comb
begin
    pulse=valid_ff2&&~valid_ff3;                     //检测valid_ff3的上升沿
end
//dout
always_ff@(posedge rclk,posedge rst)
if(rst)
    dout<=0;
else if(pulse)                                    
    dout<=sdata;
//ready
always_ff@(posedge rclk,posedge rst)
if(rst)
   ready<=0;
else if(pulse)
   ready<=1;
else
   ready<=0;
endmodule

top模块

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/02/22 20:49:47
// Design Name: 
// Module Name: handshake
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module handshake(
input logic rclk,
input logic sclk,
input logic rst,
input logic start,
input logic [31:0] data
    );
logic ready;
logic valid;
logic [31:0] sdata;
logic [31:0] dout;
sender U1(.*);
// input logic sclk,
// input logic rst,
// input logic start,
// input logic [31:0] data,
// output logic valid,
// output logic [31:0]sdata,
// input logic ready                            //从另一个时钟域来的ready信号 
//     );
receiver U2(.*);
// input logic rclk,
// input logic rst,
// input logic [31:0]sdata,                 //来自另一个时钟域的sdata
// input logic valid,                       //来自另一个时钟域的valid
// output logic ready,
// output logic [31:0] dout
endmodule

测试平台

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/02/22 21:41:49
// Design Name: 
// Module Name: test_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module test_tb;
parameter PERIOD_S = 10;
parameter PERIOD_R = 17;
logic rclk;
logic sclk;
logic rst;
logic start;
logic [31:0] data;
//rclk
initial begin
    rclk=0;
    forever begin
        #(PERIOD_R/2) rclk=~rclk;
    end
end
//sclk
initial
begin
    sclk=0;
    forever
    begin
        #(PERIOD_S/2) sclk=~sclk;
    end
end
//rst
initial
begin
    rst=1;
    #50
    rst=0;
end
//start
initial
begin
    start=0;
    #(100+$random%100)
    start=1;
    #(PERIOD_S)
    start=0;
end
//data
initial
begin
    data=23;
end
handshake U(.*);
// input logic rclk,
// input logic sclk,
// input logic rst,
// input logic start,
// input logic [31:0] data
//     );
endmodule

仿真波形
跨时钟域握手,数字IC设计,FPGA,fpga开发,数字ic设计,systemverilog文章来源地址https://www.toymoban.com/news/detail-663742.html

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

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

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

相关文章

  • 【数字IC/FPGA】百度昆仑芯手撕代码--累加器

    已知一个加法器IP,其功能是计算两个数的和,但这个和延迟两个周期才会输出。现在有一串连续的数据输入,每个周期都不间断,试问最少需要例化几个上述的加法器IP,才可以实现累加的功能。 由于加法器两个周期后才能得到结果(再将该结果作为加法器的输入进行累加

    2024年02月09日
    浏览(41)
  • 应届生谈薪技巧和注意事项,怎么为自己多争取1~2k(FPGA,芯片谈薪,数字IC,嵌入式,模拟IC,FPGA探索者)

      找工作的终极目标:谈薪!谈高薪!今天【FPGA探索者】给大家分享一下谈薪的技巧和注意事项,别被HR轻易压价。   本文适用人群: 应届毕业生 。 FPGA探索者 FPGA+数字IC笔试面试,无线通信物理层及数字信号处理,半导体芯片行业求职,校招社招实习,职场趣事,行业动

    2024年01月25日
    浏览(58)
  • 【数字IC/FPGA】什么是无符号数?什么是有符号数?

    虽然在日常生活中,我们已经习惯了使用10进制数字,但在由数字电路构成的数字世界中,2进制才是效率更高的选择。 10进制(decimal)计数法(一般也叫阿拉伯计数法)是在日常生活中使用得最多的一种计数法,它是一种 位值记数法 (positional notation)。位值计数法的意思是

    2024年04月09日
    浏览(43)
  • 【FPGA/IC】什么是模块化设计?

    FPGA/IC设计中根据模块层次的不同有两种基本的设计方法: 自下而上 方法对设计进行逐次划分的过程是从基本单元出发的,设计树最末枝上的单元是已经设计好的基本单元,或者其他项目开发好的单元或者IP。该方法先对底层的功能块进行分析,然后使用这些模块来搭建规模

    2024年03月19日
    浏览(51)
  • 【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区 联合力荐 !近500篇 数字IC精品文章收录 ! 【数字IC精品文章收录】学习路线·基础知识·总线·脚本语言·芯片求职·EDA工具·低功耗设计Verilog·STA·设计·验证·FPGA·架构·AMBA·书籍 本系列旨在提

    2023年04月08日
    浏览(37)
  • 【数字IC精品文章收录】近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|

    1.1 索引目的 本篇索引旨在 收藏CSDN全站中有关数字IC领域高价值文章 ,在数字芯片领域中,就算将架构,设计,验证,DFT,后端诸多岗位加在一起的数量,都不及软件类一个细分方向的岗位数量多,反映在社区氛围或是开源资料的丰富度而言,数字IC领域相较于软件/互联网领

    2024年02月03日
    浏览(120)
  • 【FPGA/数字IC】Multiport RAM,多读多写寄存器-——基于FPGA BRAM的多端口地址查找表与FPGA BRAM的资源分析

    目录 背景 手写Multiport Ram Multiport RAM 代码方案 资源评估 Multiport RAM 资源利用的优化 资源评估 防止读写冲突的组合逻辑设计(写优先) 仿真和时序 单口写数据 单端口读数据 多口读相同数据 多口同时读不同数据 背景         在多端口交换机的设计中,交换机的每个端口

    2024年04月26日
    浏览(48)
  • FPGA可以转IC设计吗?需要具备哪些条件?(内附学习视频)

    曾经在知乎上看到一个回答“入职做FPGA,后续是否还可以转数字IC设计?” 从下面图内薪资就可以对比出来,对比FPGA的行业薪资水平,IC行业中的一些基础性岗位薪资比很多FPGA大多数岗位薪资都要高。 除了薪资之外更多FPGA转IC设计的有以下几个原因: ①从业多年竟然找不到

    2024年02月03日
    浏览(42)
  • 数字IC前端学习笔记:时钟切换电路

    相关阅读 数字IC前端 https://blog.csdn.net/weixin_45791458/category_12173698.html?spm=1001.2014.3001.5482         有些时候我们需要在系统运行时切换系统时钟,最简单的方法就是使用一个MUX(数据选择器)选择输出的时钟,如下代码片所示。但这样做会导致毛刺的产生,这可能会导致寄存

    2024年02月04日
    浏览(42)
  • 【数字IC/FPFA】时序约束--时钟约束

    时钟周期约束,顾名思义,就是我们对时钟的周期进行约束,这个约束是我们用的最多的约束了,也是最重要的约束。 下面我们以vivado中的时钟约束为例,介绍时钟约束的相关内容。 在Vivado中我们通过使用create_clock来创建时钟周期约束。使用方法如下: 其中,参数name为创建

    2024年02月03日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包