2025-02-26 15:50:49 +08:00
|
|
|
module s2p_2 (
|
|
|
|
input clk,
|
|
|
|
input rst_n,
|
|
|
|
input [15:0] din,
|
|
|
|
input en,
|
|
|
|
output [15:0] dout0,
|
|
|
|
output [15:0] dout1,
|
|
|
|
output vldo
|
|
|
|
);
|
|
|
|
|
|
|
|
reg cnt;
|
|
|
|
wire add_cnt;
|
|
|
|
wire end_cnt;
|
|
|
|
|
|
|
|
always @(posedge clk or negedge rst_n)begin
|
|
|
|
if(!rst_n)begin
|
|
|
|
cnt <= 0;
|
|
|
|
end
|
|
|
|
else if(add_cnt)begin
|
|
|
|
if(end_cnt)
|
|
|
|
cnt <= 0;
|
|
|
|
else
|
|
|
|
cnt <= cnt + 1;
|
|
|
|
end
|
|
|
|
else begin
|
|
|
|
cnt <= 0;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
assign add_cnt = en == 1'b1;
|
|
|
|
assign end_cnt = add_cnt && cnt== 2 - 1 ;
|
|
|
|
|
2025-03-13 21:02:23 +08:00
|
|
|
wire en_r1;
|
|
|
|
wire en_r2;
|
2025-02-26 15:50:49 +08:00
|
|
|
reg [ 15: 0] dout0_r0;
|
|
|
|
reg [ 15: 0] dout1_r0;
|
|
|
|
wire dout0_en;
|
|
|
|
wire dout1_en;
|
|
|
|
wire dout0_hold;
|
|
|
|
wire dout1_hold;
|
|
|
|
|
2025-03-13 21:02:23 +08:00
|
|
|
always @(posedge clk or negedge rst_n)begin
|
|
|
|
if(!rst_n)begin
|
|
|
|
dout0_r0 <= 16'b0;
|
|
|
|
dout1_r0 <= 16'b0;
|
2025-02-26 15:50:49 +08:00
|
|
|
end
|
|
|
|
else if(dout0_en)begin
|
2025-03-13 21:02:23 +08:00
|
|
|
dout0_r0 <= din;
|
2025-02-26 15:50:49 +08:00
|
|
|
end
|
|
|
|
else if(dout1_en)begin
|
2025-03-13 21:02:23 +08:00
|
|
|
dout1_r0 <= din;
|
2025-02-26 15:50:49 +08:00
|
|
|
end
|
|
|
|
else if(dout0_hold)begin
|
2025-03-13 21:02:23 +08:00
|
|
|
dout0_r0 <= dout0_r0;
|
|
|
|
dout1_r0 <= 16'd0;
|
2025-02-26 15:50:49 +08:00
|
|
|
end
|
|
|
|
else if(dout1_hold)begin
|
2025-03-13 21:02:23 +08:00
|
|
|
dout0_r0 <= 16'd0;
|
|
|
|
dout1_r0 <= dout1_r0;
|
2025-02-26 15:50:49 +08:00
|
|
|
end
|
|
|
|
else begin
|
2025-03-13 21:02:23 +08:00
|
|
|
dout0_r0 <= 16'd0;
|
|
|
|
dout1_r0 <= 16'd0;
|
2025-02-26 15:50:49 +08:00
|
|
|
end
|
|
|
|
end
|
2025-03-13 21:02:23 +08:00
|
|
|
|
|
|
|
assign dout0_en = add_cnt && cnt == 0;
|
|
|
|
assign dout1_en = add_cnt && cnt == 1;
|
2025-02-26 15:50:49 +08:00
|
|
|
assign dout0_hold = en == 0 && en_r1 == 1 && cnt == 1;
|
|
|
|
assign dout1_hold = en == 0 && en_r1 == 1 && cnt == 0;
|
|
|
|
|
2025-03-13 21:02:23 +08:00
|
|
|
sirv_gnrl_dffr #(1) dff_en_1(en , en_r1 ,clk,rst_n);
|
|
|
|
sirv_gnrl_dffr #(1) dff_en_2(en_r1, en_r2 ,clk,rst_n);
|
|
|
|
assign vldo = en_r2;
|
|
|
|
|
|
|
|
wire [ 15: 0] dout0_r1;
|
|
|
|
sirv_gnrl_dfflr #(16) dff_dout0_1(1'b1,dout0_r0, dout0_r1 ,clk,rst_n);
|
2025-02-26 15:50:49 +08:00
|
|
|
|
2025-03-13 21:02:23 +08:00
|
|
|
assign dout0 = dout0_r1;
|
|
|
|
assign dout1 = dout1_r0;
|
2025-02-26 15:50:49 +08:00
|
|
|
|
|
|
|
|
|
|
|
endmodule
|
|
|
|
|