Files

34 lines
1008 B
Systemverilog

`default_nettype none
module phy_reset_ctrl #(
parameter int unsigned CLK_HZ = 125_000_000,
parameter int unsigned RESET_LOW_MS = 10
) (
input wire logic clk,
input wire logic rst,
output logic phy_reset_n,
output logic reset_complete
);
localparam longint unsigned RESET_CYCLES = (CLK_HZ / 1000) * RESET_LOW_MS;
localparam int unsigned COUNT_W = (RESET_CYCLES < 2) ? 1 : $clog2(RESET_CYCLES + 1);
logic [COUNT_W-1:0] count;
always_ff @(posedge clk) begin
if (rst) begin
phy_reset_n <= 1'b0;
reset_complete <= 1'b0;
count <= '0;
end else if (!reset_complete) begin
phy_reset_n <= 1'b0;
if (count == RESET_CYCLES-1) begin
phy_reset_n <= 1'b1;
reset_complete <= 1'b1;
end else count <= count + {{(COUNT_W-1){1'b0}},1'b1};
end else begin
phy_reset_n <= 1'b1;
end
end
endmodule
`default_nettype wire