IC学习笔记9——多比特信号的跨时钟域处理方法之“MUX/DMUX同步器”

一、“打两拍”处理多比特信号跨时钟域的问题

在这里插入图片描述
在这里插入图片描述如上图所示adata信号从2’b00变到2‘b11,一段时间之后再变为2’b00,但是因为寄存器同步器的delay有随机性,可能是一个周期之后就同步过去了,也可能需要两个周期。
这样我们就可能在bdata1上看到一个周期的2’b01,之后也可能看到一个周期的2’b10,这两个值都是adata没有出现过的,也就是说bdata1出现了错误的值。
为了解决这个问题,我们介绍一种"MUX/DMUX同步器“来解决多比特信号的跨时钟域问题。

二、MUX/DMUX同步器

2.1 电路波形图在这里插入图片描述

如上图所示,MUX/DMUX同步器主要是用于带有数据有效标志信号的多比特数据跨时钟域问题,且多比特数据要保持一段时间
上图红色虚线框内是主要是对数据有效标志信号的处理,可以发现其实就是对单比特的数据有效标志信号在bclk时钟域打了两拍,其实就是单比特从慢速时钟域到快速时钟域的处理方式。数据有效标志信号在时钟bclk下打两拍后就同步于该打拍的时钟域了,此时同步于aclk的数据依然保持有效,将同步后的数据有效标志信号作为多路选择器的选通信号,将数据也同步于bclk时钟域中
此外,对adata_valid_rr在bclk还打了一拍主要是为了让数据有效标志信号和同步bclk的数据匹配。
在这里,需要注意的是,如果bclk的时钟速率小于aclk的时钟速率,我们只需要把上图红色虚线框内电路换成单比特从快速时钟域到慢速时钟域的处理方式即可。

2.2 代码

             module mux_synchronizer(
                                      input                adata_valid,
                                      input     [7:0]      adata,
                                      
                                      input                brst_n,
                                      input                bclk,
                                      output reg [7:0]     bdata,
                                      output  reg          bdata_valid   
                                                       );
                              
                              reg    adata_valid_r;
                              reg    adata_valid_rr;
                              
                             always@(posedge bclk or negedge brst_n)
                             begin
                                      if(brst_n==1'b0)
                                           {bdata_valid,adata_valid_rr,adata_valid_r}<=3'b0;
                                      else
                                           {bdata_valid,adata_valid_rr,adata_valid_r}<={adata_valid_rr,adata_valid_r,adata_valid};
                             end
    
                             always@(posedge bclk or negedge brst_n)
                             begin
                                      if(brst_n==1'b0)
                                           bdata<=8'b0;
                                      else if(adata_valid_rr==1'b1)
                                           bdata<=adata;        
                             end
                             endmodule

三、使用MUX/DMUX同步器处理多比特数据跨时钟域问题

问题,假设两个异步时钟aclk和bclk,aclk=148.5M,bclk=145M。
如图,bclk时钟域中一个8bit数据data通过data_valid标记有效,持续有效约8个时钟周期,该时间内数据保存稳定且不会变化,每40ms更新一次。
要求bclk时钟域该数据信号同步到aclk时钟域,data_valid在aclk时钟域持续1个时钟周期,请用你熟悉的hdl语言描述。设计中请用异步低复位。
在这里插入图片描述

3.1 电路波形图

在这里插入图片描述

3.2 代码

      module mux_synchronizer(
                                    input            aclk,
                                    input            arst_n,
                                                   
                                    input      [7:0] data,
                                    input            data_valid,
                                    output reg [7:0] adata,
                                    output reg       adata_valid
                                                   );
                                                    
                                     reg[2:0]     adata_valid_r;
                                     wire          adata_valid_rise;
                                     always@(posedge aclk or negedge arst_n)
                                     begin
                                          if(arst_n==1'b0)
                                              adata_valid_r[2:0]<=3'd0;
                                          else
                                              adata_valid_r[2:0]<={adata_valid_r[1:0],data_valid};
                                      end
                                      assign  adata_valid_rise=~adata_valid_r[2]&adata_valid_r[1];//检测data_valid的上升沿
                                      always@(posedge aclk or negedge arst_n)
                                      begin
                                           if(arst_n==1'b0)
                                                adata<=8'd0;
                                           else if(adata_valid_rise==1'b1)
                                                adata<=data;
                                      end
                                      always@(posedge aclk or negedge arst_n)
                                      begin
                                            if(arst_n==1'b0)
                                              adata_valid<=1'b0;
                                            else
                                              adata_valid<=adata_valid_rise;
                                      end
                        endmodule

3.3 验证

         module mux_synchronizer_tb();
          reg aclk;
          reg arst_n;
          reg [7:0] data;
          reg data_valid;
          wire adata_valid;
          wire [7:0] adata;
         
          reg bclk;

          always #3.448 bclk=~bclk;
          always #3.365 aclk=~aclk;

          initial begin
	        aclk=1;
	        bclk=1;
	        arst_n=0;
	        data_valid=0;
	        data=0;
	        #200;
	        arst_n=1;
	        //第一次数据
	        @(posedge bclk)
	        data_valid=1;
	        data=1;
	        #53.84;
	       @(posedge bclk)
	        data_valid=0;
    
	        #400;
	         //第二次数据
	        @(posedge bclk)
	        data_valid=1;
	        data=2;
	        #53.84;
	       @(posedge bclk)
	        data_valid=0; 
    
	        end
 mux_synchronizer  u1(
                           .aclk(aclk),
                           .arst_n(arst_n),
                                                   
                           .data(data),
                           .data_valid(data_valid),
                           .adata(adata),
                           .adata_valid(adata_valid)
                                                   );
             endmodule       

在这里插入图片描述
在这里插入图片描述

四、其他多比特数据跨时钟域处理方法

4.1 异步FIFO

4.2 握手反馈

链接给的单比特数据跨时钟域处理,多比特数据跨时钟域处理方式原理和此类似。

五、参考文献

多bit信号跨时钟域怎么办?

如何用MUX/DMUX处理多比特数据跨时钟域

  • 24
    点赞
  • 198
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
LG plc编程软件KGL WIN是韩国LG集团的LS产电部门推出的PCL编程软件,plc编程的特性让他成为当代工业自动化的主要装置之一,工业生产方面得到了广泛的应用,是一款非常不错的编程软件,有需要的赶快下载吧! LG PLC编程软件软件特色 -Acrobat Reader4.05 (ENG): Ar4.05 (ENG):Acrobat4.05英文软件,阅读PDF格式文件 Korfont: 韩文字库安装 -Program Example:程序举例: APM-HSC:K200S/K300S新型位控模块/高速计数程序 COMM: 通讯程序 FNET:NET以及远程站通讯网络程序 PLC-K120S:K120S的通讯、高速计数、PID、位置控制、特殊模块程序 PMUX30: 触摸屏PMUX30系列程序 讲座资料: PPT文稿 inv变频器:IG5A、IG5(AN)、INV1、2、3、IV5 CHINA PLC: LGIS介绍、LG PLC介绍、LG PLC80S介绍、LG PLC 80S举例、LG PLC120S介绍、Smart介绍 APM介绍、新型高速计数介绍 PMU:PMUx30S介绍中文、英文 -培训资料: PDF文稿 AD/DA/HSC: AI模拟量输入/AO模拟量输出/HSC高速计数 CNET:CNET网络 FNET:FNET网络 MASTER-K基础:PLC基础(PPT) 软件 INV变频器:Drvie view监控软件 PLC:APM设置软件、Cnet 编辑器、Ethernet编辑器、Fnet驱动、GM/OS(转换成GM系列的操作系统文件) GPU-DEBUG(K80S操作系统升级)、GSD文件(支持P rofibus总线)、K120S/OS(K120S操作系统升级) KGL-WIN(32)、KGL-WIN(36)、网络测试软件、PosPask(老位控模块配置软件) PMU:PMU-master软件、PMU-editor软件(硬件升级、OS升级、软件升级) LG PLC编程软件用户手册 INV变频器:中文:IC5、IG5、IH、IS5、IV5、其他 (DBU、MMC、MODBUS、Profibus、RS485、Devicenet) 英文:IC5、IG5、IH、IS5、IV5、其他 (DBU、MODBUS、Profibus、RS485、Devicenet) PLC:中文:模拟量模块、CNET网络、高速计数、K120S手册、K200/300/1000S手册、K80S-K120S手册 KGL-WIN编程手册、MK指令手册、MKRS232/422说明、远程I/O手册 英文:模拟量模块、CNET网络、高速计数、K120S手册、K200/300/1000S手册、K80S-K120S手册 KGL-WIN编程手册、MK指令手册、MKRS232/422说明、远程I/O手册、手持遍程器手册 PID模块、热电阻模块、热电偶模块、位置模块、新高速计数模块、APM模块、FNET模块 PMU:中文:新型-字库、手册、OS 老型-中文手册 英文:新型-字库、手册、OS、通讯方式 老型-英文手册.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值