1 |
4 |
fafa1971 |
/*
|
2 |
114 |
albert.wat |
* S1 Interrupt Controller
|
3 |
4 |
fafa1971 |
*
|
4 |
114 |
albert.wat |
* (C) 2007 Fabrizio Fazzino
|
5 |
4 |
fafa1971 |
*
|
6 |
|
|
* LICENSE:
|
7 |
|
|
* This is a Free Hardware Design; you can redistribute it and/or
|
8 |
|
|
* modify it under the terms of the GNU General Public License
|
9 |
|
|
* version 2 as published by the Free Software Foundation.
|
10 |
|
|
* The above named program is distributed in the hope that it will
|
11 |
|
|
* be useful, but WITHOUT ANY WARRANTY; without even the implied
|
12 |
|
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
13 |
|
|
* See the GNU General Public License for more details.
|
14 |
|
|
*
|
15 |
|
|
* DESCRIPTION:
|
16 |
|
|
* This block implements the Interrupt Controller used by the S1
|
17 |
|
|
* to detect if some peripheral raised an interrupt request.
|
18 |
|
|
* A proper interrupt packet is sent to the SPARC Core by the
|
19 |
|
|
* bridge with one of the 64 interrupt sources (provided by this
|
20 |
|
|
* controller) encoded in the 6-bit Interrupt Source field.
|
21 |
|
|
* Please note that IRQ 0 is reserved for Power-On Reset (handled
|
22 |
|
|
* directly by the bridge) so up to 63 external peripherals can be
|
23 |
|
|
* connected to the S1.
|
24 |
|
|
* Note also that currently the interrupt vector is hardwired to
|
25 |
|
|
* all zeroes.
|
26 |
|
|
*/
|
27 |
|
|
|
28 |
|
|
module int_ctrl (
|
29 |
|
|
sys_clock_i, sys_reset_i, sys_irq_i,
|
30 |
|
|
sys_interrupt_source_o
|
31 |
|
|
);
|
32 |
|
|
|
33 |
|
|
// System inputs
|
34 |
|
|
input sys_clock_i;
|
35 |
|
|
input sys_reset_i;
|
36 |
|
|
|
37 |
|
|
// Incoming Interrupt Requests
|
38 |
|
|
input[63:0] sys_irq_i;
|
39 |
|
|
|
40 |
|
|
// Encoded Interrupt Source
|
41 |
|
|
output[5:0] sys_interrupt_source_o;
|
42 |
|
|
reg[5:0] sys_interrupt_source_o;
|
43 |
|
|
|
44 |
|
|
// Encoding of the source using priority and ignoring IRQ 0
|
45 |
|
|
always @(posedge sys_clock_i) begin
|
46 |
|
|
if(sys_reset_i==1) sys_interrupt_source_o = 0;
|
47 |
|
|
else if(sys_irq_i[63]) sys_interrupt_source_o = 63;
|
48 |
|
|
else if(sys_irq_i[62]) sys_interrupt_source_o = 62;
|
49 |
|
|
else if(sys_irq_i[61]) sys_interrupt_source_o = 61;
|
50 |
|
|
else if(sys_irq_i[60]) sys_interrupt_source_o = 60;
|
51 |
|
|
else if(sys_irq_i[59]) sys_interrupt_source_o = 59;
|
52 |
|
|
else if(sys_irq_i[58]) sys_interrupt_source_o = 58;
|
53 |
|
|
else if(sys_irq_i[57]) sys_interrupt_source_o = 57;
|
54 |
|
|
else if(sys_irq_i[56]) sys_interrupt_source_o = 56;
|
55 |
|
|
else if(sys_irq_i[55]) sys_interrupt_source_o = 55;
|
56 |
|
|
else if(sys_irq_i[54]) sys_interrupt_source_o = 54;
|
57 |
|
|
else if(sys_irq_i[53]) sys_interrupt_source_o = 53;
|
58 |
|
|
else if(sys_irq_i[52]) sys_interrupt_source_o = 52;
|
59 |
|
|
else if(sys_irq_i[51]) sys_interrupt_source_o = 51;
|
60 |
|
|
else if(sys_irq_i[50]) sys_interrupt_source_o = 50;
|
61 |
|
|
else if(sys_irq_i[49]) sys_interrupt_source_o = 49;
|
62 |
|
|
else if(sys_irq_i[48]) sys_interrupt_source_o = 48;
|
63 |
|
|
else if(sys_irq_i[47]) sys_interrupt_source_o = 47;
|
64 |
|
|
else if(sys_irq_i[46]) sys_interrupt_source_o = 46;
|
65 |
|
|
else if(sys_irq_i[45]) sys_interrupt_source_o = 45;
|
66 |
|
|
else if(sys_irq_i[44]) sys_interrupt_source_o = 44;
|
67 |
|
|
else if(sys_irq_i[43]) sys_interrupt_source_o = 43;
|
68 |
|
|
else if(sys_irq_i[42]) sys_interrupt_source_o = 42;
|
69 |
|
|
else if(sys_irq_i[41]) sys_interrupt_source_o = 41;
|
70 |
|
|
else if(sys_irq_i[40]) sys_interrupt_source_o = 40;
|
71 |
|
|
else if(sys_irq_i[39]) sys_interrupt_source_o = 39;
|
72 |
|
|
else if(sys_irq_i[38]) sys_interrupt_source_o = 38;
|
73 |
|
|
else if(sys_irq_i[37]) sys_interrupt_source_o = 37;
|
74 |
|
|
else if(sys_irq_i[36]) sys_interrupt_source_o = 36;
|
75 |
|
|
else if(sys_irq_i[35]) sys_interrupt_source_o = 35;
|
76 |
|
|
else if(sys_irq_i[34]) sys_interrupt_source_o = 34;
|
77 |
|
|
else if(sys_irq_i[33]) sys_interrupt_source_o = 33;
|
78 |
|
|
else if(sys_irq_i[32]) sys_interrupt_source_o = 32;
|
79 |
|
|
else if(sys_irq_i[31]) sys_interrupt_source_o = 31;
|
80 |
|
|
else if(sys_irq_i[30]) sys_interrupt_source_o = 30;
|
81 |
|
|
else if(sys_irq_i[29]) sys_interrupt_source_o = 29;
|
82 |
|
|
else if(sys_irq_i[28]) sys_interrupt_source_o = 28;
|
83 |
|
|
else if(sys_irq_i[27]) sys_interrupt_source_o = 27;
|
84 |
|
|
else if(sys_irq_i[26]) sys_interrupt_source_o = 26;
|
85 |
|
|
else if(sys_irq_i[25]) sys_interrupt_source_o = 25;
|
86 |
|
|
else if(sys_irq_i[24]) sys_interrupt_source_o = 24;
|
87 |
|
|
else if(sys_irq_i[23]) sys_interrupt_source_o = 23;
|
88 |
|
|
else if(sys_irq_i[22]) sys_interrupt_source_o = 22;
|
89 |
|
|
else if(sys_irq_i[21]) sys_interrupt_source_o = 21;
|
90 |
|
|
else if(sys_irq_i[20]) sys_interrupt_source_o = 20;
|
91 |
|
|
else if(sys_irq_i[19]) sys_interrupt_source_o = 19;
|
92 |
|
|
else if(sys_irq_i[18]) sys_interrupt_source_o = 18;
|
93 |
|
|
else if(sys_irq_i[17]) sys_interrupt_source_o = 17;
|
94 |
|
|
else if(sys_irq_i[16]) sys_interrupt_source_o = 16;
|
95 |
|
|
else if(sys_irq_i[15]) sys_interrupt_source_o = 15;
|
96 |
|
|
else if(sys_irq_i[14]) sys_interrupt_source_o = 14;
|
97 |
|
|
else if(sys_irq_i[13]) sys_interrupt_source_o = 13;
|
98 |
|
|
else if(sys_irq_i[12]) sys_interrupt_source_o = 12;
|
99 |
|
|
else if(sys_irq_i[11]) sys_interrupt_source_o = 11;
|
100 |
|
|
else if(sys_irq_i[10]) sys_interrupt_source_o = 10;
|
101 |
|
|
else if(sys_irq_i[9]) sys_interrupt_source_o = 9;
|
102 |
|
|
else if(sys_irq_i[8]) sys_interrupt_source_o = 8;
|
103 |
|
|
else if(sys_irq_i[7]) sys_interrupt_source_o = 7;
|
104 |
|
|
else if(sys_irq_i[6]) sys_interrupt_source_o = 6;
|
105 |
|
|
else if(sys_irq_i[5]) sys_interrupt_source_o = 5;
|
106 |
|
|
else if(sys_irq_i[4]) sys_interrupt_source_o = 4;
|
107 |
|
|
else if(sys_irq_i[3]) sys_interrupt_source_o = 3;
|
108 |
|
|
else if(sys_irq_i[2]) sys_interrupt_source_o = 2;
|
109 |
|
|
else if(sys_irq_i[1]) sys_interrupt_source_o = 1;
|
110 |
|
|
else sys_interrupt_source_o = 0;
|
111 |
|
|
end
|
112 |
|
|
|
113 |
|
|
endmodule
|