当前位置: 首页 > news >正文

fpga系列 HDL:跨时钟域同步 双触发器同步器

目录

      • **双触发器同步器(Two-Flip-Flop Synchronizer)示例代码**:
      • 双触发器同步器的优缺点
        • 优点:
        • 缺点:
        • 适用场景:
    • 应用实例:同步来自spi_slave的单个使能信号

  • 跨时钟域的设计需要特别小心,以避免亚稳态问题。双触发器同步器(2-Flip-Flop Synchronizer) 是一种简单且广泛应用的 时钟域交叉(CDC) 同步方法,用于将一个时钟域中的信号同步到另一个时钟域中。它通过使用两个触发器级联,确保信号在跨越不同时钟域时,(以指数平方级别)降低因为时钟的不匹配导致不稳定或亚稳态(metastability)发生的概率。

https://github.com/Strivekaudani/CDC-FIFO/blob/master/source/two_flip_flop_sync.v

双触发器同步器(Two-Flip-Flop Synchronizer)示例代码

module nocdc (input wire clk_dst,      // 目标时钟域时钟input wire async_signal, // 来自源时钟域的异步信号input wire rst_n,        // 异步复位信号,低电平有效output reg sync_signal,  // 同步后的信号output reg [7:0] counter // 计数器输出
);reg sync_ff1, sync_ff2;// 使用双触发器进行同步always @(posedge clk_dst or negedge rst_n) beginif (!rst_n) beginsync_ff1 <= 1'b0;sync_ff2 <= 1'b0;end else beginsync_ff1 <= async_signal; // 第一阶段采样异步信号sync_ff2 <= sync_ff1;     // 第二阶段消除亚稳态endendassign sync_signal = sync_ff2; // 输出同步后的信号// 使用同步后的信号更新计数器always @(posedge clk_dst or negedge rst_n) beginif (!rst_n) begincounter <= 8'b0;end else if (sync_signal) begincounter <= counter + 1'b1; // 增加计数器endendendmodule
  • 第一寄存器 sync_ff1 捕获来自源时钟域的信号,可能处于亚稳态。
  • 第二寄存器 sync_ff2 采样 sync_ff1,将信号稳定到目标时钟域。

双触发器同步器的优缺点

优点:
  1. 简单高效:双触发器同步器结构简单,通常只需要两个 D 型触发器,因此在资源使用上非常高效。
  2. 低延迟:与其他更复杂的同步方法(如 FIFO)相比,双触发器同步器的延迟较低。
  3. 减少亚稳态的风险:通过两个触发器级联,可以有效降低亚稳态的发生概率,因为第二个触发器会提供额外的稳定化时间。
缺点:
  1. 仅适用于低频信号:双触发器同步器适用于频率差异较小的时钟域交叉。如果时钟域的频率差异过大,可能会导致信号丢失或同步失败。
  2. 无法处理高数据率:如果跨时钟域的数据速率较高,双触发器同步器可能无法有效同步所有数据。
  3. 可能的延迟:虽然延迟较小,但依然会引入一个时钟周期的延迟。
适用场景:
  • 双触发器同步器特别适合同步 单比特控制信号低速数据,例如用于处理外部输入的控制信号、状态标志或较慢的时钟信号。
  • 在高数据率的应用中(如 SPI、I2C、UART 等接口),可能需要更复杂的同步方法,如 FIFO 缓存等。

应用实例:同步来自spi_slave的单个使能信号

  • 使能信号SPI_OPEN_LOOP为非同步信号:
    在这里插入图片描述
  • scheduler的开环配置信号输入(SPI_OPEN_LOOP)来自spi_slave,scheduler实现如下:
// https://github.com/ChFrenkel/tinyODIN/blob/main/scheduler.v 
// 一个调度器(Scheduler)模块,且相较于原始的ODIN调度器移除了旋转FIFO相关功能
// "scheduler.v" - Scheduler module, rotating FIFOs removed from the original ODIN scheduler
// 
// Project: tinyODIN - A low-cost digital spiking neuromorphic processor adapted from ODIN.
//
// Author:  C. Frenkel, Delft University of Technology
// Cite/paper: C. Frenkel, M. Lefebvre, J.-D. Legat and D. Bol, "A 0.086-mm² 12.7-pJ/SOP 64k-Synapse 256-Neuron Online-Learning
//             Digital Spiking Neuromorphic Processor in 28-nm CMOS," IEEE Transactions on Biomedical Circuits and Systems,
//             vol. 13, no. 1, pp. 145-158, 2019.module scheduler #(parameter                   N = 256,parameter                   M = 8
)( input  wire                 CLK,input  wire                 RSTN,input  wire                 CTRL_SCHED_POP_N,input  wire [3:0]           CTRL_SCHED_VIRTS,input  wire [7:0]           CTRL_SCHED_ADDR,input  wire                 CTRL_SCHED_EVENT_IN,input  wire [M - 1:0]       CTRL_NEURMEM_ADDR,input  wire                 NEUR_EVENT_OUT,// 来自SPI配置寄存器的输入信号声明,此处接收SPI的开环配置信号,用于特定调度配置input  wire                 SPI_OPEN_LOOP,output wire                 SCHED_EMPTY,output wire                 SCHED_FULL,output wire [11:0]          SCHED_DATA_OUT
);// 用于对SPI_OPEN_LOOP信号进行同步处理的寄存器声明(双同步寄存器)reg                    SPI_OPEN_LOOP_sync_int, SPI_OPEN_LOOP_sync;wire                   push_req_n;wire                   empty_main;wire                   full_main;wire [11:0]            data_out_main;//----------------------------------------------------------------------------------// SPI信号同步逻辑部分,采用同步屏障机制对SPI_OPEN_LOOP信号进行同步处理// 确保该信号在时钟域内稳定可靠,避免亚稳态等问题,在复位(低电平有效)和时钟上升沿时进行操作//----------------------------------------------------------------------------------always @(posedge CLK, negedge RSTN) beginif(~RSTN) begin// 复位时将中间同步寄存器和最终同步寄存器都置为0SPI_OPEN_LOOP_sync_int  <= 1'b0;SPI_OPEN_LOOP_sync      <= 1'b0;endelse begin// 在正常时钟上升沿时,先将SPI_OPEN_LOOP信号同步到中间寄存器SPI_OPEN_LOOP_sync_int  <= SPI_OPEN_LOOP;// 再将中间寄存器的值同步到最终同步寄存器,形成两级同步SPI_OPEN_LOOP_sync      <= SPI_OPEN_LOOP_sync_int;endendfifo #(.width(12),.depth(128),.depth_addr(7)) fifo_spike_0 (.clk(CLK),.rst_n(RSTN),.push_req_n(full_main | push_req_n),// 推送请求.pop_req_n(empty_main | CTRL_SCHED_POP_N),// 弹出请求// 根据不同条件组合数据输入到FIFO,若有事件输入则组合虚拟相关信息和地址信息作为输入数据,否则用神经元地址信息作为输入.data_in(CTRL_SCHED_EVENT_IN? {CTRL_SCHED_VIRTS,CTRL_SCHED_ADDR} : {4'b0,CTRL_NEURMEM_ADDR}),.empty(empty_main),.full(full_main),.data_out(data_out_main));// 推送请求控制逻辑,根据SPI_OPEN_LOOP_sync信号以及神经元事件输出等情况来决定是否允许推送数据// 当SPI_OPEN_LOOP_sync为低电平且有神经元事件输出,或者有控制器的事件输入时,允许推送数据(push_req_n为低电平)assign push_req_n = ~((~SPI_OPEN_LOOP_sync & NEUR_EVENT_OUT) | CTRL_SCHED_EVENT_IN);assign SCHED_DATA_OUT = data_out_main;assign SCHED_EMPTY    = empty_main;assign SCHED_FULL     = full_main;endmodule

在这里插入图片描述

相关文章:

fpga系列 HDL:跨时钟域同步 双触发器同步器

目录 **双触发器同步器&#xff08;Two-Flip-Flop Synchronizer&#xff09;示例代码**&#xff1a;双触发器同步器的优缺点优点&#xff1a;缺点&#xff1a;适用场景&#xff1a; 应用实例&#xff1a;同步来自spi_slave的单个使能信号 跨时钟域的设计需要特别小心&#xff0…...

金融项目实战 05|Python实现接口自动化——登录接口

目录 一、代码实现自动化理论及流程 二、脚本实现的理论和准备工作 1、抽取功能转为自动化用例 2、搭建环境(测试工具) 3、搭建目录结构 三、登录接口脚本实现 1、代码编写 1️⃣api目录 2️⃣script目录 2、断言 3、参数化 1️⃣编写数据存储文件&#xff1a;jso…...

《HTML在网络安全中的多面应用:从防范攻击到安全审查》

Html基础 Html简介 HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是用于描述网页内容和结构的标准语言。以下是对HTML的简要介绍&#xff1a; 基本概念 定义&#xff1a; HTML不是一种编程语言&#xff0c;而是一种标记语言。 它使用标…...

Linux网络 | 学习传输层网络协议之UDP(短篇)

前言&#xff1a; 本节内容正式迈入传输层网络协议的知识殿堂&#xff0c; 之前的文章&#xff0c; 我们都是在应用层进行翻来覆去。 比如http就是应用层协议&#xff0c; 只不过使用了tcp的系统调用。 从本节开始&#xff0c; 友友们将会学习传输层两大协议&#xff1a; UDP和…...

iOS - 内存屏障的使用场景

内存屏障的使用是为了解决以下几个关键问题&#xff1a; 1. CPU 乱序执行 // 没有内存屏障时&#xff0c;CPU 可能乱序执行 void example() {// 这两行代码可能被 CPU 重排序a 1; // 操作1flag true; // 操作2 }// 使用内存屏障确保顺序 void safeExample() {a 1;…...

MySQL 8.0 新特性详解与实用示例

MySQL 8.0 新特性详解与实用示例 1. 引言 MySQL 8.0 是 MySQL 版本系列中具有里程碑意义的更新版本&#xff0c;带来了大量新功能和优化&#xff0c;极大地提升了数据库的性能和可用性。本文将深入介绍 MySQL 8.0 的主要新特性及其应用场景&#xff0c;帮助你在项目中更高效地…...

【STM32-学习笔记-5-】ADC

文章目录 ADCADC函数Ⅰ、ADC_InitTypeDef结构体参数①、ADC_Mode②、ADC_DataAlign③、ADC_ExternalTrigConv④、ADC_ContinuousConvMode⑤、ADC_ScanConvMode⑥、ADC_NbrOfChannel Ⅱ、ADC配置示例1、单次转换&#xff0c;非扫描单次转换非扫描模式下&#xff0c;获取多通道的…...

TY1801 反激变换器PWM GaN功率开关

TY1801 是一款针对离线式反激变换器的多模式 PWM GaN 功率开关。TY1801 内置 GaN 功率管,它具备超宽 的 VCC 工作范围&#xff0c;非常适用于 PD 快充等要求宽输出电压的应用场合,系统不需要使用额外的绕组或外围降压电路&#xff0c;节省系统 BOM 成本。TY1801 支持 Burst&…...

Jenkins安装、插件下载及构建环境配置详解

Jenkins简介 1.1 简介 Jenkins 是一个基于Java开发的开源持续集成工具&#xff0c;它提供了一个开放且易用的软件平台&#xff0c;主要用于自动化构建、测试和部署软件项目&#xff0c;以实现持续集成&#xff08;CI&#xff09;和持续交付/部署&#xff08;CD&#xff09;。…...

ESP32,uart安装驱动uart_driver_install函数剖析,以及intr_alloc_flags 参数的意义

在 uart_driver_install 函数中&#xff0c;参数 RX_BUF_SIZE * 2 指定了接收缓冲区&#xff08;RX buffer&#xff09;的大小。这个参数对于 UART 驱动程序来说非常重要&#xff0c;因为它决定了可以存储多少接收到的数据&#xff0c;直到应用程序读取它们为止。下面是对该函数…...

Ubuntu把应用程序放到桌面

有时候我们下载的软件是一个文件夹&#xff0c;通常需要进入进入指定文件夹下去执行.sh 文件来启动&#xff0c;下面来个实例如何把idea放到桌面 打开文件目录/usr/share/applications/或者~/.local/share/applications/目录。第一个目录是全局的&#xff0c;所有用户都可以使…...

什么是端口映射

端口映射 端口映射&#xff08;Port Mapping&#xff09;是一种网络技术&#xff0c;用于将外部网络请求转发到内部网络的特定设备或服务。它通常用于以下场景&#xff1a; 外部访问内部服务&#xff1a;允许外部用户通过公网IP访问内网中的设备或服务。多设备共享IP&#xf…...

数据结构《MapSet哈希表》

文章目录 一、搜索树1.1 定义1.2 模拟实现搜索 二、Map2.1 定义2.2 Map.Entry2.3 TreeMap的使用2.4 Map的常用方法 三、Set3.1 定义3.2 TreeSet的使用3.3 Set的常用方法 四、哈希表4.1 哈希表的概念4.2 冲突4.2.1 冲突的概念4.2.2 冲突的避免1. 选择合适的哈希函数2. 负载因子调…...

【QT】QComboBox:activated信号和currentIndexChanged信号的区别

目录 1、activated1.1 原型1.2 触发机制1.3 使用场景1.4 连接信号和槽的方法1.4.1 方式一1.4.2 方式二 2、currentIndexChanged2.1 原型2.2 触发机制2.3 使用场景2.4 连接信号和槽的方法 1、activated 1.1 原型 [signal] void QComboBox::activated(int index) [signal] void…...

【Block总结】ELGCA模块,池化-转置(PT)注意力和深度卷积有效聚合局部和全局上下文信息

ELGCA结构 论文题目&#xff1a;ELGC-Net: Efficient Local-Global Context Aggregation for Remote Sensing Change Detection 论文链接&#xff1a;https://arxiv.org/pdf/2403.17909 官方github&#xff1a;https://github.com/techmn/elgcnet 高效局部-全局上下文聚合器&…...

MERN全栈脚手架(MongoDB、Express、React、Node)与Yeoman详解

MERN 全栈脚手架是一种用于快速构建基于 MongoDB、Express、React 和 Node.js 的全栈应用的框架或模板。它帮助开发者快速启动项目&#xff0c;减少了从零开始配置的时间。以下是关于 MERN 全栈脚手架的详细解析。 一、MERN 技术栈简介 MongoDB: 文档型数据库&#xff0c;用于…...

基于springboot+vue+微信小程序的宠物领养系统

基于springbootvue微信小程序的宠物领养系统 一、介绍 本项目利用SpringBoot、Vue和微信小程序技术&#xff0c;构建了一个宠物领养系统。 本系统的设计分为两个层面&#xff0c;分别为管理层面与用户层面&#xff0c;也就是管理者与用户&#xff0c;管理权限与用户权限是不…...

如何使用策略模式并让spring管理

1、策略模式公共接口类 BankFileStrategy public interface BankFileStrategy {String getBankFile(String bankType) throws Exception; } 2、策略模式业务实现类 Slf4j Component public class ConcreteStrategy implements BankFileStrategy {Overridepublic String ge…...

react中hooks之useRef 用法总结

1. 基本概念 useRef 是 React 的一个 Hook&#xff0c;返回一个可变的 ref 对象&#xff0c;其 .current 属性被初始化为传入的参数。这个对象在组件的整个生命周期内保持不变。 2. 主要用途和特性 2.1 获取 DOM 元素实例 function TextInputWithFocusButton() {const inpu…...

使用 Docker 部署 Java 项目(通俗易懂)

目录 1、下载与配置 Docker 1.1 docker下载&#xff08;这里使用的是Ubuntu&#xff0c;Centos命令可能有不同&#xff09; 1.2 配置 Docker 代理对象 2、打包当前 Java 项目 3、进行编写 DockerFile&#xff0c;并将对应文件传输到 Linux 中 3.1 编写 dockerfile 文件 …...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...