单根信号跨时钟域——两级D触发器消除亚稳态

meta_harden

这个模块是在Xilinx的例程工程Wave Generator中看到的,来看一下有什么用。

描述

在源文件注释中有描述到,这是一个基础的亚稳态固化方法;通过两级的时钟同步,将异步的信号传输到一个新的时钟域上。

端口

先看一下端口定义:

module meta_harden (
  input            clk_dst,      // Destination clock
  input            rst_dst,      // Reset - synchronous to destination clock
  input            signal_src,   // Asynchronous signal to be synchronized
  output reg       signal_dst    // Synchronized signal
);

输入端口有目标时钟,复位,以及需要同步的异步信号。

输出端口有已经同步后的信号。

实例化端口

实例化端口的使用方式为:

/* Synchronize the RXD pin to the clk_rx clock domain. Since RXD changes
* very slowly wrt. the sampling clock, a simple metastability hardener is
* sufficient */
meta_harden meta_harden_rxd_i0 (
	.clk_dst      			(clk_rx),
    .rst_dst      			(rst_clk_rx),
    .signal_src   			(rxd_i),
    .signal_dst   			(rxd_clk_rx)
);

这里选用的是典型的uart通信中的在rxd_i在接入到rx模块时,通过该meta_harden模块,将输入信号固化到clk_rx这个时钟域。

关键变量声明

只有一个变量:

reg signal_meta;

对异步信号采样来说,第一次采样大概率是处于亚稳态的,然而使用目标时钟进行第二次采样,处于亚稳态的概率就小很多。

此变量为时钟进行的第一次采样。

main code

code如下:

always @(posedge clk_dst) begin
    if (rst_dst) begin
      signal_meta <= 1'b0;
      signal_dst  <= 1'b0;
    end else begin // if !rst_dst
      signal_meta <= signal_src;
      signal_dst  <= signal_meta;
    end // if rst
end // always

注意:输出引脚signal_dstreg类型.

应用

正如开头描述的那样,一般单根控制信号有夸时钟域操作时候,就需要接入此模块。

比如,标准的RGB视频信号,接收时,VsyncHsyncDE等控制信号就需要接入此模块,打两个时钟之后在做其他处理,24 bit Data信号也都可以这样处理。

猜你喜欢

转载自blog.csdn.net/sinat_31206523/article/details/107571784
今日推荐