diff --git a/doc/rtc.drawio b/doc/rtc/rtc.drawio similarity index 100% rename from doc/rtc.drawio rename to doc/rtc/rtc.drawio diff --git a/doc/rtc/rtc.drawio.png b/doc/rtc/rtc.drawio.png new file mode 100644 index 0000000..993ffb2 Binary files /dev/null and b/doc/rtc/rtc.drawio.png differ diff --git a/doc/rtc/rtc.md b/doc/rtc/rtc.md new file mode 100644 index 0000000..5d68bd5 --- /dev/null +++ b/doc/rtc/rtc.md @@ -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: + +![rtc.drawio.png](rtc.drawio.png) + +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. + + +