目录
跨时钟的操作的重要性这里就不需要在赘述了,推荐一个比较经典的文章就是 《跨越鸿沟 同步世界中的异步信号》,建议这个文章和此博文搭配起来看。
https://wenku.baidu.com/view/3b84da0f844769eae009ed5e.html
https://reborn.blog.csdn.net/article/details/101280171
为了使同步工作能正常进行,从某个时钟域传来的信号应先通过原时钟域上的一个触发器,然后不经过两个时钟域间的任何组合逻辑,直接进度同步器的第一个触发器中。
主要讲跨时钟域时候,1bit信号的三种同步方式。同步器类型基本上有三种:电平、边沿检测和脉冲。
1 电平同步
电平同步方式:主要使用在跨时钟域的信号在新时钟域中要保持高电平或低电平两个时钟周期以上。 从慢时钟跨越到快时钟 和从 快时钟跨越到慢时钟,对电平同步来讲,不影响。
module dianping_sys
(
input I_clk_1,
input I_clk_2,
input I_dat_in,
output reg O_dat_out
);
reg S_dat_in_1d = 1'b0;
reg S_dat_in_2d = 1'b0;
reg S_dat_in_3d = 1'b0;
always @ (posedge I_clk_1)
begin
S_dat_in_1d <= I_dat_in;
end
always @ (posedge I_clk_1)
begin
S_dat_in_2d <= S_dat_in_1d;
S_dat_in_3d <= S_dat_in_2d;
O_dat_out <= S_dat_in_3d;
end
endmodule
module dianping_sys_tb;
// Inputs
reg I_clk_1;
reg I_clk_2;
reg I_dat_in;
// Outputs
wire O_dat_out;
// Instantiate the Unit Under Test (UUT)
dianping_sys uut (
.I_clk_1(I_clk_1),
.I_clk_2(I_clk_2),
.I_dat_in(I_dat_in),
.O_dat_out(O_dat_out)
);
// always # 5 I_clk_1 = ~ I_clk_1;
// always # 15 I_clk_2= ~ I_clk_2;
always # 15 I_clk_1 = ~ I_clk_1;
always # 5 I_clk_2= ~ I