fpga系列 HDL:跨时钟域同步 双触发器同步器
目录
- **双触发器同步器(Two-Flip-Flop Synchronizer)示例代码**:
- 双触发器同步器的优缺点
- 优点:
- 缺点:
- 适用场景:
- 应用实例:同步来自spi_slave的单个使能信号
- 跨时钟域的设计需要特别小心,以避免亚稳态问题。双触发器同步器(2-Flip-Flop Synchronizer) 是一种简单且广泛应用的 时钟域交叉(CDC) 同步方法,用于将一个时钟域中的信号同步到另一个时钟域中。它通过使用两个触发器级联,确保信号在跨越不同时钟域时,(以指数平方级别)降低因为时钟的不匹配导致不稳定或亚稳态(metastability)发生的概率。

双触发器同步器(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,将信号稳定到目标时钟域。
双触发器同步器的优缺点
优点:
- 简单高效:双触发器同步器结构简单,通常只需要两个 D 型触发器,因此在资源使用上非常高效。
- 低延迟:与其他更复杂的同步方法(如 FIFO)相比,双触发器同步器的延迟较低。
- 减少亚稳态的风险:通过两个触发器级联,可以有效降低亚稳态的发生概率,因为第二个触发器会提供额外的稳定化时间。
缺点:
- 仅适用于低频信号:双触发器同步器适用于频率差异较小的时钟域交叉。如果时钟域的频率差异过大,可能会导致信号丢失或同步失败。
- 无法处理高数据率:如果跨时钟域的数据速率较高,双触发器同步器可能无法有效同步所有数据。
- 可能的延迟:虽然延迟较小,但依然会引入一个时钟周期的延迟。
适用场景:
- 双触发器同步器特别适合同步 单比特控制信号 或 低速数据,例如用于处理外部输入的控制信号、状态标志或较慢的时钟信号。
- 在高数据率的应用中(如 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:跨时钟域同步 双触发器同步器
目录 **双触发器同步器(Two-Flip-Flop Synchronizer)示例代码**:双触发器同步器的优缺点优点:缺点:适用场景: 应用实例:同步来自spi_slave的单个使能信号 跨时钟域的设计需要特别小心࿰…...
金融项目实战 05|Python实现接口自动化——登录接口
目录 一、代码实现自动化理论及流程 二、脚本实现的理论和准备工作 1、抽取功能转为自动化用例 2、搭建环境(测试工具) 3、搭建目录结构 三、登录接口脚本实现 1、代码编写 1️⃣api目录 2️⃣script目录 2、断言 3、参数化 1️⃣编写数据存储文件:jso…...
《HTML在网络安全中的多面应用:从防范攻击到安全审查》
Html基础 Html简介 HTML(HyperText Markup Language,超文本标记语言)是用于描述网页内容和结构的标准语言。以下是对HTML的简要介绍: 基本概念 定义: HTML不是一种编程语言,而是一种标记语言。 它使用标…...
Linux网络 | 学习传输层网络协议之UDP(短篇)
前言: 本节内容正式迈入传输层网络协议的知识殿堂, 之前的文章, 我们都是在应用层进行翻来覆去。 比如http就是应用层协议, 只不过使用了tcp的系统调用。 从本节开始, 友友们将会学习传输层两大协议: UDP和…...
iOS - 内存屏障的使用场景
内存屏障的使用是为了解决以下几个关键问题: 1. CPU 乱序执行 // 没有内存屏障时,CPU 可能乱序执行 void example() {// 这两行代码可能被 CPU 重排序a 1; // 操作1flag true; // 操作2 }// 使用内存屏障确保顺序 void safeExample() {a 1;…...
MySQL 8.0 新特性详解与实用示例
MySQL 8.0 新特性详解与实用示例 1. 引言 MySQL 8.0 是 MySQL 版本系列中具有里程碑意义的更新版本,带来了大量新功能和优化,极大地提升了数据库的性能和可用性。本文将深入介绍 MySQL 8.0 的主要新特性及其应用场景,帮助你在项目中更高效地…...
【STM32-学习笔记-5-】ADC
文章目录 ADCADC函数Ⅰ、ADC_InitTypeDef结构体参数①、ADC_Mode②、ADC_DataAlign③、ADC_ExternalTrigConv④、ADC_ContinuousConvMode⑤、ADC_ScanConvMode⑥、ADC_NbrOfChannel Ⅱ、ADC配置示例1、单次转换,非扫描单次转换非扫描模式下,获取多通道的…...
TY1801 反激变换器PWM GaN功率开关
TY1801 是一款针对离线式反激变换器的多模式 PWM GaN 功率开关。TY1801 内置 GaN 功率管,它具备超宽 的 VCC 工作范围,非常适用于 PD 快充等要求宽输出电压的应用场合,系统不需要使用额外的绕组或外围降压电路,节省系统 BOM 成本。TY1801 支持 Burst&…...
Jenkins安装、插件下载及构建环境配置详解
Jenkins简介 1.1 简介 Jenkins 是一个基于Java开发的开源持续集成工具,它提供了一个开放且易用的软件平台,主要用于自动化构建、测试和部署软件项目,以实现持续集成(CI)和持续交付/部署(CD)。…...
ESP32,uart安装驱动uart_driver_install函数剖析,以及intr_alloc_flags 参数的意义
在 uart_driver_install 函数中,参数 RX_BUF_SIZE * 2 指定了接收缓冲区(RX buffer)的大小。这个参数对于 UART 驱动程序来说非常重要,因为它决定了可以存储多少接收到的数据,直到应用程序读取它们为止。下面是对该函数…...
Ubuntu把应用程序放到桌面
有时候我们下载的软件是一个文件夹,通常需要进入进入指定文件夹下去执行.sh 文件来启动,下面来个实例如何把idea放到桌面 打开文件目录/usr/share/applications/或者~/.local/share/applications/目录。第一个目录是全局的,所有用户都可以使…...
什么是端口映射
端口映射 端口映射(Port Mapping)是一种网络技术,用于将外部网络请求转发到内部网络的特定设备或服务。它通常用于以下场景: 外部访问内部服务:允许外部用户通过公网IP访问内网中的设备或服务。多设备共享IP…...
数据结构《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结构 论文题目:ELGC-Net: Efficient Local-Global Context Aggregation for Remote Sensing Change Detection 论文链接:https://arxiv.org/pdf/2403.17909 官方github:https://github.com/techmn/elgcnet 高效局部-全局上下文聚合器&…...
MERN全栈脚手架(MongoDB、Express、React、Node)与Yeoman详解
MERN 全栈脚手架是一种用于快速构建基于 MongoDB、Express、React 和 Node.js 的全栈应用的框架或模板。它帮助开发者快速启动项目,减少了从零开始配置的时间。以下是关于 MERN 全栈脚手架的详细解析。 一、MERN 技术栈简介 MongoDB: 文档型数据库,用于…...
基于springboot+vue+微信小程序的宠物领养系统
基于springbootvue微信小程序的宠物领养系统 一、介绍 本项目利用SpringBoot、Vue和微信小程序技术,构建了一个宠物领养系统。 本系统的设计分为两个层面,分别为管理层面与用户层面,也就是管理者与用户,管理权限与用户权限是不…...
如何使用策略模式并让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,返回一个可变的 ref 对象,其 .current 属性被初始化为传入的参数。这个对象在组件的整个生命周期内保持不变。 2. 主要用途和特性 2.1 获取 DOM 元素实例 function TextInputWithFocusButton() {const inpu…...
使用 Docker 部署 Java 项目(通俗易懂)
目录 1、下载与配置 Docker 1.1 docker下载(这里使用的是Ubuntu,Centos命令可能有不同) 1.2 配置 Docker 代理对象 2、打包当前 Java 项目 3、进行编写 DockerFile,并将对应文件传输到 Linux 中 3.1 编写 dockerfile 文件 …...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
