Add rtc docs
This commit is contained in:
BIN
doc/rtc/rtc.drawio.png
Normal file
BIN
doc/rtc/rtc.drawio.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
82
doc/rtc/rtc.md
Normal file
82
doc/rtc/rtc.md
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
# RTC
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The RTC is capable of keeping track of elapsed time as well as generating
|
||||||
|
periodic interrupts. Its input frequency is (currently) the same as the CPU
|
||||||
|
frequency. The architecture is shown below:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The `counter` register is a 32 bit register which increments by `increment`
|
||||||
|
every clock tick. When this value reaches `threshold`, both `output` and
|
||||||
|
`irq_counter` are incremented by 1. When `irq_counter` reaches `irq_threshold`,
|
||||||
|
an interrupt is generated.
|
||||||
|
|
||||||
|
The interrupt frequency can be calculated with the following equations:
|
||||||
|
|
||||||
|
$$ F_{out}=\frac{F_{in}\cdot{increment}}{threshold} $$
|
||||||
|
$$ F_{irq}=\frac{F_{out}}{irq\_threshold} $$
|
||||||
|
|
||||||
|
Where $ F_{out} $ is the frequency at which the output changes and $ F_{irq} $
|
||||||
|
is the frequency at which interrupts occur.
|
||||||
|
|
||||||
|
## Interface
|
||||||
|
|
||||||
|
The RTC is controlled through two 8-bit registers, `CMD` and `DAT`.
|
||||||
|
The upepr 4 bits of `CMD` control which register is accessed, and the lower 4
|
||||||
|
bits control the byte select. The RTC uses 32 bit registers, so only values of
|
||||||
|
0-3 are supported.
|
||||||
|
|
||||||
|
### CMD
|
||||||
|
| [7:4] | [3:2 | [1:0] |
|
||||||
|
|------------------ |---------- |------------- |
|
||||||
|
| Register Address | Reserved | Byte Select |
|
||||||
|
|
||||||
|
### DAT
|
||||||
|
| [7:0] |
|
||||||
|
|----------------------- |
|
||||||
|
| Data[8*Byte_sel +: 8] |
|
||||||
|
|
||||||
|
## Registers
|
||||||
|
|
||||||
|
### Register Map
|
||||||
|
|
||||||
|
| Address | Read | Write |
|
||||||
|
|--------- |--------------- |--------------- |
|
||||||
|
| 0 | Threshold | Threshold |
|
||||||
|
| 1 | Increment | Increment |
|
||||||
|
| 2 | IRQ Threshold | IRQ Threshold |
|
||||||
|
| 3 | Output | Control |
|
||||||
|
|
||||||
|
### Threshold
|
||||||
|
|
||||||
|
32 bit threshold register. When `counter` reaches this value, `output` and
|
||||||
|
`irq_counter` are incremented by 1, and `counter` is reset back to 0.
|
||||||
|
|
||||||
|
### Increment
|
||||||
|
|
||||||
|
32 bit increment register. Every clock cycle, `counter` is incremented by
|
||||||
|
`increment`
|
||||||
|
|
||||||
|
### IRQ Threshold
|
||||||
|
|
||||||
|
32 bit IRQ threshold register. When `irq_counter` reaches this value, and IRQ
|
||||||
|
is generated and `irq_counter` is reset back to 0.
|
||||||
|
|
||||||
|
### Output
|
||||||
|
|
||||||
|
32 bit output register. This value ticks up.
|
||||||
|
|
||||||
|
### Control
|
||||||
|
|
||||||
|
| [7:2] | [1] | [0] |
|
||||||
|
|---------- |------------ |-------- |
|
||||||
|
| Reserved | IRQ Enable | Enable |
|
||||||
|
|
||||||
|
8 bit Control register. Regardless of Byte Select, any write to address 3 will
|
||||||
|
write to this register. `IRQ Enable` controls interrupt generation. `Enable` is
|
||||||
|
a global enable. When 0, all counter registers are set to 0.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user