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

米联客-FPGA程序设计Verilog语法入门篇连载-15 Verilog语法_跨时钟域设计

软件版本:无

操作系统:WIN10 64bit

硬件平台:适用所有系列FPGA

板卡获取平台:https://milianke.tmall.com/

登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

1概述

本小节主要讲解Verilog语法的跨时钟域设计,需要掌握跨时钟域时快慢时钟之间信号是如何同步的。

2跨时钟域慢速到快速时钟

由慢时钟到快时钟的信号传递,就传输的信号位宽一般分为两种,单比特信号和多比特信号。下面我们分开进行讨论。

2.1 单比特信号

上一节课同步异步设计有提到慢时钟到快时钟的设计方法,一般分析,快时钟域的信号总能采集到慢时钟域的信号,但是如果存在异步时钟域可能会导致采样数据出错,因此需要进行时钟同步处理。同步处理针对单比特信号采取打三拍进行同步。

异步时钟域的信号从一个时钟域进入另一个时钟域之前,将该信号用三级触发器缓存两次,可有效降低因为时序而导致的亚稳态问题。例:

module async_data(input       clk_1,                                //输入时钟clk_1input       data_1,                               //输入数据data_1input       clk_2,                                //输入时钟clk_2  output      data_2                                //输出数据data_2);reg [2:0]    data_ff ;                            //寄存器变量data_ffalways @(posedge clk_2)                           //clk_2敏感posedge,上升沿触发begin  data_ff  <= {data_ff[1:0], data_1};         //data_1数据采样End                                                //data_ff[0]表示最新采样的数据,!data_ff[1]为上一个时钟周期采样的数据assign data_2 = !data_ff[2] && data_ff[1];     //最新的电平为1,之前的电平为0,判断为上升沿检测

 

clk_1为慢时钟,clk_2为快时钟,将data_1在快时钟域进行三拍缓存,检测信号的上升沿,此时将信号进行了同步化。

2.2多比特信号

对于多比特信号的传输,我们要考虑两种情况,即单时钟周期突发信号和多时钟周期连续信号的传输。

针对单时钟周期突发信号我们可以采用利用打拍法延迟采样。例:

module async_data_1(input               clk_1,                //输入时钟clk_1input [7:0]         data_in,             //输入数据data_1input               din_en,               //输入突发信号input               clk_2,                //输入时钟clk_2output  reg[7:0]    data_out,            //输出数据dataoutput  reg         dout_en               //输出突发数据有效信号);reg [2:0]    din_en_ff ;wire din_en_pos;always @(posedge clk_2 )begindin_en_ff  <= {din_en_ff[1:0], din_en} ;    //输入突发信号打拍缓存2拍endassign din_en_pos = !din_en_ff[2] && din_en_ff[1] ; //din_en_ff[1]为新缓存的信号,为1时有效,din_en_ff[2]为上一拍缓存的信号//为0时有效,所以din_en_pos为捕捉 din_en信号上升沿always @(posedge clk_2)beginif (din_en_pos)data_out   <= din ;                              //din_en_pos信号拉高,说明数据有效,将输入数据输出else;endalways @(posedge clk_2 )begindout_en <= din_en_pos ;                              //输出突发数据有效信号为din_en_pos信号endendmodule

 

针对多时钟周期连续信号我们可以采用检测慢时钟的边沿进行采样。如果两个时钟的频率相差较小,可能还需要对数据进行延迟缓存,以保证采集到的是当拍时钟的数据;如果两个时钟的频率相差较大,数据采样时刻可以通过计数的方法获得,而不用对数据进行缓存。例:

module async_data_2(input               clk_1,input [7:0]         data_in,input               din_en,input               clk_2,output  reg[7:0]    data_out,output  reg         dout_en);reg [3:0]    din_en_ff ;wire din_edge_pos;reg [3:0] cnt ;always @(posedge clk_2 )begindin_en_ff  <= {din_en_ff[2:0], clk_1} ;endassign din_edge_pos = !din_en_ff[2] && din_en_ff[1] ;always @(posedge clk_2)                        //clk_2为驱动时钟,进行计数if (din_edge_pos & din_en)                 //din_edge_pos信号为捕捉到上升沿,且din_en信号持续拉高cnt <= 4'h0 ;else if (cnt != 4'hf)                      //计数值为4'hfcnt <= cnt + 1'b1 ;endalways @(posedge clk_2)                         //clk_2为驱动时钟beginif (din_en && cnt == 7)                    //din_en信号持续拉高并且完成7次计数时,确认数据有效data_out   <= din ;                     //数据完成赋值else;endalways @(posedge clk_2 )beginif(din_en && cnt == 8)                     //din_en信号持续拉高并且完成8次计数时,确认数据有效dout_en <= 1 ;                          //输出突发数据有效信号进行拉高elsedout_en <= 0;endendmodule

 

3跨时钟域快速到慢速时钟

由快时钟到慢时钟的信号传递,就传输的信号位宽一般分为两种,单比特信号和多比特信号。下面我们分开进行讨论。

3.1 单比特信号

由快时钟到慢时钟的单比特信号传递,我们需要考虑信号本身是单时钟周期的脉冲信号还是连续多个周期的电平信号。针对单时钟周期的脉冲信号,最好的传送方法是握手法,假设单时钟周期脉冲信号的高电平为有效信号,其基本原理如下。

(1) 快时钟域对脉冲信号进行检测,检测有高电平时输出一个高电平信号。快时钟域输出高电平信号时,保持输出信号为高电平状态。

(2) 慢时钟域对快时钟域的检测信号进行延迟打拍采样。因为此时的脉冲信号被快时钟域保持拉高状态,延迟打拍会采集到该信号。

(3) 慢时钟域确认采样得到高电平检测信号后,再反馈信号给快时钟域。

(4) 快时钟域对反馈信号进行延迟打拍采样。如果检测到反馈信号为高电平,证明慢时钟域已经接收到有效的高电平信号。如果此时快时钟域自身逻辑不再要求脉冲信号为高电平状态,拉低快时钟域的脉冲信号即可。

此方法是通过相互握手的方式对窄脉冲信号进行脉宽扩展。例:

module pulse_fast_2_slow(input                rst_n,                               //复位信号input                clk_fast,                            //快时钟input                pulse_fast,                          //快时钟握手信号input                clk_slow,                            //慢时钟output               pulse_slow                           //慢时钟握手信号);wire                 clear_up ;reg                  pulse_fast_detect ;reg  [1:0]           pulse_fast_detect_ff ;reg  [1:0]           pulse_slow_2_fast ;always@(posedge clk_fast or negedge rst_n)beginif (!rst_n)pulse_fast_detect  <= 1'b0 ;           //pulse_fast_detect拉低复位else if (clear_up)pulse_fast_detect  <= 1'b0 ;           //pulse_fast_detect拉低复位else if (pulse_fast)                      //在快时钟域中对快时钟握手信号进行抓取pulse_fast_detect  <= 1'b1 ;          //信号抓取后,将 pulse_fast_detect持续拉高,可能为多个时钟周期,方便慢时钟域捕捉endalways@(posedge clk_slow or negedge rst_n)beginif (!rst_n)pulse_fast_detect_ff     <= 3'b0 ;                                                //缓存三拍清零elsepulse_fast_detect_ff     <= {pulse_fast_detect_ff[0], pulse_fast_detect} ;  //在慢时钟域中对pulse_fast_detect信号进行抓取End                                                                                    //不要求一翻转立刻捕捉到,只要求延时捕捉assign pulse_slow = pulse_fast_detect_ff[1] ;                                     //取中间一拍进行输出给快时钟域always@(posedge clk_fast or negedge rst_n)beginif (!rst_n)pulse_slow_2_fast  <= 1'b0 ;elsepulse_slow_2_fast  <= {pulse_slow_2_fast[0], pulse_slow};                    //快时钟域对慢时钟握手信号进行捕捉endassign clear_up = !pulse_fast && pulse_slow_2_fast[1];                           //捕捉到回应,将 pulse_fast_detect拉低endmodule

 

3.2 多比特信号

当多位宽数据进行同步时,如果数据变化速率过快,就不能再使用延迟打拍采样的方法。因为此时数据各 bit 位变化的时间参差不齐,用异步时钟进行打拍采样,可能会采集到因路径延迟不同而导致的错误数据。解决此类异步问题的常用方法是采用异步 FIFO (First In First Out)进行数据的交异步FIFO在后面的一节课专门介绍。

相关文章:

米联客-FPGA程序设计Verilog语法入门篇连载-15 Verilog语法_跨时钟域设计

软件版本&#xff1a;无 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用所有系列FPGA 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑&#xff01; 1概述 本小节主要讲解Verilog语法的…...

gradio 对话界面实现支持图片、视频正常显示

参考: https://www.gradio.app/docs/gradio/chatbot 问题: gradio网页输出视频nan;图片webp显示不出来 解决方法:需要通过gradio的Video、Image包装 代码: 这里下面启动个后端vlm模型(参考:https://blog.csdn.net/weixin_42357472/article/details/141126225),前端通…...

催收业务怎么提高接通率

提高催收呼叫业务的接通率是一个综合性的任务&#xff0c;需要从多个方面进行优化。以下是一些具体的策略和建议&#xff1a; 一、优化呼叫时间与频次 1. 选择合适的呼叫时间&#xff1a;通过分析目标客户的活跃时段&#xff0c;选择他们最可能接听电话的时间进行呼叫…...

动态生成sitemaps和robots.txt文件:提升SEO与网站可爬性

本文由 ChatMoney团队出品 在现代Web开发中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;是网站成功的关键因素之一。搜索引擎通过网络爬虫来索引网页&#xff0c;而sitemaps和robots.txt文件则是帮助这些爬虫更好地理解和索引网站内容的重要工具。 sitemaps简介 Sit…...

LeetCode 第二十五天 2024.8.12

1. &#xff1a;递增子序列 题目链接: 491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; 应用条件&#xff1a;回溯 难点&#xff1a; 这道题的难点在于如何去重&#xff0c;肯定不能像我们在组合中去重那样对数组排序。而且我们是要对每一层进行去重&#xff0c;…...

Elasticsearch 全文查询详解

全文查询&#xff08;Full-Text Query&#xff09;是 Elasticsearch 中的核心功能之一&#xff0c;用于对非结构化文本数据进行高效检索。与结构化查询不同&#xff0c;全文查询不仅仅是简单的精确匹配&#xff0c;还包括对文本进行分析和处理&#xff0c;从而实现更复杂的搜索…...

20240810在荣品RK3588S-AHD开发板的预置Android13下挂载exFAT的256GB的TF卡

df -h mount fdisk无效 20240810在荣品RK3588S-AHD开发板的预置Android13下挂载exFAT的256GB的TF卡 2024/8/10 21:19 缘起&#xff1a;当时比较便宜96.9&#xffe5;/想看看256GB的TF卡的高速卡的效果&#xff0c;就在京东入手了3张三星的高速TF卡。最近在弄RK3588S&#xff0c…...

java基础进阶——log日志、类加载器、XML、单元测试、注解、枚举类

前言 这篇内容主要掌握的就是logback使用、理解类加载器、XML文件的编写&#xff0c;XML文档约束schema&#xff0c;用Dom4j解析XML文档&#xff0c;Xpath检索XML文档&#xff0c;完整使用Junit单元测试框架常用部分&#xff0c;注解的定义和使用&#xff0c;枚举类的定义和开发…...

《向量数据库指南》——控制Chatbot对话内容:Dopple AI的创新实践与用户体验优化

控制Chatbot对话内容:Dopple AI的创新实践与用户体验优化 在Chatbot技术日益成熟的今天,如何有效地控制对话内容,以满足用户多样化的需求,成为了开发者们关注的焦点。Dopple AI,作为一款先进的聊天机器人平台,通过其独特的交互设计和后端技术支持,为用户提供了前所未有…...

构建实时数据仓库:流式处理与实时计算技术解析

目录 一、流式处理 请求与响应 批处理 二、实时计算 三、Lambda架构 Lambda架构的缺点 四、Kappa架构 五、实时数据仓库解决方案 近年来随着业务领域的不断拓展&#xff0c;尤其像互联网、无线终端APP等行业应用的激增&#xff0c;产生的数据量呈指数级增长&#xff0c;对海量数…...

python算术表达式遗传算法

import random import operator import math# 定义可能的运算符和操作 ops {: ,-: -,*: *,/: /,sin: math.sin,cos: math.cos }# 随机生成一个表达式&#xff08;个体&#xff09; def generate_expression(depth0):if depth > 2: # 限制表达式的最大深度return str(rando…...

net.sf.jsqlparser.statement.select.SelectItem

今天一启动项目&#xff0c;出现了这个错误&#xff0c;仔细想了想&#xff0c;应该是昨天合并代码&#xff0c;导致的mybatis-plus版本冲突&#xff0c;以及分页PageHelper版本不兼容 可以看见这个我是最下边的 Caused by 报错信息&#xff0c;这个地方提示我 net .s…...

lua匹配MAC地址 正则表达式

LUA的正则表达式匹配很弱智&#xff0c;能不用lua就不要用lua。 %x表示十六进制数值 (%x%x):(%x%x):(%x%x):(%x%x):(%x%x):(%x%x)它不允许这样用&#xff1a; ((%x%x):){5}(%x%x)mac这还算好办&#xff0c;ipv4就难了&#xff0c;ipv6不可能&#xff0c;这样写下来那一串表达…...

Chainlit快速实现AI对话应用并将聊天数据的AWS S3 和 Azure Blob云服务中

自定义数据层 Literal AI 提供了最简单的方法来保存、分析和监控您的数据。 如果您正在考虑实现自定义数据层,请查看此处的示例以获取一些启发。 此外,我们非常希望看到社区主导的开源数据层实现并将其列在这里。如果您有兴趣做出贡献,请通过 Discord 与我们联系。 您需…...

浅谈性能优化(基于C++)

本文主要针对C的性能优化方法展开讨论。虽然这些方法也适用于一些其他语言&#xff0c;但由于C经常用于底层操作&#xff0c;提供了更多的优化空间&#xff1b;相比之下&#xff0c;诸如Python、Kotlin等高级语言由于其抽象程度更高&#xff0c;优化空间较少。 性能优化原理 …...

Python 报错:ModuleNotFoundError: No module named ‘Crypto‘

Crypto报错解决方案 Python 报错&#xff1a;ModuleNotFoundError: No module named Crypto前言问题解决方案 Python 报错&#xff1a;ModuleNotFoundError: No module named ‘Crypto’ 前言 Crypto是一个加密模块&#xff0c;它包含了多种加密算法&#xff0c;如 AES、DES、…...

UE(User Equipment) 和 UA(User Agent)

UE&#xff08;User Equipment&#xff09; UE 是 用户设备&#xff0c;这是一个泛指的术语&#xff0c;涵盖了所有类型的终端设备&#xff0c;例如手机、电脑、平板、智能手表等。这些设备可以连接到网络并进行通信。UE可以包含多种功能&#xff0c;包括对话&#xff08;语音…...

视觉SLAM ch3补充——在Linux中配置VScode以及CMakeLists如何添加Eigen库

ch3中的所有代码&#xff0c;除了在kdevelop中运行&#xff0c;还可以在VScode中运行。下面将简要演示配置过程&#xff0c;代码不再做解答&#xff0c;详细内容在下面的文章中。&#xff08;这一节中的pangolin由于安装过程中会出现很多问题&#xff0c;且后续内容用不到该平台…...

开关电源:优化电子产品中的能源使用

电压转换器是许多技术系统的支柱。根据应用的不同&#xff0c;所需的电源单元由变压器、整流器 AC/DC 转换器实现。当高性能开关电源尚未上市时&#xff0c;几乎只使用 50 Hz 变压器解决方案。 电源注意事项 电能几乎完全以三相电流的形式提供&#xff0c;系统电压为 10 ...3…...

Java语言程序设计——篇十三(2)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...