这种情况下,异步控制信号可能在己慢时钟下只维持了一个有效时钟,而在快时钟下,已经被采样了几次,一次读请求可能被误以为多次读请求。
快时钟同步慢时钟信号示意图
RTL代码
module synchronizer(
clk_fst;
rst_b;
rd_en;//原始控制信号
rd_en_s2f;//处理后的信号
);
input clk_fst;
input rst_b;
output rd_en_s2f;
wire rd_en_s2f;
reg rd_en_s2f1;
reg rd_en_s2f2;
reg rd_en_s2f3;
always@(posedge clk_fst or negedge rst_b)
if(!rst_b)begin
rd_en_s2f1 <= 1'b0;
rd_en_s2f2 <= 1'b0;
rd_en_s2f3 <= 1'b0;
end else begin//同步器
rd_en_s2f1 <= rd_en;
rd_en_s2f2 <= rd_en_s2f1;
rd_en_s2f3 <= rd_en_s2f2;
end
end
always@(rd_en_s2f3 or rd_en_s2f3)begin
case({rd_en_s2f3,rd_en_s2f2})
2'b01:
rd_en_s2f <= 1'b1;
default:
rd_en_s2f <= 1'b0;
endcase
end
endmodule