保持coding,不定期整理思路
CDC跨时钟域处理–DMUX
快到慢–多bit数据跨时钟域:
快时钟域clk_a,慢时钟域clk_b
代码:
module dmux(
input clk_a,
input clk_b,
input rst_n,
input [3:0] data_in,
input data_en,
output [3:0] data_out
);
reg [3:0] data_in_reg;
reg data_en_reg;
reg [1:0] data_en_b_reg;
//暂存clk_a时钟域信号
always @(posedge clk_a or negedge rst_n) begin
if (!rst_n) begin
data_in_reg <= 'd0;
data_en_reg <= 'd0;
end
else begin
data_in_reg <= data_in;
data_en_reg <= data_en;
end
end
//同步clk_a时钟域使能信号至clk_b时钟域
always @(posedge clk_b or negedge rst_n) begin
if (!rst_n)
data_en_b_reg <= 'd0;
else
data_en_b_reg <= {data_en_b_reg[0],data_en_reg};
end
//同步clk_a时钟域数据信号至clk_b时钟域
always @(posedge clk_b or negedge rst_n) begin
if (!rst_n)
data_out <= 'd0;
else
data_out <= data_en_b_reg[1] ? data_in_reg : data_out;
end
endmodule
其实这里还可以进行改进,即当数据跨时钟传输时,输出flag标志位
只需要增加 判断mux的sel信号何时从0变为1 的条件 即可,即需要对data_en_b_reg信号再多打一拍产生data_en_b_reg[2],注意此时data_en_b_reg的定义是3bit的数据
always @(posedge clk_b or negedge rst_n) begin
if (!rst_n)
flag <= 'd0;
else
flag <= ( (~data_en_b_reg[2]) && (data_en_b_reg[1]) );
end