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/] [bench/] [sdc_dma/] [verilog/] [sdModel.v] - Blame information for rev 136

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 127 tac2
 //`include "timescale.v"
2 135 tac2
`include "sd_defines.v"
3 79 tac2
`define tTLH 10 //Clock rise time
4
`define tHL 10 //Clock fall time
5
`define tISU 6 //Input setup time
6
`define tIH 0 //Input hold time
7
`define tODL 14 //Output delay
8 98 tac2
`define DLY_TO_OUTP 47
9 79 tac2
 
10
`define BLOCKSIZE 512
11 135 tac2
`define MEMSIZE 24643590 // 2mb block
12 79 tac2
`define BLOCK_BUFFER_SIZE 1
13 135 tac2
`define TIME_BUSY 63
14 79 tac2
 
15 96 tac2
`define PRG 7
16
`define RCV 6
17
`define DATAS 5
18
`define TRAN 4
19 79 tac2
module sdModel(
20
  input sdClk,
21
  tri cmd,
22
  tri [3:0] dat
23
 
24
);
25
 
26
 
27
reg oeCmd;
28
reg oeDat;
29
reg cmdOut;
30 96 tac2
reg [3:0] datOut;
31
reg [10:0] transf_cnt;
32 79 tac2
 
33 96 tac2
 
34
 
35 79 tac2
reg [5:0] lastCMD;
36
reg cardIdentificationState;
37 96 tac2
reg CardTransferActive;
38
reg [2:0] BusWidth;
39 79 tac2
 
40
assign cmd = oeCmd ? cmdOut : 1'bz;
41
assign dat = oeDat ? datOut : 4'bz;
42
 
43 96 tac2
reg InbuffStatus;
44
reg [31:0] BlockAddr;
45
reg [7:0] Inbuff [0:511];
46
reg [7:0] FLASHmem [0:`MEMSIZE];
47 79 tac2
 
48
 
49
reg [46:0]inCmd;
50
reg [5:0]cmdRead;
51
reg [7:0] cmdWrite;
52
reg crcIn;
53
reg crcEn;
54
reg crcRst;
55
reg [31:0] CardStatus;
56
reg [15:0] RCA;
57
reg [31:0] OCR;
58
reg [120:0] CID;
59 135 tac2
reg [120:0] CSD;
60 79 tac2
reg Busy; //0 when busy
61
wire [6:0] crcOut;
62 102 tac2
reg [4:0] crc_c;
63 96 tac2
 
64
reg [3:0] CurrentState;
65
reg [3:0] DataCurrentState;
66 135 tac2
`define RCASTART 16'h2000
67 79 tac2
`define OCRSTART 32'hff8000
68
`define STATUSSTART 32'h0
69 135 tac2
`define CIDSTART 128'hffffffddddddddaaaaaaaa99999999  //Just some random data not really usefull anyway 
70
`define CSDSTART 128'hadaeeeddddddddaaaaaaaa12345678
71 79 tac2
 
72
`define outDelay 4
73
reg [2:0] outDelayCnt;
74 96 tac2
reg [9:0] flash_write_cnt;
75
reg [8:0] flash_blockwrite_cnt;
76
 
77 79 tac2
parameter SIZE = 10;
78
parameter CONTENT_SIZE = 40;
79
parameter
80
    IDLE   =  10'b0000_0000_01,
81
    READ_CMD   =  10'b0000_0000_10,
82
    ANALYZE_CMD     =  10'b0000_0001_00,
83
    SEND_CMD        =  10'b0000_0010_00;
84
reg [SIZE-1:0] state;
85
reg [SIZE-1:0] next_state;
86
 
87 96 tac2
parameter
88
    DATA_IDLE   =10'b0000_0000_01,
89
    READ_WAITS  =10'b0000_0000_10,
90
    READ_DATA  = 10'b0000_0001_00,
91
    WRITE_FLASH =10'b0000_0010_00,
92
    WRITE_DATA  =10'b0000_0100_00;
93
parameter okcrctoken = 4'b0101;
94
parameter invalidcrctoken = 4'b1111;
95
reg [SIZE-1:0] dataState;
96
reg [SIZE-1:0] next_datastate;
97
 
98 79 tac2
reg ValidCmd;
99
reg inValidCmd;
100
 
101
reg [7:0] response_S;
102
reg [135:0] response_CMD;
103
integer responseType;
104 96 tac2
 
105
     reg [9:0] block_cnt;
106
     reg wptr;
107
     reg crc_ok;
108
     reg [3:0] last_din;
109
 
110
 
111
 
112
reg crcDat_rst;
113 135 tac2
reg mult_read;
114
reg mult_write;
115 96 tac2
reg crcDat_en;
116
reg [3:0] crcDat_in;
117
wire [15:0] crcDat_out [3:0];
118
 
119
genvar i;
120
generate
121
for(i=0; i<4; i=i+1) begin:CRC_16_gen
122 135 tac2
  sd_crc_16 CRC_16_i (crcDat_in[i],crcDat_en, sdClk, crcDat_rst, crcDat_out[i]);
123 96 tac2
end
124
endgenerate
125 135 tac2
sd_crc_7 crc_7(
126 79 tac2
crcIn,
127
crcEn,
128
sdClk,
129
crcRst,
130
crcOut);
131 96 tac2
 
132 135 tac2
reg stop;
133 96 tac2
 
134 79 tac2
reg appendCrc;
135
reg [5:0] startUppCnt;
136
 
137 96 tac2
reg q_start_bit;
138 79 tac2
//Card initinCMd
139 135 tac2
initial $readmemh("../bin/ramdisk2.hex",FLASHmem);
140 79 tac2
 
141
integer k;
142
initial begin
143
        $display("Contents of Mem after reading data file:");
144 135 tac2
        for (k=0; k<512; k=k+1) $display("%d:%h",k,FLASHmem[k]);
145 79 tac2
end
146
reg qCmd;
147
reg [2:0] crcCnt;
148 125 tac2
 
149
reg add_wrong_cmd_crc;
150
reg add_wrong_cmd_indx;
151
reg add_wrong_data_crc;
152
 
153 79 tac2
initial begin
154 125 tac2
  add_wrong_data_crc<=0;
155
  add_wrong_cmd_indx<=0;
156
  add_wrong_cmd_crc<=0;
157 135 tac2
   stop<=1;
158 79 tac2
  cardIdentificationState<=1;
159
  state<=IDLE;
160 96 tac2
  dataState<=DATA_IDLE;
161 79 tac2
  Busy<=0;
162
  oeCmd<=0;
163
  crcCnt<=0;
164 96 tac2
  CardTransferActive<=0;
165 79 tac2
  qCmd<=1;
166
  oeDat<=0;
167
  cmdOut<=0;
168 98 tac2
  cmdWrite<=0;
169 96 tac2
  InbuffStatus<=0;
170 79 tac2
  datOut<=0;
171
  inCmd<=0;
172 96 tac2
  BusWidth<=1;
173 79 tac2
  responseType=0;
174 135 tac2
  mult_read=0;
175
  mult_write=0;
176 79 tac2
  crcIn<=0;
177
  response_S<=0;
178
  crcEn<=0;
179
  crcRst<=0;
180
  cmdRead<=0;
181
  ValidCmd<=0;
182
  inValidCmd=0;
183
  appendCrc<=0;
184
  RCA<= `RCASTART;
185
  OCR<= `OCRSTART;
186
  CardStatus <= `STATUSSTART;
187
  CID<=`CIDSTART;
188 135 tac2
  CSD<=`CSDSTART;
189 79 tac2
  response_CMD<=0;
190
  outDelayCnt<=0;
191 96 tac2
  crcDat_rst<=1;
192
  crcDat_en<=0;
193
  crcDat_in<=0;
194
  transf_cnt<=0;
195
  BlockAddr<=0;
196
  block_cnt <=0;
197 98 tac2
  wptr<=0;
198
  transf_cnt<=0;
199
  crcDat_rst<=1;
200
  crcDat_en<=0;
201
  crcDat_in<=0;
202
  flash_write_cnt<=0;
203 135 tac2
  startUppCnt<=0;
204 98 tac2
  flash_blockwrite_cnt<=0;
205 79 tac2
end
206
 
207
//CARD logic
208
 
209
always @ (state or cmd or cmdRead or ValidCmd or inValidCmd or cmdWrite or outDelayCnt)
210
begin : FSM_COMBO
211
 next_state  = 0;
212
case(state)
213
IDLE: begin
214
   if (!cmd)
215
     next_state = READ_CMD;
216
  else
217
     next_state = IDLE;
218
end
219
READ_CMD: begin
220
  if (cmdRead>= 47)
221
     next_state = ANALYZE_CMD;
222
  else
223
     next_state =  READ_CMD;
224
 end
225
 ANALYZE_CMD: begin
226
  if ((ValidCmd  )   && (outDelayCnt >= `outDelay ))
227
     next_state = SEND_CMD;
228
  else if (inValidCmd)
229
     next_state =  IDLE;
230
 else
231
    next_state =  ANALYZE_CMD;
232
 end
233
 SEND_CMD: begin
234
    if (cmdWrite>= response_S)
235
     next_state = IDLE;
236
  else
237
     next_state =  SEND_CMD;
238
 
239
 end
240
 
241
 
242
 endcase
243
end
244
 
245 98 tac2
always @ (dataState or CardStatus or crc_c or flash_write_cnt or dat[0] )
246 96 tac2
begin : FSM_COMBODAT
247
 next_datastate  = 0;
248
case(dataState)
249
 DATA_IDLE: begin
250 135 tac2
   if ((CardStatus[12:9]==`RCV) ||  (mult_write == 1'b1) )
251 96 tac2
     next_datastate = READ_WAITS;
252 135 tac2
   else if ((CardStatus[12:9]==`DATAS )||  (mult_read == 1'b1) )
253 96 tac2
     next_datastate = WRITE_DATA;
254
   else
255
     next_datastate = DATA_IDLE;
256
 end
257
 
258
 READ_WAITS: begin
259 98 tac2
   if ( dat[0] == 1'b0 )
260 96 tac2
     next_datastate =  READ_DATA;
261
   else
262
     next_datastate =  READ_WAITS;
263
 end
264
 
265
 READ_DATA : begin
266
  if (crc_c==0  )
267
     next_datastate =  WRITE_FLASH;
268 135 tac2
  else begin
269
        if (stop == 1'b0)
270 96 tac2
     next_datastate =  READ_DATA;
271 135 tac2
    else
272
     next_datastate =  DATA_IDLE;
273
    end
274
 
275
 
276 96 tac2
 end
277
  WRITE_FLASH : begin
278 135 tac2
  if (flash_write_cnt>265 )
279 96 tac2
     next_datastate =  DATA_IDLE;
280 135 tac2
  else
281 96 tac2
     next_datastate =  WRITE_FLASH;
282 135 tac2
 
283 98 tac2
end
284 135 tac2
 
285 98 tac2
  WRITE_DATA : begin
286
    if (transf_cnt >= `BIT_BLOCK)
287
       next_datastate= DATA_IDLE;
288
    else
289 135 tac2
                 begin
290
                        if (stop == 1'b0)
291
                         next_datastate=WRITE_DATA;
292
                        else
293
                         next_datastate =  DATA_IDLE;
294
        end
295 98 tac2
  end
296 96 tac2
 
297
 
298
 
299
 
300
 
301
 endcase
302
end
303
 
304 79 tac2
always @ (posedge sdClk  )
305 96 tac2
 begin
306
 
307
    q_start_bit <= dat[0];
308
 end
309
 
310
always @ (posedge sdClk  )
311 79 tac2
begin : FSM_SEQ
312 96 tac2
    state <= next_state;
313 79 tac2
end
314
 
315 96 tac2
always @ (posedge sdClk  )
316
begin : FSM_SEQDAT
317
    dataState <= next_datastate;
318
end
319 79 tac2
 
320 96 tac2
 
321
 
322 79 tac2
always @ (posedge sdClk) begin
323 96 tac2
if (CardTransferActive) begin
324
 if (InbuffStatus==0) //empty
325
   CardStatus[8]<=1;
326
  else
327
   CardStatus[8]<=0;
328
  end
329
else
330 135 tac2
  CardStatus[8]<=1;
331 96 tac2
 
332 79 tac2
 startUppCnt<=startUppCnt+1;
333 136 tac2
 OCR[31]<=~Busy;
334 79 tac2
 if (startUppCnt == `TIME_BUSY)
335
   Busy <=1;
336
end
337
 
338
 
339
always @ (posedge sdClk) begin
340
   qCmd<=cmd;
341
end
342
 
343
//read data and cmd on rising edge
344
always @ (posedge sdClk) begin
345
 case(state)
346
   IDLE: begin
347 135 tac2
      mult_write <= 0;
348
      mult_read <=0;
349 79 tac2
      crcIn<=0;
350
      crcEn<=0;
351
      crcRst<=1;
352
      oeCmd<=0;
353 135 tac2
      stop<=0;
354 79 tac2
      cmdRead<=0;
355
      appendCrc<=0;
356
      ValidCmd<=0;
357
      inValidCmd=0;
358
      cmdWrite<=0;
359
      crcCnt<=0;
360
      response_CMD<=0;
361
      response_S<=0;
362
      outDelayCnt<=0;
363
      responseType=0;
364
    end
365
   READ_CMD: begin //read cmd
366
      crcEn<=1;
367
      crcRst<=0;
368
      crcIn <= #`tIH qCmd;
369
      inCmd[47-cmdRead]  <= #`tIH qCmd;
370
      cmdRead <= #1 cmdRead+1;
371
      if (cmdRead >= 40)
372
         crcEn<=0;
373
 
374
      if (cmdRead == 46) begin
375
          oeCmd<=1;
376
     cmdOut<=1;
377
      end
378
   end
379
 
380
   ANALYZE_CMD: begin//check for valid cmd
381
   //Wrong CRC go idle
382
    if (inCmd[46] == 0) //start
383
      inValidCmd=1;
384
    else if (inCmd[7:1] != crcOut) begin
385
      inValidCmd=1;
386
      $fdisplay(sdModel_file_desc, "**sd_Model Commando CRC Error") ;
387
      $display(sdModel_file_desc, "**sd_Model Commando CRC Error") ;
388
    end
389
    else if  (inCmd[0] != 1)  begin//stop 
390
      inValidCmd=1;
391
      $fdisplay(sdModel_file_desc, "**sd_Model Commando No Stop Bit Error") ;
392
      $display(sdModel_file_desc, "**sd_Model Commando No Stop Bit Error") ;
393
    end
394
    else begin
395 96 tac2
      if(outDelayCnt ==0)
396
        CardStatus[3]<=0;
397 79 tac2
      case(inCmd[45:40])
398
 
399
        2 : response_S <= 136;
400
        3 : response_S <= 48;
401
        7 : response_S <= 48;
402
        8 : response_S <= 0;
403 135 tac2
        9 : response_S <= 136;
404 79 tac2
        14 : response_S <= 0;
405 96 tac2
        16 : response_S <= 48;
406 79 tac2
        17 : response_S <= 48;
407 135 tac2
                18 : response_S <= 48;
408 79 tac2
        24 : response_S <= 48;
409 135 tac2
                25 : response_S <= 48;
410 79 tac2
        33 : response_S <= 48;
411
        55 : response_S <= 48;
412
        41 : response_S <= 48;
413
    endcase
414
         case(inCmd[45:40])
415
 
416
            response_CMD <= 0;
417
            cardIdentificationState<=1;
418
            ResetCard;
419
        end
420
        2 : begin
421
         if (lastCMD != 41 && outDelayCnt==0) begin
422
               $fdisplay(sdModel_file_desc, "**Error in sequnce, ACMD 41 should precede 2 in Startup state") ;
423 125 tac2
               //$display(sdModel_file_desc, "**Error in sequnce, ACMD 41 should precede 2 in Startup state") ;
424 79 tac2
               CardStatus[3]<=1;
425
            end
426
        response_CMD[127:8] <= CID;
427
        appendCrc<=0;
428
        CardStatus[12:9] <=2;
429
        end
430
        3 :  begin
431 96 tac2
           if (lastCMD != 2 && outDelayCnt==0 ) begin
432 79 tac2
               $fdisplay(sdModel_file_desc, "**Error in sequnce, CMD 2 should precede 3 in Startup state") ;
433 125 tac2
               //$display(sdModel_file_desc, "**Error in sequnce, CMD 2 should precede 3 in Startup state") ;
434 79 tac2
               CardStatus[3]<=1;
435
            end
436
        response_CMD[127:112] <= RCA[15:0] ;
437
        response_CMD[111:96] <= CardStatus[15:0] ;
438
        appendCrc<=1;
439
        CardStatus[12:9] <=3;
440
        cardIdentificationState<=0;
441 96 tac2
       end
442
        6 : begin
443
           if (lastCMD == 55 && outDelayCnt==0) begin
444
              if (inCmd[9:8] == 2'b10) begin
445
               BusWidth <=4;
446
                    $display(sdModel_file_desc, "**BUS WIDTH 4 ") ;
447
               end
448
              else
449
               BusWidth <=1;
450
 
451
              response_S<=48;
452
              response_CMD[127:96] <= CardStatus;
453
           end
454
           else if (outDelayCnt==0)begin
455
             response_CMD <= 0;
456
             response_S<=0;
457
             $fdisplay(sdModel_file_desc, "**Error Invalid CMD, %h",inCmd[45:40]) ;
458 125 tac2
           //  $display(sdModel_file_desc, "**Error Invalid CMD, %h",inCmd[45:40]) ;
459 96 tac2
            end
460
        end
461
        7: begin
462
         if (outDelayCnt==0) begin
463
          if (inCmd[39:24]== RCA[15:0]) begin
464
              CardTransferActive <= 1;
465
              response_CMD[127:96] <= CardStatus ;
466
              CardStatus[12:9] <=`TRAN;
467
          end
468
          else begin
469
               CardTransferActive <= 0;
470
               response_CMD[127:96] <= CardStatus ;
471
               CardStatus[12:9] <=3;
472
          end
473
         end
474
        end
475 79 tac2
        8 : response_CMD[127:96] <= 0; //V1.0 card
476 135 tac2
 
477
                9 : begin
478
         if (lastCMD != 41 && outDelayCnt==0) begin
479
               $fdisplay(sdModel_file_desc, "**Error in sequnce, ACMD 41 should precede 2 in Startup state") ;
480
               //$display(sdModel_file_desc, "**Error in sequnce, ACMD 41 should precede 2 in Startup state") ;
481
               CardStatus[3]<=1;
482
            end
483
        response_CMD[127:8] <= CSD;
484
        appendCrc<=0;
485
        CardStatus[12:9] <=2;
486
        end
487
 
488
                  12: begin
489
          response_CMD[127:96] <= CardStatus ;
490
          stop<=1;
491
                  mult_write <= 0;
492
          mult_read <=0;
493
         CardStatus[12:9] <= `TRAN;
494
        end
495
 
496
 
497 96 tac2
        16 : begin
498
          response_CMD[127:96] <= CardStatus ;
499
 
500
        end
501 135 tac2
 
502
 
503
 
504
 
505
 
506 98 tac2
        17 :  begin
507
          if (outDelayCnt==0) begin
508
            if (CardStatus[12:9] == `TRAN) begin //If card is in transferstate                               
509
                CardStatus[12:9] <=`DATAS;//Put card in data state
510
                response_CMD[127:96] <= CardStatus ;
511
                BlockAddr = inCmd[39:8];
512
                if (BlockAddr%512 !=0)
513
                  $display("**Block Misalign Error");
514
          end
515
           else begin
516
             response_S <= 0;
517
             response_CMD[127:96] <= 0;
518
           end
519
         end
520
 
521
       end
522 135 tac2
 
523
     18 :  begin
524
          if (outDelayCnt==0) begin
525
            if (CardStatus[12:9] == `TRAN) begin //If card is in transferstate                               
526
                CardStatus[12:9] <=`DATAS;//Put card in data state
527
                response_CMD[127:96] <= CardStatus ;
528
                            mult_read <= 1;
529
                BlockAddr = inCmd[39:8];
530
                if (BlockAddr%512 !=0)
531
                  $display("**Block Misalign Error");
532
          end
533
           else begin
534
             response_S <= 0;
535
             response_CMD[127:96] <= 0;
536
 
537
           end
538
         end
539
 
540
       end
541 98 tac2
 
542 96 tac2
        24 : begin
543
          if (outDelayCnt==0) begin
544 98 tac2
            if (CardStatus[12:9] == `TRAN) begin //If card is in transferstate
545 96 tac2
              if (CardStatus[8]) begin //If Free write buffer           
546
                CardStatus[12:9] <=`RCV;//Put card in Rcv state
547
                response_CMD[127:96] <= CardStatus ;
548
                BlockAddr = inCmd[39:8];
549
                if (BlockAddr%512 !=0)
550
                  $display("**Block Misalign Error");
551
              end
552
              else begin
553
                response_CMD[127:96] <= CardStatus;
554
                 $fdisplay(sdModel_file_desc, "**Error Try to blockwrite when No Free Writebuffer") ;
555
                 $display("**Error Try to blockwrite when No Free Writebuffer") ;
556
             end
557
           end
558
           else begin
559
             response_S <= 0;
560
             response_CMD[127:96] <= 0;
561
           end
562
         end
563 135 tac2
       end
564
        25 : begin
565
          if (outDelayCnt==0) begin
566
            if (CardStatus[12:9] == `TRAN) begin //If card is in transferstate
567
              if (CardStatus[8]) begin //If Free write buffer           
568
                CardStatus[12:9] <=`RCV;//Put card in Rcv state
569
                response_CMD[127:96] <= CardStatus ;
570
                BlockAddr = inCmd[39:8];
571
                                mult_write <= 1;
572
                if (BlockAddr%512 !=0)
573
                  $display("**Block Misalign Error");
574
              end
575
              else begin
576
                response_CMD[127:96] <= CardStatus;
577
                 $fdisplay(sdModel_file_desc, "**Error Try to blockwrite when No Free Writebuffer") ;
578
                 $display("**Error Try to blockwrite when No Free Writebuffer") ;
579
             end
580
           end
581
           else begin
582
             response_S <= 0;
583
             response_CMD[127:96] <= 0;
584
           end
585
         end
586
       end
587
 
588 79 tac2
        33 : response_CMD[127:96] <= 48;
589
        55 :
590
        begin
591
          response_CMD[127:96] <= CardStatus ;
592
          CardStatus[5] <=1;      //Next CMD is AP specific CMD
593
          appendCrc<=1;
594
        end
595
        41 :
596
        begin
597
         if (cardIdentificationState) begin
598
            if (lastCMD != 55 && outDelayCnt==0) begin
599
               $fdisplay(sdModel_file_desc, "**Error in sequnce, CMD 55 should precede 41 in Startup state") ;
600 96 tac2
               $display( "**Error in sequnce, CMD 55 should precede 41 in Startup state") ;
601 79 tac2
               CardStatus[3]<=1;
602
            end
603
            else begin
604
             responseType=3;
605
             response_CMD[127:96] <= OCR;
606
             appendCrc<=0;
607
             CardStatus[5] <=0;
608
            if (Busy==1)
609
              CardStatus[12:9] <=1;
610
           end
611
        end
612
       end
613
 
614
    endcase
615
     ValidCmd<=1;
616
     crcIn<=0;
617
 
618
     outDelayCnt<=outDelayCnt+1;
619
     if (outDelayCnt==`outDelay)
620
       crcRst<=1;
621
     oeCmd<=1;
622
     cmdOut<=1;
623
     response_CMD[135:134] <=0;
624
 
625
    if (responseType != 3)
626 125 tac2
       if (!add_wrong_cmd_indx)
627
         response_CMD[133:128] <=inCmd[45:40];
628
      else
629
         response_CMD[133:128] <=0;
630
 
631 79 tac2
    if (responseType == 3)
632
       response_CMD[133:128] <=6'b111111;
633
 
634
     lastCMD <=inCmd[45:40];
635
    end
636
   end
637
 
638
 
639
 
640
 endcase
641
end
642
 
643
always @ ( negedge sdClk) begin
644
 case(state)
645
 
646
SEND_CMD: begin
647
     crcRst<=0;
648
     crcEn<=1;
649
    cmdWrite<=cmdWrite+1;
650
    if (response_S!=0)
651
     cmdOut<=0;
652
   else
653
      cmdOut<=1;
654
 
655
    if ((cmdWrite>0) &&  (cmdWrite < response_S-8)) begin
656
      cmdOut<=response_CMD[135-cmdWrite];
657
      crcIn<=response_CMD[134-cmdWrite];
658
      if (cmdWrite >= response_S-9)
659
       crcEn<=0;
660
    end
661
   else if (cmdWrite!=0) begin
662
     crcEn<=0;
663 125 tac2
     if (add_wrong_cmd_crc) begin
664
        cmdOut<=0;
665
        crcCnt<=crcCnt+1;
666
     end
667
     else begin
668 79 tac2
     cmdOut<=crcOut[6-crcCnt];
669
     crcCnt<=crcCnt+1;
670 125 tac2
     if (responseType == 3)
671 79 tac2
           cmdOut<=1;
672 125 tac2
    end
673 79 tac2
   end
674
  if (cmdWrite == response_S-1)
675
    cmdOut<=1;
676
 
677
  end
678
 endcase
679
end
680
 
681 98 tac2
 
682
 
683
integer outdly_cnt;
684
 
685
 
686
 
687
 
688
 
689
 
690
 
691 96 tac2
always @ (posedge sdClk) begin
692
 
693
  case (dataState)
694
  DATA_IDLE: begin
695 135 tac2
 
696
     crcDat_rst<=1;
697
     crcDat_en<=0;
698
     crcDat_in<=0;
699
 
700 96 tac2
  end
701
 
702
  READ_WAITS: begin
703
      oeDat<=0;
704
      crcDat_rst<=0;
705
      crcDat_en<=1;
706
      crcDat_in<=0;
707
      crc_c<=15;//
708
      crc_ok<=1;
709
  end
710
  READ_DATA: begin
711
 
712
 
713
    InbuffStatus<=1;
714
    if (transf_cnt<`BIT_BLOCK_REC) begin
715
       if (wptr)
716 135 tac2
         Inbuff[block_cnt][3:0] <= dat;
717 96 tac2
       else
718 135 tac2
          Inbuff[block_cnt][7:4] <= dat;
719 125 tac2
 
720
       if (!add_wrong_data_crc)
721
          crcDat_in<=dat;
722
        else
723
          crcDat_in<=4'b1010;
724
 
725 96 tac2
       crc_ok<=1;
726
       transf_cnt<=transf_cnt+1;
727
       if (wptr)
728
         block_cnt<=block_cnt+1;
729
       wptr<=~wptr;
730 98 tac2
 
731
 
732 96 tac2
    end
733
    else if  ( transf_cnt <= (`BIT_BLOCK_REC +`BIT_CRC_CYCLE-1)) begin
734
       transf_cnt<=transf_cnt+1;
735
       crcDat_en<=0;
736
       last_din <=dat;
737
 
738 97 tac2
       if (transf_cnt> `BIT_BLOCK_REC) begin
739 96 tac2
        crc_c<=crc_c-1;
740
 
741
          if (crcDat_out[0][crc_c] != last_din[0])
742
           crc_ok<=0;
743
          if  (crcDat_out[1][crc_c] != last_din[1])
744
           crc_ok<=0;
745
          if  (crcDat_out[2][crc_c] != last_din[2])
746
           crc_ok<=0;
747
          if  (crcDat_out[3][crc_c] != last_din[3])
748
           crc_ok<=0;
749
      end
750
    end
751
  end
752
  WRITE_FLASH: begin
753
     oeDat<=1;
754
     block_cnt <=0;
755
     wptr<=0;
756
     transf_cnt<=0;
757
     crcDat_rst<=1;
758
     crcDat_en<=0;
759
     crcDat_in<=0;
760
 
761
 
762
  end
763
 
764
  endcase
765
 
766
 
767
end
768
 
769
 
770
 
771 98 tac2
reg data_send_index;
772
integer write_out_index;
773
always @ (negedge sdClk) begin
774 96 tac2
 
775
  case (dataState)
776 98 tac2
  DATA_IDLE: begin
777
     write_out_index<=0;
778
     transf_cnt<=0;
779
     data_send_index<=0;
780
     outdly_cnt<=0;
781 135 tac2
     flash_write_cnt<=0;
782 96 tac2
  end
783 98 tac2
 
784
 
785
   WRITE_DATA: begin
786
      oeDat<=1;
787
      outdly_cnt<=outdly_cnt+1;
788
 
789
      if ( outdly_cnt > `DLY_TO_OUTP) begin
790
         transf_cnt <= transf_cnt+1;
791
         crcDat_en<=1;
792
         crcDat_rst<=0;
793
 
794
      end
795
      else begin
796 102 tac2
        crcDat_en<=0;
797
        crcDat_rst<=1;
798
        oeDat<=1;
799
        crc_c<=16;
800 98 tac2
     end
801
 
802
       if (transf_cnt==1) begin
803
 
804
          last_din <= FLASHmem[BlockAddr+(write_out_index)][7:4];
805
          datOut<=0;
806
          crcDat_in<= FLASHmem[BlockAddr+(write_out_index)][7:4];
807
          data_send_index<=1;
808
        end
809
        else if ( (transf_cnt>=2) && (transf_cnt<=`BIT_BLOCK-`CRC_OFF )) begin
810 102 tac2
          data_send_index<=~data_send_index;
811 98 tac2
          if (!data_send_index) begin
812
             last_din<=FLASHmem[BlockAddr+(write_out_index)][7:4];
813
             crcDat_in<= FLASHmem[BlockAddr+(write_out_index)][7:4];
814
          end
815
          else begin
816
             last_din<=FLASHmem[BlockAddr+(write_out_index)][3:0];
817 125 tac2
             if (!add_wrong_data_crc)
818
               crcDat_in<= FLASHmem[BlockAddr+(write_out_index)][3:0];
819
             else
820
               crcDat_in<=4'b1010;
821 98 tac2
             write_out_index<=write_out_index+1;
822 125 tac2
 
823 98 tac2
         end
824 125 tac2
 
825
 
826 98 tac2
          datOut<= last_din;
827
 
828
 
829
          if ( transf_cnt >=`BIT_BLOCK-`CRC_OFF ) begin
830
             crcDat_en<=0;
831
         end
832
 
833
       end
834
       else if (transf_cnt>`BIT_BLOCK-`CRC_OFF & crc_c!=0) begin
835 102 tac2
         datOut<= last_din;
836 98 tac2
         crcDat_en<=0;
837 102 tac2
         crc_c<=crc_c-1;
838
         if (crc_c<= 16) begin
839 98 tac2
         datOut[0]<=crcDat_out[0][crc_c-1];
840
         datOut[1]<=crcDat_out[1][crc_c-1];
841
         datOut[2]<=crcDat_out[2][crc_c-1];
842 102 tac2
         datOut[3]<=crcDat_out[3][crc_c-1];
843
       end
844 98 tac2
       end
845
       else if (transf_cnt==`BIT_BLOCK-2) begin
846
          datOut<=4'b1111;
847
      end
848
       else if ((transf_cnt !=0) && (crc_c == 0 ))begin
849
         oeDat<=0;
850
         CardStatus[12:9] <= `TRAN;
851
         end
852
 
853
 
854
 
855
  end
856
 
857
 
858
 
859 96 tac2
  WRITE_FLASH: begin
860
    flash_write_cnt<=flash_write_cnt+1;
861
     CardStatus[12:9] <= `PRG;
862 98 tac2
      datOut[0]<=0;
863
       datOut[1]<=1;
864
       datOut[2]<=1;
865
       datOut[3]<=1;
866 96 tac2
    if (flash_write_cnt == 0)
867
      datOut<=1;
868
    else if(flash_write_cnt == 1)
869 98 tac2
     datOut[0]<=1;
870
    else if(flash_write_cnt == 2)
871 96 tac2
     datOut[0]<=0;
872 98 tac2
 
873 97 tac2
 
874 98 tac2
    else if ((flash_write_cnt > 2) && (flash_write_cnt < 7)) begin
875 96 tac2
      if (crc_ok)
876 98 tac2
        datOut[0] <=okcrctoken[6-flash_write_cnt];
877 96 tac2
      else
878 98 tac2
        datOut[0] <= invalidcrctoken[6-flash_write_cnt];
879 96 tac2
    end
880 98 tac2
    else if  ((flash_write_cnt >= 7) && (flash_write_cnt < 264)) begin
881 96 tac2
       datOut[0]<=0;
882 98 tac2
 
883 96 tac2
      flash_blockwrite_cnt<=flash_blockwrite_cnt+2;
884
       FLASHmem[BlockAddr+(flash_blockwrite_cnt)]<=Inbuff[flash_blockwrite_cnt];
885
       FLASHmem[BlockAddr+(flash_blockwrite_cnt+1)]<=Inbuff[flash_blockwrite_cnt+1];
886 135 tac2
 
887 96 tac2
    end
888
    else begin
889
      datOut<=1;
890
      InbuffStatus<=0;
891
      CardStatus[12:9] <= `TRAN;
892
    end
893
  end
894
endcase
895
end
896
 
897 79 tac2
integer sdModel_file_desc;
898 96 tac2
 
899 79 tac2
initial
900
begin
901 136 tac2
  sdModel_file_desc = $fopen("../log/sd_model.log");
902 79 tac2
  if (sdModel_file_desc < 2)
903
  begin
904 96 tac2
    $display("*E Could not open/create testbench log file in /log/ directory!");
905 79 tac2
    $finish;
906
  end
907
end
908
 
909
task ResetCard; //  MAC registers
910
begin
911 125 tac2
   add_wrong_data_crc<=0;
912
  add_wrong_cmd_indx<=0;
913
  add_wrong_cmd_crc<=0;
914 96 tac2
 cardIdentificationState<=1;
915 79 tac2
  state<=IDLE;
916 96 tac2
  dataState<=DATA_IDLE;
917 79 tac2
  Busy<=0;
918
  oeCmd<=0;
919
  crcCnt<=0;
920 96 tac2
  CardTransferActive<=0;
921 79 tac2
  qCmd<=1;
922
  oeDat<=0;
923
  cmdOut<=0;
924
  cmdWrite<=0;
925 135 tac2
  startUppCnt<=0;
926 96 tac2
  InbuffStatus<=0;
927 79 tac2
  datOut<=0;
928
  inCmd<=0;
929 96 tac2
  BusWidth<=1;
930 79 tac2
  responseType=0;
931
  crcIn<=0;
932
  response_S<=0;
933
  crcEn<=0;
934
  crcRst<=0;
935
  cmdRead<=0;
936
  ValidCmd<=0;
937
  inValidCmd=0;
938
  appendCrc<=0;
939
  RCA<= `RCASTART;
940
  OCR<= `OCRSTART;
941
  CardStatus <= `STATUSSTART;
942
  CID<=`CIDSTART;
943 135 tac2
  CSD<=`CSDSTART;
944 79 tac2
  response_CMD<=0;
945
  outDelayCnt<=0;
946 96 tac2
  crcDat_rst<=1;
947
  crcDat_en<=0;
948
  crcDat_in<=0;
949
  transf_cnt<=0;
950
  BlockAddr<=0;
951
  block_cnt <=0;
952
     wptr<=0;
953
     transf_cnt<=0;
954
     crcDat_rst<=1;
955
     crcDat_en<=0;
956
     crcDat_in<=0;
957 98 tac2
flash_write_cnt<=0;
958 96 tac2
flash_blockwrite_cnt<=0;
959 79 tac2
end
960
endtask
961
 
962
 
963
endmodule

powered by: WebSVN 2.1.0

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