verilog 跨时钟域 单bit延迟打拍 多bit延迟采样 多bit计数延迟采样
慢到快时钟域:
单bit数据 延迟打拍法
// 慢时钟域到快时钟域 单bit数据 延迟打拍法
// 一般设计中使用两级触发器进行缓存即可满足设计时序需求
// 两级触发器延迟打拍并检测信号上升沿的 Verilog 描述如下module slow2fast_delay_clap(input clk1, // 异步慢时钟input sig1, // 异步信号input rstn, // 复位input clk2, // 目的快时钟output sig2); // 快时钟域同步后的信号reg[2:0] sig2_r; // 寄存三拍,前两级用于同步,后两级用于边沿检测always@(posedge clk2 or negedge rstn)beginif(~rstn) sig2_r <= 3'b0;else sig2_r <= {sig2_r[1:0], sig1}; // 缓存endassign sig2 = sig2_r[1] && !sig2_r[2]; // 上升沿检测endmodule //---------testbench--------`timescale 1ns/10ps
module slow2fast_delay_clap_tb;reg clk1,clk2,rstn,sig1;wire sig2;slow2fast_delay_clap m(clk1,sig1,rstn,clk2,sig2);initial beginclk1=0; clk2=0; sig1=0; rstn=0;#20 rstn=1; #30 sig1=1;#20 sig1=0; // 一个慢时钟周期后sig1=0#400 $stop;endalways #10 clk1 = ~clk1; // 慢时钟always #5 clk2 = ~clk2; // 快时钟endmodule
多bit数据 延迟采样法
例如当两个异步时钟频率比为 5 时,可以先用延迟打拍的方法对数据使能信号进行 2 级打拍缓存,然后再在快时钟域对慢时钟域的数据信号进行采集。该方法的基本思想是保证信号被安全采集的时刻,而不用同步多位宽的数据信号,可节省部分硬件资源。
// 慢时钟 20MHz
// 快时钟 100MHz
module delay_sample(input rstn,input clk1,input [31:0] din,input din_en,input clk2,output [31:0] dout,output dout_en);//sync din_en 同步数据输入使能信号 2级打拍缓存reg [2:0] din_en_r ;always @(posedge clk2 or negedge rstn) beginif (!rstn) din_en_r <= 3'b0 ;else din_en_r <= {din_en_r[1:0], din_en} ; // 缓存endwire din_en_pos = din_en_r[1] && !din_en_r[2] ; // 同步使能信号上升沿检测// 同步数据reg [31:0] dout_r ;reg dout_en_r ;always @(posedge clk2 or negedge rstn) beginif (!rstn)dout_r <= 'b0 ;else if (din_en_pos)dout_r <= din ;end//dout_en delay 同步数据输出使能信号always @(posedge clk2 or negedge rstn) beginif (!rstn) dout_en_r <= 1'b0 ;else dout_en_r <= din_en_pos ; // 输入有效,则输出有效endassign dout = dout_r ; assign dout_en = dout_en_r ;endmodule
din_en 拉高后,dout_en 在快时钟域延迟2拍 (第3个上升沿) 才拉高。
多bit 计数延迟采样:
但如果慢时钟域没有数据使能信号 din_en, 或数据使能信号一直有效,此时在快时钟域对数据使能信号进行上升沿检测的方法将会失效。因为数据使能信号一直有效,除了第一个数据,快时钟域将无法检测到后继数据的传输时刻。解决方法就是,在快时钟域对慢时钟信号的边沿进行检测。
如果两个时钟的频率相差较小,可能还需要对数据进行延迟缓存,以保证采集到的是当拍时钟的数据;如果两个时钟的频率相差较大,数据采样时刻可以通过计数的方法获得,而不用对数据进行缓存。
// 利用计数延迟采样的方法对慢时钟边沿进行检测的 Verilog 描述如下。// 慢时钟 999KHz
// 快时钟 100MHz (快慢差100倍)
module delay_cnt_sample(input rstn,input clk1,input [31:0] din,input din_en,input clk2,output [31:0] dout,output dout_en);//4级缓存:3级用于打拍同步,一级用于边沿检测reg [3:0] edge_r ;always @(posedge clk2 or negedge rstn) beginif (!rstn) edge_r <= 3'b0 ;else edge_r <= {edge_r[3:0], clk1} ;endwire edge_pos = edge_r[2] && !edge_r[3] ; // 慢时钟上升沿延时3拍//延迟计数器,检测到慢时钟上升沿时开始计数reg [5:0] cnt ;always @(posedge clk2 or negedge rstn) beginif (!rstn) cnt <= 6'h3f ;else if (edge_pos && din_en) cnt <= 6'h0 ;else if (cnt != 6'h3f) cnt <= cnt + 1'b1 ;end//数据同步reg [31:0] dout_r ;reg dout_en_r ;always @(posedge clk2 or negedge rstn) beginif (!rstn)dout_r <= 'b0 ;else if (din_en && cnt == 47) // 大约在慢时钟周期中间时刻采样 (3+47=50)dout_r <= din ;end//数据使能信号较数据采样时刻延迟一个周期输出always @(posedge clk2 or negedge rstn) beginif (!rstn) dout_en_r <= 1'b0 ;else if (din_en && cnt==48) dout_en_r <= 1'b1 ;else dout_en_r <= 1'b0 ;endassign dout = dout_r ;assign dout_en = dout_en_r ;endmodule
频率相差较大的数据同步采样结果图如下。由图可知,快时钟采样时刻在慢时钟周期中央时刻左右,此时是非常安全的。
寄存n拍
// 不对输入信号进行寄存
always @ (posedge clk) beginif (inputs) begin...end...
end// 对输入信号寄存一拍
always @ (posedge clk) begininputs_reg <= inputs;if (inputs_reg == 1'b0 && inputs == 1'b1)begin...end...
end//对输入信号寄存三拍
always @ (posedge clk) begininputs_reg1 <= inputs;inputs_reg2 <= inputs_reg1;inputs_reg3 <= inputs_reg2;if (inputs_reg2 == 1'b1 && inputs_reg3 == 1'b0) begin...end...
end
verilog 跨时钟域 单bit延迟打拍 多bit延迟采样 多bit计数延迟采样相关推荐
- 【 FPGA 】跨时钟域处理以及边沿检测
本文转载自:跨时钟域处理 题目:多时钟域设计中,如何处理跨时钟域 单bit:两级触发器同步(适用于慢到快) 多bit:采用异步FIFO,异步双口RAM 加握手信号 格雷码转换 题目:编写Verilog ...
- 跨时钟域电路设计方法
在数字电路设计过程中 ,难免会遇到某个信号需要跨越不同时钟域的情况. 如果对跨时钟域的信号不做妥善的处理,跨越时钟域后,信号可能发生亚稳态,传播亚稳态,导致电路工作异常.并且,由跨时钟域处理不当引发的 ...
- 竞争冒险 亚稳态 跨时钟域 异步fifo
1竞争冒险 竞争冒险存在组合电路中,以下图为例,对于图a中的与门,初始时刻A是高电平,B是低电平,输出Y是低电平.在某一个时刻B先开始跳变,并且达到了与门的VIL(max),此时B被视为高电平,A在某 ...
- FPGA跨时钟域处理的三大方法
跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者的必修课.如果是还在校的本科生,跨时钟域处理也是面试中经常常被问到的一个问题. 在本篇文章中,主要介 ...
- FPGA设计中,跨时钟域问题的处理
FPGA设计中,跨时钟域问题的处理 今天和大侠简单聊一聊FPGA设计中跨时钟域问题的处理,话不多说,上货. 跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPG ...
- 解决跨时钟域问题的三大方法
跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者的必修课.如果是还是在校的学生,跨时钟域处理也是面试中经常常被问到的一个问题. 在本篇文章中,主要介 ...
- 跨时钟域为什么要双寄存器同步
随着设计规模的不断攀升,各种接口外设琳琅满目,时钟"满天飞"就不可避免(注意这里的"满天飞"不是滥用,意指时钟频率多.时钟扇出多).而一个设计中,不同时钟频率之 ...
- 控制信号(单脉冲信号)的跨时钟域传输问题
控制信号(单脉冲信号)的跨时钟域传输问题存在两种情况,一种是从快时钟域到慢时钟域传输,如果用慢时钟强行采样快时钟域内的控制信号,可能存在采样不到信号的情况,而且很大概率采不到信号:另一种情况是从慢时钟 ...
- FPGA知识点汇总(verilog、数字电路、时序分析、跨时钟域、亚稳态)
FPGA十分擅长同时做简单且重复的工作(并行计算)人工智能就有许多重复性.需要并行计算的工作如模式识别.图像处理,在通信领域,FPGA的低延时.可编程.低功耗的特点 开发流程:RTL设计,仿真验证,逻 ...
最新文章
- linux安全擦除ssd命令,linux – 如何向SSD发送“ATA Secure Erase”命令?
- 全新发布:《SQL语法速成手册》
- Mycat探索之旅(3)----Mycat的全局序列号
- 数学篇(三)向量的基本运算
- 修改shell提示符的显示格式
- Instr()函数用法
- 【Flink】Flink yarn 下报错ClassNotFoundException: org.apache.hadoop.yarn.api.ApplicationConstants$Environ
- Day02:requests请求库,selenium请求库
- C#串口编程测试收发
- dcs world f15c教学_开源声码器WORLD在语音合成中的应用
- hibernate整合openGauss
- NB-IOT基础模型搭建思路
- 这是我看过把Spring Cloud核心组件讲的最明白的一个故事了
- SQL中的日期和字符串互相转换
- python tokenize()_tokenize (Language) – Python 中文开发手册 - Break易站
- 友盟php接入统计,ionic2 接入友盟统计
- 未能写入输出文件..”--“拒绝访问。”的解决办法 [转]
- 谷歌 发布android 8,谷歌推出了Android 8.1 预计在12月发布正式版
- 「MixMarvel征文」链游大厂MixMarvel,值得期待
- 2022年如何寻找外链资源?