案例一:低速时钟域到高速时钟域
注意:在仿真中,异步输入与同步输出之间会有2个时钟周期的延时。
/*
慢时钟域到快时钟域,单bit模块
时钟:CLK为快时钟域的时钟。
异步输入:asynch_lh_in。
同步输出:sync_lh_out
*/
wire asynch_lh_in;
reg sync_lh_out;
reg q_lh_1;
always@(posedge CLK or posedge RESET)begin
if(RESET)
q_lh_1 <= 0;
else
q_lh_1 <= asynch_lh_in;
end
always@(posedge CLK or posedge RESET)begin
if(RESET)
sync_lh_out <= 0;
else
sync_lh_out <= q_lh_1;
end
案例二:高速时钟域到低速时钟域
注意:由于采用了asynch_in和synch_out作为前两级寄存器的复位信号,好处是这种情形下,异步信号只会在同步输出端持续一个时钟周期。
/*
单bit跨时钟于模块,只需要通过
CLK:低速时钟域时钟
输入:asynch_in
输出:sync_out
*/
wire asynch_in;
reg sync_out;
wire clr_q1,clr_q2;
reg middle_1,q1;
assign clr_q = RESET || (~asynch_in && sync_out);
always@(posedge asynch_in or posedge clr_q)begin
if(clr_q)
middle_1 <= 0;
else
middle_1 <= 1'b1;
end
always@(posedge CLK_W or posedge clr_q)begin
if(clr_q)
q1 <= 0;
else
q1 <= middle_1;
end
always@(posedge CLK_W or posedge RESET)begin
if(RESET)
sync_out <= 0;
else
sync_out <= q1;
end