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

Subversion Repositories sdcard_mass_storage_controller

[/] [sdcard_mass_storage_controller/] [trunk/] [rtl/] [sdc_dma/] [verilog/] [sdc_controller.v] - Blame information for rev 134

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 134 tac2
`include "sd_defines.v"
2
//////////////////////////////////////////////////////////////////////
3
////                                                                    ////
4
////  sd_controller.v                                                   ////
5
////                                                                          ////
6
////  This file is part of the SD Card IP core project                        ////
7
////  http://www.opencores.org/?do=project&who=sdcard_mass_storage_controller  ////
8
////                                                                           ////
9
////  Author(s):                                                            ////
10
////      - Adam Edvardsson (adam.edvardsson@orsoc.se)                       ////
11
////                                                                 ////
12
////                                                              ////
13
//////////////////////////////////////////////////////////////////////
14
////                                                              ////
15
//// Copyright (C) 2009 Authors                                   ////
16
////                                                              ////
17
//// This source file may be used and distributed without         ////
18
//// restriction provided that this copyright statement is not    ////
19
//// removed from the file and that any derivative work contains  ////
20
//// the original copyright notice and the associated disclaimer. ////
21
////                                                              ////
22
//// This source file is free software; you can redistribute it   ////
23
//// and/or modify it under the terms of the GNU Lesser General   ////
24
//// Public License as published by the Free Software Foundation; ////
25
//// either version 2.1 of the License, or (at your option) any   ////
26
//// later version.                                               ////
27
////                                                              ////
28
//// This source is distributed in the hope that it will be       ////
29
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
30
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
31
//// PURPOSE.  See the GNU Lesser General Public License for more ////
32
//// details.                                                     ////
33
////                                                              ////
34
//// You should have received a copy of the GNU Lesser General    ////
35
//// Public License along with this source; if not, download it   ////
36
//// from http://www.opencores.org/lgpl.shtml                     ////
37
////                                                              ////
38
//////////////////////////////////////////////////////////////////////
39
 
40
 
41
 
42
 
43
module sdc_controller(
44
 
45
  // WISHBONE common
46
  wb_clk_i, wb_rst_i, wb_dat_i, wb_dat_o,
47
 
48
  // WISHBONE slave
49
  wb_adr_i, wb_sel_i, wb_we_i, wb_cyc_i, wb_stb_i, wb_ack_o,
50
 
51
  // WISHBONE master
52
  m_wb_adr_o, m_wb_sel_o, m_wb_we_o,
53
  m_wb_dat_o, m_wb_dat_i, m_wb_cyc_o,
54
  m_wb_stb_o, m_wb_ack_i,
55
  m_wb_cti_o, m_wb_bte_o,
56
  //SD BUS
57
 
58
  sd_cmd_dat_i,sd_cmd_out_o,  sd_cmd_oe_o, card_detect,
59
  sd_dat_dat_i, sd_dat_out_o , sd_dat_oe_o, sd_clk_o_pad
60
  `ifdef SDC_CLK_SEP
61
   ,sd_clk_i_pad
62
  `endif
63
  `ifdef SDC_IRQ_ENABLE
64
   ,int_a, int_b, int_c
65
  `endif
66
);
67
 
68
 
69
 
70
// WISHBONE common
71
input           wb_clk_i;     // WISHBONE clock
72
input           wb_rst_i;     // WISHBONE reset
73
input   [31:0]  wb_dat_i;     // WISHBONE data input
74
output  [31:0]  wb_dat_o;     // WISHBONE data output
75
     // WISHBONE error output
76
input                   card_detect;
77
// WISHBONE slave
78
input   [7:0]  wb_adr_i;     // WISHBONE address input
79
input   [3:0]  wb_sel_i;     // WISHBONE byte select input
80
input          wb_we_i;      // WISHBONE write enable input
81
input          wb_cyc_i;     // WISHBONE cycle input
82
input          wb_stb_i;     // WISHBONE strobe input
83
 
84
output          wb_ack_o;     // WISHBONE acknowledge output
85
 
86
// WISHBONE master
87
output  [31:0]  m_wb_adr_o;
88
output  [3:0]   m_wb_sel_o;
89
output          m_wb_we_o;
90
 
91
input   [31:0]  m_wb_dat_i;
92
output  [31:0]  m_wb_dat_o;
93
output          m_wb_cyc_o;
94
output          m_wb_stb_o;
95
input           m_wb_ack_i;
96
output  [2:0]   m_wb_cti_o;
97
output  [1:0]    m_wb_bte_o;
98
//SD port
99
 
100
input  wire [3:0] sd_dat_dat_i;   //Data in from SDcard
101
output wire [3:0] sd_dat_out_o; //Data out to SDcard
102
output wire sd_dat_oe_o; //SD Card tristate Data Output enable (Connects on the SoC TopLevel)
103
 
104
input  wire sd_cmd_dat_i; //Command in from SDcard
105
output wire sd_cmd_out_o; //Command out to SDcard
106
output wire sd_cmd_oe_o; //SD Card tristate CMD Output enable (Connects on the SoC TopLevel)
107
output sd_clk_o_pad;
108
  `ifdef SDC_CLK_SEP
109
   input wire sd_clk_i_pad;
110
  `endif
111
//IRQ
112
`ifdef SDC_IRQ_ENABLE
113
   output int_a, int_b, int_c ;
114
  `endif
115
 
116
wire int_busy;
117
 
118
 
119
 
120
//Wires from SD_CMD_MASTER Module 
121
wire [15:0] status_reg_w;
122
wire [31:0] cmd_resp_1_w;
123
wire [15:0]normal_int_status_reg_w;
124
wire [4:0]error_int_status_reg_w;
125
 
126
 
127
wire[31:0]  argument_reg;
128
wire[15:0]  cmd_setting_reg;
129
reg[15:0]   status_reg;
130
reg[31:0]   cmd_resp_1;
131
wire[7:0]   software_reset_reg;
132
wire[15:0]  time_out_reg;
133
reg[15:0]   normal_int_status_reg;
134
reg[15:0]   error_int_status_reg;
135
wire[15:0]  normal_int_signal_enable_reg;
136
wire[15:0]  error_int_signal_enable_reg;
137
wire[7:0]   clock_divider;
138
reg[15:0]   Bd_Status_reg;
139
reg[7:0]    Bd_isr_reg;
140
wire[7:0]   Bd_isr_enable_reg;
141
 
142
 
143
//Rx Buffer  Descriptor internal signals
144
 
145
 
146
 
147
wire [`BD_WIDTH-1 :0] free_bd_rx_bd; //NO free Rx_bd
148
wire new_rx_bd;  // New Bd writen
149
wire [`RAM_MEM_WIDTH-1:0] dat_out_s_rx_bd; //Data out from Rx_bd to Slave
150
 
151
//Tx Buffer Descriptor internal signals
152
wire [`RAM_MEM_WIDTH-1:0] dat_in_m_rx_bd; //Data in to Rx_bd from Master
153
wire [`RAM_MEM_WIDTH-1:0] dat_in_m_tx_bd;
154
wire [`BD_WIDTH-1 :0] free_bd_tx_bd;
155
wire new_tx_bd;
156
wire [`RAM_MEM_WIDTH-1:0] dat_out_s_tx_bd;
157
wire [7:0] bd_int_st_w; //Wire to BD status register
158
 
159
//Wires for connecting Bd registers with the SD_Data_master module
160
wire re_s_tx_bd_w;
161
wire a_cmp_tx_bd_w;
162
wire re_s_rx_bd_w;
163
wire a_cmp_rx_bd_w;
164
wire write_req_s; //SD_Data_master want acces to the CMD line.
165
wire cmd_busy; //CMD line busy no access granted
166
 
167
wire [31:0] cmd_arg_s; //SD_Data_master CMD Argument
168
wire [15:0] cmd_set_s; //SD_Data_master Settings Argument
169
wire [31:0] sys_adr; //System addres the DMA whil Read/Write to/from
170
wire [1:0]start_dat_t; //Start data transfer
171
 
172
//Signals to Syncronize busy signaling betwen Wishbone access and SD_Data_master access to the CMD line (Also manage the status reg uppdate)
173
 
174
assign cmd_busy = int_busy | status_reg[0];
175
wire status_reg_busy;
176
 
177
 
178
//Wires from SD_DATA_SERIAL_HOST_1 to the FIFO
179
wire [`SD_BUS_W -1 : 0 ]data_in_rx_fifo;
180
wire [31: 0 ] data_fout_tx_fifo;
181
wire [31:0] m_wb_dat_o_rx;
182
wire [3:0] m_wb_sel_o_tx;
183
wire [31:0] m_wb_adr_o_tx;
184
wire [31:0] m_wb_adr_o_rx;
185
 
186
//SD clock 
187
wire sd_clk_i; //Sd_clk provided to the system
188
wire sd_clk_o; //Sd_clk used in the system 
189
 
190
 
191
//sd_clk_o to be used i set here
192
`ifdef SDC_CLK_BUS_CLK
193
  assign sd_clk_i = wb_clk_i;
194
`endif
195
`ifdef SDC_CLK_SEP
196
   assign sd_clk_i = sd_clk_i_pad;
197
  `endif
198
 
199
`ifdef SDC_CLK_STATIC
200
   assign sd_clk_o = sd_clk_i;
201
`endif
202
 
203
`ifdef SDC_CLK_DYNAMIC
204
  sd_clock_divider clock_divider_1 (
205
 .CLK (sd_clk_i),
206
 .DIVIDER (clock_divider),
207
 .RST  (wb_rst_i | software_reset_reg[0]),
208
 .SD_CLK  (sd_clk_o)
209
);
210
`endif
211
assign sd_clk_o_pad  = sd_clk_o ;
212
 
213
wire [15:0] settings;
214
wire [7:0] serial_status;
215
wire [39:0] cmd_out_master;
216
wire [39:0] cmd_in_host;
217
 
218
sd_cmd_master cmd_master_1
219
(
220
    .CLK_PAD_IO     (wb_clk_i),
221
    .RST_PAD_I      (wb_rst_i | software_reset_reg[0]),
222
    .New_CMD        (new_cmd),
223
    .data_write     (d_write),
224
    .data_read      (d_read),
225
    .ARG_REG        (argument_reg),
226
    .CMD_SET_REG    (cmd_setting_reg[13:0]),
227
    .STATUS_REG     (status_reg_w),
228
    .TIMEOUT_REG    (time_out_reg),
229
    .RESP_1_REG     (cmd_resp_1_w),
230
    .ERR_INT_REG    (error_int_status_reg_w),
231
    .NORMAL_INT_REG (normal_int_status_reg_w),
232
    .ERR_INT_RST    (error_isr_reset),
233
    .NORMAL_INT_RST (normal_isr_reset),
234
    .settings       (settings),
235
    .go_idle_o      (go_idle),
236
    .cmd_out        (cmd_out_master ),
237
    .req_out        (req_out_master ),
238
    .ack_out        (ack_out_master ),
239
    .req_in         (req_in_host),
240
    .ack_in         (ack_in_host),
241
    .cmd_in         (cmd_in_host),
242
    .serial_status (serial_status),
243
    .card_detect (card_detect)
244
 
245
);
246
 
247
 
248
sd_cmd_serial_host cmd_serial_host_1(
249
    .SD_CLK_IN  (sd_clk_o),
250
    .RST_IN     (wb_rst_i | software_reset_reg[0] | go_idle),
251
    .SETTING_IN (settings),
252
    .CMD_IN     (cmd_out_master),
253
    .REQ_IN     (req_out_master),
254
    .ACK_IN     (ack_out_master),
255
    .REQ_OUT    (req_in_host),
256
    .ACK_OUT    (ack_in_host),
257
    .CMD_OUT    (cmd_in_host),
258
    .STATUS     (serial_status),
259
    .cmd_dat_i  (sd_cmd_dat_i),
260
    .cmd_out_o  (sd_cmd_out_o),
261
    .cmd_oe_o   ( sd_cmd_oe_o),
262
    .st_dat_t   (start_dat_t)
263
);
264
 
265
 
266
sd_data_master data_master_1
267
(
268
    .clk            (wb_clk_i),
269
    .rst            (wb_rst_i | software_reset_reg[0]),
270
    .dat_in_tx      (dat_out_s_tx_bd),
271
    .free_tx_bd     (free_bd_tx_bd),
272
    .ack_i_s_tx     (ack_o_s_tx ),
273
    .re_s_tx        (re_s_tx_bd_w),
274
    .a_cmp_tx       (a_cmp_tx_bd_w),
275
    .dat_in_rx      (dat_out_s_rx_bd),
276
    .free_rx_bd     (free_bd_rx_bd),
277
    .ack_i_s_rx     (ack_o_s_rx),
278
    .re_s_rx        (re_s_rx_bd_w),
279
    .a_cmp_rx       (a_cmp_rx_bd_w),
280
    .cmd_busy       (cmd_busy),
281
    .we_req         (write_req_s),
282
    .we_ack         (we_ack),
283
    .d_write        (d_write),
284
    .d_read         (d_read),
285
    .cmd_arg        (cmd_arg_s),
286
    .cmd_set        (cmd_set_s),
287
    .cmd_tsf_err    (normal_int_status_reg[15]) ,
288
    .card_status    (cmd_resp_1[12:8])   ,
289
    .start_tx_fifo  (start_tx_fifo),
290
    .start_rx_fifo  (start_rx_fifo),
291
    .sys_adr        (sys_adr),
292
    .tx_empt        (tx_e ),
293
    .tx_full        (tx_f ),
294
    .rx_full        (full_rx ),
295
    .busy_n         (busy_n),
296
    .transm_complete(trans_complete ),
297
    .crc_ok         (crc_ok),
298
    .ack_transfer   (ack_transfer),
299
    .Dat_Int_Status (bd_int_st_w),
300
    .Dat_Int_Status_rst (Bd_isr_reset),
301
    .CIDAT           (cidat_w),
302
        .transfer_type  (cmd_setting_reg[15:14])
303
);
304
 
305
wire [31:0] data_out_tx_fifo;
306
sd_data_serial_host sd_data_serial_host_1(
307
    .sd_clk         (sd_clk_o),
308
    .rst            (wb_rst_i | software_reset_reg[0]),
309
    .data_in        (data_out_tx_fifo),
310
    .rd             (rd),
311
    .data_out       (data_in_rx_fifo),
312
    .we             (we_rx),
313
    .DAT_oe_o       (sd_dat_oe_o),
314
    .DAT_dat_o      (sd_dat_out_o),
315
    .DAT_dat_i      (sd_dat_dat_i),
316
    .start_dat      (start_dat_t),
317
    .ack_transfer   (ack_transfer),
318
    .busy_n         (busy_n),
319
    .transm_complete(trans_complete ),
320
    .crc_ok         (crc_ok)
321
);
322
 
323
 
324
sd_bd rx_bd
325
(
326
    .clk        (wb_clk_i),
327
    .rst       (wb_rst_i | software_reset_reg[0]),
328
    .we_m      (we_m_rx_bd),
329
    .dat_in_m  (dat_in_m_rx_bd),
330
    .free_bd   (free_bd_rx_bd),
331
    .re_s      (re_s_rx_bd_w),
332
    .ack_o_s   (ack_o_s_rx),
333
    .a_cmp     (a_cmp_rx_bd_w),
334
    .dat_out_s (dat_out_s_rx_bd)
335
 
336
);
337
 
338
sd_bd tx_bd
339
(
340
    .clk       (wb_clk_i),
341
    .rst       (wb_rst_i | software_reset_reg[0]),
342
    .we_m      (we_m_tx_bd),
343
    .dat_in_m  (dat_in_m_tx_bd),
344
    .free_bd   (free_bd_tx_bd),
345
    .ack_o_s   (ack_o_s_tx),
346
    .re_s      (re_s_tx_bd_w),
347
    .a_cmp     (a_cmp_tx_bd_w),
348
    .dat_out_s (dat_out_s_tx_bd)
349
);
350
 
351
 
352
sd_fifo_tx_filler fifo_filer_tx (
353
    .clk        (wb_clk_i),
354
    .rst        (wb_rst_i | software_reset_reg[0]),
355
    .m_wb_adr_o (m_wb_adr_o_tx),
356
    .m_wb_we_o  (m_wb_we_o_tx),
357
    .m_wb_dat_i (m_wb_dat_i),
358
    .m_wb_cyc_o (m_wb_cyc_o_tx),
359
    .m_wb_stb_o (m_wb_stb_o_tx),
360
    .m_wb_ack_i (m_wb_ack_i),
361
    .m_wb_cti_o (m_wb_cti_o_tx),
362
        .m_wb_bte_o (m_wb_bte_o_tx),
363
    .en         (start_tx_fifo),
364
    .adr        (sys_adr),
365
    .sd_clk     (sd_clk_o),
366
    .dat_o      (data_out_tx_fifo   ),
367
    .rd         (rd),
368
    .empty      (tx_e),
369
    .fe         (tx_f)
370
);
371
 
372
sd_fifo_rx_filler fifo_filer_rx (
373
    .clk        (wb_clk_i),
374
    .rst        (wb_rst_i | software_reset_reg[0]),
375
    .m_wb_adr_o (m_wb_adr_o_rx),
376
    .m_wb_we_o  (m_wb_we_o_rx),
377
    .m_wb_dat_o (m_wb_dat_o),
378
    .m_wb_cyc_o (m_wb_cyc_o_rx),
379
    .m_wb_stb_o (m_wb_stb_o_rx),
380
    .m_wb_ack_i (m_wb_ack_i),
381
    .m_wb_cti_o (m_wb_cti_o_rx),
382
        .m_wb_bte_o (m_wb_bte_o_rx),
383
    .en         (start_rx_fifo),
384
    .adr        (sys_adr),
385
    .sd_clk     (sd_clk_o),
386
    .dat_i      (data_in_rx_fifo   ),
387
    .wr         (we_rx),
388
    .full       (full_rx)
389
);
390
 
391
sd_controller_wb sd_controller_wb0
392
        (
393
         .wb_clk_i          (wb_clk_i),
394
         .wb_rst_i          (wb_rst_i),
395
         .wb_dat_i          (wb_dat_i),
396
         .wb_dat_o          (wb_dat_o),
397
         .wb_adr_i          (wb_adr_i[7:0]),
398
         .wb_sel_i          (wb_sel_i),
399
         .wb_we_i           (wb_we_i),
400
         .wb_stb_i          (wb_stb_i),
401
         .wb_cyc_i          (wb_cyc_i),
402
         .wb_ack_o          (wb_ack_o),
403
         .we_m_tx_bd        (we_m_tx_bd),
404
     .new_cmd           (new_cmd),
405
     .we_m_rx_bd        (we_m_rx_bd),
406
    .we_ack             (we_ack),
407
    .int_ack            (int_ack),
408
    .cmd_int_busy       (cmd_int_busy),
409
    .Bd_isr_reset       (Bd_isr_reset),
410
    .normal_isr_reset   (normal_isr_reset),
411
    .error_isr_reset    (error_isr_reset),
412
    .int_busy           (int_busy),
413
    .dat_in_m_tx_bd     (dat_in_m_tx_bd),
414
    .dat_in_m_rx_bd     (dat_in_m_rx_bd),
415
    .write_req_s        (write_req_s),
416
    .cmd_set_s          (cmd_set_s),
417
    .cmd_arg_s          (cmd_arg_s),
418
    .argument_reg       (argument_reg),
419
    .cmd_setting_reg    (cmd_setting_reg),
420
    .status_reg         (status_reg),
421
    .cmd_resp_1         (cmd_resp_1),
422
    .software_reset_reg (software_reset_reg ),
423
    .time_out_reg       (time_out_reg ),
424
    .normal_int_status_reg  (normal_int_status_reg),
425
    .error_int_status_reg   (error_int_status_reg ),
426
    .normal_int_signal_enable_reg   (normal_int_signal_enable_reg),
427
    .error_int_signal_enable_reg    (error_int_signal_enable_reg),
428
    .clock_divider                  (clock_divider ),
429
    .Bd_Status_reg                  (Bd_Status_reg),
430
    .Bd_isr_reg                     (Bd_isr_reg ),
431
    .Bd_isr_enable_reg              (Bd_isr_enable_reg)
432
         );
433
 
434
 
435
 
436
 
437
 
438
//MUX For WB master acces granted to RX or TX FIFO filler
439
assign m_wb_cyc_o = start_tx_fifo ? m_wb_cyc_o_tx :start_rx_fifo ?m_wb_cyc_o_rx: 0;
440
assign m_wb_stb_o = start_tx_fifo ? m_wb_stb_o_tx :start_rx_fifo ?m_wb_stb_o_rx: 0;
441
 
442
assign m_wb_cti_o = start_tx_fifo ? m_wb_cti_o_tx :start_rx_fifo ?m_wb_cti_o_rx: 0;
443
assign m_wb_bte = start_tx_fifo ? m_wb_bte_o_tx :start_rx_fifo ?m_wb_bte_o_rx: 0;
444
//assign m_wb_dat_o = m_wb_dat_o_rx;
445
assign m_wb_we_o = start_tx_fifo ? m_wb_we_o_tx :start_rx_fifo ?m_wb_we_o_rx: 0;
446
assign m_wb_adr_o = start_tx_fifo ? m_wb_adr_o_tx :start_rx_fifo ?m_wb_adr_o_rx: 0;
447
 
448
`ifdef SDC_IRQ_ENABLE
449
assign int_a =  |(normal_int_status_reg &  normal_int_signal_enable_reg) ;
450
assign int_b =  |(error_int_status_reg & error_int_signal_enable_reg);
451
assign int_c =  |(Bd_isr_reg & Bd_isr_enable_reg);
452
`endif
453
 
454
assign m_wb_sel_o = 4'b1111;
455
 
456
//Set Bd_Status_reg
457
always @ (posedge wb_clk_i ) begin
458
  Bd_Status_reg[15:8]=free_bd_rx_bd;
459
  Bd_Status_reg[7:0]=free_bd_tx_bd;
460
  cmd_resp_1<= cmd_resp_1_w;
461
  normal_int_status_reg<= normal_int_status_reg_w  ;
462
  error_int_status_reg<= error_int_status_reg_w  ;
463
  status_reg[0]<= status_reg_busy;
464
  status_reg[15:1]<=  status_reg_w[15:1];
465
  status_reg[1] <= cidat_w;
466
  Bd_isr_reg<=bd_int_st_w;
467
 
468
end
469
 
470
 
471
 
472
//cmd_int_busy is set when an internal access to the CMD buss is granted then immidetly uppdate the status busy bit to prevent buss access to cmd
473
assign status_reg_busy = cmd_int_busy ? 1'b1: status_reg_w[0];
474
 
475
 
476
 
477
 
478
 
479
endmodule

powered by: WebSVN 2.1.0

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