always @ (posedge clk2 or negedge rst1_n)
begin
if(!rst1_n)
begin
rst2_n <= 1'b0;
rst2_n_d1 <= 1'b0;
end
else
begin
rst2_n_d1 <= 1'b1;
rst2_n <= rst2_n_d1;
end
end
always @ (posedge clk1 or negedge rst1_n)
begin
if(!rst1_n)
wr_ptr <= 1'b0;
else if(valid)
wr_ptr <= wr_ptr + 1'b1;
else
wr_ptr <= wr_ptr;
end
always @ (posedge clk1 or negedge rst1_n)
begin
if(!rst1_n)
begin
reg0[31:0] <= 32'h00;
reg1[31:0] <= 32'h00;
end
else if(valid)
begin
case(wr_ptr)
1'b0: reg0[31:0] <= data_in[31:0];
1'b1: reg1[31:0] <= data_in[31:0];
endcase
end
else
begin
reg0[31:0] <= reg0[31:0];
reg1[31:0] <= reg1[31:0];
end
end
always @ (posedge clk2 or negedge rst2_n)
begin
if(!rst2_n)
wr_ptr_d1 <= 1'b0;
else
wr_ptr_d1 <= wr_ptr;
end
assign read_en = wr_ptr_d1 ^ wr_ptr;
always @ (posedge clk2 or negedge rst2_n)
begin
if(!rst2_n)
begin
out_valid <= 1'b0;
rd_ptr <= 1'b0;
end
else if (read_en)
begin
out_valid <= 1'b1;
rd_ptr <= rd_ptr + 1'b1;
end
else
begin
out_valid <= 1'b0;
rd_ptr <= rd_ptr;
end
end
always @ (posedge clk2 or negedge rst2_n)
begin
if(!rst2_n)
data_out[31:0] <= 32'h00;
else if (read_en)
begin
case(rd_ptr)
1'b0: data_out[31:0] <= reg0[31:0];
1'b1: data_out[31:0] <= reg1[31:0];
endcase
end
else
data_out[31:0] <= data_out[31:0];
end