34 lines
1008 B
Systemverilog
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
|