当前位置:首页 > FPGA > 正文内容

CDC 单脉冲信号处理

chanra1n3年前 (2022-04-22)FPGA3853

代码中的Sys_clk其实是没有用到的,项目文件:

cdc_single.zip

//------------------------------------------------------
// File Name        : cdc.v
// Author           : ChanRa1n
// Description      : a cdc test ex
// Called by        : TopModule
// Revision History : 2022-04-22
// Revision         : 1.0
// Email            : chenyu@myfpga.cn
// Copyright(c) 2018-Now, MYFPGA.CN, All right reserved.
//------------------------------------------------------

module cdc (
    input   wire   [0:0]   Sys_clk,
    input   wire   [0:0]   Sys_rst_n,

    input   wire   [0:0]   Clk_50M_in,
    input   wire   [0:0]   Clk_10M_in,

    input   wire   [0:0]   Sig_50M_in,
    input   wire   [0:0]   Sig_10M_in,

    output  wire   [0:0]   Sig_out_fast2slow,
    output  wire   [0:0]   Sig_out_slow2fast,

    output  wire   [0:0]   Sig_out_fast2slow_dff2,
    output  wire   [0:0]   Sig_out_slow2fast_dff2
);
//-----------------------------------------------------------------------------
    reg   [0:0]   Sig_out_fast2slow_reg ;
    reg   [0:0]   Sig_out_slow2fast_reg ;  
    assign   Sig_out_fast2slow = Sig_out_fast2slow_reg ;
    assign   Sig_out_slow2fast = Sig_out_slow2fast_reg ;

    always@(posedge Clk_10M_in or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_out_fast2slow_reg <= 0 ;
        end
        else begin
            Sig_out_fast2slow_reg <= Sig_50M_in ;
        end
    end

    always@(posedge Clk_50M_in or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_out_slow2fast_reg <= 0 ;
        end
        else begin
            Sig_out_slow2fast_reg <= Sig_10M_in ;
        end
    end
//-----------------------------------------------------------------------------
    reg   [0:0]   Sig_out_fast2slow_lvl_reg  ;
    reg   [0:0]   Sig_out_fast2slow_adj_reg0 ;
    reg   [0:0]   Sig_out_fast2slow_adj_reg1 ;

    always@(posedge Clk_50M_in or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_out_fast2slow_lvl_reg <= 0 ;
        end
        else begin
            if(Sig_50M_in)
                Sig_out_fast2slow_lvl_reg <= ~Sig_out_fast2slow_lvl_reg ;
            else
                Sig_out_fast2slow_lvl_reg <= Sig_out_fast2slow_lvl_reg ;
        end
    end

    always@(posedge Clk_10M_in or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_out_fast2slow_adj_reg0 <= 0 ;
            Sig_out_fast2slow_adj_reg1 <= 0 ;
        end
        else begin
            Sig_out_fast2slow_adj_reg0 <= Sig_out_fast2slow_lvl_reg ;
            Sig_out_fast2slow_adj_reg1 <= Sig_out_fast2slow_adj_reg0;
        end
    end

    assign   Sig_out_fast2slow_dff2 = Sig_out_fast2slow_adj_reg0 != Sig_out_fast2slow_adj_reg1;
//-----------------------------------------------------------------------------
    reg   [0:0]   Sig_out_slow2fast_lvl_reg  ;
    reg   [0:0]   Sig_out_slow2fast_adj_reg0 ;
    reg   [0:0]   Sig_out_slow2fast_adj_reg1 ;

    always@(posedge Clk_10M_in or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_out_slow2fast_lvl_reg <= 0 ;
        end
        else begin
            if(Sig_50M_in)
                Sig_out_slow2fast_lvl_reg <= ~Sig_out_slow2fast_lvl_reg ;
            else
                Sig_out_slow2fast_lvl_reg <= Sig_out_slow2fast_lvl_reg ;
        end
    end

    always@(posedge Clk_50M_in or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_out_slow2fast_adj_reg0 <= 0 ;
            Sig_out_slow2fast_adj_reg1 <= 0 ;
        end
        else begin
            Sig_out_slow2fast_adj_reg0 <= Sig_out_slow2fast_lvl_reg ;
            Sig_out_slow2fast_adj_reg1 <= Sig_out_slow2fast_adj_reg0;
        end
    end

    assign   Sig_out_slow2fast_dff2 = Sig_out_slow2fast_adj_reg0 != Sig_out_slow2fast_adj_reg1 ;

//-----------------------------------------------------------------------------
endmodule


//------------------------------------------------------
// File Name        : cdc_tb.v
// Author           : ChanRa1n
// Description      : Testbench file for cdc_tb
// Called by        : Simulation
// Revision History : 2022-04-22
// Revision         : 1.0
// Email            : chenyu@myfpga.cn
// Copyright(c) 2018-Now, MYFPGA.CN, All right reserved.
//------------------------------------------------------

`default_nettype wire
`timescale 1ns/1ns

module cdc_tb ();
    reg Sys_clk;
    reg Sys_rst_n;

    reg    [0:0]   Clk_50M_in;
    reg    [0:0]   Clk_10M_in;
    reg    [0:0]   Sig_50M_in;
    reg    [0:0]   Sig_10M_in;
    wire   [0:0]   Sig_out_fast2slow;
    wire   [0:0]   Sig_out_slow2fast;
    wire   [0:0]   Sig_out_fast2slow_dff2;
    wire   [0:0]   Sig_out_slow2fast_dff2;

    localparam CLK_PERIOD = 10;

    always #(CLK_PERIOD/2) Sys_clk=~Sys_clk;
    always #(100) Clk_10M_in=~Clk_10M_in;
    always #(20) Clk_50M_in=~Clk_50M_in;

    initial begin
        #1 Sys_rst_n<=1'b0;Sys_clk<=1'b0;Clk_10M_in<=0;
        #1 Clk_50M_in<=0;
        #(CLK_PERIOD*3) Sys_rst_n<=1;
        #(CLK_PERIOD*3000);
        $stop;
    end
   
    initial begin
        forever begin
        @(posedge Clk_10M_in);
        Sig_10M_in <= {$random} % 2;
        end
    end

    initial begin
        forever begin
        @(posedge Clk_50M_in);
        Sig_50M_in <= {$random} % 2;
        end
    end

    cdc cdc (
    .Sys_clk(Sys_clk),
    .Sys_rst_n(Sys_rst_n),
    .Clk_50M_in(Clk_50M_in),
    .Clk_10M_in(Clk_10M_in),
    .Sig_50M_in(Sig_50M_in),
    .Sig_10M_in(Sig_10M_in),
    .Sig_out_fast2slow(Sig_out_fast2slow),
    .Sig_out_slow2fast(Sig_out_slow2fast),
    .Sig_out_fast2slow_dff2(Sig_out_fast2slow_dff2),
    .Sig_out_slow2fast_dff2(Sig_out_slow2fast_dff2)
    );

endmodule

image.png

image.png

image.png


当然,光是对高速信号展宽还是不够,我们依旧没有消除亚稳态,所以这里需要再进行打两拍。也就是这样:

//------------------------------------------------------
// File Name        : cdc.v
// Author           : ChanRa1n
// Description      : a cdc test ex
// Called by        : TopModule
// Revision History : 2022-04-22
// Revision         : 1.0
// Email            : chenyu@myfpga.cn
// Copyright(c) 2018-Now, MYFPGA.CN, All right reserved.
//------------------------------------------------------

module cdc (
    input   wire   [0:0]   Sys_clk,
    input   wire   [0:0]   Sys_rst_n,

    input   wire   [0:0]   Clk_50M_in,
    input   wire   [0:0]   Clk_10M_in,

    input   wire   [0:0]   Sig_50M_in,
    input   wire   [0:0]   Sig_10M_in,

    output  wire   [0:0]   Sig_out_fast2slow,
    output  wire   [0:0]   Sig_out_slow2fast,

    output  wire   [0:0]   Sig_out_fast2slow_dff2,
    output  wire   [0:0]   Sig_out_slow2fast_dff2
);
//-----------------------------------------------------------------------------
    reg   [0:0]   Sig_out_fast2slow_reg ;
    reg   [0:0]   Sig_out_slow2fast_reg ;  
    assign   Sig_out_fast2slow = Sig_out_fast2slow_reg ;
    assign   Sig_out_slow2fast = Sig_out_slow2fast_reg ;

    always@(posedge Clk_10M_in or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_out_fast2slow_reg <= 0 ;
        end
        else begin
            Sig_out_fast2slow_reg <= Sig_50M_in ;
        end
    end

    always@(posedge Clk_50M_in or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_out_slow2fast_reg <= 0 ;
        end
        else begin
            Sig_out_slow2fast_reg <= Sig_10M_in ;
        end
    end
//-----------------------------------------------------------------------------
    reg   [0:0]   Sig_out_fast2slow_lvl_reg  ;
    reg   [0:0]   Sig_out_fast2slow_adj_reg0 ;
    reg   [0:0]   Sig_out_fast2slow_adj_reg1 ;
    reg   [0:0]   Sig_out_fast2slow_adj_reg2 ;
    reg   [0:0]   Sig_out_fast2slow_adj_reg3 ;

    always@(posedge Clk_50M_in or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_out_fast2slow_lvl_reg <= 0 ;
        end
        else begin
            if(Sig_50M_in)
                Sig_out_fast2slow_lvl_reg <= ~Sig_out_fast2slow_lvl_reg ;
            else
                Sig_out_fast2slow_lvl_reg <= Sig_out_fast2slow_lvl_reg ;
        end
    end

    always@(posedge Clk_10M_in or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_out_fast2slow_adj_reg0 <= 0 ;
            Sig_out_fast2slow_adj_reg1 <= 0 ;
        end
        else begin
            Sig_out_fast2slow_adj_reg0 <= Sig_out_fast2slow_lvl_reg ;
            Sig_out_fast2slow_adj_reg1 <= Sig_out_fast2slow_adj_reg0;
        end
    end

    always@(posedge Clk_10M_in or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_out_fast2slow_adj_reg2 <= 0 ;
            Sig_out_fast2slow_adj_reg3 <= 0 ;
        end
        else begin
            Sig_out_fast2slow_adj_reg2 <= Sig_out_fast2slow_adj_reg0 != Sig_out_fast2slow_adj_reg1 ;
            Sig_out_fast2slow_adj_reg3 <= Sig_out_fast2slow_adj_reg2;
        end
    end

    assign   Sig_out_fast2slow_dff2 = Sig_out_fast2slow_adj_reg3;
//-----------------------------------------------------------------------------
    reg   [0:0]   Sig_out_slow2fast_lvl_reg  ;
    reg   [0:0]   Sig_out_slow2fast_adj_reg0 ;
    reg   [0:0]   Sig_out_slow2fast_adj_reg1 ;
    reg   [0:0]   Sig_out_slow2fast_adj_reg2 ;
    reg   [0:0]   Sig_out_slow2fast_adj_reg3 ;

    always@(posedge Clk_10M_in or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_out_slow2fast_lvl_reg <= 0 ;
        end
        else begin
            if(Sig_50M_in)
                Sig_out_slow2fast_lvl_reg <= ~Sig_out_slow2fast_lvl_reg ;
            else
                Sig_out_slow2fast_lvl_reg <= Sig_out_slow2fast_lvl_reg ;
        end
    end

    always@(posedge Clk_50M_in or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_out_slow2fast_adj_reg0 <= 0 ;
            Sig_out_slow2fast_adj_reg1 <= 0 ;
           
        end
        else begin
            Sig_out_slow2fast_adj_reg0 <= Sig_out_slow2fast_lvl_reg ;
            Sig_out_slow2fast_adj_reg1 <= Sig_out_slow2fast_adj_reg0;
        end
    end

    always@(posedge Clk_50M_in or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_out_slow2fast_adj_reg2 <= 0 ;
            Sig_out_slow2fast_adj_reg3 <= 0 ;
        end
        else begin
            Sig_out_slow2fast_adj_reg2 <= Sig_out_slow2fast_adj_reg0 != Sig_out_slow2fast_adj_reg1 ;
            Sig_out_slow2fast_adj_reg3 <= Sig_out_slow2fast_adj_reg2;
        end
    end

    assign   Sig_out_slow2fast_dff2 = Sig_out_slow2fast_adj_reg3 ;

//-----------------------------------------------------------------------------
endmodule

image.png


扫描二维码推送至手机访问。

版权声明:本文由我的FPGA发布,如需转载请注明出处。

本文链接:https://myfpga.cn/index.php/post/244.html

分享给朋友:

“CDC 单脉冲信号处理” 的相关文章

Xilinx_ISE_DS_Win_14.7_1015_1 安装教程(Xilinx High Speed Cable USB驱动安装)

Xilinx_ISE_DS_Win_14.7_1015_1 安装教程(Xilinx High Speed Cable USB驱动安装)

首先下载Xilinx ISE软件的安装包,以下是百度云链接,6.12G,放着一晚上就下载完了链接:https://pan.baidu.com/s/13cUoFZgbld0X4ikCLsVFNQ 提取码:53ro更建议使用win7来安装这个,win8 win10 ...

FPGA ALARM FPGA多功能闹钟 完整项目 内含上位机

FPGA ALARM FPGA多功能闹钟 完整项目 内含上位机

一、项目简述本项目使用苏州硬禾信息科技有限公司设计的小脚丫FPGA开发板设计了一个完成定时、测温、报警、控制的小项目,并通过上位机显示、下发音乐配置数据。本项目B站介绍:https://www.bilibili.com/video/BV1Vh411k7QV/二、研究进展(一)研究内容:l ...

基础实验十三,DS18B20温度传感器

基础实验十三,DS18B20温度传感器

//==========================================================================// Author     : ChanRa1n// Description: Training for Intel FPGA/...

Verilog实现时钟分频(奇数分频,偶数分频)二分频 三分频 四分频 五分频

Verilog实现时钟分频(奇数分频,偶数分频)二分频 三分频 四分频 五分频

完整工程文件:clkdiv.zip//------------------------------------------------------// File Name        : clkdiv.v// Author     &nb...

Xilinx FIFO和ILA学习

Xilinx FIFO和ILA学习

`timescale 1ns / 1ps//-------------------------------------------------------//Filename       ﹕ FIFO_TOP.v//Author      ...

Verilog实现串并转换

Verilog实现串并转换

项目文件:SIPO.zip//------------------------------------------------------// File Name        : SIPO.v// Author       &n...