Timothy Chen | bc16a17 | 2020-04-07 23:45:23 -0700 | [diff] [blame] | 1 | // 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 | |
| 10 | module 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 Chen | 8837fbd | 2020-04-10 17:02:25 -0700 | [diff] [blame^] | 44 | end else if (valid && stop_i) begin |
Timothy Chen | bc16a17 | 2020-04-07 23:45:23 -0700 | [diff] [blame] | 45 | 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 | |
| 57 | endmodule // pwrmgr |