精华内容
下载资源
问答
  • 跨时钟域脉冲信号检测(慢时钟检测时钟脉冲信号)
    千次阅读
    2020-05-17 22:17:24

    关于跨时钟域信号的处理过程,有关脉冲信号的检测刚好用在我的毕业设计当中。
    由于我毕设中关于雷达信号处理过程中,从AD采集的信号时钟频率低,信号处理的频率高。一般处理这种情况使用的是异步FIFO,但我为了方便计算帧数用的双端的BRAM储存数据,当采集满了发送脉冲跳转状态开始信号处理。
    快时钟采集满时钟很好处理,但是当信号处理完成后需要跳转状态机到初始态,状态机是慢时钟跳转状态,而DSP_OVER信号是满时钟,而且频率相差时间较长,因此需要对他进行慢时钟同步。

    解决方案如下:
    clka是快时钟,clkb是慢时钟。
    主要思路如下:
    当快时钟采集到pulse_a_in脉冲时候signal_a 信号拉高。
    我们需要signal_a 信号一直拉高,直到clkb时钟采集到高电平后再拉低。
    然后用clkb时钟一直采集signal_a ,用signal_b来记录。
    然后为了消除亚稳态我们需要用D触发器打两拍进行消除亚稳态。

    代码还是比较好懂的,这个经过实际上板子测试确认跳转状态正常。

    module  F2S_Sync_Pulse(
                                            input              clk_a,//fast clock
                                            input              clk_b,//slow clock
                                            input              rst_n,
                                            input            pulse_a_in,
                                            output           pulse_b_out,
                                            output           b_out
                                             );
     /**************************************************************************************/
     reg                          signal_a;
     reg                          signal_b;
     reg                          signal_b_s;
     reg                          signal_b_ss;
     reg                          signal_b_a1;
     reg                          signal_b_a2;
    
    //在时钟域clk_a下,生成展宽信号signal_a
       always @ (posedge clk_a or negedge rst_n)
           begin
               if (rst_n == 1'b0)
                   signal_a <= 1'b0;
               else if (pulse_a_in)            //检测到到输入信号pulse_a_in被拉高,则拉高signal_a
                   signal_a <= 1'b1;
               else if (signal_b_a2)           //检测到signal_b1_a2被拉高,则拉低signal_a
                   signal_a <= 1'b0;
               else;
           end
    //在时钟域clk_b下,采集signal_a生成signal_b
    
    always@(posedge clk_b or negedge rst_n)begin
               if(rst_n == 1'b0)begin
                   signal_b <= 0;
              end
              else begin
                  signal_b <= signal_a;
              end
    end
    //多级触发器将clk_b抓到的signal_b信号打两拍输出
    always@(posedge clk_b or negedge rst_n)begin
          if(rst_n == 1'b0)begin
          signal_b_s  <= 1'b1;
          signal_b_ss <= 1'b1;
          end
          else begin
          signal_b_s  <= signal_b;
          signal_b_ss <= signal_b_s;
          end
    end
    //在时钟域clk_a下,采集signal_b_s,用于反馈来拉低展宽信号signal_a
    always@(posedge clk_a or negedge rst_n)begin
     if(rst_n == 1'b0)begin
         signal_b_a1 <= 1'b0;
         signal_b_a2 <= 1'b0;
     end
     else begin    //对signal_b_s打两拍,因此处涉及到跨时钟域
         signal_b_a1 <= signal_b_s;
         signal_b_a2 <= signal_b_a1;
     end
    end
    assign   pulse_b_out = signal_b_s & (~signal_b_ss);
    assign   b_out            = signal_b_s;
    
    endmodule
    
    更多相关内容
  • 适用于脉冲信号采样,慢时钟采样快时钟 基本原理 将时钟域的脉冲信号扩展成多周期的电平信号,慢时钟同步电平信号进行采样得到同步后的电平信号,此时通过电平延时组合逻辑由电平产生脉冲信号。 限制 时钟...

    pulse_sample

    适用场景

    适用于脉冲信号采样,慢时钟采样快时钟

    基本原理

    将快时钟域的脉冲信号扩展成多周期的电平信号,慢时钟同步电平信号进行采样得到同步后的电平信号,此时通过电平延时组合逻辑由电平产生脉冲信号。

    限制

    快时钟域的两次脉冲应该应该有一定的间隔,否则扩展后的电平信号连在一起了,会导致同步后的信号只有一个脉冲

    说明

    源时钟域src_pulse依次输入给src_pulse_seq[0]src_pulse_seq[1]src_pulse_seq[2],四个信号相或产生的信号输入给寄存器src_pulse_extend。寄存器src_pulse_extend通过两级同步打拍得到sync_temp,sync_temp依次打拍得到src_pulse_expand_delay1src_pulse_expand_delay2。再由(src_pulse_expand_delay1)&&(!src_pulse_expand_delay2)得到脉冲信号dst_pulse_tmpdst_pulse_tmp打拍得到目的时钟域脉冲dst_pulse

    verilog


    module pulse_sample(
            // source clock domain signals
            src_clk,
      src_async_rst_n,
      src_pulse,
      // dst  clock domain signals
      dst_clk,
      dst_async_rst_n,
      dst_pulse
      );
     
     parameter                       EXTEND_NUM = 4;
     // source clock domain signals
     input                           src_clk;
     input                           src_async_rst_n;
     input                           src_pulse;
     // dst  clock domain signals
     input                           dst_clk;
     input                           dst_async_rst_n;
     output                          dst_pulse;
     
     reg    [EXTEND_NUM-2:0]         src_pulse_seq;
     reg                             src_pulse_extended;
     reg                             sync_temp;
     
     reg                             src_pulse_sync;
     reg                             src_pulse_expand_delay1;
     reg                             src_pulse_expand_delay2;
     reg                             dst_pulse;
     wire                            dst_pulse_tmp;
     
     always@(posedge src_clk or negedge src_async_rst_n)
         if(!src_async_rst_n)
      begin
          src_pulse_seq[EXTEND_NUM-2:0]      <= {(EXTEND_NUM-1){1'b0}};
         src_pulse_extended                 <= 1'b0;
      end
      else
      begin
          src_pulse_seq[0]                   <= src_pulse;
          src_pulse_seq[EXTEND_NUM-2:1]      <= src_pulse_seq[EXTEND_NUM-3:0];
         src_pulse_extended                 <= src_pulse|(|(src_pulse_seq[EXTEND_NUM-2:0]));
      end
      
     always@(posedge dst_clk or negedge dst_async_rst_n)
            if(!dst_async_rst_n)
         begin
           sync_temp        <= 1'b0;
          src_pulse_sync   <= 1'b0;
         end
         else
         begin
           sync_temp        <= src_pulse_extended;
          src_pulse_sync   <= sync_temp;
         end
        
     assign dst_pulse_tmp  =   (src_pulse_expand_delay1)&&(!src_pulse_expand_delay2);
       
     always@(posedge dst_clk or negedge dst_async_rst_n)
            if(!dst_async_rst_n)
         begin
           src_pulse_expand_delay1    <= 1'b0;
          src_pulse_expand_delay2    <= 1'b0;
          dst_pulse                  <= 1'b0;
          end
         else
         begin
           src_pulse_expand_delay1    <= src_pulse_sync           ;
          src_pulse_expand_delay2    <= src_pulse_expand_delay1  ;
          dst_pulse                  <= dst_pulse_tmp            ;
         end
        endmodule
     


    展开全文
  • 慢时钟数据传递到时钟域时,由于采样时钟速率更高,所以一般慢时钟域的数据都会被采集到,不会出现问题。前提是慢时钟域是时钟域时钟的1.5倍,也就是数据保持足够的时间,具体原因后面会进行分析。

    本系列将对sunburst design网站的2008最佳文章《Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog》进行翻译和基于自我理解的分析阐述,本文介绍快满时钟数据传输问题。

    慢时钟到快时钟

    慢时钟数据传递到快时钟域时,由于采样时钟速率更高,所以一般慢时钟域的数据都会被采集到,不会出现问题。前提是慢时钟域是快时钟域时钟的1.5倍,也就是数据保持足够的时间,具体原因后面会进行分析。

    快时钟到慢时钟

    下图展示了一种失败的设计:

    数据宽度和原时钟宽度相同,采样时钟域属于慢时钟,那么就会导致无法正确采集到数据,错过了数据的有效位置。

    上图展示了一种设计,数据宽度略大于采样时钟宽度,这样由于建立时间或者保持时间不够导致亚稳态信号的产生。

    开环设计

    如果能够保证数据宽度是慢时钟的1.5倍,即可使用开环设计,如下图所示:

    优点:开环设计是快时钟到慢时钟数据传输最高效的方法,设计中可以通过数据延展来实现。

    缺点:代码维护可能出现问题,新的工程师来了之后可能不理解你的延展意图,而更改此方案。方法是可以在设计中加入systemverilog的断言机制,即SVA,判断数据宽度是否经历了3个沿(1.5*bclk)。

    闭环设计

    该方法属于握手反馈机制,优点是最安全的数据传输手段,缺点是数据延迟较大,影响性能。具体情况如下图所示:

    -----------------------------------------END---------------------------------------------

    展开全文
  • 时钟域同步到慢时钟域设计一、开环设计方法闭环设计 一、开环设计方法 开环设计方法,一般只在对时钟控制信号有明确规定的时候用这样的设计方法。要求就是使adat信号脉冲持续时间为bclk的1.5倍以上,这样才能保证...

    快时钟域同步到慢时钟域设计

    在跨时钟域设计中,最容易发生的就是发送时钟域的脉冲信号持续时间过短,这样就会产生下图的一个情况,有效脉冲刚好卡在一个bclk时钟的一个周期内,使得接收域接收不到脉冲信号。
    持续时间过短
    还有一种情况就是持续的时间刚好卡在接收时钟域的建立时间和保持时间,如下图,第一个bclk上升沿的时候,不满足建立时间,而第二个bclk上升沿的时候,不满足保持时间。这样就会影响系统的运行。
    在这里插入图片描述
    所以一般设计时,我们需要保证上图的adat持续的时间足够使得bclk时钟域接收到有效脉冲。

    一、开环设计

    开环设计方法,一般只在对时钟控制信号有明确规定的时候用这样的设计方法。要求就是使adat信号脉冲持续时间为bclk的1.5倍以上,这样才能保证慢时钟域在采样信号的时候能够满足建立时间和保持时间,避免采样错误。
    在这里插入图片描述
    这种方法可以理解为延长adat的持续时间。
    根据快时钟与慢时钟的快慢计算,假设aclk是bclk的三倍,那当aclk下接收到一个脉冲信号时,至少要将脉冲持续时间延长到4.5个aclk周期,这样才能保证bclk接收到信号。
    设计代码:

    reg flag0,flag1,flag2,flag3,flag4,flag5;
    wire flag0a,flag12,flag34;
    assign flag0a = flag_a | flag0;
    assign flag12 = flag2 | flag1;
    assign flag34 = flag3 | flag4;
    
    always@(posedge aclk)   //脉冲延迟电路
    begin
    	flag0 <= flag_a;
    	flag1 <= flag0a;
    	flag2 <= flag1;
    	flag3 <= flag12;
    	flag4 <= flag3;
    	flag5 <= flag34;
    end
    wire a_to_b;
    assign a_to_b = flag5 | flag34;
    //b时钟域接收a时钟域的信号
    always@(posedge bclk)  
    begin
    	flag_b <= a_to_b;
    end
    endmodule
    

    综合的电路如图
    在这里插入图片描述

    二、闭环设计

    可以理解为一种反馈式设计,我们需要将adat的一次脉冲同步到b时钟域中,将同步到b时钟域的数据再用a时钟域的同步器反馈回a时钟域中,以此来判断adat脉冲是否传输成功。
    在这里插入图片描述
    若要实现一个跨时钟域检测a时钟域的脉冲信号
    输入输出:

    input aclk,	//a时钟
    input bclk,	//b时钟
    input adat,	//a时钟下的控制信号
    output bout,	//b输出
    output b_pules;	//检测信号,有上升沿脉冲则为1。
    

    设计代码

    reg adat1;
    reg bq1_dat,bq2_dat,b_buf;
    reg aq1_dat,aq2_dat;
    //a时钟域中寄存adat脉冲信号寄存器
    always@(posedge aclk)
    	if(adat == 1'b1)
    		adat1 <= 1'b1;
    	else if(aq2_dat == 1'b1)
    		adat1 <= 1'b0;
    	else
    		adat1 <= adat1;
    //反馈回a时钟域的信号
    always@(posedge aclk)
    	{aq2_dat,aq1_dat} <= {aq1_dat,bq2_dat};
    //b时钟域同步器
    always@(posedge bclk)
    begin
    	{b_buf,bq2_dat,bq1_dat} <= {bq2_dat,bq1_dat,adat1};
    end	
    //输出bout
    assign bout = bq2_dat;
    //检测是否为上升沿脉冲,
    assign b_pules = (~b_buf) & bq2_dat;
    
    展开全文
  • 这种情况下,异步控制信号可能在己慢时钟下只维持了一个有效时钟,而在时钟下,已经被采样了几次,一次读请求可能被误以为多次读请求。 时钟同步慢时钟信号示意图 RTL代码 module synchronizer( clk_...
  • 跨时钟域脉冲采样分为两种情况:一种情况是快时钟采样慢时钟域下的脉冲信号,另外一种情况是慢时钟采样时钟域下的脉冲信号。 A:快时钟采样慢时钟域下的脉冲信号 这种情况较为简单,例如存在慢时钟CLKA域下的...
  • 跨时钟域处理从时钟域到慢时钟域,如果是下面第一个图,cklb则可以采样到signal_a_in,但是如果只有单脉冲,如第二个图,则不能确保采样掉signal_a_in。这个时候用两级触发器同步是没有用的。 代码如下: //...
  • 如果你写过异步FIFO,格雷码的传输就已经包括慢时钟域到时钟域以及时钟域到慢时钟域的处理方法了,自己之前的异步FIFO由于理解没到位,时钟域到慢时钟域的处理也是打拍,原因是时钟域的时钟频率不够。...
  • 假设两个异步时钟频率比为 5, 我们可以先用延迟打拍的方法对数据使能信号进行 2 级打拍缓存,然后再在时钟域对慢时钟域的数据信号进行采集。 该方法的基本思想就是选择合适的时刻(例如数据的中间时刻)去采集...
  • 异步信号的同步处理——时钟域到慢时钟域程序适用条件 程序 module time_diff( input clk_a , //输入时钟A input rst_n , //复位信号 input pulse_a, //输入脉冲A input clk_b , //输入时钟B output ...
  • 最近研究了下,信号同步到快速时钟域的办法,也就是使用同步器。下面详细分析下。 1. 最开始我是采用下面...这样就把a的采样搬移到了快时钟域上,且数据宽度为1个时钟周期。 通过仿真,我们可以看到在第一次采样到.
  • //时钟域到慢时钟域的展宽打拍 module fast2slow_CDC( input clk1, input clk2, input rst, input pulse_clk1, output pulse_syn_clk2 ); reg pulse_wide_clk2; reg reg1_pulse_wide_clk2; reg reg1_...
  • 100MHz时钟域信号,用125M时钟域信号去检测,100M时钟域信号是个很长的脉冲信号,原则上时钟域一定能检测到慢时钟域的信号,但是他们是不同时钟域的信号,肯定存在亚稳态问题,这位工程师是这样子处理的。...
  • 异步信号的同步处理——慢时钟域到时钟域一、什么是亚稳态1.亚稳态发生原因2.亚稳态发生场合3.亚稳态危害二、理论分析1、信号传输中的亚稳态三、异步信号的同步处理,慢时钟域到时钟域1、程序2、适用条件 一、...
  • 慢时钟域 我们假定有两个时钟,CLK1 和 CLK2,还有一个信号叫 READ,CLK1 时钟频率于 CLK2,现在我们需要将READ 信号同步到CLK2时钟域下。 1、方法一:展宽+打拍同步 READ_DLY1 信号是 READ 信号相对于 CLK1 时钟...
  • 理论上讲,时钟域的信号总会采集到慢时钟域传输来的信号,如果存在异步可能会导致采样数据出错,所以需要进行同步处理。此类同步处理相对简单,一般采用延迟打拍法,或延迟采样法。 延迟打拍法 最常用的同步方法...
  • FPGA跨时钟域处理方法

    2021-07-17 20:19:16
    前提条件是 时钟域到慢时钟域,原因有两个,1)只有时钟域到慢时钟域,才能保证慢时钟域的脉冲信号能被时钟域采样到。2)两级寄存器的主要作用是消除亚稳态(不能完全消除亚稳态,但可以使亚稳态出现的概率...
  • 信号从时钟域传输到慢时钟域来时,需要根据信号的特点来进行同步处理。对于单 bit 信号,一般可按电平信号和脉冲信号来区分。 电平信号同步 同步逻辑设计中,电平信号是指长时间保持不变的信号。保持不变的时间...
  • 分为2种情况,以单Bit信号从慢时钟域到时钟域和时钟域到慢时钟域来说明。 文章目录1、慢时钟域到时钟域2、时钟域到慢时钟域二、仿真波形如图 1、慢时钟域到时钟域 慢时钟域到时钟域是经常遇到的,通常...
  • 目录 时钟域到慢时钟域 时钟域间可靠信号传递的要求 “三边沿”要求 ...与同步器相关的一个问题是,来自发送时钟域的信号可能会在采样之前更改两次值,或者可能过于接近较慢时钟域的采样边.
  • 转:https://blog.csdn.net/lugandong/article/details/72468831一、拿512fs说话:看图知道采样的位深是32bit(位),左右声道各占了8*32BCLK,那一个完整的LRCLK一共8*32*2=512BCLK。其实xxxfs就是这么算出来的,也是...
  • 时钟域问题

    2022-03-14 21:52:08
    跨时钟域 跨时钟域(CDC:Clock Domain Crossing)的信号可以分为单bit信号和多bit信号。...频率相差2倍以下,为了避免快时钟采样丢失,需要进行握手的同步处理。 2. 时钟域到慢时钟域 电平扩展 已知慢时钟域的时
  • 不同相频关系时钟的跨时钟域问题

    千次阅读 2022-01-21 20:28:54
    如果多个时钟都起源于同一时钟,并且它们的相位和频率关系是已知的,那么这些时钟可以看成是跨同步时钟域的时钟。按照相位和频率的关系,可以将这些时钟分成以下类型: 同频零相位差时钟 同频恒定相位差时钟 非同频...
  • 【数字IC手撕代码】Verilog单bit跨时钟,(打两拍,边沿同步,脉冲同步)|题目|原理|设计|仿真
  • 时钟域之全面解析

    千次阅读 多人点赞 2020-07-04 17:33:47
    上图中在信号adat传输到bclk中采样,由于采样时间靠近第二个时钟的上升沿,发生同步失败。同步失败是由于输处bdat变为亚稳态,而在bdat再次被采样时没有收敛到合法的稳定状态。 为什么会产生亚稳态? 存储元件,如...
  • 在一些双边沿接收发送数据的处理中,会以半频时钟为握手时钟,而内部采用时钟(半频时钟的一倍...时钟的上升沿既可以对应慢时钟的上升沿也可以对应慢时钟的下降沿,则a的变化既可能发生在慢时钟的上升沿也可能发...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,095
精华内容 2,838
关键字:

快时钟采样慢时钟