verilog设计-cdc:多比特信号跨时钟域(DMUX)

一、前言

多比特一般为数据,其在跨时钟域传输的过程中有多种处理方式,比如DMUX,异步FIFO,双口RAM,握手处理。本文介绍通过DMUX的方式传输多比特信号。

二、DMUX同步跨时钟域数据

dmux表示数据分配器,该方法适合带数据有效标志信号的多bit数据做跨时钟域传输。其典型结构如下:

慢时钟域到快时钟域

快时钟域到慢时钟域只要将红框中换成单bit快时钟域到慢时钟域处理单元即可。

DMUX遵循的原则就是,数据不同步只对控制信号同步,这点其实和异步fifo里的思路一样,只不多异步fifo中的控制信号是多比特的格雷码,而这个场景下的控制信号是data_valid。继续观察结构可以发现,DMUX是将单bit控制信号同步之后将其最为mux的选择信号。因此使用这个结构需要满足一些要求:

1.数据和使能信号在源时钟域为同步到来的信号;

2.在目的时钟域对数据完成采样前,数据信号不能跳变;

如果不满足以上的要求,那么就可能造成数据漏同步、错同步等问题。

三、DMUX Verilog代码

3.1 慢时钟域数据到快时钟域

module mult_bit_slow_to_fast_dmux #(parameter DATAWIDTH = 8)(input                       rst_n,        input                       clk_slow,input  [DATAWIDTH-1:0]      data_slow,input                       data_valid_slow,input                       clk_fast,output reg [DATAWIDTH-1:0]  data_fast,output reg                  data_valid_fast);//signal valid slow to fast cdcreg data_valid_slow_reg;always@(posedge clk_slow or negedge rst_n)beginif(!rst_n)data_valid_slow_reg <= 1'b0;elsedata_valid_slow_reg <= data_valid_slow;  endreg data_valid_slow2fast_reg0,data_valid_slow2fast_reg1;always@(posedge clk_fast or negedge rst_n)beginif(!rst_n)begindata_valid_slow2fast_reg0 <= 1'b0;data_valid_slow2fast_reg0 <= 1'b0;endelsebegindata_valid_slow2fast_reg0 <= data_valid_slow_reg ;  data_valid_slow2fast_reg1 <= data_valid_slow2fast_reg0 ;endendalways@(posedge clk_fast or negedge rst_n)beginif(!rst_n)data_valid_fast <= 1'b0;elsedata_valid_fast <= data_valid_slow2fast_reg1 ;end//data slow to fast cdcreg  [DATAWIDTH-1:0]      data_slow_reg,always@(posedge clk_slow or negedge rst_n)beginif(!rst_n)data_slow_reg <=  0;elsedata_slow_reg <= data_slow ;endalways@(posedge clk_fast or negedge rst_n)beginif(!rst_n)data_fast<=  0;else if(data_valid_slow2fast_reg1 == 1'b1)data_fast <= data_slow_reg ;endendmodule

3.2 快时钟域数据到慢时钟域

module mult_bit_fast_to_slow_dmux #(parameter DATAWIDTH = 8)(input                       rst_n,        input                       clk_fast,input  [DATAWIDTH-1:0]      data_fast,input                       data_valid_fast,input                        clk_slow,output  reg [DATAWIDTH-1:0]  data_slow,output  reg                  data_valid_slow);//signal valid fast to slow cdcreg data_valid_fast_reg;always@(posedge clk_fast or negedge rst_n)beginif(!rst_n)data_valid_fast_reg <= 1'b0;else if(data_valid_fast  == 1'b1)data_valid_fast_reg <= ~data_valid_fast_reg ;  endreg data_valid_fast2slow_reg0,data_valid_fast2slow_reg1;always@(posedge clk_slow or negedge rst_n)beginif(!rst_n)begindata_valid_fast2slow_reg0 <= 1'b0;data_valid_fast2slow_reg1 <= 1'b0;endelsebegindata_valid_fast2slow_reg0<= data_valid_fast_reg ;  data_valid_fast2slow_reg1<= data_valid_fast2slow_reg0;endendreg data_valid_fast2slow_reg2always@(posedge clk_slow or negedge rst_n)beginif(!rst_n)data_valid_fast2slow_reg2 <= 1'b0;elsedata_valid_fast2slow_reg2 <= data_valid_fast2slow_reg1;endassign data_valid_slow_ready = data_valid_fast2slow_reg1 ^ data_valid_fast2slow_reg2 ;always@(posedge clk_slow or negedge rst_n)beginif(!rst_n)data_valid_slow<=  0;else data_valid_slow<= data_valid_slow_ready ;end//data fast to slow cdcreg  [DATAWIDTH-1:0]      data_fast_reg,always@(posedge clk_fast or negedge rst_n)beginif(!rst_n)data_fast_reg<=  0;elsedata_fast_reg<= data_fast;endalways@(posedge clk_slow or negedge rst_n)beginif(!rst_n)data_slow <=  0;else if(data_valid_slow_ready == 1'b1)data_slow <= data_fast_reg ;endendmodule

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

llama-index 结合chatglm3-6B 利用RAG 基于文档智能问答

简介 llamaindex结合chatglm3使用 import os import torch from llama_index.core import VectorStoreIndex, ServiceContext from llama_index.core.callbacks import CallbackManager from llama_index.core.llms.callbacks import llm_completion_callback from llama_ind…

Docker进阶:使用Docker部署Harbor私有镜像仓库

Docker进阶&#xff1a;使用Docker部署Harbor私有镜像仓库 1、安装Docker和Docker Compose1、安装Docker、Docker Compose2、验证Docker和Docker Compose是否成功安装3、先启动运行docker服务 2、下载并配置Harbor1、下载最新版本的Harbor离线安装包2、配置Harbor的主机名和管理…

小程序利用WebService跟asp.net交互过程发现的问题并处理

最近在研究一个项目&#xff0c;用到asp.net跟小程序交互&#xff0c;简单的说就是小程序端利用wx.request发起请求。获取asp.net 响应回来的数据。但经常会报错。点击下图的测试按钮 出现如下错误&#xff1a; 百思不得其解&#xff0c;试了若干方法&#xff0c;都不行。 因为…

web学习笔记(四十九)

目录 1. 初识 Express 1.1 什么是 Express 1.2 Express 能做什么 1.3 Express 的基本使用 1.4 如何把内容响应给客户端 2. 托管静态资源 2.1 express.static() 1. 初识 Express 1.1 什么是 Express 之前我们有讲过可以通过node.js内置的http模块来创建服务器&#x…

迭代器模式(统一对集合的访问方式)

目录 前言 UML plantuml 类图 实战代码 Iterator ArrayList Client 自定义迭代器 TreeNode TreeUtils Client 前言 在实际开发过程中&#xff0c;常用各种集合来存储业务数据并处理&#xff0c;比如使用 List&#xff0c;Map&#xff0c;Set 等等集合来存储业务数…

Ubuntu下使用vscode进行C/C++开发:进阶篇

在vscode上进行C/C++开发的进阶需求: 1) 编写及调试源码时,可进行断点调试、可跨文件及文件夹进行函数调用。 2) 可生成库及自动提取对应的头文件和库文件。 3) 可基于当前工程资源一键点击验证所提取的库文件的正确性。 4) 可结合find_package实现方便的调用。 对于第一…

【C语言】预处理常见知识详解(宏详解)

文章目录 1、预定义符号2、define2.1 define 定义常量2.2 define 定义宏 3、#和##3.1 **#**3.2 **##** 4、条件编译&#xff08;开关&#xff09; 1、预定义符号 在C语言中内置了一些预定义符号&#xff0c;可以直接使用&#xff0c;这些符号实在预处理期间处理的&#xff0c;…

ES6 学习(三)-- es特性

文章目录 1. Symbol1.1 使用Symbol 作为对象属性名1.2 使用Symbol 作为常量 2. Iterator 迭代器2.1 for...of循环2.2 原生默认具备Interator 接口的对象2.3 给对象添加Iterator 迭代器2.4 ... 解构赋值 3. Set 结构3.1 初识 Set3.2 Set 实例属性和方法3.3 遍历3.4 相关面试题 4…

C/C++ ③ —— C++11新特性

1. 类型推导 1.1 auto auto可以让编译器在编译期就推导出变量的类型 auto的使⽤必须⻢上初始化&#xff0c;否则⽆法推导出类型auto在⼀⾏定义多个变量时&#xff0c;各个变量的推导不能产⽣⼆义性&#xff0c;否则编译失败auto不能⽤作函数参数在类中auto不能⽤作⾮静态成员…

【科技素养题】少儿编程 蓝桥杯青少组科技素养题 信息素养真题及解析第26套

少儿编程 科技素养 信息素养真题第26套 1、本次考试名称STEMA是STEM Assessment 的缩写。在保持第一个和最后一个字母不变的情况下,将 STEMA 的字母排列组合&#xff0c;一共可以组成&#xff08;&#xff09;个与原先不同的组合。 A、5 B、6 C、12 D、20 答案&#xff1a…

基础算法-去重字符串,辗转相除法,非递归前序遍历二叉树题型分析

目录 不同子串 辗转相除法-求最大公约数 二叉树非递归前序遍历 不同子串 从a开始&#xff0c;截取 a aa aaa aaab 从第二个下标开始a aa aab 从第三个 a ab 从第四个 b 使用set的唯一性&#xff0c;然后暴力遍历来去去重&#xff0c;从第一个下标开始截取aaab a aa aaa aaab…

激光是如何产生的?

激光产生的原理 美国于1960年成功研制出世界上第一台红宝石激光器&#xff0c;我国也于1961年成功研制出第一台国产红宝石激光器&#xff08;诞生于中国科学院长春光学精密机械研究所&#xff09;&#xff0c;激光技术被认为是第二个20世纪&#xff0c;继量子物理、无线电技术、…