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 26

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

powered by: WebSVN 2.1.0

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