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_fifo/] [verilog/] [sd_controller_fifo_wb.v] - Blame information for rev 10

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

Line No. Rev Author Line
1 6 tac2
`include "SD_defines.v"
2
 
3
module sd_controller_fifo_wba
4
(
5
 
6
 
7
  // WISHBONE common
8
  wb_clk_i, wb_rst_i, wb_dat_i, wb_dat_o,
9
 
10
  // WISHBONE slave
11
  wb_adr_i, wb_sel_i, wb_we_i, wb_cyc_i, wb_stb_i, wb_ack_o,
12
 
13
    // WISHBONE master
14
  m_wb_adr_o, m_wb_sel_o, m_wb_we_o,
15
  m_wb_dat_o, m_wb_dat_i, m_wb_cyc_o,
16
  m_wb_stb_o, m_wb_ack_i,
17
  m_wb_cti_o, m_wb_bte_o,
18
  //SD BUS
19
  sd_cmd_dat_i,sd_cmd_out_o,  sd_cmd_oe_o,
20
  sd_dat_dat_i, sd_dat_out_o , sd_dat_oe_o, sd_clk_o_pad
21
  //PLL CLK_IN
22
  // sd_clk_i_pad
23
 
24
);
25
input           wb_clk_i;     // WISHBONE clock
26
input           wb_rst_i;     // WISHBONE reset
27
input   [7:0]  wb_dat_i;     // WISHBONE data input
28
output  [7:0]  wb_dat_o;     // WISHBONE data output
29
     // WISHBONE error output
30
 
31
// WISHBONE slave
32
input   [2:0]  wb_adr_i;     // WISHBONE address input
33
input    [3:0]  wb_sel_i;     // WISHBONE byte select input
34
input           wb_we_i;      // WISHBONE write enable input
35
input           wb_cyc_i;     // WISHBONE cycle input
36
input           wb_stb_i;     // WISHBONE strobe input
37
 
38
output reg          wb_ack_o;     // WISHBONE acknowledge output
39
 
40
// WISHBONE master
41
output  [31:0]  m_wb_adr_o;
42
output   [3:0]  m_wb_sel_o;
43
output          m_wb_we_o;
44
 
45
input   [31:0]  m_wb_dat_i;
46
output  [31:0]  m_wb_dat_o;
47
output          m_wb_cyc_o;
48
output          m_wb_stb_o;
49
input           m_wb_ack_i;
50
output          [2:0] m_wb_cti_o;
51
output  [1:0]     m_wb_bte_o;
52
 
53
input wire [3:0] sd_dat_dat_i;
54
output wire [3:0] sd_dat_out_o;
55
output wire sd_dat_oe_o;
56
 
57
input wire sd_cmd_dat_i;
58
output wire sd_cmd_out_o;
59
output wire sd_cmd_oe_o;
60
 
61
output sd_clk_o_pad;
62
wire sd_clk_i;
63
//input sd_clk_i_pad;
64
 
65
`define tx_cmd_fifo 4'h0
66
`define rx_cmd_fifo 4'h1
67
`define tx_data_fifo 4'h2
68
`define rx_data_fifo 4'h3
69
`define status 4'h4
70
`define controll 4'h5
71
`define timer 4'h6
72
 
73
reg [7:0] controll_reg;
74
reg [7:0] status_reg;
75
reg [7:0] command_timeout_reg;
76
 
77
`ifdef SD_CLK_BUS_CLK
78
  assign sd_clk_i = wb_clk_i;
79
`endif
80
 
81
`ifdef SD_CLK_SEP
82
  //assign sd_clk_i = sd_clk_i_pad;
83
`endif
84
assign sd_clk_o=sd_clk_i;
85
 
86
reg [1:0] wb_fifo_adr_i_writer;
87
reg [1:0] wb_fifo_adr_i_reader;
88
wire [1:0] wb_fifo_adr_i;
89
reg add_token_read;
90
wire [7:0] wb_fifo_dat_i;
91
wire [7:0] wb_fifo_dat_o;
92
reg [7:0]  wb_dat_i_storage;
93
reg [7:0] wb_dat_o_i;
94
reg time_enable;
95
assign sd_clk_o_pad  = sd_clk_i ;
96
 
97
 
98
assign wb_fifo_adr_i = add_token_read ? wb_fifo_adr_i_reader : wb_fifo_adr_i_writer;
99
assign wb_fifo_dat_i =wb_dat_i_storage;
100
assign wb_dat_o = wb_adr_i[0] ? wb_fifo_dat_o :   wb_dat_o_i ;
101
 
102
 
103
 
104
wire [1:4]fifo_full ;
105
wire [1:4]fifo_empty;
106
reg wb_fifo_we_i;
107
reg wb_fifo_re_i;
108
wire [1:0] sd_adr_o;
109
wire [7:0] sd_dat_o;
110
wire [7:0] sd_dat_i;
111
sd_fifo sd_fifo_0
112
(
113
   .wb_adr_i  (wb_fifo_adr_i ),
114
   .wb_dat_i  (wb_fifo_dat_i),
115
   .wb_dat_o  (wb_fifo_dat_o ),
116
   .wb_we_i   (wb_fifo_we_i),
117
   .wb_re_i   (wb_fifo_re_i),
118
   .wb_clk  (wb_clk_i),
119
   .sd_adr_i (sd_adr_o ),
120
   .sd_dat_i (sd_dat_o),
121
   .sd_dat_o (sd_dat_i ),
122
   .sd_we_i (sd_we_o),
123
   .sd_re_i (sd_re_o),
124
   .sd_clk (sd_clk_o),
125
   .fifo_full ( fifo_full ),
126
   .fifo_empty (fifo_empty    ),
127
   .rst (wb_rst_i) // | controll_reg[0])
128
  ) ;
129
 
130
wire [1:0] sd_adr_o_cmd;
131
wire [7:0] sd_dat_i_cmd;
132
wire [7:0] sd_dat_o_cmd;
133
 
134
wire [1:0] sd_adr_o_dat;
135
wire [7:0] sd_dat_i_dat;
136
wire [7:0] sd_dat_o_dat;
137
wire [1:0] st_dat_t;
138
sd_cmd_phy sdc_cmd_phy_0
139
(
140
  .sd_clk (sd_clk_o),
141
  .rst (wb_rst_i ),//| controll_reg[0]),
142
  .cmd_dat_i ( sd_cmd_dat_i  ),
143
  .cmd_dat_o (sd_cmd_out_o   ),
144
  .cmd_oe_o (sd_cmd_oe_o   ),
145
  .sd_adr_o (sd_adr_o_cmd),
146
  .sd_dat_i (sd_dat_i_cmd),
147
  .sd_dat_o (sd_dat_o_cmd),
148
  .sd_we_o (sd_we_o_cmd),
149
  .sd_re_o (sd_re_o_cmd),
150
  .fifo_full ( fifo_full[1:2] ),
151
  .fifo_empty ( fifo_empty [1:2]),
152
  .start_dat_t (st_dat_t),
153
  .fifo_acces_token (fifo_acces_token)
154
  );
155
 
156
 
157
  sd_data_phy sd_data_phy_0 (
158
  .sd_clk (sd_clk_o),
159
  .rst (wb_rst_i | controll_reg[0]),
160
  .DAT_oe_o ( sd_dat_oe_o  ),
161
  .DAT_dat_o (sd_dat_out_o),
162
  .DAT_dat_i  (sd_dat_dat_i ),
163
  .sd_adr_o (sd_adr_o_dat   ),
164
  .sd_dat_i (sd_dat_i_dat  ),
165
  .sd_dat_o (sd_dat_o_dat  ),
166
  .sd_we_o  (sd_we_o_dat),
167
  .sd_re_o (sd_re_o_dat),
168
  .fifo_full ( fifo_full[3:4] ),
169
  .fifo_empty ( fifo_empty [3:4]),
170
  .start_dat (st_dat_t),
171
  .fifo_acces (~fifo_acces_token)
172
  );
173
 
174
 
175
  assign sd_adr_o =  fifo_acces_token ? sd_adr_o_cmd : sd_adr_o_dat;
176
  assign sd_dat_o =  fifo_acces_token ? sd_dat_o_cmd : sd_dat_o_dat;
177
  assign sd_we_o  = fifo_acces_token ? sd_we_o_cmd : sd_we_o_dat;
178
  assign sd_re_o  =  fifo_acces_token ? sd_re_o_cmd : sd_re_o_dat;
179
 
180
 assign sd_dat_i_dat = sd_dat_i;
181
 assign sd_dat_i_cmd = sd_dat_i;
182
 
183
 
184
  always @(posedge wb_clk_i or posedge wb_rst_i)
185
        begin
186
        if (wb_rst_i)
187
            status_reg<=0;
188
          else begin
189
      status_reg[0] <= fifo_full[1];
190
      status_reg[1] <= fifo_empty[2];
191
      status_reg[2] <=  fifo_full[3];
192
      status_reg[3] <=  fifo_empty[4];
193
    end
194
  end
195
 
196
  reg delayed_ack;
197
  always @(posedge wb_clk_i or posedge wb_rst_i)
198
        begin
199
 
200
          if (wb_rst_i)
201
            wb_ack_o <=0;
202
           else
203
             wb_ack_o <=wb_stb_i & wb_cyc_i &  ~wb_ack_o & delayed_ack;
204
 
205
        end
206
 
207
  always @(posedge wb_clk_i or posedge wb_rst_i)
208
        begin
209
 
210
 
211
    if ( wb_rst_i )begin
212
            command_timeout_reg<=`TIME_OUT_TIME;
213
            wb_dat_i_storage<=0;
214
            controll_reg<=0;
215
 
216
            wb_fifo_we_i<=0;
217
            wb_fifo_adr_i_writer<=0;
218
            time_enable<=0;
219
          end
220
          else if (wb_stb_i  & wb_cyc_i & (~wb_ack_o))begin //CS
221
 
222
 
223
            if (wb_we_i) begin
224
              case (wb_adr_i)
225
              `tx_cmd_fifo : begin
226
                wb_fifo_adr_i_writer<=0;
227
                wb_fifo_we_i<=1&!delayed_ack;
228
                wb_dat_i_storage<=wb_dat_i;
229
                command_timeout_reg<=`TIME_OUT_TIME;
230
                time_enable<=1;
231
              end
232
        `tx_data_fifo : begin
233
                wb_fifo_adr_i_writer<=2;
234
                wb_fifo_we_i<=1&!delayed_ack;
235
                wb_dat_i_storage<=wb_dat_i;
236
                command_timeout_reg<=`TIME_OUT_TIME;
237
                time_enable<=0;
238
              end
239
        `controll : controll_reg <= wb_dat_i;
240
              endcase
241
            end
242
           end
243
           else begin
244
            //  wb_fifo_adr_i_writer<=0;
245
              wb_fifo_we_i<=0;
246
 
247
             if (!status_reg[1])
248
               time_enable<=0;
249
 
250
             if ((command_timeout_reg!=0) && (time_enable))
251
                 command_timeout_reg<=command_timeout_reg-1;
252
           end
253
end
254
 
255
 
256
always @(posedge wb_clk_i or posedge wb_rst_i )begin
257
 
258
 
259
   if ( wb_rst_i) begin
260
     add_token_read<=0;
261
     delayed_ack<=0;
262
     wb_fifo_re_i<=0;
263
      wb_fifo_adr_i_reader<=0;
264
      wb_dat_o_i<=0;
265
  end
266
 else begin
267
    delayed_ack<=0;
268
    wb_fifo_re_i<=0;
269
   if (wb_stb_i  & wb_cyc_i & (~wb_ack_o)) begin //C
270
   delayed_ack<=delayed_ack+1;
271
    add_token_read<=0;
272
    if (!wb_we_i) begin
273
 
274
      case (wb_adr_i)
275
      `rx_cmd_fifo : begin
276
 
277
         add_token_read<=1;
278
         wb_fifo_adr_i_reader<=1;
279
              wb_fifo_re_i<=1&delayed_ack;
280
 
281
      end
282
      `rx_data_fifo :begin
283
         add_token_read<=1;
284
         wb_fifo_adr_i_reader<=3;
285
               wb_fifo_re_i<=1 & delayed_ack;
286
 
287
     end
288
      `status : wb_dat_o_i <= status_reg;
289
      `timer : wb_dat_o_i <= command_timeout_reg;
290
 
291
 
292
     endcase
293
    end
294
  end
295
end
296
end
297
 
298
 
299
//just to get rid of warnings....
300
 assign m_wb_adr_o =0;
301
 assign m_wb_sel_o =0;
302
 assign m_wb_we_o=0;
303
 assign m_wb_dat_o =0;
304
 
305
 assign m_wb_cyc_o=0;
306
 assign m_wb_stb_o=0;
307
 assign m_wb_cti_o=0;
308
 assign m_wb_bte_o=0;
309
 
310
 
311
 
312
endmodule
313
 
314
 
315
 
316
 
317
 

powered by: WebSVN 2.1.0

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