mirror of https://github.com/efabless/caravel.git
212 lines
4.9 KiB
ReStructuredText
212 lines
4.9 KiB
ReStructuredText
|
.. 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.
|