| .. raw:: html |
| |
| <!--- |
| # SPDX-FileCopyrightText: 2020 Efabless Corporation |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| # SPDX-License-Identifier: Apache-2.0 |
| --> |
| |
| Counter-Timers |
| ============== |
| |
| The counter/timer is a general-purpose 32-bit adder and subtractor that can be configured for a variety of timing functions including one-shot counts, continuous timing and interval interrupts. |
| At a core clock rate of 80 MHz, the longest single time interval is 26.84 seconds. |
| |
| Functionality |
| ------------- |
| |
| When enabled, the counter counts up or down from the value set in ``reg_timerX_value`` (X is replaced by 0 or 1) at the time the counter is enabled. |
| If counting up, the count continues until the counter reaches ``reg_timerX_data``. |
| If counting down, the count continues until the counter reaches zero. |
| |
| In continuous mode, the counter resets to zero if counting up, and resets to the value in ``reg_timerX_data`` if counting down, and the count continues immediately. |
| If the interrupt is enabled, the counter will generate an interrupt on every cycle. |
| |
| In one-shot mode, the counter triggers an interrupt (:doc:`IRQ channels 10 and 11 <irq>` for Timer 0 and 1, respectively), when it reaches the value of ``reg_timerX_data`` (up count) or zero (down count) and stops. |
| |
| .. note:: |
| |
| When the counter/timer is disabled, the ``reg_timerX_value`` remains unchanged, which puts the timer in a hold state. |
| When reenabled, counting resumes. |
| To reset the timer, write zero to the ``reg_timerX_value`` register. |
| |
| Counter-Timer 0 |
| --------------- |
| |
| The counter triggers an interrupt on IRQ channel 10. |
| |
| .. _reg_timer0_config: |
| |
| ``reg_timer0_config`` |
| ~~~~~~~~~~~~~~~~~~~~~ |
| |
| Base address: ``0x22000000`` |
| |
| .. wavedrom:: |
| |
| { "reg": [ |
| {"name": "Timer config", "bits": 8}, |
| {"name": "(undefined, reads zero)", "bits": 24, "type": 1}] |
| } |
| |
| .. list-table:: Timer 0 configuration bit definitions |
| :name: reg_timer0_configuration_bit_definitions |
| :header-rows: 1 |
| :widths: auto |
| |
| * - Bit |
| - Name |
| - Values |
| * - 3 |
| - Counter/timer enable |
| - 0 - counter/timer disabled |
| |
| 1 - counter/timer enabled |
| * - 2 |
| - One-shot mode |
| - 0 - continuous mode |
| |
| 1 - one-shot mode |
| * - 1 |
| - Updown |
| - 0 - count down |
| |
| 1 - count up |
| * - 0 |
| - Interrupt enable |
| - 0 - interrupt disabled |
| |
| 1 - interrupt enabled |
| |
| .. _reg_timer0_value: |
| |
| ``reg_timer0_value`` |
| ~~~~~~~~~~~~~~~~~~~~ |
| |
| Base address: ``0x22000004`` |
| |
| .. wavedrom:: |
| |
| { "reg": [ |
| {"name": "Timer value", "bits": 32}] |
| } |
| |
| | |
| |
| The value in this register is the current value of the counter. |
| Value is 32 bits. |
| The register is read-write and can be used to reset the timer. |
| |
| .. _reg_timer0_data: |
| |
| ``reg_timer0_data`` |
| ~~~~~~~~~~~~~~~~~~~~ |
| |
| Base address: ``0x22000008`` |
| |
| .. wavedrom:: |
| |
| { "reg": [ |
| {"name": "Timer data", "bits": 32}] |
| } |
| |
| | |
| |
| The value in this register is the reset value for the comparator. |
| |
| Counter-Timer 1 |
| --------------- |
| |
| The counter triggers an interrupt on IRQ channel 11. |
| |
| .. _reg_timer1_config: |
| |
| ``reg_timer1_config`` |
| ~~~~~~~~~~~~~~~~~~~~~ |
| |
| Base address: ``0x23000000`` |
| |
| .. wavedrom:: |
| |
| { "reg": [ |
| {"name": "Timer config", "bits": 8}, |
| {"name": "(undefined, reads zero)", "bits": 24, "type": 1}] |
| } |
| |
| .. list-table:: Timer 1 configuration bit definitions |
| :name: reg_timer1_configuration_bit_definitions |
| :header-rows: 1 |
| :widths: auto |
| |
| * - Bit |
| - Name |
| - Values |
| * - 3 |
| - Counter/timer enable |
| - 0 - counter/timer disabled |
| |
| 1 - counter/timer enabled |
| * - 2 |
| - One-shot mode |
| - 0 - continuous mode |
| |
| 1 - one-shot mode |
| * - 1 |
| - Updown |
| - 0 - count down |
| |
| 1 - count up |
| * - 0 |
| - Interrupt enable |
| - 0 - interrupt disabled |
| |
| 1 - interrupt enabled |
| |
| .. _reg_timer1_value: |
| |
| ``reg_timer1_value`` |
| ~~~~~~~~~~~~~~~~~~~~ |
| |
| Base address: ``0x23000004`` |
| |
| .. wavedrom:: |
| |
| { "reg": [ |
| {"name": "Timer value", "bits": 32}] |
| } |
| |
| | |
| |
| The value in this register is the current value of the counter. |
| Value is 32 bits. |
| The register is read-write and can be used to reset the timer. |
| |
| .. _reg_timer1_data: |
| |
| ``reg_timer1_data`` |
| ~~~~~~~~~~~~~~~~~~~~ |
| |
| Base address: ``0x23000008`` |
| |
| .. wavedrom:: |
| |
| { "reg": [ |
| {"name": "Timer data", "bits": 32}] |
| } |
| |
| | |
| |
| The value in this register is the reset value for the comparator. |