慢到快时钟域:

单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计数延迟采样相关推荐

  1. 【 FPGA 】跨时钟域处理以及边沿检测

    本文转载自:跨时钟域处理 题目:多时钟域设计中,如何处理跨时钟域 单bit:两级触发器同步(适用于慢到快) 多bit:采用异步FIFO,异步双口RAM 加握手信号 格雷码转换 题目:编写Verilog ...

  2. 跨时钟域电路设计方法

    在数字电路设计过程中 ,难免会遇到某个信号需要跨越不同时钟域的情况. 如果对跨时钟域的信号不做妥善的处理,跨越时钟域后,信号可能发生亚稳态,传播亚稳态,导致电路工作异常.并且,由跨时钟域处理不当引发的 ...

  3. 竞争冒险 亚稳态 跨时钟域 异步fifo

    1竞争冒险 竞争冒险存在组合电路中,以下图为例,对于图a中的与门,初始时刻A是高电平,B是低电平,输出Y是低电平.在某一个时刻B先开始跳变,并且达到了与门的VIL(max),此时B被视为高电平,A在某 ...

  4. FPGA跨时钟域处理的三大方法

    跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者的必修课.如果是还在校的本科生,跨时钟域处理也是面试中经常常被问到的一个问题. 在本篇文章中,主要介 ...

  5. FPGA设计中,跨时钟域问题的处理

    FPGA设计中,跨时钟域问题的处理 今天和大侠简单聊一聊FPGA设计中跨时钟域问题的处理,话不多说,上货. 跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPG ...

  6. 解决跨时钟域问题的三大方法

    跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者的必修课.如果是还是在校的学生,跨时钟域处理也是面试中经常常被问到的一个问题. 在本篇文章中,主要介 ...

  7. 跨时钟域为什么要双寄存器同步

    随着设计规模的不断攀升,各种接口外设琳琅满目,时钟"满天飞"就不可避免(注意这里的"满天飞"不是滥用,意指时钟频率多.时钟扇出多).而一个设计中,不同时钟频率之 ...

  8. 控制信号(单脉冲信号)的跨时钟域传输问题

    控制信号(单脉冲信号)的跨时钟域传输问题存在两种情况,一种是从快时钟域到慢时钟域传输,如果用慢时钟强行采样快时钟域内的控制信号,可能存在采样不到信号的情况,而且很大概率采不到信号:另一种情况是从慢时钟 ...

  9. FPGA知识点汇总(verilog、数字电路、时序分析、跨时钟域、亚稳态)

    FPGA十分擅长同时做简单且重复的工作(并行计算)人工智能就有许多重复性.需要并行计算的工作如模式识别.图像处理,在通信领域,FPGA的低延时.可编程.低功耗的特点 开发流程:RTL设计,仿真验证,逻 ...

最新文章

  1. linux安全擦除ssd命令,linux – 如何向SSD发送“ATA Secure Erase”命令?
  2. 全新发布:《SQL语法速成手册》
  3. Mycat探索之旅(3)----Mycat的全局序列号
  4. 数学篇(三)向量的基本运算
  5. 修改shell提示符的显示格式
  6. Instr()函数用法
  7. 【Flink】Flink yarn 下报错ClassNotFoundException: org.apache.hadoop.yarn.api.ApplicationConstants$Environ
  8. Day02:requests请求库,selenium请求库
  9. C#串口编程测试收发
  10. dcs world f15c教学_开源声码器WORLD在语音合成中的应用
  11. hibernate整合openGauss
  12. NB-IOT基础模型搭建思路
  13. 这是我看过把Spring Cloud核心组件讲的最明白的一个故事了
  14. SQL中的日期和字符串互相转换
  15. python tokenize()_tokenize (Language) – Python 中文开发手册 - Break易站
  16. 友盟php接入统计,ionic2 接入友盟统计
  17. 未能写入输出文件..”--“拒绝访问。”的解决办法 [转]
  18. 谷歌 发布android 8,谷歌推出了Android 8.1 预计在12月发布正式版
  19. 「MixMarvel征文」链游大厂MixMarvel,值得期待
  20. 2022年如何寻找外链资源?

热门文章

  1. C语言程序里何时用分号?
  2. 基于JAVA校园面包超市系统计算机毕业设计源码+系统+数据库+lw文档+部署
  3. 一家小珠宝店老板的豪赌
  4. 基于springboot的海鲜特产商城
  5. 高性能程序设计,缓存为王
  6. C++ 同类不同对象的互相访问
  7. Vue 登陆 处理 token
  8. 第六篇:Ceph集群常见问题处理方法
  9. rabbitmq端口
  10. 叮,您有一份防薅羊毛攻略已送达。