`timescale 1ns/1ns
module mux(
input clk_a ,
input clk_b ,
input arstn ,
input brstn ,
input [3:0] data_in ,
input data_en ,
output reg [3:0] dataout
);
//跨时钟,需要两级同步
reg en_temp;
reg en_1,en_2;
reg [3:0] data_temp;
always @(posedge clk_a or negedge arstn) begin
if(!arstn) begin
data_temp <= 4'b0;
end
else if(data_en) begin
data_temp <= data_in;
end
end
always @(posedge clk_a or negedge arstn) begin
if(!arstn) begin
en_temp <= 1'b0;
end
else begin
en_temp <= data_en;
end
end
always @(posedge clk_b or negedge brstn) begin
if(!brstn) begin
en_1 <= 1'b0;
end
else begin
en_1 <= en_temp;
end
end
always @(posedge clk_b or negedge brstn) begin
if(!brstn) begin
en_2 <= 1'b0;
end
else begin
en_2 <= en_1;
end
end
always @(posedge clk_b or negedge brstn) begin
if(!brstn) begin
dataout <= 4'b0;
end
else if(en_2) begin
dataout <= data_temp;
end
end
endmodule