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

Subversion Repositories sd_card_controller

[/] [sd_card_controller/] [trunk/] [bench/] [verilog/] [sdModel.v] - Blame information for rev 3

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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