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_dst
为reg
类型.
应用
正如开头描述的那样,一般单根控制信号有夸时钟域操作时候,就需要接入此模块。
比如,标准的RGB视频信号,接收时,Vsync
,Hsync
,DE
等控制信号就需要接入此模块,打两个时钟之后在做其他处理,24 bit Data
信号也都可以这样处理。