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 95

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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