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

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.lryc.cn/news/327510.html

相关文章:

  • 服务器停止解析域名,但仍然可以访问到
  • Centos系统与Ubuntu系统防火墙区别,以及firewalld、ufw和iptables三者之前的区别。
  • ES6 学习(三)-- es特性
  • 使用ChatGPT的场景之gpt写研究报告,如何ChatGPT写研究报告
  • librdkafka的简单使用
  • 【iOS ARKit】播放3D音频
  • ES学习日记(四)-------插件head安装和一些配套插件下载
  • flask+uwsgi+云服务器 部署服务端
  • linux学习之路 -- 普通用户添加进sudoer列表
  • 【分类评估指标,精确率,召回率,】from sklearn.metrics import classification_report
  • element-ui autocomplete 组件源码分享
  • 视觉SLAM理论与实践的学习链接汇总
  • 极光笔记|极光消息推送服务的云原生实践
  • 高效八股文背诵方法
  • Codeforces Round 841 (Div. 2) C. Even Subarrays
  • 用 SpringBoot+Redis 解决海量重复提交问题
  • 前端基础知识html
  • 网络原理-传输层-UDP报文结构
  • TCP/IP参考模型(四层及其解析)
  • 2024第六届环境科学与可再生能源国际会议能源 (ESRE 2024) 即将召开!
  • CentOS配置docker外部访问
  • 面试前端八股文十问十答第二期
  • 【漏洞复现】大华综合安防监控管理平台 Digital Surveillance System系统存在RCE漏洞
  • ssm网上订餐管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目采用线性算法
  • python 进程之由浅入深
  • 公链角逐中突围,Solana 何以成为 Web3 世界的流量焦点?
  • 算法设计-杨辉三角
  • Linux swatch命令教程:实时监视系统活动(附实例详解和注意事项)
  • C/C++语言学习路线: 嵌入式开发、底层软件、操作系统方向(持续更新)
  • SAP-CO主数据之统计指标创建-<KK01>