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 21

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

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

powered by: WebSVN 2.1.0

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