OpenCores
URL https://opencores.org/ocsvn/neorv32/neorv32/trunk

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [docs/] [datasheet/] [soc_xirq.adoc] - Blame information for rev 61

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 61 zero_gravi
<<<
2
:sectnums:
3
==== External Interrupt Controller (XIRQ)
4
 
5
[cols="<3,<3,<4"]
6
[frame="topbot",grid="none"]
7
|=======================
8
| Hardware source file(s): | neorv32_xirq.vhd |
9
| Software driver file(s): | neorv32_xirq.c |
10
|                          | neorv32_xirq.h |
11
| Top entity port:         | `xirq_i` | IRQ input (up to 32-bit)
12
| Configuration generics:  | _XIRQ_NUM_CH_           | Number of IRQs to implement (0..32)
13
|                          | _XIRQ_TRIGGER_TYPE_     | IRQ trigger type configuration
14
|                          | _XIRQ_TRIGGER_POLARITY_ | IRQ trigger polarity configuration
15
| CPU interrupts:          | fast IRQ channel 8 | XIRQ (see <<_processor_interrupts>>)
16
|=======================
17
 
18
The eXternal interrupt controller provides a simple mechanism to implement up to 32 processor-external interrupt
19
request signals. The external IRQ requests are prioritized, queued and signaled to the CPU via a
20
single _CPU fast interrupt request_.
21
 
22
**Theory of Operation**
23
 
24
The XIRQ provides up to 32 interrupt _channels_ (configured via the _XIRQ_NUM_CH_ generic). Each bit in `xirq_i`
25
represents one interrupt channel. An interrupt channel is enabled by setting the according bit in the
26
interrupt enable register _XIRQ_IER_.
27
 
28
If the configured trigger (see below) of an enabled channel fires, the request is stored into an internal buffer.
29
This buffer is available via the interrupt pending register _XIRQ_IPR_. A `1` in this register indicates that the
30
corresponding interrupt channel has fired but has not yet been serviced (so it is pending). Pending IRQs can be
31
cleared by writing `1` to the according pending bit. As soon as there is a least one pending interrupt in the
32
buffer, an interrupt request is send to the CPU.
33
 
34
The CPU can determine firing interrupt request either by checking the bits in the _XIRQ_IPR_ register, which show all
35
pending interrupt and does not prioritize, or by reading the interrupt source _XIRQ_SCR_ register.
36
This register provides a 5-bit wide ID (0..31) that shows the interrupt request with _highest priority_.
37
Interrupt channel `xirq_i(0)` has highest priority and `xirq_i(_XIRQ_NUM_CH_-1)` has lowest priority.
38
This priority assignment is fixed and cannot be altered by software.
39
The CPU can use the ID from _XIRQ_SCR_ to service IRQ according to their priority. To acknowledge the according
40
interrupt the CPU can write `1 << XIRQ_SCR` to _XIRQ_IPR_.
41
 
42
**IRQ Trigger Configuration**
43
 
44
The controller does not provide a configuration option to define the IRQ triggers _during runtime_. Instead, two
45
generics are provided to configure the trigger of each interrupt channel before synthesis: the _XIRQ_TRIGGER_TYPE_
46
and _XIRQ_TRIGGER_POLARITY_ generic. Both generics are 32 bit wide representing one bit per interrupt channel. If
47
less than 32 interrupt channels are implemented the remaining configuration bits are ignored.
48
 
49
_XIRQ_TRIGGER_TYPE_ is used to define the general trigger type. This can either be _level-triggered_ (`0`) or
50
_edge-triggered_ (`1`). _XIRQ_TRIGGER_POLARITY_ is used to configure the polarity of the trigger: a `0` defines
51
low-level or falling-edge and a `1` defines high-level or a rising-edge.
52
 
53
.Example trigger configuration: channel 0 for rising-edge, IRQ channels 1 to 31 for high-level
54
[source, vhdl]
55
----
56
XIRQ_TRIGGER_TYPE     => x"00000001";
57
XIRQ_TRIGGER_POLARITY => x"ffffffff";
58
----
59
 
60
.XIRQ register map
61
[cols="^4,<5,^2,^2,<14"]
62
[options="header",grid="all"]
63
|=======================
64
| Address | Name [C] | Bit(s) | R/W | Function
65
| `0xffffff80` | _XIRQ_IER_ | `31:0` | r/w | Interrupt enable register (one bit per channel, LSB-aligned)
66
| `0xffffff84` | _XIRQ_IPR_ | `31:0` | r/w | Interrupt pending register (one bit per channel, LSB-aligned); writing 1 to a bit clears according interrupt; writing _any_ value acknowledges the _current_ CPU interrupt
67
| `0xffffff88` | _XIRQ_SCR_ |  `4:0` | r/- | Channel id (0..31) of firing IRQ (prioritized!)
68
| `0xffffff8c` | -          | `31:0` | r/- | _reserved_, read as zero
69
|=======================

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.