跨时钟域信号传输,单bit,慢时钟域到快时钟域,一般使用同步器,打两拍防止亚稳态。
不可以直接将组合逻辑的输出做两级同步,需要打拍。打一拍产生亚稳态的概率还很大,两拍提高可靠性,三拍改善不大。
电路图如下:
verilog代码描述如下:
//clk_a是慢时钟域时钟,clk_b是快时钟域时钟,data_in为输入信号,data_out为输出信号
module slow_to_fast(
input clk_a,
input clk_b,
input rst_n,
input data_in,
output wire data_out
);
reg data_in_reg;
reg [1:0] data_out_reg;
//将输入data_in信号寄存
always@(posedge clk_a or negedge rst_n)begin
if(!rst_n)
data_in_reg <= 1'b0;
else
data_in_reg <= data_in;
end
//将要输出的信号寄存打拍
always@(posedge clk_b or negedge rst_n)begin
if(!rst_n)
data_out_reg <= 2'b0;
else
data_out_reg <= { data_out_reg[0] , data_in_reg } ;
end
//给输出赋值
assign data_out = data_out_reg[1];