blob: e8391fc6e188e7e17efab96183d2bf8ad4c5c4b4 [file] [log] [blame]
Timothy Chenbc16a172020-04-07 23:45:23 -07001// Copyright lowRISC contributors.
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4//
5// Power Manager module to find slow clock edges
6//
7
8`include "prim_assert.sv"
9
10module pwrmgr_cdc_pulse (
11 input clk_slow_i,
12 input clk_i,
13 input rst_ni,
14 input start_i,
15 input stop_i,
16 output logic pulse_o
17);
18
19 logic clk_slow_q;
20 logic clk_slow_q2;
21 logic toggle;
22 logic valid;
23
24 prim_flop_2sync # (
25 .Width(1)
26 ) i_sync (
27 .clk_i,
28 .rst_ni,
29 .d(clk_slow_i),
30 .q(clk_slow_q)
31 );
32
33 always_ff @(posedge clk_i or negedge rst_ni) begin
34 if (!rst_ni) begin
35 clk_slow_q2 <= 1'b0;
36 end else begin
37 clk_slow_q2 <= clk_slow_q;
38 end
39 end
40
41 always_ff @(posedge clk_i or negedge rst_ni) begin
42 if (!rst_ni) begin
43 valid <= 1'b0;
Timothy Chen8837fbd2020-04-10 17:02:25 -070044 end else if (valid && stop_i) begin
Timothy Chenbc16a172020-04-07 23:45:23 -070045 valid <= 1'b0;
46 end else if (!valid && toggle && start_i) begin
47 valid <= 1'b1;
48 end
49 end
50
51 assign toggle = clk_slow_q2 ^ clk_slow_q;
52 assign pulse_o = valid & toggle;
53
54
55
56
57endmodule // pwrmgr