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

Subversion Repositories or1200_soc

[/] [or1200_soc/] [trunk/] [src/] [soc_gpio.v] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 qaztronic
// --------------------------------------------------------------------
2
//
3
// --------------------------------------------------------------------
4
 
5
`include "timescale.v"
6
`include "gpio_defines.v"
7
 
8
 
9
module soc_gpio #(
10
                    parameter dw = 32,
11
                    parameter aw = `GPIO_ADDRHH+1,
12
                    parameter gw = `GPIO_IOS
13
                  )
14
                  (
15
                    input   [31:0]  gpio_data_i,
16
                    output  [31:0]  gpio_data_o,
17
                    input   [31:0]  gpio_addr_i,
18
                    input   [3:0]   gpio_sel_i,
19
                    input           gpio_we_i,
20
                    input           gpio_cyc_i,
21
                    input           gpio_stb_i,
22
                    output          gpio_ack_o,
23
                    output          gpio_err_o,
24
                    output          gpio_rty_o,
25
 
26
                    input         [gw-1:0]  gpio_a_aux_i,
27
                    input   [gw-1:0]  gpio_a_ext_pad_i,
28
                    output  [gw-1:0]  gpio_a_ext_pad_o,
29
                    output  [gw-1:0]  gpio_a_ext_padoe_o,
30
                    output            gpio_a_inta_o,
31
 
32
                    input         [gw-1:0]  gpio_b_aux_i,
33
                    input   [gw-1:0]  gpio_b_ext_pad_i,
34
                    output  [gw-1:0]  gpio_b_ext_pad_o,
35
                    output  [gw-1:0]  gpio_b_ext_padoe_o,
36
                    output            gpio_b_inta_o,
37
 
38
                    input         [gw-1:0]  gpio_c_aux_i,
39
                    input   [gw-1:0]  gpio_c_ext_pad_i,
40
                    output  [gw-1:0]  gpio_c_ext_pad_o,
41
                    output  [gw-1:0]  gpio_c_ext_padoe_o,
42
                    output            gpio_c_inta_o,
43
 
44
                    input         [gw-1:0]  gpio_d_aux_i,
45
                    input   [gw-1:0]  gpio_d_ext_pad_i,
46
                    output  [gw-1:0]  gpio_d_ext_pad_o,
47
                    output  [gw-1:0]  gpio_d_ext_padoe_o,
48
                    output            gpio_d_inta_o,
49
 
50
                    input         [gw-1:0]  gpio_e_aux_i,
51
                    input   [gw-1:0]  gpio_e_ext_pad_i,
52
                    output  [gw-1:0]  gpio_e_ext_pad_o,
53
                    output  [gw-1:0]  gpio_e_ext_padoe_o,
54
                    output            gpio_e_inta_o,
55
 
56
                    input         [gw-1:0]  gpio_f_aux_i,
57
                    input   [gw-1:0]  gpio_f_ext_pad_i,
58
                    output  [gw-1:0]  gpio_f_ext_pad_o,
59
                    output  [gw-1:0]  gpio_f_ext_padoe_o,
60
                    output            gpio_f_inta_o,
61
 
62
                    input         [gw-1:0]  gpio_g_aux_i,
63
                    input   [gw-1:0]  gpio_g_ext_pad_i,
64
                    output  [gw-1:0]  gpio_g_ext_pad_o,
65
                    output  [gw-1:0]  gpio_g_ext_padoe_o,
66
                    output            gpio_g_inta_o,
67
 
68
                    input           gpio_clk_i,
69
                    input           gpio_rst_i
70
                  );
71
 
72
 
73
  //---------------------------------------------------
74
  // GPIO muxes                  
75
  wire  [dw-1:0]  gpio_a_dat_o;
76
  wire            gpio_a_ack_o;
77
  wire            gpio_a_err_o;
78
 
79
  wire  [dw-1:0]  gpio_b_dat_o;
80
  wire            gpio_b_ack_o;
81
  wire            gpio_b_err_o;
82
 
83
  wire  [dw-1:0]  gpio_c_dat_o;
84
  wire            gpio_c_ack_o;
85
  wire            gpio_c_err_o;
86
 
87
  wire  [dw-1:0]  gpio_d_dat_o;
88
  wire            gpio_d_ack_o;
89
  wire            gpio_d_err_o;
90
 
91
  wire  [dw-1:0]  gpio_e_dat_o;
92
  wire            gpio_e_ack_o;
93
  wire            gpio_e_err_o;
94
 
95
  wire  [dw-1:0]  gpio_f_dat_o;
96
  wire            gpio_f_ack_o;
97
  wire            gpio_f_err_o;
98
 
99
  wire  [dw-1:0]  gpio_g_dat_o;
100
  wire            gpio_g_ack_o;
101
  wire            gpio_g_err_o;
102
 
103
  wire stub_ack_o = gpio_cyc_i & gpio_stb_i;
104
 
105
  reg  [dw-1:0]  mux_dat_o;
106
  reg            mux_ack_o;
107
  reg            mux_err_o;
108
 
109
  // gpio regs are from offset 0x00-0x24
110
  reg gpio_offset_range;
111
 
112
  always @(*)
113
    casez( gpio_addr_i[5:2] )
114
      4'b00_??: gpio_offset_range = 1'b1;
115
      4'b01_??: gpio_offset_range = 1'b1;
116
      4'b10_00: gpio_offset_range = 1'b1;
117
      4'b10_01: gpio_offset_range = 1'b1;
118
      default:  gpio_offset_range = 1'b0;
119
    endcase
120
 
121
  wire gpio_addr_range = ~( |gpio_addr_i[23:6] ) & gpio_offset_range;
122
 
123
  always @(*)
124
    case( {gpio_addr_range, gpio_addr_i[27:24] } )
125
      5'h1_0:   {mux_dat_o, mux_ack_o, mux_err_o} = {gpio_a_dat_o, gpio_a_ack_o, gpio_a_err_o};
126
      5'h1_1:   {mux_dat_o, mux_ack_o, mux_err_o} = {gpio_b_dat_o, gpio_b_ack_o, gpio_b_err_o};
127
      5'h1_2:   {mux_dat_o, mux_ack_o, mux_err_o} = {gpio_c_dat_o, gpio_c_ack_o, gpio_c_err_o};
128
      5'h1_3:   {mux_dat_o, mux_ack_o, mux_err_o} = {gpio_d_dat_o, gpio_d_ack_o, gpio_d_err_o};
129
      5'h1_4:   {mux_dat_o, mux_ack_o, mux_err_o} = {gpio_e_dat_o, gpio_e_ack_o, gpio_e_err_o};
130
      5'h1_5:   {mux_dat_o, mux_ack_o, mux_err_o} = {gpio_f_dat_o, gpio_f_ack_o, gpio_f_err_o};
131
      5'h1_6:   {mux_dat_o, mux_ack_o, mux_err_o} = {gpio_g_dat_o, gpio_g_ack_o, gpio_g_err_o};
132
      default:  {mux_dat_o, mux_ack_o, mux_err_o} = {32'h1bad_c0de, stub_ack_o, 1'b0};
133
    endcase
134
 
135
  assign  gpio_data_o = mux_dat_o;
136
  assign  gpio_ack_o = mux_ack_o;
137
  assign  gpio_err_o = mux_err_o;
138
 
139
 
140
  //---------------------------------------------------
141
  // GPIO a
142
  gpio_top
143
    i_gpio_a(
144
                  .wb_clk_i(gpio_clk_i),
145
                  .wb_rst_i(gpio_rst_i),
146
                  .wb_cyc_i(gpio_cyc_i & (gpio_addr_i[27:24] == 4'h0) ),
147
                  .wb_adr_i(gpio_addr_i[7:0]),
148
                  .wb_dat_i(gpio_data_i),
149
                  .wb_sel_i(gpio_sel_i),
150
                  .wb_we_i(gpio_we_i),
151
                  .wb_stb_i(gpio_stb_i),
152
                  .wb_dat_o(gpio_a_dat_o),
153
                  .wb_ack_o(gpio_a_ack_o),
154
                  .wb_err_o(gpio_a_err_o),
155
                  .wb_inta_o(gpio_a_inta_o),
156
 
157
`ifdef GPIO_AUX_IMPLEMENT
158
                  .aux_i(gpio_a_aux_i),
159
`endif // GPIO_AUX_IMPLEMENT
160
 
161
`ifdef GPIO_CLKPAD
162
              .clk_pad_i(gpio_clk_i),
163
`endif //  GPIO_CLKPAD
164
 
165
                  .ext_pad_i(gpio_a_ext_pad_i),
166
                  .ext_pad_o(gpio_a_ext_pad_o),
167
                  .ext_padoe_o(gpio_a_ext_padoe_o)
168
            );
169
 
170
  //---------------------------------------------------
171
  // GPIO b
172
  gpio_top
173
    i_gpio_b(
174
                  .wb_clk_i(gpio_clk_i),
175
                  .wb_rst_i(gpio_rst_i),
176
                  .wb_cyc_i(gpio_cyc_i & (gpio_addr_i[27:24] == 4'h1) ),
177
                  .wb_adr_i(gpio_addr_i[7:0]),
178
                  .wb_dat_i(gpio_data_i),
179
                  .wb_sel_i(gpio_sel_i),
180
                  .wb_we_i(gpio_we_i),
181
                  .wb_stb_i(gpio_stb_i),
182
                  .wb_dat_o(gpio_b_dat_o),
183
                  .wb_ack_o(gpio_b_ack_o),
184
                  .wb_err_o(gpio_b_err_o),
185
                  .wb_inta_o(gpio_b_inta_o),
186
 
187
`ifdef GPIO_AUX_IMPLEMENT
188
                  .aux_i(gpio_b_aux_i),
189
`endif // GPIO_AUX_IMPLEMENT
190
 
191
`ifdef GPIO_CLKPAD
192
              .clk_pad_i(gpio_clk_i),
193
`endif //  GPIO_CLKPAD
194
 
195
                  .ext_pad_i(gpio_b_ext_pad_i),
196
                  .ext_pad_o(gpio_b_ext_pad_o),
197
                  .ext_padoe_o(gpio_b_ext_padoe_o)
198
            );
199
 
200
  //---------------------------------------------------
201
  // GPIO c
202
  gpio_top
203
    i_gpio_c(
204
                  .wb_clk_i(gpio_clk_i),
205
                  .wb_rst_i(gpio_rst_i),
206
                  .wb_cyc_i(gpio_cyc_i & (gpio_addr_i[27:24] == 4'h2) ),
207
                  .wb_adr_i(gpio_addr_i[7:0]),
208
                  .wb_dat_i(gpio_data_i),
209
                  .wb_sel_i(gpio_sel_i),
210
                  .wb_we_i(gpio_we_i),
211
                  .wb_stb_i(gpio_stb_i),
212
                  .wb_dat_o(gpio_c_dat_o),
213
                  .wb_ack_o(gpio_c_ack_o),
214
                  .wb_err_o(gpio_c_err_o),
215
                  .wb_inta_o(gpio_c_inta_o),
216
 
217
`ifdef GPIO_AUX_IMPLEMENT
218
                  .aux_i(gpio_c_aux_i),
219
`endif // GPIO_AUX_IMPLEMENT
220
 
221
`ifdef GPIO_CLKPAD
222
              .clk_pad_i(gpio_clk_i),
223
`endif //  GPIO_CLKPAD
224
 
225
                  .ext_pad_i(gpio_c_ext_pad_i),
226
                  .ext_pad_o(gpio_c_ext_pad_o),
227
                  .ext_padoe_o(gpio_c_ext_padoe_o)
228
            );
229
 
230
  //---------------------------------------------------
231
  // GPIO d
232
  gpio_top
233
    i_gpio_d(
234
                  .wb_clk_i(gpio_clk_i),
235
                  .wb_rst_i(gpio_rst_i),
236
                  .wb_cyc_i(gpio_cyc_i & (gpio_addr_i[27:24] == 4'h3) ),
237
                  .wb_adr_i(gpio_addr_i[7:0]),
238
                  .wb_dat_i(gpio_data_i),
239
                  .wb_sel_i(gpio_sel_i),
240
                  .wb_we_i(gpio_we_i),
241
                  .wb_stb_i(gpio_stb_i),
242
                  .wb_dat_o(gpio_d_dat_o),
243
                  .wb_ack_o(gpio_d_ack_o),
244
                  .wb_err_o(gpio_d_err_o),
245
                  .wb_inta_o(gpio_d_inta_o),
246
 
247
`ifdef GPIO_AUX_IMPLEMENT
248
                  .aux_i(gpio_d_aux_i),
249
`endif // GPIO_AUX_IMPLEMENT
250
 
251
`ifdef GPIO_CLKPAD
252
              .clk_pad_i(gpio_clk_i),
253
`endif //  GPIO_CLKPAD
254
 
255
                  .ext_pad_i(gpio_d_ext_pad_i),
256
                  .ext_pad_o(gpio_d_ext_pad_o),
257
                  .ext_padoe_o(gpio_d_ext_padoe_o)
258
            );
259
 
260
  //---------------------------------------------------
261
  // GPIO e
262
  gpio_top
263
    i_gpio_e(
264
                  .wb_clk_i(gpio_clk_i),
265
                  .wb_rst_i(gpio_rst_i),
266
                  .wb_cyc_i(gpio_cyc_i & (gpio_addr_i[27:24] == 4'h4) ),
267
                  .wb_adr_i(gpio_addr_i[7:0]),
268
                  .wb_dat_i(gpio_data_i),
269
                  .wb_sel_i(gpio_sel_i),
270
                  .wb_we_i(gpio_we_i),
271
                  .wb_stb_i(gpio_stb_i),
272
                  .wb_dat_o(gpio_e_dat_o),
273
                  .wb_ack_o(gpio_e_ack_o),
274
                  .wb_err_o(gpio_e_err_o),
275
                  .wb_inta_o(gpio_e_inta_o),
276
 
277
`ifdef GPIO_AUX_IMPLEMENT
278
                  .aux_i(gpio_e_aux_i),
279
`endif // GPIO_AUX_IMPLEMENT
280
 
281
`ifdef GPIO_CLKPAD
282
              .clk_pad_i(gpio_clk_i),
283
`endif //  GPIO_CLKPAD
284
 
285
                  .ext_pad_i(gpio_e_ext_pad_i),
286
                  .ext_pad_o(gpio_e_ext_pad_o),
287
                  .ext_padoe_o(gpio_e_ext_padoe_o)
288
            );
289
 
290
  //---------------------------------------------------
291
  // GPIO f
292
  gpio_top
293
    i_gpio_f(
294
                  .wb_clk_i(gpio_clk_i),
295
                  .wb_rst_i(gpio_rst_i),
296
                  .wb_cyc_i(gpio_cyc_i & (gpio_addr_i[27:24] == 4'h5) ),
297
                  .wb_adr_i(gpio_addr_i[7:0]),
298
                  .wb_dat_i(gpio_data_i),
299
                  .wb_sel_i(gpio_sel_i),
300
                  .wb_we_i(gpio_we_i),
301
                  .wb_stb_i(gpio_stb_i),
302
                  .wb_dat_o(gpio_f_dat_o),
303
                  .wb_ack_o(gpio_f_ack_o),
304
                  .wb_err_o(gpio_f_err_o),
305
                  .wb_inta_o(gpio_f_inta_o),
306
 
307
`ifdef GPIO_AUX_IMPLEMENT
308
                  .aux_i(gpio_f_aux_i),
309
`endif // GPIO_AUX_IMPLEMENT
310
 
311
`ifdef GPIO_CLKPAD
312
              .clk_pad_i(gpio_clk_i),
313
`endif //  GPIO_CLKPAD
314
 
315
                  .ext_pad_i(gpio_f_ext_pad_i),
316
                  .ext_pad_o(gpio_f_ext_pad_o),
317
                  .ext_padoe_o(gpio_f_ext_padoe_o)
318
            );
319
 
320
  //---------------------------------------------------
321
  // GPIO g
322
  gpio_top
323
    i_gpio_g(
324
                  .wb_clk_i(gpio_clk_i),
325
                  .wb_rst_i(gpio_rst_i),
326
                  .wb_cyc_i(gpio_cyc_i & (gpio_addr_i[27:24] == 4'h6) ),
327
                  .wb_adr_i(gpio_addr_i[7:0]),
328
                  .wb_dat_i(gpio_data_i),
329
                  .wb_sel_i(gpio_sel_i),
330
                  .wb_we_i(gpio_we_i),
331
                  .wb_stb_i(gpio_stb_i),
332
                  .wb_dat_o(gpio_g_dat_o),
333
                  .wb_ack_o(gpio_g_ack_o),
334
                  .wb_err_o(gpio_g_err_o),
335
                  .wb_inta_o(gpio_g_inta_o),
336
 
337
`ifdef GPIO_AUX_IMPLEMENT
338
                  .aux_i(gpio_g_aux_i),
339
`endif // GPIO_AUX_IMPLEMENT
340
 
341
`ifdef GPIO_CLKPAD
342
              .clk_pad_i(gpio_clk_i),
343
`endif //  GPIO_CLKPAD
344
 
345
                  .ext_pad_i(gpio_g_ext_pad_i),
346
                  .ext_pad_o(gpio_g_ext_pad_o),
347
                  .ext_padoe_o(gpio_g_ext_padoe_o)
348
            );
349
 
350
 
351
  //---------------------------------------------------
352
  // outputs
353
  assign gpio_rty_o = 1'b0;
354
 
355
 
356
endmodule
357
 
358
 
359
 
360
 

powered by: WebSVN 2.1.0

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