跨时钟域握手信号的实现(Verilog)

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

方法

使用握手信号是在两个不同域之间传输数据的有效方式,如下图所示:
握手信号verilog,verilog实战,fpga开发,数字设计
使用握手信号xack和yreq,系统X发给系统Y,下面是使用握手信号传输数据的例子:
1)发送器系统X将数据放到数据总线上并发出xreq请求信号,表示有效数据已经发送到接收器系统Y的数据总线上
2)把xreq信号同步到接收器的时钟域yclk上。
3)接收器在识别xreq同步信号yreq2后,锁存数据总线上的信号
4)接收器发出确认信号yack,表示其已经接受了数据
5)接收器发出的yack信号同步到发送时钟xclk上
6)发送器在识别同步的ack信号后,将下一个数据放到数据总线上
握手信号的时序图如下所示:
握手信号verilog,verilog实战,fpga开发,数字设计

握手信号的要求

数据应该在发送时钟域内稳定至少两个时钟上升沿,请求信号xreq的宽度应该超过两个上升沿时钟,否则从高速时钟的低速时钟域传递可能无法捕捉到该信号。缺点是是延迟太大(相比于FIFO)。

硬件实现

数据发送系统

模块框图如下
握手信号verilog,verilog实战,fpga开发,数字设计

module tx_data(
    input   wire            tx_clk      ,
    input   wire            xack2       ,
    input   wire            rst_n       ,
    input   wire            en          ,

    output  reg             xreq        ,
    output  wire    [7:0]   t_data  
);

    reg     [3:0]       data1   ;
    reg     [3:0]       data2   ;

    //在yack2有效时data1和data2更新
    always @(posedge tx_clk or negedge rst_n) begin
        if(!rst_n) begin
            data1 <= 4'd1;
            data2 <= 4'd1;
        end
        else if(xack2) begin
            data1 <= data1 + 4'd1;
            data2 <= data2 + 4'd2;
        end
        else begin
            data1 <= data1;
            data2 <= data2;
        end
    end       

    //xreq信号
    always @(posedge tx_clk or negedge rst_n) begin
        if(!rst_n) begin
            xreq <= 1'b0;
        end
        else if(en) begin
            xreq <= 1'b1;
        end
        else if(xack2) begin
            xreq <= 1'b1;
        end
        else begin
            xreq <= 1'b0;
        end
    end

    assign t_data = {data1, data2};

endmodule

数据接收系统

模块框图如下:
握手信号verilog,verilog实战,fpga开发,数字设计

module rv_data(
    input   wire        rv_clk      ,
    input   wire        rst_n       ,
    input   wire        yreq2       ,
    input   wire [7:0]  r_data      ,

    output  reg         yack        ,
    output  wire [5:0]  result           
);
    /*
        接收到数据的第一周期进行数据计算
        第二周期返回ack信号
    */
    reg             dly1        ;
    reg     [5:0]   result_reg  ;

    always @(posedge rv_clk or negedge rst_n) begin
        if(!rst_n) begin
            yack <= 1'b0;
        end
        else if(dly1) begin
            yack <= 1'b1;
        end
        else begin
            yack <= 1'b0;
        end
    end

    always @(posedge rv_clk or negedge rst_n) begin
        if(!rst_n) begin
            dly1 <= 1'b0;
        end
        else if(yreq2) begin
            dly1 <= 1'b1;
        end
        else begin
            dly1 <= 1'b0;
        end
    end

    always @(posedge rv_clk or negedge rst_n) begin
        if(!rst_n) begin
            result_reg <= 'd0;
        end
        else if(yreq2) begin
            result_reg <= r_data[3:0] + r_data[7:4];
        end
        else begin
            result_reg <= result_reg;
        end
    end

    assign result = dly1 ? result_reg : 6'd0;

endmodule

异步握手实现

模块框图如下:
握手信号verilog,verilog实战,fpga开发,数字设计

module shake_hand_asy(
    input   wire            tx_clk      ,
    input   wire            rv_clk      ,
    input   wire            rst_n       ,
    input   wire            en          ,

    output  wire    [5:0]   result 
);

    wire                xreq    ;
    wire                yack    ;
    wire    [7:0]       data    ;

    reg                 yreq1   ;
    reg                 yreq2   ;
    reg                 xack1   ;
    reg                 xack2   ;

    //xreg的两级同步
    always @(posedge rv_clk or negedge rst_n) begin
        if(!rst_n) begin
            yreq1 <= 1'b0;
            yreq2 <= 1'b0;
        end
        else begin
            yreq1 <= xreq;
            yreq2 <= yreq1;
        end
    end

    //yack的两级同步
    always @(posedge tx_clk or rst_n) begin
        if(!rst_n) begin
            xack1 <= 1'b0;
            xack2 <= 1'b0;
        end
        else begin
            xack1 <= yack;
            xack2 <= xack1;
        end
    end

    tx_data u_tx_data(
    . tx_clk    (tx_clk)    ,
    . xack2     (xack2)     ,
    . rst_n     (rst_n)     ,
    . en        (en)        ,

    . xreq      (xreq)      ,
    . t_data    (data)
);

    rv_data u_rv_data(
     .rv_clk     (rv_clk)    ,
     .rst_n      (rst_n)     ,
     .yreq2      (yreq2)     ,
     .r_data     (data)      ,

     .yack       (yack)      ,
     .result     (result)      
);

endmodule

波形仿真

testbench代码如下:


`timescale  1ns/1ns

module tb_shake_hand_asy();

    reg         tx_clk      ;
    reg         rv_clk      ;
    reg         rst_n       ;
    reg         en          ;

    wire [5:0]  result      ;

    initial begin
        tx_clk = 1'b0;
        rv_clk = 1'b0;
        rst_n = 1'b0;
        en = 1'b0;
        #30
        rst_n = 1'b1;
        @(posedge tx_clk);
        en = 1'b1;          //启动
        @(posedge tx_clk);
        en = 1'b0;
    end

    always #15 tx_clk = ~tx_clk;
    always #10 rv_clk = ~rv_clk;

    shake_hand_asy u_shake_hand_asy(
    . tx_clk    (tx_clk)  ,
    . rv_clk    (rv_clk)  ,
    . rst_n     (rst_n)  ,
    . en        (en)  ,

    . result    (result)
);

endmodule

波形如下所示:
握手信号verilog,verilog实战,fpga开发,数字设计
可知仿真正确。

总结

自己基础还很薄弱,继续加油!!!!文章来源地址https://www.toymoban.com/news/detail-599597.html

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

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

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

相关文章

  • FPGA实验报告 Verilog HDL:7人表决器 巴克码信号发生器 FPGA数字时钟

    写在前面:本文提供以下三个任务的思路讲解和代码实现, 如需参考引脚配置说明,可以点击下方链接跳转查看完整实验报告 ;本实验使用的是Altera公司的cycloneⅢ类型的芯片。 Verilog HDL实现:7人表决器 信号发生器 多功能数字时钟 实验目标:实现7人投票表决电路,支持人

    2024年02月05日
    浏览(37)
  • 握手信号输入一倍,输出两倍[verilog]

    module one_to_two #(     parameter WORD_LEN = 33 ) (     input                     clk,     input                    arst,          input [WORD_LEN-1:0]     i_din,     input                     i_din_valid,     output                     o_din_ready,          output [2*

    2024年02月13日
    浏览(30)
  • 【FPGA Verilog开发实战指南】初识Verilog HDL-基础语法

    就是用代码来描述硬件结构 语言有VHDL与Verilog HDL Verilog HDL 是从C语言来的,学的快 ###例子 也叫保留字,一般是小写 module 表示模块的开始 endmodule 模块的结束 模块名 一般与.v文件的名字一致 输入信号 input 输出信号 output 既做输入也做输出 inout 需要一些变量和参数对输

    2024年02月21日
    浏览(34)
  • 【Verilog实现FPGA上的信号延迟】—— 用Verilog代码实现将信号延迟N拍,这是FPGA中非常重要的一个操作,可以使数据在不同模块之间精确同步。

    【Verilog实现FPGA上的信号延迟】—— 用Verilog代码实现将信号延迟N拍,这是FPGA中非常重要的一个操作,可以使数据在不同模块之间精确同步。 模块是FPGA中最基本的构建模块。通常一个模块代表一个电路,包括输入、输出和处理逻辑。模块中包含的处理逻辑被称为时序逻辑。

    2024年02月04日
    浏览(62)
  • 基于FPGA的信号处理算法,FFT法相差检测verilog实现

    基于FPGA的信号处理算法,FFT法相差检测verilog实现 。 1.硬件平台:altera芯片 2.软件平台:Quartusii 13.1 Verilog 3.实现功能:检测两路正弦波的相位差 基于FPGA的信号处理算法,FFT法相差检测verilog实现 引言 在现代通信系统中,信号处理算法在实时性和精度方面面临着巨大的挑战。

    2024年04月16日
    浏览(46)
  • 基于vivado+Verilog FPGA开发 — 基于AD9767高速DAC的DDS信号发生器

    目录  一、功能定义 二、设计输入  1、主模块 2、DDS模块 3、 按键消抖模块 三、功能仿真  四、综合优化 五、布局布线 六、时序仿真 七、板级调试  代码规范:Verilog 代码规范_verilog代码编写规范-CSDN博客 开发流程:FPGA基础知识----第二章 FPGA 开发流程_fpga 一个项目的整个

    2024年03月18日
    浏览(59)
  • FPGA 的数字信号处理:Verilog 实现简单的 FIR 滤波器

    该项目介绍了如何使用 Verilog 实现具有预生成系数的简单 FIR 滤波器。 不起眼的 FIR 滤波器是 FPGA 数字信号处理中最基本的模块之一,因此了解如何将具有给定抽头数及其相应系数值的基本模块组合在一起非常重要。因此,在这个关于 FPGA 上 DSP 基础实用入门的教程中,将从一

    2024年02月09日
    浏览(36)
  • 基于FPGA的ECG信号滤波与心率计算verilog实现,包含testbench

    目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 ECG信号的特点与噪声 4.2 FPGA在ECG信号处理中的应用 4.3 ECG信号滤波原理 4.4 心率计算原理 4.5 FPGA在ECG信号处理中的优势 5.算法完整程序工程 其RTL结构如下: vivado2019.2          心电图(ECG)是

    2024年02月20日
    浏览(31)
  • FPGA(Verilog)时钟无缝切换设计与验证

    时钟切换基本模型,本文围绕“ 基本组合电路切换、解决前毛刺切换、解决后毛刺切换 ”三方面完成时钟无缝切换。 组合逻辑切换,本质就是二选一多路器 如下图,CLK_SEL 0与1分别控制时钟CLK_A CLK_B输出。 组合逻辑输出只跟当前输入状态有关,CLK_SEL异步不可控导致输出毛刺

    2023年04月10日
    浏览(32)
  • 基于FPGA的16QAM调制器verilog实现,包括testbench,并通过MATLAB显示FPGA输出信号的星座图

    目录 1.算法仿真效果 2.verilog核心程序 3.算法涉及理论知识概要 4.完整verilog matlab2022a/vivado2019.2仿真结果如下:  将FPGA仿真的数据导出,然后在matlab中将数据通过噪声之后,可以得到如下的星座图效果。 fpga工程版本信息:       16QAM全称正交幅度调制是英文Quadrature Amplitude

    2024年02月07日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包