-
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
更多相关内容 -
单脉冲采样(1)---慢时钟采样快时钟
2018-01-19 20:44:24适用于脉冲信号采样,慢时钟采样快时钟 基本原理 将快时钟域的脉冲信号扩展成多周期的电平信号,慢时钟同步电平信号进行采样得到同步后的电平信号,此时通过电平延时组合逻辑由电平产生脉冲信号。 限制 快时钟...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_delay1、src_pulse_expand_delay2。再由(src_pulse_expand_delay1)&&(!src_pulse_expand_delay2)得到脉冲信号dst_pulse_tmp,dst_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
-
《Clock Domain Crossing》 翻译与理解(4)快时钟到慢时钟数据传输
2021-03-16 20:32:35慢时钟数据传递到快时钟域时,由于采样时钟速率更高,所以一般慢时钟域的数据都会被采集到,不会出现问题。前提是慢时钟域是快时钟域时钟的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---------------------------------------------
-
FPGA CDC跨时钟域设计学习(二)快时钟域同步到慢时钟域
2020-08-22 18:05:03快时钟域同步到慢时钟域设计一、开环设计方法闭环设计 一、开环设计方法 开环设计方法,一般只在对时钟控制信号有明确规定的时候用这样的设计方法。要求就是使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;
-
快时钟同步慢时钟域下的异步控制信号slow clk to fast clk
2022-04-23 10:53:41这种情况下,异步控制信号可能在己慢时钟下只维持了一个有效时钟,而在快时钟下,已经被采样了几次,一次读请求可能被误以为多次读请求。 快时钟同步慢时钟信号示意图 RTL代码 module synchronizer( clk_... -
Verilog学习心得之六 --- 跨时钟域脉冲采样
2019-08-16 00:27:26跨时钟域脉冲采样分为两种情况:一种情况是快时钟采样慢时钟域下的脉冲信号,另外一种情况是慢时钟采样快时钟域下的脉冲信号。 A:快时钟采样慢时钟域下的脉冲信号 这种情况较为简单,例如存在慢时钟CLKA域下的... -
FPGA&ASIC笔面试题(四):编写Verilog代码描述跨时钟域信号传输,快时钟域到慢时钟域(补充)
2021-07-10 16:59:08跨时钟域处理从快时钟域到慢时钟域,如果是下面第一个图,cklb则可以采样到signal_a_in,但是如果只有单脉冲,如第二个图,则不能确保采样掉signal_a_in。这个时候用两级触发器同步是没有用的。 代码如下: //... -
快到慢的跨时钟域处理
2022-04-24 19:59:12如果你写过异步FIFO,格雷码的传输就已经包括慢时钟域到快时钟域以及快时钟域到慢时钟域的处理方法了,自己之前的异步FIFO由于理解没到位,快时钟域到慢时钟域的处理也是打拍,原因是快时钟域的时钟频率不够快。... -
跨时钟域同步3---多bit信号同步(延迟采样法/慢到快)
2021-10-29 20:56:56假设两个异步时钟频率比为 5, 我们可以先用延迟打拍的方法对数据使能信号进行 2 级打拍缓存,然后再在快时钟域对慢时钟域的数据信号进行采集。 该方法的基本思想就是选择合适的时刻(例如数据的中间时刻)去采集... -
异步信号的同步处理——快时钟域到慢时钟域(方法一)
2020-04-08 11:17:31异步信号的同步处理——快时钟域到慢时钟域程序适用条件 程序 module time_diff( input clk_a , //输入时钟A input rst_n , //复位信号 input pulse_a, //输入脉冲A input clk_b , //输入时钟B output ... -
较慢的时钟域信号同步到较快的时钟域
2021-09-09 22:07:07最近研究了下,慢信号同步到快速时钟域的办法,也就是使用同步器。下面详细分析下。 1. 最开始我是采用下面...这样就把a的采样搬移到了快时钟域上,且数据宽度为1个时钟周期。 通过仿真,我们可以看到在第一次采样到. -
快时钟域到慢时钟域的展宽打拍-Verilog
2021-09-02 21:10:14//快时钟域到慢时钟域的展宽打拍 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_... -
慢时钟域到快时钟域长脉冲信号的检测方法
2022-03-19 15:43:25100MHz时钟域信号,用125M时钟域信号去检测,100M时钟域信号是个很长的脉冲信号,原则上快时钟域一定能检测到慢时钟域的信号,但是他们是不同时钟域的信号,肯定存在亚稳态问题,这位工程师是这样子处理的。... -
异步信号的同步处理——慢时钟域到快时钟域
2020-04-08 11:13:42异步信号的同步处理——慢时钟域到快时钟域一、什么是亚稳态1.亚稳态发生原因2.亚稳态发生场合3.亚稳态危害二、理论分析1、信号传输中的亚稳态三、异步信号的同步处理,慢时钟域到快时钟域1、程序2、适用条件 一、... -
跨时钟域同步2---单bit信号同步实战(快到慢+慢到快)
2021-10-08 15:03:21慢时钟域 我们假定有两个时钟,CLK1 和 CLK2,还有一个信号叫 READ,CLK1 时钟频率快于 CLK2,现在我们需要将READ 信号同步到CLK2时钟域下。 1、方法一:展宽+打拍同步 READ_DLY1 信号是 READ 信号相对于 CLK1 时钟... -
《数字IC: Verilog》4.2 跨时钟域传输:慢到快
2021-08-30 00:20:09理论上讲,快时钟域的信号总会采集到慢时钟域传输来的信号,如果存在异步可能会导致采样数据出错,所以需要进行同步处理。此类同步处理相对简单,一般采用延迟打拍法,或延迟采样法。 延迟打拍法 最常用的同步方法... -
FPGA跨时钟域处理方法
2021-07-17 20:19:16前提条件是 快时钟域到慢时钟域,原因有两个,1)只有快时钟域到慢时钟域,才能保证慢时钟域的脉冲信号能被快时钟域采样到。2)两级寄存器的主要作用是消除亚稳态(不能完全消除亚稳态,但可以使亚稳态出现的概率... -
《数字IC: Verilog》4.3 跨时钟域传输:快到慢
2021-08-30 00:29:21信号从快时钟域传输到慢时钟域来时,需要根据信号的特点来进行同步处理。对于单 bit 信号,一般可按电平信号和脉冲信号来区分。 电平信号同步 同步逻辑设计中,电平信号是指长时间保持不变的信号。保持不变的时间... -
FPGA实现跨时钟域传输问题
2021-09-17 08:37:42分为2种情况,以单Bit信号从慢时钟域到快时钟域和快时钟域到慢时钟域来说明。 文章目录1、慢时钟域到快时钟域2、快时钟域到慢时钟域二、仿真波形如图 1、慢时钟域到快时钟域 慢时钟域到快时钟域是经常遇到的,通常... -
【CDC 系列】跨时钟域处理(二)快时钟域信号同步到慢时钟域
2022-05-20 20:30:03目录 快时钟域到慢时钟域 时钟域间可靠信号传递的要求 “三边沿”要求 ...与同步器相关的一个问题是,来自发送时钟域的信号可能会在采样之前更改两次值,或者可能过于接近较慢时钟域的采样边. -
linux alsa音频中采样率fs、比特率BCLK 、主时钟MCLK关系
2021-05-19 05:34:28转: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跨时钟域快到慢,慢到快,(打两拍,边沿同步,脉冲同步)|题目|原理|设计|...
2022-02-19 00:07:17【数字IC手撕代码】Verilog单bit跨时钟域快到慢,慢到快,(打两拍,边沿同步,脉冲同步)|题目|原理|设计|仿真 -
跨时钟域之全面解析
2020-07-04 17:33:47上图中在信号adat传输到bclk中采样,由于采样时间靠近第二个时钟的上升沿,发生同步失败。同步失败是由于输处bdat变为亚稳态,而在bdat再次被采样时没有收敛到合法的稳定状态。 为什么会产生亚稳态? 存储元件,如... -
关于数字IC设计中分频后的慢速时钟和以快时钟触发的信号的关系处理
2019-03-23 15:13:38在一些双边沿接收发送数据的处理中,会以半频时钟为握手时钟,而内部采用快时钟(半频时钟的一倍...快时钟的上升沿既可以对应慢时钟的上升沿也可以对应慢时钟的下降沿,则a的变化既可能发生在慢时钟的上升沿也可能发...