Add pic docs
This commit is contained in:
BIN
doc/pic/pic.drawio.png
Normal file
BIN
doc/pic/pic.drawio.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 140 KiB |
60
doc/pic/pic.md
Normal file
60
doc/pic/pic.md
Normal file
@@ -0,0 +1,60 @@
|
||||
# PIC
|
||||
|
||||
## Overview
|
||||
|
||||
The PIC (Programmable Interrupt Controller) supports 256 edge or level
|
||||
triggered interrupts.
|
||||
|
||||
Interrupts can only be rising edge or positive level trigger. Negative edge or
|
||||
low level trigger can be accomplished by inverting the input to this module.
|
||||
|
||||
When an interrupt is triggered, it remains triggered until cleared with an
|
||||
`EOI`. Currently, only the highest priority interrupt can be cleared. This
|
||||
is bad design and will be fixed soon(tm).
|
||||
|
||||

|
||||
|
||||
## Interface
|
||||
|
||||
The PIC is controlled through two 8-bit registers, `CMD` and `DAT`.
|
||||
The upepr 3 bits of `CMD` control which register is accessed, and the lower 5
|
||||
bits control the byte select.
|
||||
|
||||
`EOI` is a special case: when `CMD` is 0xFF, the highest priority interrupt is
|
||||
cleared.
|
||||
|
||||
### CMD
|
||||
| [7:5] | [4:0] |
|
||||
|------------------ |------------- |
|
||||
| Register Address | Byte Select |
|
||||
|
||||
### DAT
|
||||
| [7:0] |
|
||||
|----------------------- |
|
||||
| Data[8*Byte_sel +: 8] |
|
||||
|
||||
## Registers
|
||||
|
||||
### Register Map
|
||||
|
||||
| Address | Read | Write |
|
||||
|--------- |------------ |-------- |
|
||||
| 0 | IRQ Number | ~ |
|
||||
| 1 | Enable | Enable |
|
||||
| 2 | Type | Type |
|
||||
|
||||
### IRQ Number
|
||||
|
||||
8 bit register outputs the highest priority interrupt currently active. When
|
||||
no interrupt is active, it will output 255.
|
||||
|
||||
### Enable
|
||||
|
||||
256 bit enable register. When bit _n_ is set to 1, the corresponding interrupt
|
||||
_n_.
|
||||
|
||||
### Type
|
||||
|
||||
256 bit type register. When bit _n_ is set to 0, the corresponding interrupt
|
||||
_n_ will be edge triggered. If the bit is set to 1, the interrupt will be level
|
||||
triggered.
|
||||
Reference in New Issue
Block a user