【CDC跨时钟域信号处理】快时钟域到慢时钟域-单bit

news2024/11/26 23:19:27

快时钟域到慢时钟域分两种情况:
1、允许采样丢失:直接采用同步器即可。
2、不允许采样丢失:原理是保证快时钟域的信号宽度满足一定的条件,使得慢时钟域有足够的时间采样到。
对于情况2有两种方法解决:①信号展宽+边沿检测②握手,且①比②要优先被选择。因为握手资源消耗较大,一般不用。

方法一

脉冲信号展宽+边沿检测,脉冲信号转换成电平信号再进行边沿检测

  • 电路图:
    在这里插入图片描述
  • 代码:(verilog是描述电路的语言,所以要心中有电路,代码就好写了)
module pulse_detect(
    input              clk_fast    , 
    input              clk_slow    ,   
    input              rst_n       ,
    input               data_in     ,
    output           dataout
);
  reg data_in_fast;
  reg [2:0] data_slow;
  //将脉冲信号在快时钟域展平为电平信号。即展宽脉冲信号。在两次脉冲信号之间为电平信号。
  always@(posedge clk_fast or negedge rst_n)begin
      if(!rst_n)
          data_in_fast<= 0;
      else
          data_in_fast<= data_in ? (~data_in_fast) : data_in_fast;
  end
  //将展宽的脉冲信号在慢时钟域打两拍,并检测边沿。
  always@(posedge clk_slow or negedge rst_n)begin
      if(!rst)
          data_slow <= 3'b0;
      else
          data_slow <= {data_slow[1:0],data_in_reg};
  end   
  
  assign dataout = data_slow[2] ^ data_slow[1]; 
endmodule

  • 波形
    在这里插入图片描述

方法二

握手+边沿

  • 电路图:
    在这里插入图片描述
  • 代码1:
module pulse_detect(
  input         clk_fast  , 
  input         clk_slow  ,   
  input         rst_n    ,
  input        data_in    ,

  output         dataout
);
    //握手方式
    reg fast_req;//fast时钟域的请求信号
    reg slow_ack;//slow时钟域的应答信号
    reg [2:0] slow_req;//slow时钟域的请求信号
    reg [2:0] fast_ack;//fast时钟域的应答信号
    
    //fast时钟域
    
    //将slow时钟域的应答信号打三拍,送到fast时钟域
    always@(posedge clk_fast or negedge rst_n)begin
        if(!rst_n)
            fast_ack <= 3'd0;
        else
            fast_ack <= {fast_ack[1:0],slow_ack};
    end
    
    //生成请求信号fast_req
    always@(posedge clk_fast or negedge rst_n)begin
        if(!rst_n)
            fast_req <= 0;
        else if(data_in)
            fast_req <= 1'b1;
        else
            //快时钟域中没有输入数据时
            //如果慢时钟域应答了,01x,则快时钟域此时不请求,否则,快时钟域的请求信号维持上一时钟的状态
            fast_req <= ((fast_ack[1]) & (~fast_ack[2])) ? 1'b0 : fast_req;        
    end
    
    //slow时钟域
    
    //将fast时钟域的请求信号打三拍,送到slow时钟域
    always@(posedge clk_slow or negedge rst_n)begin
        if(!rst_n)
            slow_req <= 0;
        else
            slow_req <= {slow_req[1:0],fast_req};
    end
    
    //生成应答信号slow_ack
    always@(posedge clk_slow or negedge rst_n)begin
        if(!rst_n)
            slow_ack <= 0;
        else if(slow_req[1] & (~slow_req[2])) 
            //如果快时钟域的请求信号由0变为1,01x,即发出请求信号,则慢时钟域进行应答
            slow_ack <= 1'b1;
        else
            //如果slow请求信号10x,即慢时钟域请求信号无效时,慢时钟域不应答
            //否则慢时钟域应答信号不变
            slow_ack <= (slow_req[2]&(~slow_req[1])) ? 1'b0 : slow_ack;
    end
    //当慢时钟域01x,发出请求信号时,输出为1.
    assign dataout = (~slow_req[2]) & (slow_req[1]);
    
endmodule
  • 代码2:
module Sync_Pulse (
                input  src_clk,
                input  dst_clk,
                input  rst_n,
                input  src_pulse,
   
                output  dst_pulse
                  );
  
    reg req_state_dly1, req_state_dly2,dst_req_state,src_sync_req;
    reg ack_state_dly1,src_sync_ack;
    wire dst_sync_ack;
     
    always @ (posedge src_clk or negedge rst_n) begin
            if (rst_n == 1'b0)
                src_sync_req <= 1'b0;
            else if (src_pulse)           
                src_sync_req <= 1'b1;
            else if (src_sync_ack)           
                src_sync_req <= 1'b0;
            else;
     end
    
   
    always @ (posedge dst_clk or negedge rst_n) begin
            if (rst_n == 1'b0)
            begin
                req_state_dly1 <= 1'b0;
                req_state_dly2 <= 1'b0;
                dst_req_state <= 1'b0;
            end else begin
                req_state_dly1 <= src_sync_req;
                req_state_dly2 <= req_state_dly1;        
                dst_req_state <= req_state_dly2;
             end
    end
    
    assign dst_sync_ack = req_state_dly2;
    
    always @ (posedge src_clk or negedge rst_n) begin
            if (rst_n == 1'b0) begin
                    ack_state_dly1 <= 1'b0;
                    src_sync_ack <= 1'b0;
            end
            else begin
                     ack_state_dly1 <= dst_sync_ack;
                     src_sync_ack <= ack_state_dly1;
            end
     end
 
    assign  dst_pulse =   dst_req_state & (~req_state_dly2);
 
endmodule

对上述代码增加同步失败的指示信号

module handshake_pulse_sync
(
        input src_clk , //source clock
        input src_rst_n, //source clock reset (0: reset)
        input src_pulse , //source clock pulse in
       
        output src_sync_fail , //source clock sync state: 1 clock pulse if sync fail.
        input dst_clk , //destination clock
        input dst_rst_n , //destination clock reset (0:reset)
        output dst_pulse //destination pulse out
);
        //INTER DECLARATION        
        wire dst_pulse ;
        wire src_sync_idle ;
        reg src_sync_fail ;
        reg src_sync_req ;
        reg src_sync_ack ;
        reg ack_state_dly1, ack_state_dly2 ;
        reg req_state_dly1, req_state_dly2 ;
        reg dst_req_state ;
        reg dst_sync_ack ;
              
        assign src_sync_idle = ~(src_sync_req | src_sync_ack );
        
        //report an error if src_pulse when sync busy ;
        always @(posedge src_clk or negedge src_rst_n) begin
            if(src_rst_n == 1'b0)
                    src_sync_fail <= 1'b0 ;
            else if (src_pulse & (~src_sync_idle))
                    src_sync_fail <= 1'b1 ;
            else
                    src_sync_fail <= 1'b0 ;
        end
        
        
        //set sync req if src_pulse when sync idle ;
        always @(posedge src_clk or negedge src_rst_n) begin
                if(src_rst_n == 1'b0)
                        src_sync_req <= 1'b0 ;
                else if (src_pulse & src_sync_idle)
                        src_sync_req <= 1'b1 ;
                else if (src_sync_ack)
                        src_sync_req <= 1'b0 ;
        end
                
        always @(posedge src_clk or negedge src_rst_n) begin
                if(src_rst_n == 1'b0) begin
                        ack_state_dly1 <= 1'b0 ;
                        ack_state_dly2 <= 1'b0 ;
                        src_sync_ack <= 1'b0 ;
                end
                else begin
                        ack_state_dly1 <= dst_sync_ack ;
                        ack_state_dly2 <= ack_state_dly1 ;
                        src_sync_ack <= ack_state_dly2 ;
                end
        end
        
        always @(posedge dst_clk or negedge dst_rst_n) begin
                if(dst_rst_n == 1'b0) begin
                        req_state_dly1 <= 1'b0 ;
                        req_state_dly2 <= 1'b0 ;
                        dst_req_state <= 1'b0 ;
                end
                else begin
                        req_state_dly1 <= src_sync_req ;
                        req_state_dly2 <= req_state_dly1 ;
                        dst_req_state <= req_state_dly2 ;
                end
        end
        
        //Rising Edge of dst_state generate a dst_pulse;
        assign dst_pulse = (~dst_req_state) & req_state_dly2 ;
        //set sync ack when src_req = 1 , clear it when src_req = 0 ;
        
        always @(posedge dst_clk or negedge dst_rst_n) begin
                if(dst_rst_n == 1'b0)
                        dst_sync_ack <= 1'b0;
                else if (req_state_dly2)
                        dst_sync_ack <= 1'b1;
                else
                        dst_sync_ack <= 1'b0;
        end
endmodule

电路分析:
将src时钟域的脉冲信号打一拍之后,在dst时钟域内打三拍进行同步,其中第二拍的结果作为dst时钟域的应答信号,第二拍和第三拍的结果做边沿检测,以保证在dst时钟域输出接收到的脉冲信号。

其中第二拍的应答信号,在src时钟域经过两级同步作为src的应答信号,当输入脉冲信号时,src的请求信号有效。当src的应答信号有效时,请求信号无效。

缺点:上述操作无法检测到脉冲连续输入时产生的错误,即无法检测同步失败。如:在当前脉冲信号同步过程中又发出了新的脉冲信号的情况。

快时钟域至少展宽脉冲宽度到大于慢时钟域的周期长度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口管理测试繁琐复杂?何不试试Eolink

一、前言 作为一名测试从业者&#xff0c;深刻的明白接口测试在项目过程中是多么重要的一个环节。通过页面进行的UI测试会因为界面不稳定而导致用例维护非常困难。另外&#xff0c;在检查系统的安全性、稳定性上面也是尤为重要的环节&#xff0c;这些也是无法通过前端测试的&a…

react-native webstorm 无法启动 Android 模拟器

react-native webstorm 无法启动 Android 模拟器 一、问题描述 在 安装完 Android Studio 和 模拟器之后&#xff0c;WebStorm 启动 react-native 项目时提示如下&#xff1a; No emulators found as an output of emulator -list-avds.二、解决办法 官方环境安装说明&#x…

汽车OTA技术门槛提升,具备软硬一体化能力的Tier1优势凸显

在软件定义汽车的大背景下&#xff0c;无论是传统车企还是造车新势力都在加大OTA的布局力度&#xff0c;整车OTA的普及应用已经成为必然趋势。 高工智能汽车研究院监测数据显示&#xff0c;2022年1-6月中国市场&#xff08;不含进出口&#xff09;乘用车标配搭载OTA上险量为40…

移动硬盘raw怎么办?一招教你解决RAW格式的文件

RAW文件格式是一种特殊的文件格式。RAW表示未处理&#xff0c;因此RAW也指未格式化的磁盘。移动硬盘里有 RAW格式的文件。这是什么原因造成的&#xff1f;以及我们该如何把移动硬盘raw里面的文件给恢复回来&#xff1f;来看看下面的解说&#xff0c;一起寻找解决方法吧&#xf…

阿里云国际站云计算-负载均衡SLB介绍-unirech

阿里云国际站的负载均衡SLB&#xff08;Server Load Balancer&#xff09;是一种对流量进行按需分发的服务&#xff0c;通过将流量分发到不同的后端服务器来扩展应用系统的吞吐能力&#xff0c;并且可以消除系统中的单点故障&#xff0c;提升应用系统的可用性。 阿里云国际站的…

研究研究 ES_OEMCONVERT 标志

ES_OEMCONVERT 这个标志&#xff0c;主要是用在 16 位 Windows 系统上。下面是一篇 MSDN 上的文章中对它的一段描述&#xff1a; ES_OEMCONVERT 会导致输入到编辑控件中的文本从 ANSI 转换为 OEM&#xff0c;然后再转换回 ANSI。这可确保在应用程序调用 AnsiToOem 函数将编辑控…

【在Vue脚手架项目中使用axios】

目录 1. 安装axios 2. 在main.js中添加配置 1. 安装axios 首先&#xff0c;需要安装axios&#xff0c;则在终端窗口中&#xff0c;在当前项目文件夹下&#xff0c;执行安装命令&#xff1a; 如果没有权限进入C盘找到cmd的执行软件&#xff0c;用管理员启动&#xff0c;进入目…

作为外贸业务员,为什么我经常随机轻松 就“捡“到精准潜在客户

心里夹杂着很多情绪和想法&#xff0c;沉浸在客户背调里面走不出来&#xff0c;但我还是决定不得不暂停下得心应手的google背调&#xff0c;记录一下此时此刻的想法。 01 我曾好多次在文章里表露出做外贸业务背调是非常关键的一环&#xff0c;而在背调里一些细微的关键信息非常…

自适应滤波器更新算法-EP3

文章目录1、PNLMS和IPNLMS算法1.1 算法原理2.2 算法分析2、一种改进的时变参数的比例自适应滤波算法2.1 算法原理2.2 算法分析2.3 算法性能评价标准2.3.1 均方误差(Mean Square Error, MSE)2.3.2 失调(Misalignment, MIS)2.3.3 回声衰减系数(Echo Return Loss Enhancement, ERL…

【音视频开发】为什么无损音频会有44.1Khz这样的奇葩采样率?

文章目录一、 问题&#xff1a;为什么无损音频会有44.1Khz这样的奇葩采样率&#xff1f;二 、PCM流程2.1 PCM流程2.2 PCM量化方式2.2 量化位数2.3 比特率三、答疑解惑3.1 使用采样定理来解释3.2 以影片磁带录音&#xff1f;硬件限制而来的 44.1kHz3.3 关于44100和质数的关系四、…

【关于检查请求参数的基本有效性】

目录 检查请求参数的基本有效性 检查请求参数的基本有效性 在服务器端项目中&#xff0c;可以通过spring-boot-starter-validation对请求参数进行检查。 在客户端项目中&#xff0c;Element UI的示例表单中都有对各控件&#xff08;例如输入框、选择框等&#xff09;的检查。…

[附源码]Python计算机毕业设计Django校园生活服务平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

DBCO的PEG连接剂1480516-75-3,DBCO-PEG4-Maleimide(MAL)

DBCO-PEG4-Maleimide试剂反应原理&#xff1a; DBCO-PEG4-Maleimide是包含马来酰亚胺基团和DBCO部分的PEG连接剂。亲水性PEG间隔臂提高了在水缓冲液中的溶解度。马来酰亚胺基团与硫醇特异有效地反应&#xff0c;形成稳定的硫醚键。低质量将为改性分子添加间隔物&#xff0c;并…

任务(task)

任务&#xff08;task&#xff09; 一、 任务概述 线程&#xff08;Thread&#xff09;是创建并发的底层工具&#xff0c;因此有一定的局限性&#xff08;不易得到返回值&#xff08;必须通过创建共享域&#xff09;&#xff1b;异常的捕获和处理也麻烦&#xff1b;同时线程执…

Linux软件包管理

Linux软件包管理实验目的及要求1.了解RPM特点与YUM工作机制。2.熟悉RPM软件包的密钥管理。3.掌握RPM、YUM或DNF包管理方法及其命令。实验原理实验步骤1.查询当前已安装的RPM包&#xff0c;在安装光盘上查找尚未安装的RPM包&#xff0c;通过命令和图形界面的多种方式进行安装、升…

年龄到了一定程度才能体会到世界杯的真正意义

前言 聊起来世界杯&#xff0c;想必读者们都有说不完的世界杯话题&#xff0c;四年一届的全球盛会&#xff0c;把全世界的目光都牢牢的拿捏在手里&#xff0c;世界杯不仅仅是关于足球的比赛活动&#xff0c;而且更是团队协作精神、永不言弃等精神的体现和传承。年轻的时候可能是…

在线点餐系统毕业设计,外卖点餐系统设计与实现,毕业设计论文源码需求分析

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于java的外卖点菜系统&#xff0c;管理员通过后台添加菜品&#xff0c;用户浏览器登录&#xff0c;查看菜品、购买、下单等。根据需求&#xff0c;本系统采用的是BS&#xff08;Browser Server简称浏览器服…

[论文分享] IR2Vec: LLVM IR Based Scalable Program Embeddings

IR2Vec: LLVM IR Based Scalable Program Embeddings [TACO 2020] S. VENKATAKEERTHY, ROHIT AGGARWAL, Indian Institute of Technology Hyderabad 我们提出了IR2Vec&#xff0c;一种简洁且可扩展的编码框架&#xff0c;将程序表示为连续空间中的分布式嵌入。这种分布式嵌入…

java反射所需要了解的基本知识点

反射概述 反射&#xff1a;通过运行时操作元数据或对象&#xff0c;Java 可以灵活地操作运行时才能确定的信息&#xff0c;指程序可以访问、检测和修改它本身状态或行为的一种能力。 其相关类在下面这个包里面&#xff1a;java.lang.reflect.*; 反射机制相关的重要的类&#…

图解系统:

1.硬件结构 1.1.存储器的层次关系 每个存储器只和相邻的一层存储器设备打交道&#xff0c;并且存储设备为了追求更快的速度&#xff0c;所需的材料成本必然也是更高&#xff0c;也正因为成本太高&#xff0c;所以 CPU 内部的寄存器、L1\L2\L3 Cache 只好用较小的容量&#xff…