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

Subversion Repositories epc_rfid_transponder

[/] [epc_rfid_transponder/] [trunk/] [cmmdec.vhd] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 erwing
-------------------------------------------------------------------------------
2
--     Politecnico di Torino                                              
3
--     Dipartimento di Automatica e Informatica             
4
-------------------------------------------------------------------------------
5
-------------------------------------------------------------------------------     
6
--
7
--     Title          : EPC Class1 Gen2 RFID Tag - Command decoder
8
--
9
--     File name      : commdec.vhd 
10
--
11
--     Description    : Tag Command decoder    
12
--
13
--     Authors        : Erwing R. Sanchez <erwing.sanchezsanchez@polito.it>
14
--
15
--     Rev. History   : 26 June 06 - First Draft 
16
--                                 
17
-------------------------------------------------------------------------------            
18
-------------------------------------------------------------------------------
19
 
20
library IEEE;
21
use IEEE.STD_LOGIC_1164.all;
22
use IEEE.std_logic_unsigned.all;
23
use IEEE.STD_LOGIC_ARITH.all;
24
library work;
25
use work.epc_tag.all;
26
 
27
 
28
entity CommandDecoder is
29
 
30
  generic (
31
    LOG2_10_TARI_CK_CYC        : integer := 9;  -- Log2(clock cycles for 10 maximum TARI value) (def:Log2(490) = 9 @TCk=520ns)
32
    DELIMITIER_TIME_CK_CYC_MIN : integer := 22;  -- Min Clock cycles for 12,5 us delimitier
33
    DELIMITIER_TIME_CK_CYC_MAX : integer := 24);  -- Max Clock cycles for 12,5 us delimitier
34
  port (
35
    clk       : in  std_logic;
36
    rst_n     : in  std_logic;
37
    tdi       : in  std_logic;
38
    en        : in  std_logic;
39
    CommDone  : out CommandInternalCode_t;
40
    Data_r    : out std_logic_vector(31 downto 0);
41
    CRC_r     : out std_logic_vector(15 downto 0);
42
    Pointer_r : out std_logic_vector(15 downto 0);
43
    RN16_r    : out std_logic_vector(15 downto 0);
44
    Length_r  : out std_logic_vector(7 downto 0);
45
    Mask_r    : out std_logic_vector(MASKLENGTH-1 downto 0)
46
    );
47
 
48
end CommandDecoder;
49
 
50
architecture CommandDec1 of CommandDecoder is
51
 
52
 
53
  component SymbolDecoder
54
    generic (
55
      LOG2_10_TARI_CK_CYC        : integer;
56
      DELIMITIER_TIME_CK_CYC_MIN : integer;
57
      DELIMITIER_TIME_CK_CYC_MAX : integer);
58
    port (
59
      clk      : in  std_logic;
60
      rst_n    : in  std_logic;
61
      tdi      : in  std_logic;
62
      en       : in  std_logic;
63
      start    : in  std_logic;
64
      sserror  : out std_logic;
65
      ssovalid : out std_logic;
66
      sso      : out std_logic);
67
  end component;
68
 
69
 
70
  component crc5encdec
71
    generic (
72
      PRESET_CRC5 : integer);
73
    port (
74
      clk   : in  std_logic;
75
      rst_n : in  std_logic;
76
      init  : in  std_logic;
77
      ce    : in  std_logic;
78
      sdi   : in  std_logic;
79
      cout  : out std_logic_vector(4 downto 0));
80
  end component;
81
 
82
 
83
  component crc16encdec
84
    generic (
85
      PRESET_CRC16 : integer);
86
    port (
87
      clk   : in  std_logic;
88
      rst_n : in  std_logic;
89
      init  : in  std_logic;
90
      ce    : in  std_logic;
91
      sdi   : in  std_logic;
92
      cout  : out std_logic_vector(15 downto 0));
93
  end component;
94
 
95
 
96
  component COUNTERCLR
97
    generic (
98
      width : integer);
99
    port (
100
      clk    : in  std_logic;
101
      rst_n  : in  std_logic;
102
      en     : in  std_logic;
103
      clear  : in  std_logic;
104
      outcnt : out std_logic_vector(width-1 downto 0));
105
  end component;
106
 
107
  component shiftreg
108
    generic (
109
      REGWD : integer);
110
    port (
111
      clk   : in  std_logic;
112
      rst_n : in  std_logic;
113
      ce    : in  std_logic;
114
      sin   : in  std_logic;
115
      pout  : out std_logic_vector(REGWD - 1 downto 0));
116
  end component;
117
 
118
 
119
 
120
  type CmDecFSM_t is (st_Init, st_Start, st_Cm2_0, st_QueryRep, st_Ack,
121
                      st_Cm4or8_1, st_Cm4_10, st_Cm4_100,
122
                      st_Query, st_QueryAdjust, st_Cm4_101, st_Select,
123
                      st_Cm8_11, st_Cm8_110, st_Cm8_1100, st_Cm8_11000,
124
                      st_Cm8_110000, st_Cm8_1100000, st_Nak, st_ReqRN,
125
                      st_Cm8_1100001, st_Read, st_Write, st_Cm8_110001,
126
                      st_Cm8_1100010, st_Kill, st_Lock, st_Cm8_1100011,
127
                      st_Access, st_BlockWrite, st_Cm8_11001, st_Cm8_110010,
128
                      st_Cm8_1100100, st_BlockErase, st_ErrorDec, st_CommandReady,
129
                      st_QueryRep_w, st_Ack_w, st_Query_w, st_QueryAdjust_w, st_Select_w,
130
                      st_Nak_w, st_ReqRN_w, st_Read_w, st_Write_w, st_Kill_w, st_Lock_w,
131
                      st_Access_w, st_BlockWrite_w, st_BlockErase_w);
132
 
133
  type CmDataRecFSM_t is (st_WaitCmd, st_QueryRep_GetData, st_QueryRep_Done,
134
                          st_Ack_GetRN, st_Ack_Done,
135
                          st_Nak_Done,
136
                          st_Query_GetData, st_Query_GetCRC5, st_Query_Done,
137
                          st_QueryAdjust_GetData, st_QueryAdjust_Done,
138
                          st_Select_GetData1, st_Select_GetPointer, st_Select_GetPointer_LastByte,
139
                          st_Select_GetPointer_NotLastByte, st_Select_GetLength,
140
                          st_Select_GetMask, st_Select_GetData2, st_Select_GetCRC16, st_Select_Done,
141
                          st_ReqRN_GetRN, st_ReqRN_GetCRC16, st_ReqRN_Done,
142
                          st_Read_GetData1, st_Read_GetWordPtr, st_Read_GetLength,
143
                          st_Read_GetRN, st_Read_GetCRC16, st_Read_Done,
144
                          st_Read_GetWordPtr_LastByte, st_Read_GetWordPtr_NotLastByte,
145
                          st_Write_GetData1, st_Write_GetWordPtr, st_Write_GetData2,
146
                          st_Write_GetRN, st_Write_GetCRC16, st_Write_Done,
147
                          st_Write_GetWordPtr_LastByte, st_Write_GetWordPtr_NotLastByte,
148
                          st_Kill_GetData, st_Kill_GetRN, st_Kill_GetCRC16, st_Kill_Done,
149
                          st_Lock_GetData, st_Lock_GetRN, st_Lock_GetCRC16, st_Lock_Done,
150
                          st_Access_GetData, st_Access_GetRN, st_Access_GetCRC16, st_Access_Done,
151
                          st_BlockWrite_GetData, st_BlockWrite_GetWordPtr,
152
                          st_BlockWrite_GetWordCnt, st_BlockWrite_GetWriteData,
153
                          st_BlockWrite_GetRN, st_BlockWrite_GetCRC16, st_BlockWrite_Done,
154
                          st_BlockErase_GetData1, st_BlockErase_GetWordPtr, st_BlockErase_GetData2,
155
                          st_BlockErase_GetRN, st_BlockErase_GetCRC16, st_BlockErase_Done);
156
 
157
 
158
  -- Constants 
159
  constant PRESET_CRC5                                   : integer := 9;
160
  constant PRESET_CRC16                                  : integer := 65535;
161
  -- Decoder States Signals
162
  signal   StDec, NextStDec                              : CmDecFSM_t;
163
  signal   StartSDec_i, StartSDec                        : std_logic;
164
  -- Data Receiver State Signals
165
  signal   StDat, NextStDat                              : CmDataRecFSM_t;
166
  -- Command Start and Done
167
  signal   CommandDone, CommandDone_i                    : CommandInternalCode_t;
168
  signal   CommandStart, CommandStart_i                  : CommandInternalCode_t;
169
  -- Counter signals
170
  signal   DataCnt, RNCnt, CRCCnt                        : std_logic_vector(7 downto 0);
171
  signal   PointerCnt                                    : std_logic_vector(7 downto 0);
172
  signal   DataCnt_Inc, DataCnt_Inc_i, RNCnt_Inc         : std_logic;
173
  signal   RNCnt_Inc_i, PointerCnt_Inc, PointerCnt_Inc_i : std_logic;
174
  signal   CRCCnt_Inc, CRCCnt_Inc_i, DataCnt_Clear       : std_logic;
175
  signal   DataCnt_Clear_i, RNCnt_Clear, RNCnt_Clear_i   : std_logic;
176
  signal   PointerCnt_Clear, PointerCnt_Clear_i          : std_logic;
177
  signal   CRCCnt_Clear, CRCCnt_Clear_i                  : std_logic;
178
  -- Flags
179
  signal   LastPntByteFlag, LastPntByteFlag_i            : std_logic;
180
  signal   FirstPntBitTaken, FirstPntBitTaken_i          : std_logic;
181
  signal   CommandDoneFlag, CommandDoneFlag_i            : std_logic;
182
  -- Register enables
183
  signal   DatRegEnable, RNRegEnable, CRCRegEnable       : std_logic;
184
  signal   DatRegEnable_i, RNRegEnable_i, CRCRegEnable_i : std_logic;
185
  signal   PointerRegEnable, PointerRegEnable_i          : std_logic;
186
  signal   LengthWCntRegEnable, LengthWCntRegEnable_i    : std_logic;
187
  signal   MaskRegEnable_i, MaskRegEnable                : std_logic;
188
  -- Registers 
189
  signal   RN16_o, CRC16_o                               : std_logic_vector(15 downto 0);
190
  signal   RN16_ce, CRC16_ce, GPReg_ce                   : std_logic;
191
  signal   GPReg_o                                       : std_logic_vector(31 downto 0);
192
  signal   Pointer_o                                     : std_logic_vector(15 downto 0);
193
  signal   Pointer_ce                                    : std_logic;
194
  signal   Pointer_rst, Pointer_rst_i, Pointer_NOTrst    : std_logic;
195
  signal   LengthWCnt_o                                  : std_logic_vector(7 downto 0);
196
  signal   LengthWCnt_ce                                 : std_logic;
197
  signal   MaskReg_o                                     : std_logic_vector(MASKLENGTH-1 downto 0);
198
  signal   MaskReg_ce                                    : std_logic;
199
  -- CRC regs & control
200
  signal   CRC5Dec                                       : std_logic_vector(4 downto 0);
201
  signal   CRC16Dec                                      : std_logic_vector(15 downto 0);
202
  signal   CRC5Init, CRC16Init, CRC5Init_i, CRC16Init_i  : std_logic;
203
  signal   CRC5ce, CRC16ce                               : std_logic;
204
  -- Symbol Decoder signals
205
  signal   sso, ssovalid, sserror                        : std_logic;
206
 
207
begin  -- CommandDec1
208
 
209
 
210
-------------------------------------------------------------------------------
211
-- COMMAND DECODER PROCESSES
212
-------------------------------------------------------------------------------
213
 
214
  SYNCRO_DEC : process (clk, rst_n)
215
  begin  -- process SYNCRO
216
    if rst_n = '0' then                 -- asynchronous reset (active low)
217
      StartSDec    <= '0';
218
      -- Command start signal
219
      CommandStart <= cmd_NULL;
220
      -- CRC signals
221
      CRC5Init     <= '0';
222
      CRC16Init    <= '0';
223
      -- State signal
224
      StDec        <= st_Init;
225
    elsif clk'event and clk = '1' then  -- rising clock edge
226
      StartSDec    <= StartSDec_i;
227
      -- Command start signal
228
      CommandStart <= CommandStart_i;
229
      -- CRC signals
230
      CRC5Init     <= CRC5Init_i;
231
      CRC16Init    <= CRC16Init_i;
232
      -- State signal
233
      StDec        <= NextStDec;
234
    end if;
235
  end process SYNCRO_DEC;
236
 
237
  NEXT_ST_DEC : process (StDec, sso, ssovalid, CommandDoneFlag, sserror)
238
  begin  -- process NEXT_ST
239
    NextStDec <= StDec;
240
 
241
    case StDec is
242
      when st_Init =>
243
        NextStDec <= st_Start;
244
      when st_Start =>
245
        if ssovalid = '1' then
246
          if sso = '0' then
247
            NextStDec <= st_Cm2_0;
248
          else
249
            NextStDec <= st_Cm4or8_1;
250
          end if;
251
        end if;
252
 
253
        -- two-bit commands
254
      when st_Cm2_0 =>
255
        if sserror = '1' then
256
          NextStDec <= st_Init;
257
        elsif ssovalid = '1' then
258
          if sso = '0' then
259
            NextStDec <= st_QueryRep;   -- 00
260
          else
261
            NextStDec <= st_Ack;        -- 01
262
          end if;
263
        end if;
264
      when st_Cm4or8_1 =>
265
        if sserror = '1' then
266
          NextStDec <= st_Init;
267
        elsif ssovalid = '1' then
268
          if sso = '0' then
269
            NextStDec <= st_Cm4_10;
270
          else
271
            NextStDec <= st_Cm8_11;
272
          end if;
273
        end if;
274
 
275
        -- four-bit commands
276
      when st_Cm4_10 =>
277
        if sserror = '1' then
278
          NextStDec <= st_Init;
279
        elsif ssovalid = '1' then
280
          if sso = '0'then
281
            NextStDec <= st_Cm4_100;
282
          else
283
            NextStDec <= st_Cm4_101;
284
          end if;
285
        end if;
286
      when st_Cm4_100 =>
287
        if sserror = '1' then
288
          NextStDec <= st_Init;
289
        elsif ssovalid = '1' then
290
          if sso = '0' then
291
            NextStDec <= st_Query;        -- 1000
292
          else
293
            NextStDec <= st_QueryAdjust;  -- 1001
294
          end if;
295
        end if;
296
      when st_Cm4_101 =>
297
        if sserror = '1' then
298
          NextStDec <= st_Init;
299
        elsif ssovalid = '1' then
300
          if sso = '0' then
301
            NextStDec <= st_Select;       -- 1010
302
          else
303
            NextStDec <= st_ErrorDec;
304
          end if;
305
        end if;
306
 
307
        -- eight-bit commands
308
      when st_Cm8_11 =>
309
        if sserror = '1' then
310
          NextStDec <= st_Init;
311
        elsif ssovalid = '1' then
312
          if sso = '0' then
313
            NextStDec <= st_Cm8_110;
314
          else
315
            NextStDec <= st_ErrorDec;
316
          end if;
317
        end if;
318
      when st_Cm8_110 =>
319
        if sserror = '1' then
320
          NextStDec <= st_Init;
321
        elsif ssovalid = '1' then
322
          if sso = '0' then
323
            NextStDec <= st_Cm8_1100;
324
          else
325
            NextStDec <= st_ErrorDec;
326
          end if;
327
        end if;
328
      when st_cm8_1100 =>
329
        if sserror = '1' then
330
          NextStDec <= st_Init;
331
        elsif ssovalid = '1' then
332
          if sso = '0' then
333
            NextStDec <= st_Cm8_11000;
334
          else
335
            NextStDec <= st_Cm8_11001;
336
          end if;
337
        end if;
338
      when st_Cm8_11000 =>
339
        if sserror = '1' then
340
          NextStDec <= st_Init;
341
        elsif ssovalid = '1' then
342
          if sso = '0' then
343
            NextStDec <= st_Cm8_110000;
344
          else
345
            NextStDec <= st_Cm8_110001;
346
          end if;
347
        end if;
348
      when st_Cm8_110000 =>
349
        if sserror = '1' then
350
          NextStDec <= st_Init;
351
        elsif ssovalid = '1' then
352
          if sso = '0' then
353
            NextStDec <= st_Cm8_1100000;
354
          else
355
            NextStDec <= st_Cm8_1100001;
356
          end if;
357
        end if;
358
      when st_Cm8_1100000 =>
359
        if sserror = '1' then
360
          NextStDec <= st_Init;
361
        elsif ssovalid = '1' then
362
          if sso = '0' then
363
            NextStDec <= st_Nak;         -- 11000000
364
          else
365
            NextStDec <= st_ReqRN;       -- 11000001
366
          end if;
367
        end if;
368
      when st_Cm8_1100001 =>
369
        if sserror = '1' then
370
          NextStDec <= st_Init;
371
        elsif ssovalid = '1' then
372
          if sso = '0' then
373
            NextStDec <= st_Read;        -- 11000010
374
          else
375
            NextStDec <= st_Write;       -- 11000011
376
          end if;
377
        end if;
378
      when st_Cm8_110001 =>
379
        if sserror = '1' then
380
          NextStDec <= st_Init;
381
        elsif ssovalid = '1' then
382
          if sso = '0' then
383
            NextStDec <= st_Cm8_1100010;
384
          else
385
            NextStDec <= st_Cm8_1100011;
386
          end if;
387
        end if;
388
      when st_Cm8_1100010 =>
389
        if sserror = '1' then
390
          NextStDec <= st_Init;
391
        elsif ssovalid = '1' then
392
          if sso = '0' then
393
            NextStDec <= st_Kill;        -- 11000100
394
          else
395
            NextStDec <= st_Lock;        -- 11000101
396
          end if;
397
        end if;
398
      when st_Cm8_1100011 =>
399
        if sserror = '1' then
400
          NextStDec <= st_Init;
401
        elsif ssovalid = '1' then
402
          if sso = '0' then
403
            NextStDec <= st_Access;      -- 11000110
404
          else
405
            NextStDec <= st_BlockWrite;  -- 11000111
406
          end if;
407
        end if;
408
      when st_Cm8_11001 =>
409
        if sserror = '1' then
410
          NextStDec <= st_Init;
411
        elsif ssovalid = '1' then
412
          if sso = '0' then
413
            NextStDec <= st_Cm8_110010;
414
          else
415
            NextStDec <= st_ErrorDec;
416
          end if;
417
        end if;
418
      when st_Cm8_110010 =>
419
        if sserror = '1' then
420
          NextStDec <= st_Init;
421
        elsif ssovalid = '1' then
422
          if sso = '0' then
423
            NextStDec <= st_Cm8_1100100;
424
          else
425
            NextStDec <= st_ErrorDec;
426
          end if;
427
        end if;
428
      when st_Cm8_1100100 =>
429
        if sserror = '1' then
430
          NextStDec <= st_Init;
431
        elsif ssovalid = '1' then
432
          if sso = '0' then
433
            NextStDec <= st_BlockErase;  -- 11001000
434
          else
435
            NextStDec <= st_ErrorDec;
436
          end if;
437
        end if;
438
 
439
        -- Command Start states
440
      when st_QueryRep =>
441
        if sserror = '1' then
442
          NextStDec <= st_Init;
443
        else
444
          NextStDec <= st_QueryRep_w;
445
        end if;
446
      when st_Ack =>
447
        if sserror = '1' then
448
          NextStDec <= st_Init;
449
        else
450
          NextStDec <= st_Ack_w;
451
        end if;
452
      when st_Query =>
453
        if sserror = '1' then
454
          NextStDec <= st_Init;
455
        else
456
          NextStDec <= st_Query_w;
457
        end if;
458
      when st_QueryAdjust =>
459
        if sserror = '1' then
460
          NextStDec <= st_Init;
461
        else
462
          NextStDec <= st_QueryAdjust_w;
463
        end if;
464
      when st_Select =>
465
        if sserror = '1' then
466
          NextStDec <= st_Init;
467
        else
468
          NextStDec <= st_Select_w;
469
        end if;
470
      when st_Nak =>
471
        if sserror = '1' then
472
          NextStDec <= st_Init;
473
        else
474
          NextStDec <= st_Nak_w;
475
        end if;
476
      when st_ReqRN =>
477
        if sserror = '1' then
478
          NextStDec <= st_Init;
479
        else
480
          NextStDec <= st_ReqRN_w;
481
        end if;
482
      when st_Read =>
483
        if sserror = '1' then
484
          NextStDec <= st_Init;
485
        else
486
          NextStDec <= st_Read_w;
487
        end if;
488
      when st_Write =>
489
        if sserror = '1' then
490
          NextStDec <= st_Init;
491
        else
492
          NextStDec <= st_Write_w;
493
        end if;
494
      when st_Kill =>
495
        if sserror = '1' then
496
          NextStDec <= st_Init;
497
        else
498
          NextStDec <= st_Kill_w;
499
        end if;
500
      when st_Lock =>
501
        if sserror = '1' then
502
          NextStDec <= st_Init;
503
        else
504
          NextStDec <= st_Lock_w;
505
        end if;
506
      when st_Access =>
507
        if sserror = '1' then
508
          NextStDec <= st_Init;
509
        else
510
          NextStDec <= st_Access_w;
511
        end if;
512
      when st_BlockWrite =>
513
        if sserror = '1' then
514
          NextStDec <= st_Init;
515
        else
516
          NextStDec <= st_BlockWrite_w;
517
        end if;
518
      when st_BlockErase =>
519
        if sserror = '1' then
520
          NextStDec <= st_Init;
521
        else
522
          NextStDec <= st_BlockErase_w;
523
        end if;
524
 
525
        -- Command done-waiting states
526
      when st_QueryRep_w =>
527
        if sserror = '1' then
528
          NextStDec <= st_Init;
529
        elsif CommandDoneFlag = '1' then
530
          NextStDec <= st_CommandReady;
531
        end if;
532
      when st_Ack_w =>
533
        if sserror = '1' then
534
          NextStDec <= st_Init;
535
        elsif CommandDoneFlag = '1' then
536
          NextStDec <= st_CommandReady;
537
        end if;
538
      when st_Query_w =>
539
        if sserror = '1' then
540
          NextStDec <= st_Init;
541
        elsif CommandDoneFlag = '1' then
542
          NextStDec <= st_CommandReady;
543
        end if;
544
      when st_QueryAdjust_w =>
545
        if sserror = '1' then
546
          NextStDec <= st_Init;
547
        elsif CommandDoneFlag = '1' then
548
          NextStDec <= st_CommandReady;
549
        end if;
550
      when st_Select_w =>
551
        if sserror = '1' then
552
          NextStDec <= st_Init;
553
        elsif CommandDoneFlag = '1' then
554
          NextStDec <= st_CommandReady;
555
        end if;
556
      when st_Nak_w =>
557
        if sserror = '1' then
558
          NextStDec <= st_Init;
559
        elsif CommandDoneFlag = '1' then
560
          NextStDec <= st_CommandReady;
561
        end if;
562
      when st_ReqRN_w =>
563
        if sserror = '1' then
564
          NextStDec <= st_Init;
565
        elsif CommandDoneFlag = '1' then
566
          NextStDec <= st_CommandReady;
567
        end if;
568
      when st_Read_w =>
569
        if sserror = '1' then
570
          NextStDec <= st_Init;
571
        elsif CommandDoneFlag = '1' then
572
          NextStDec <= st_CommandReady;
573
        end if;
574
      when st_Write_w =>
575
        if sserror = '1' then
576
          NextStDec <= st_Init;
577
        elsif CommandDoneFlag = '1' then
578
          NextStDec <= st_CommandReady;
579
        end if;
580
      when st_Kill_w =>
581
        if sserror = '1' then
582
          NextStDec <= st_Init;
583
        elsif CommandDoneFlag = '1' then
584
          NextStDec <= st_CommandReady;
585
        end if;
586
      when st_Lock_w =>
587
        if sserror = '1' then
588
          NextStDec <= st_Init;
589
        elsif CommandDoneFlag = '1' then
590
          NextStDec <= st_CommandReady;
591
        end if;
592
      when st_Access_w =>
593
        if sserror = '1' then
594
          NextStDec <= st_Init;
595
        elsif CommandDoneFlag = '1' then
596
          NextStDec <= st_CommandReady;
597
        end if;
598
      when st_BlockWrite_w =>
599
        if sserror = '1' then
600
          NextStDec <= st_Init;
601
        elsif CommandDoneFlag = '1' then
602
          NextStDec <= st_CommandReady;
603
        end if;
604
      when st_BlockErase_w =>
605
        if sserror = '1' then
606
          NextStDec <= st_Init;
607
        elsif CommandDoneFlag = '1' then
608
          NextStDec <= st_CommandReady;
609
        end if;
610
 
611
      when others =>
612
        NextStDec <= st_Init;
613
    end case;
614
  end process NEXT_ST_DEC;
615
 
616
 
617
  OUTPUTDEC_DEC : process (StDec)
618
  begin  -- process OUTPUT_DEC
619
    StartSDec_i    <= '0';
620
    CommandStart_i <= cmd_NULL;
621
    CRC5Init_i     <= '0';
622
    CRC16Init_i    <= '0';
623
 
624
    case StDec is
625
      when st_Init =>
626
        CRC5Init_i  <= '1';
627
        CRC16Init_i <= '1';
628
        StartSDec_i <= '1';
629
      when st_Start =>
630
        StartSDec_i <= '1';
631
      when st_QueryRep =>
632
        CommandStart_i <= cmd_QueryRep;
633
      when st_Ack =>
634
        CommandStart_i <= cmd_Ack;
635
      when st_Query =>
636
        CommandStart_i <= cmd_Query;
637
      when st_QueryAdjust =>
638
        CommandStart_i <= cmd_QueryAdjust;
639
      when st_Select =>
640
        CommandStart_i <= cmd_Select;
641
      when st_Nak =>
642
        CommandStart_i <= cmd_Nak;
643
      when st_ReqRN =>
644
        CommandStart_i <= cmd_ReqRN;
645
      when st_Read =>
646
        CommandStart_i <= cmd_Read;
647
      when st_Write =>
648
        CommandStart_i <= cmd_Write;
649
      when st_Kill =>
650
        CommandStart_i <= cmd_Kill;
651
      when st_Lock =>
652
        CommandStart_i <= cmd_Lock;
653
      when st_Access =>
654
        CommandStart_i <= cmd_Access;
655
      when st_BlockWrite =>
656
        CommandStart_i <= cmd_BlockWrite;
657
      when st_BlockErase =>
658
        CommandStart_i <= cmd_BlockErase;
659
      when others => null;
660
    end case;
661
  end process OUTPUTDEC_DEC;
662
 
663
 
664
-------------------------------------------------------------------------------
665
-- DATA RECEIVER PROCESSES
666
-------------------------------------------------------------------------------
667
 
668
  SYNCRO_DAT : process (clk, rst_n)
669
  begin  -- process SYNCRO
670
    if rst_n = '0' then                 -- asynchronous reset (active low)
671
      -- Command Done signal
672
      CommandDone         <= cmd_NULL;
673
      -- Counters
674
      DataCnt_Inc         <= '0';
675
      DataCnt_Clear       <= '0';
676
      RNCnt_Inc           <= '0';
677
      RNCnt_Clear         <= '0';
678
      CRCCnt_Inc          <= '0';
679
      CRCCnt_Clear        <= '0';
680
      PointerCnt_Inc      <= '0';
681
      PointerCnt_Clear    <= '0';
682
      -- Reg CE
683
      DatRegEnable        <= '0';
684
      RNRegEnable         <= '0';
685
      CRCRegEnable        <= '0';
686
      PointerRegEnable    <= '0';
687
      LengthWCntRegEnable <= '0';
688
      MaskRegEnable       <= '0';
689
      Pointer_rst         <= '0';
690
      -- Flags
691
      LastPntByteFlag     <= '0';
692
      FirstPntBitTaken    <= '0';
693
      CommandDoneFlag     <= '0';
694
      -- State signal
695
      StDat               <= st_WaitCmd;
696
    elsif clk'event and clk = '1' then  -- rising clock edge;
697
      -- Command Done signal
698
      CommandDone         <= CommandDone_i;
699
      -- Counters
700
      DataCnt_Inc         <= DataCnt_Inc_i;
701
      DataCnt_Clear       <= DataCnt_Clear_i;
702
      RNCnt_Inc           <= RNCnt_Inc_i;
703
      RNCnt_Clear         <= RNCnt_Clear_i;
704
      CRCCnt_Inc          <= CRCCnt_Inc_i;
705
      CRCCnt_Clear        <= CRCCnt_Clear_i;
706
      PointerCnt_Inc      <= PointerCnt_Inc_i;
707
      PointerCnt_Clear    <= PointerCnt_Clear_i;
708
      -- Reg CE
709
      DatRegEnable        <= DatRegEnable_i;
710
      RNRegEnable         <= RNRegEnable_i;
711
      CRCRegEnable        <= CRCRegEnable_i;
712
      PointerRegEnable    <= PointerRegEnable_i;
713
      LengthWCntRegEnable <= LengthWCntRegEnable_i;
714
      MaskRegEnable       <= MaskRegEnable_i;
715
      Pointer_rst         <= Pointer_rst_i;
716
      -- Flags
717
      LastPntByteFlag     <= LastPntByteFlag_i;
718
      FirstPntBitTaken    <= FirstPntBitTaken_i;
719
      CommandDoneFlag     <= CommandDoneFlag_i;
720
      -- State signal
721
      StDat               <= NextStDat;
722
    end if;
723
  end process SYNCRO_DAT;
724
 
725
 
726
  NEXT_ST_DAT : process (StDat, CommandStart, sserror, DataCnt, RNCnt, CRCCnt, FirstPntBitTaken, LastPntByteFlag, PointerCnt, LengthWCnt_o)
727
  begin  -- process NEXT_ST_DAT
728
    NextStDat <= StDat;
729
 
730
    case StDat is
731
      when st_WaitCmd =>
732
        case CommandStart is
733
          when cmd_Select =>
734
            NextStDat <= st_Select_GetData1;
735
          when cmd_Query =>
736
            NextStDat <= st_Query_GetData;
737
          when cmd_QueryAdjust =>
738
            NextStDat <= st_QueryAdjust_GetData;
739
          when cmd_QueryRep =>
740
            NextStDat <= st_QueryRep_GetData;
741
          when cmd_Ack =>
742
            NextStDat <= st_Ack_GetRN;
743
          when cmd_Nak =>
744
            NextStDat <= st_Nak_Done;
745
          when cmd_ReqRN =>
746
            NextStDat <= st_ReqRN_GetRN;
747
          when cmd_Read =>
748
            NextStDat <= st_Read_GetData1;
749
          when cmd_Write =>
750
            NextStDat <= st_Write_GetData1;
751
          when cmd_Kill =>
752
            NextStDat <= st_Kill_GetData;
753
          when cmd_Lock =>
754
            NextStDat <= st_Lock_GetData;
755
          when cmd_Access =>
756
            NextStDat <= st_Access_GetData;
757
          when cmd_BlockWrite =>
758
            NextStDat <= st_BlockWrite_GetData;
759
          when cmd_BlockErase =>
760
            NextStDat <= st_BlockErase_GetData1;
761
          when others => null;
762
        end case;
763
 
764
        -- Select
765
      when st_Select_GetData1 =>
766
        if sserror = '1' then
767
          NextStDat <= st_WaitCmd;
768
        elsif DataCnt = conv_std_logic_vector(8, 8) then  -- Target(3)-Action(3)-Membank(2)
769
          NextStDat <= st_Select_GetPointer;
770
        end if;
771
      when st_Select_GetPointer =>
772
        if sserror = '1' then
773
          NextStDat <= st_WaitCmd;
774
        elsif FirstPntBitTaken = '1' then
775
          if LastPntByteFlag = '1' then
776
            NextStDat <= st_Select_GetPointer_LastByte;
777
          else
778
            NextStDat <= st_Select_GetPointer_NotLastByte;
779
          end if;
780
        end if;
781
      when st_Select_GetPointer_NotLastByte =>
782
        if sserror = '1' then
783
          NextStDat <= st_WaitCmd;
784
        elsif PointerCnt = conv_std_logic_vector(7, 8) then
785
          NextStDat <= st_Select_GetPointer;
786
        end if;
787
      when st_Select_GetPointer_LastByte =>
788
        if sserror = '1' then
789
          NextStDat <= st_WaitCmd;
790
        elsif PointerCnt = conv_std_logic_vector(7, 8) then
791
          NextStDat <= st_Select_GetLength;
792
        end if;
793
      when st_Select_GetLength =>
794
        if sserror = '1' then
795
          NextStDat <= st_WaitCmd;
796
        elsif RNCnt = conv_std_logic_vector(8, 8) then
797
          NextStDat <= st_Select_GetMask;
798
        end if;
799
      when st_Select_GetMask =>
800
        if sserror = '1' then
801
          NextStDat <= st_WaitCmd;
802
        elsif PointerCnt = LengthWCnt_o then
803
          NextStDat <= st_Select_GetData2;
804
        end if;
805
      when st_Select_GetData2 =>
806
        if sserror = '1' then
807
          NextStDat <= st_WaitCmd;
808
        elsif DataCnt = conv_std_logic_vector(1, 8) then  -- Truncate(1)
809
          NextStDat <= st_Select_GetCRC16;
810
        end if;
811
      when st_Select_GetCRC16 =>
812
        if sserror = '1' then
813
          NextStDat <= st_WaitCmd;
814
        elsif CRCCnt = conv_std_logic_vector(16, 8) then
815
          NextStDat <= st_Select_Done;
816
        end if;
817
      when st_Select_Done =>
818
        if sserror = '1' then
819
          NextStDat <= st_WaitCmd;
820
        else
821
          NextStDat <= st_WaitCmd;
822
        end if;
823
 
824
        -- Query
825
      when st_Query_GetData =>
826
        if sserror = '1' then
827
          NextStDat <= st_WaitCmd;
828
        elsif DataCnt = conv_std_logic_vector(13, 8) then  -- DR(1)-M(2)-TRext(1)-Sel(2)-Session(2)-Target(1)-Q(4)
829
          NextStDat <= st_Query_GetCRC5;
830
        end if;
831
      when st_Query_GetCRC5 =>
832
        if sserror = '1' then
833
          NextStDat <= st_WaitCmd;
834
        elsif CRCCnt = conv_std_logic_vector(5, 8) then
835
          NextStDat <= st_Query_Done;
836
        end if;
837
      when st_Query_Done =>
838
        if sserror = '1' then
839
          NextStDat <= st_WaitCmd;
840
        else
841
          NextStDat <= st_WaitCmd;
842
        end if;
843
 
844
        -- QueryAdjust
845
      when st_QueryAdjust_GetData =>
846
        if sserror = '1' then
847
          NextStDat <= st_WaitCmd;
848
        elsif DataCnt = conv_std_logic_vector(5, 8) then  -- Session(2)-UpDn(3)
849
          NextStDat <= st_QueryAdjust_Done;
850
        end if;
851
      when st_QueryAdjust_Done =>
852
        if sserror = '1' then
853
          NextStDat <= st_WaitCmd;
854
        else
855
          NextStDat <= st_WaitCmd;
856
        end if;
857
 
858
        -- QueryRep
859
      when st_QueryRep_GetData =>
860
        if sserror = '1' then
861
          NextStDat <= st_WaitCmd;
862
        elsif DataCnt = conv_std_logic_vector(2, 8) then  --Session(2)
863
          NextStDat <= st_QueryRep_Done;
864
        end if;
865
      when st_QueryRep_Done =>
866
        if sserror = '1' then
867
          NextStDat <= st_WaitCmd;
868
        else
869
          NextStDat <= st_WaitCmd;
870
        end if;
871
 
872
        -- Ack
873
      when st_Ack_GetRN =>
874
        if sserror = '1' then
875
          NextStDat <= st_WaitCmd;
876
        elsif RNCnt = conv_std_logic_vector(16, 8) then
877
          NextStDat <= st_Ack_Done;
878
        end if;
879
      when st_Ack_Done =>
880
        if sserror = '1' then
881
          NextStDat <= st_WaitCmd;
882
        else
883
          NextStDat <= st_WaitCmd;
884
        end if;
885
 
886
        -- Nak
887
      when st_Nak_Done =>
888
        if sserror = '1' then
889
          NextStDat <= st_WaitCmd;
890
        else
891
          NextStDat <= st_WaitCmd;
892
        end if;
893
 
894
        -- ReqRN
895
      when st_ReqRN_GetRN =>
896
        if sserror = '1' then
897
          NextStDat <= st_WaitCmd;
898
        elsif RNCnt = conv_std_logic_vector(16, 8) then
899
          NextStDat <= st_ReqRN_GetCRC16;
900
        end if;
901
      when st_ReqRN_GetCRC16 =>
902
        if sserror = '1' then
903
          NextStDat <= st_WaitCmd;
904
        elsif CRCCnt = conv_std_logic_vector(16, 8) then
905
          NextStDat <= st_ReqRN_Done;
906
        end if;
907
      when st_ReqRN_Done =>
908
        if sserror = '1' then
909
          NextStDat <= st_WaitCmd;
910
        else
911
          NextStDat <= st_WaitCmd;
912
        end if;
913
 
914
        -- Read
915
      when st_Read_GetData1 =>
916
        if sserror = '1' then
917
          NextStDat <= st_WaitCmd;
918
        elsif DataCnt = conv_std_logic_vector(2, 8) then  -- Membank(2)
919
          NextStDat <= st_Read_GetWordPtr;
920
        end if;
921
      when st_Read_GetWordPtr =>
922
        if sserror = '1' then
923
          NextStDat <= st_WaitCmd;
924
        elsif FirstPntBitTaken = '1' then
925
          if LastPntByteFlag = '1' then
926
            NextStDat <= st_Read_GetWordPtr_LastByte;
927
          else
928
            NextStDat <= st_Read_GetWordPtr_NotLastByte;
929
          end if;
930
        end if;
931
      when st_Read_GetWordPtr_LastByte =>
932
        if sserror = '1' then
933
          NextStDat <= st_WaitCmd;
934
        elsif PointerCnt = conv_std_logic_vector(7, 8) then
935
          NextStDat <= st_Read_GetLength;
936
        end if;
937
      when st_Read_GetWordPtr_NotLastByte =>
938
        if sserror = '1' then
939
          NextStDat <= st_WaitCmd;
940
        elsif PointerCnt = conv_std_logic_vector(7, 8) then
941
          NextStDat <= st_Read_GetWordPtr;
942
        end if;
943
      when st_Read_GetLength =>
944
        if sserror = '1' then
945
          NextStDat <= st_WaitCmd;
946
        elsif DataCnt = conv_std_logic_vector(8, 8) then  -- WordCount(8)
947
          NextStDat <= st_Read_GetRN;
948
        end if;
949
      when st_Read_GetRN =>
950
        if sserror = '1' then
951
          NextStDat <= st_WaitCmd;
952
        elsif RNCnt = conv_std_logic_vector(16, 8) then
953
          NextStDat <= st_Read_GetCRC16;
954
        end if;
955
      when st_Read_GetCRC16 =>
956
        if sserror = '1' then
957
          NextStDat <= st_WaitCmd;
958
        elsif CRCCnt = conv_std_logic_vector(16, 8) then
959
          NextStDat <= st_Read_Done;
960
        end if;
961
      when st_Read_Done =>
962
        if sserror = '1' then
963
          NextStDat <= st_WaitCmd;
964
        else
965
          NextStDat <= st_WaitCmd;
966
        end if;
967
 
968
        -- Write
969
      when st_Write_GetData1 =>
970
        if sserror = '1' then
971
          NextStDat <= st_WaitCmd;
972
        elsif DataCnt = conv_std_logic_vector(2, 8) then   -- Membank(2)
973
          NextStDat <= st_Write_GetWordPtr;
974
        end if;
975
      when st_Write_GetWordPtr =>
976
        if sserror = '1' then
977
          NextStDat <= st_WaitCmd;
978
        elsif FirstPntBitTaken = '1' then
979
          if LastPntByteFlag = '1' then
980
            NextStDat <= st_Write_GetWordPtr_LastByte;
981
          else
982
            NextStDat <= st_Write_GetWordPtr_NotLastByte;
983
          end if;
984
        end if;
985
      when st_Write_GetWordPtr_LastByte =>
986
        if sserror = '1' then
987
          NextStDat <= st_WaitCmd;
988
        elsif PointerCnt = conv_std_logic_vector(7, 8) then
989
          NextStDat <= st_Write_GetData2;
990
        end if;
991
      when st_Write_GetWordPtr_NotLastByte =>
992
        if sserror = '1' then
993
          NextStDat <= st_WaitCmd;
994
        elsif PointerCnt = conv_std_logic_vector(7, 8) then
995
          NextStDat <= st_Write_GetWordPtr;
996
        end if;
997
      when st_Write_GetData2 =>
998
        if sserror = '1' then
999
          NextStDat <= st_WaitCmd;
1000
        elsif DataCnt = conv_std_logic_vector(16, 8) then  --Data(16)
1001
          NextStDat <= st_Write_GetRN;
1002
        end if;
1003
      when st_Write_GetRN =>
1004
        if sserror = '1' then
1005
          NextStDat <= st_WaitCmd;
1006
        elsif RNCnt = conv_std_logic_vector(16, 8) then
1007
          NextStDat <= st_Write_GetCRC16;
1008
        end if;
1009
      when st_Write_GetCRC16 =>
1010
        if sserror = '1' then
1011
          NextStDat <= st_WaitCmd;
1012
        elsif CRCCnt = conv_std_logic_vector(16, 8) then
1013
          NextStDat <= st_Write_Done;
1014
        end if;
1015
      when st_Write_Done =>
1016
        if sserror = '1' then
1017
          NextStDat <= st_WaitCmd;
1018
        else
1019
          NextStDat <= st_WaitCmd;
1020
        end if;
1021
 
1022
        -- Kill
1023
      when st_Kill_GetData =>
1024
        if sserror = '1' then
1025
          NextStDat <= st_WaitCmd;
1026
        elsif DataCnt = conv_std_logic_vector(19, 8) then  -- Data(16)-RFU(3)
1027
          NextStDat <= st_Kill_GetRN;
1028
        end if;
1029
      when st_Kill_GetRN =>
1030
        if sserror = '1' then
1031
          NextStDat <= st_WaitCmd;
1032
        elsif RNCnt = conv_std_logic_vector(16, 8) then
1033
          NextStDat <= st_Kill_GetCRC16;
1034
        end if;
1035
      when st_Kill_GetCRC16 =>
1036
        if sserror = '1' then
1037
          NextStDat <= st_WaitCmd;
1038
        elsif CRCCnt = conv_std_logic_vector(16, 8) then
1039
          NextStDat <= st_Kill_Done;
1040
        end if;
1041
      when st_Kill_Done =>
1042
        if sserror = '1' then
1043
          NextStDat <= st_WaitCmd;
1044
        else
1045
          NextStDat <= st_WaitCmd;
1046
        end if;
1047
 
1048
        -- Lock
1049
      when st_Lock_GetData =>
1050
        if sserror = '1' then
1051
          NextStDat <= st_WaitCmd;
1052
        elsif DataCnt = conv_std_logic_vector(20, 8) then  -- Payload(20)
1053
          NextStDat <= st_Lock_GetRN;
1054
        end if;
1055
      when st_Lock_GetRN =>
1056
        if sserror = '1' then
1057
          NextStDat <= st_WaitCmd;
1058
        elsif RNCnt = conv_std_logic_vector(16, 8) then
1059
          NextStDat <= st_Lock_GetCRC16;
1060
        end if;
1061
      when st_Lock_GetCRC16 =>
1062
        if sserror = '1' then
1063
          NextStDat <= st_WaitCmd;
1064
        elsif CRCCnt = conv_std_logic_vector(16, 8) then
1065
          NextStDat <= st_Lock_Done;
1066
        end if;
1067
      when st_Lock_Done =>
1068
        if sserror = '1' then
1069
          NextStDat <= st_WaitCmd;
1070
        else
1071
          NextStDat <= st_WaitCmd;
1072
        end if;
1073
 
1074
        -- Access
1075
      when st_Access_GetData =>
1076
        if sserror = '1' then
1077
          NextStDat <= st_WaitCmd;
1078
        elsif DataCnt = conv_std_logic_vector(16, 8) then
1079
          NextStDat <= st_Access_GetRN;
1080
        end if;
1081
      when st_Access_GetRN =>
1082
        if sserror = '1' then
1083
          NextStDat <= st_WaitCmd;
1084
        elsif RNCnt = conv_std_logic_vector(16, 8) then
1085
          NextStDat <= st_Access_GetCRC16;
1086
        end if;
1087
      when st_Access_GetCRC16 =>
1088
        if sserror = '1' then
1089
          NextStDat <= st_WaitCmd;
1090
        elsif CRCCnt = conv_std_logic_vector(16, 8) then
1091
          NextStDat <= st_Access_Done;
1092
        end if;
1093
      when st_Access_Done =>
1094
        if sserror = '1' then
1095
          NextStDat <= st_WaitCmd;
1096
        else
1097
          NextStDat <= st_WaitCmd;
1098
        end if;
1099
 
1100
        -- BlockWrite
1101
      when st_BlockWrite_GetData =>
1102
        if sserror = '1' then
1103
          NextStDat <= st_WaitCmd;
1104
        elsif DataCnt = conv_std_logic_vector(2, 8) then  --Membank(2)
1105
          NextStDat <= st_BlockWrite_GetWordPtr;
1106
        end if;
1107
      when st_BlockWrite_GetWordPtr =>
1108
        if sserror = '1' then
1109
          NextStDat <= st_WaitCmd;
1110
        else
1111
          NextStDat <= st_BlockWrite_GetWordCnt;
1112
        end if;
1113
      when st_BlockWrite_GetWordCnt =>
1114
        if sserror = '1' then
1115
          NextStDat <= st_WaitCmd;
1116
        else
1117
          NextStDat <= st_BlockWrite_GetWriteData;
1118
        end if;
1119
      when st_BlockWrite_GetWriteData =>
1120
        if sserror = '1' then
1121
          NextStDat <= st_WaitCmd;
1122
        else
1123
          NextStDat <= st_BlockWrite_GetRN;
1124
        end if;
1125
      when st_BlockWrite_GetRN =>
1126
        if sserror = '1' then
1127
          NextStDat <= st_WaitCmd;
1128
        elsif RNCnt = conv_std_logic_vector(16, 8) then
1129
          NextStDat <= st_BlockWrite_GetCRC16;
1130
        end if;
1131
      when st_BlockWrite_GetCRC16 =>
1132
        if sserror = '1' then
1133
          NextStDat <= st_WaitCmd;
1134
        elsif CRCCnt = conv_std_logic_vector(16, 8) then
1135
          NextStDat <= st_BlockWrite_Done;
1136
        end if;
1137
      when st_BlockWrite_Done =>
1138
        if sserror = '1' then
1139
          NextStDat <= st_WaitCmd;
1140
        else
1141
          NextStDat <= st_WaitCmd;
1142
        end if;
1143
 
1144
        -- BlockErase
1145
      when st_BlockErase_GetData1 =>
1146
        if sserror = '1' then
1147
          NextStDat <= st_WaitCmd;
1148
        elsif DataCnt = conv_std_logic_vector(2, 8) then  --Membank(2)
1149
          NextStDat <= st_BlockErase_GetWordPtr;
1150
        end if;
1151
      when st_BlockErase_GetWordPtr =>
1152
        if sserror = '1' then
1153
          NextStDat <= st_WaitCmd;
1154
        else
1155
          NextStDat <= st_BlockErase_GetData2;
1156
        end if;
1157
      when st_BlockErase_GetData2 =>
1158
        if sserror = '1' then
1159
          NextStDat <= st_WaitCmd;
1160
        elsif DataCnt = conv_std_logic_vector(8, 8) then
1161
          NextStDat <= st_BlockErase_GetRN;
1162
        end if;
1163
      when st_BlockErase_GetRN =>
1164
        if sserror = '1' then
1165
          NextStDat <= st_WaitCmd;
1166
        elsif RNCnt = conv_std_logic_vector(16, 8) then
1167
          NextStDat <= st_BlockErase_GetCRC16;
1168
        end if;
1169
      when st_BlockErase_GetCRC16 =>
1170
        if sserror = '1' then
1171
          NextStDat <= st_WaitCmd;
1172
        elsif CRCCnt = conv_std_logic_vector(16, 8) then
1173
          NextStDat <= st_BlockErase_Done;
1174
        end if;
1175
      when st_BlockErase_Done =>
1176
        if sserror = '1' then
1177
          NextStDat <= st_WaitCmd;
1178
        else
1179
          NextStDat <= st_WaitCmd;
1180
        end if;
1181
 
1182
      when others => null;
1183
    end case;
1184
 
1185
  end process NEXT_ST_DAT;
1186
 
1187
  OUPUTDEC_DAT : process (StDat, ssovalid, sso, CRC5Dec, CRC16Dec)
1188
  begin  -- process OUPUTDEC_DAT
1189
    CommandDone_i         <= cmd_NULL;
1190
    CommandDoneFlag_i     <= '0';
1191
    -- Counters
1192
    DataCnt_Inc_i         <= '0';
1193
    DataCnt_Clear_i       <= '1';
1194
    RNCnt_Inc_i           <= '0';       -- Used also as "Select.Length" counter
1195
    RNCnt_Clear_i         <= '1';
1196
    CRCCnt_Inc_i          <= '0';
1197
    CRCCnt_Clear_i        <= '1';
1198
    PointerCnt_Inc_i      <= '0';       -- Used also as "Select.Mask" counter
1199
    PointerCnt_Clear_i    <= '1';
1200
    -- Reg CE
1201
    MaskRegEnable_i       <= '0';
1202
    DatRegEnable_i        <= '0';
1203
    PointerRegEnable_i    <= '0';
1204
    LengthWCntRegEnable_i <= '0';
1205
    RNRegEnable_i         <= '0';
1206
    CRCRegEnable_i        <= '0';
1207
    -- Flags
1208
    LastPntByteFlag_i     <= '0';
1209
    FirstPntBitTaken_i    <= '0';
1210
    Pointer_rst_i         <= '0';
1211
 
1212
    case StDat is
1213
 
1214
      -- Select
1215
      when st_Select_GetData1 =>
1216
        DatRegEnable_i  <= '1';
1217
        Pointer_rst_i   <= '1';
1218
        DataCnt_Clear_i <= '0';
1219
        if ssovalid = '1' then
1220
          DataCnt_Inc_i <= '1';
1221
        end if;
1222
      when st_Select_GetPointer =>
1223
        if ssovalid = '1' then
1224
          FirstPntbitTaken_i <= '1';
1225
          if sso = '0' then
1226
            LastPntByteFlag_i <= '1';
1227
          end if;
1228
        end if;
1229
      when st_Select_GetPointer_NotLastByte =>
1230
        PointerRegEnable_i <= '1';
1231
        PointerCnt_Clear_i <= '0';
1232
        if ssovalid = '1' then
1233
          PointerCnt_Inc_i <= '1';
1234
        end if;
1235
      when st_Select_GetPointer_LastByte =>
1236
        PointerRegEnable_i <= '1';
1237
        PointerCnt_Clear_i <= '0';
1238
        if ssovalid = '1' then
1239
          PointerCnt_Inc_i <= '1';
1240
        end if;
1241
      when st_Select_GetLength =>
1242
        LengthWCntRegEnable_i <= '1';
1243
        RNCnt_Clear_i         <= '0';
1244
        if ssovalid = '1' then
1245
          RNCnt_Inc_i <= '1';
1246
        end if;
1247
      when st_Select_GetMask =>
1248
        MaskRegEnable_i    <= '1';
1249
        PointerCnt_Clear_i <= '0';
1250
        if ssovalid = '1' then
1251
          PointerCnt_Inc_i <= '1';
1252
        end if;
1253
      when st_Select_GetData2 =>
1254
        DatRegEnable_i  <= '1';
1255
        DataCnt_Clear_i <= '0';
1256
        if ssovalid = '1' then
1257
          DataCnt_Inc_i <= '1';
1258
        end if;
1259
      when st_Select_GetCRC16 =>
1260
        CRCRegEnable_i <= '1';
1261
        CRCCnt_Clear_i <= '0';
1262
        if ssovalid = '1' then
1263
          CRCCnt_Inc_i <= '1';
1264
        end if;
1265
      when st_Select_Done =>
1266
        CommandDoneFlag_i <= '1';
1267
        if CRC16Dec = X"0000" then
1268
          CommandDone_i <= cmd_Select;
1269
        end if;
1270
 
1271
        -- Query
1272
      when st_Query_GetData =>
1273
        DatRegEnable_i  <= '1';
1274
        DataCnt_Clear_i <= '0';
1275
        if ssovalid = '1' then
1276
          DataCnt_Inc_i <= '1';
1277
        end if;
1278
      when st_Query_GetCRC5 =>
1279
        CRCRegEnable_i <= '1';
1280
        CRCCnt_Clear_i <= '0';
1281
        if ssovalid = '1' then
1282
          CRCCnt_Inc_i <= '1';
1283
        end if;
1284
      when st_Query_Done =>
1285
        CommandDoneFlag_i <= '1';
1286
        if CRC5Dec = "00000" then
1287
          CommandDone_i <= cmd_Query;
1288
        end if;
1289
 
1290
        -- QueryAdjust
1291
      when st_QueryAdjust_GetData =>
1292
        DatRegEnable_i  <= '1';
1293
        DataCnt_Clear_i <= '0';
1294
        if ssovalid = '1' then
1295
          DataCnt_Inc_i <= '1';
1296
        end if;
1297
      when st_QueryAdjust_Done =>
1298
        CommandDoneFlag_i <= '1';
1299
        CommandDone_i     <= cmd_QueryAdjust;
1300
 
1301
        -- QueryRep
1302
      when st_QueryRep_GetData =>
1303
        DatRegEnable_i  <= '1';
1304
        DataCnt_Clear_i <= '0';
1305
        if ssovalid = '1' then
1306
          DataCnt_Inc_i <= '1';
1307
        end if;
1308
      when st_QueryRep_Done =>
1309
        CommandDoneFlag_i <= '1';
1310
        CommandDone_i     <= cmd_QueryRep;
1311
 
1312
        -- Ack
1313
      when st_Ack_GetRN =>
1314
        RNRegEnable_i <= '1';
1315
        RNCnt_Clear_i <= '0';
1316
        if ssovalid = '1' then
1317
          RNCnt_Inc_i <= '1';
1318
        end if;
1319
      when st_Ack_Done =>
1320
        CommandDoneFlag_i <= '1';
1321
        CommandDone_i     <= cmd_Ack;
1322
 
1323
        -- Nak
1324
      when st_Nak_Done =>
1325
        CommandDoneFlag_i <= '1';
1326
        CommandDone_i     <= cmd_Nak;
1327
 
1328
        -- ReqRN
1329
      when st_ReqRN_GetRN =>
1330
        RNRegEnable_i <= '1';
1331
        RNCnt_Clear_i <= '0';
1332
        if ssovalid = '1' then
1333
          RNCnt_Inc_i <= '1';
1334
        end if;
1335
      when st_ReqRN_GetCRC16 =>
1336
        CRCRegEnable_i <= '1';
1337
        CRCCnt_Clear_i <= '0';
1338
        if ssovalid = '1' then
1339
          CRCCnt_Inc_i <= '1';
1340
        end if;
1341
      when st_ReqRN_Done =>
1342
        CommandDoneFlag_i <= '1';
1343
        if CRC16Dec = X"0000" then
1344
          CommandDone_i <= cmd_ReqRN;
1345
        end if;
1346
 
1347
        -- Read
1348
      when st_Read_GetData1 =>
1349
        Pointer_rst_i   <= '1';
1350
        DatRegEnable_i  <= '1';
1351
        DataCnt_Clear_i <= '0';
1352
        if ssovalid = '1' then
1353
          DataCnt_Inc_i <= '1';
1354
        end if;
1355
      when st_Read_GetWordPtr =>
1356
        if ssovalid = '1' then
1357
          FirstPntbitTaken_i <= '1';
1358
          if sso = '0' then
1359
            LastPntByteFlag_i <= '1';
1360
          end if;
1361
        end if;
1362
      when st_Read_GetWordPtr_NotLastByte =>
1363
        PointerRegEnable_i <= '1';
1364
        PointerCnt_Clear_i <= '0';
1365
        if ssovalid = '1' then
1366
          PointerCnt_Inc_i <= '1';
1367
        end if;
1368
      when st_Read_GetWordPtr_LastByte =>
1369
        PointerRegEnable_i <= '1';
1370
        PointerCnt_Clear_i <= '0';
1371
        if ssovalid = '1' then
1372
          PointerCnt_Inc_i <= '1';
1373
        end if;
1374
      when st_Read_GetLength =>
1375
        --DatRegEnable_i  <= '1';
1376
        LengthWCntRegEnable_i <= '1';
1377
        DataCnt_Clear_i       <= '0';
1378
        if ssovalid = '1' then
1379
          DataCnt_Inc_i <= '1';
1380
        end if;
1381
      when st_Read_GetRN =>
1382
        RNRegEnable_i <= '1';
1383
        RNCnt_Clear_i <= '0';
1384
        if ssovalid = '1' then
1385
          RNCnt_Inc_i <= '1';
1386
        end if;
1387
      when st_Read_GetCRC16 =>
1388
        CRCRegEnable_i <= '1';
1389
        CRCCnt_Clear_i <= '0';
1390
        if ssovalid = '1' then
1391
          CRCCnt_Inc_i <= '1';
1392
        end if;
1393
      when st_Read_Done =>
1394
        CommandDoneFlag_i <= '1';
1395
        if CRC16Dec = X"0000" then
1396
          CommandDone_i <= cmd_Read;
1397
        end if;
1398
 
1399
        -- Write
1400
      when st_Write_GetData1 =>
1401
        DatRegEnable_i  <= '1';
1402
        Pointer_rst_i   <= '1';
1403
        DataCnt_Clear_i <= '0';
1404
        if ssovalid = '1' then
1405
          DataCnt_Inc_i <= '1';
1406
        end if;
1407
      when st_Write_GetWordPtr =>
1408
        if ssovalid = '1' then
1409
          FirstPntbitTaken_i <= '1';
1410
          if sso = '0' then
1411
            LastPntByteFlag_i <= '1';
1412
          end if;
1413
        end if;
1414
      when st_Write_GetWordPtr_NotLastByte =>
1415
        PointerRegEnable_i <= '1';
1416
        PointerCnt_Clear_i <= '0';
1417
        if ssovalid = '1' then
1418
          PointerCnt_Inc_i <= '1';
1419
        end if;
1420
      when st_Write_GetWordPtr_LastByte =>
1421
        PointerRegEnable_i <= '1';
1422
        PointerCnt_Clear_i <= '0';
1423
        if ssovalid = '1' then
1424
          PointerCnt_Inc_i <= '1';
1425
        end if;
1426
      when st_Write_GetData2 =>
1427
        DatRegEnable_i  <= '1';
1428
        DataCnt_Clear_i <= '0';
1429
        if ssovalid = '1' then
1430
          DataCnt_Inc_i <= '1';
1431
        end if;
1432
      when st_Write_GetRN =>
1433
        RNRegEnable_i <= '1';
1434
        RNCnt_Clear_i <= '0';
1435
        if ssovalid = '1' then
1436
          RNCnt_Inc_i <= '1';
1437
        end if;
1438
      when st_Write_GetCRC16 =>
1439
        CRCRegEnable_i <= '1';
1440
        CRCCnt_Clear_i <= '0';
1441
        if ssovalid = '1' then
1442
          CRCCnt_Inc_i <= '1';
1443
        end if;
1444
      when st_Write_Done =>
1445
        CommandDoneFlag_i <= '1';
1446
        if CRC16Dec = X"0000" then
1447
          CommandDone_i <= cmd_Write;
1448
        end if;
1449
 
1450
        -- Kill
1451
      when st_Kill_GetData =>
1452
        DatRegEnable_i  <= '1';
1453
        DataCnt_Clear_i <= '0';
1454
        if ssovalid = '1' then
1455
          DataCnt_Inc_i <= '1';
1456
        end if;
1457
      when st_Kill_GetRN =>
1458
        RNRegEnable_i <= '1';
1459
        RNCnt_Clear_i <= '0';
1460
        if ssovalid = '1' then
1461
          RNCnt_Inc_i <= '1';
1462
        end if;
1463
      when st_Kill_GetCRC16 =>
1464
        CRCRegEnable_i <= '1';
1465
        CRCCnt_Clear_i <= '0';
1466
        if ssovalid = '1' then
1467
          CRCCnt_Inc_i <= '1';
1468
        end if;
1469
      when st_Kill_Done =>
1470
        CommandDoneFlag_i <= '1';
1471
        if CRC16Dec = X"0000" then
1472
          CommandDone_i <= cmd_Kill;
1473
        end if;
1474
 
1475
        -- Lock
1476
      when st_Lock_GetData =>
1477
        DatRegEnable_i  <= '1';
1478
        DataCnt_Clear_i <= '0';
1479
        if ssovalid = '1' then
1480
          DataCnt_Inc_i <= '1';
1481
        end if;
1482
      when st_Lock_GetRN =>
1483
        RNRegEnable_i <= '1';
1484
        RNCnt_Clear_i <= '0';
1485
        if ssovalid = '1' then
1486
          RNCnt_Inc_i <= '1';
1487
        end if;
1488
      when st_Lock_GetCRC16 =>
1489
        CRCRegEnable_i <= '1';
1490
        CRCCnt_Clear_i <= '0';
1491
        if ssovalid = '1' then
1492
          CRCCnt_Inc_i <= '1';
1493
        end if;
1494
      when st_Lock_Done =>
1495
        CommandDoneFlag_i <= '1';
1496
        if CRC16Dec = X"0000" then
1497
          CommandDone_i <= cmd_Lock;
1498
        end if;
1499
 
1500
        -- Access (not fully implemented)
1501
      when st_Access_GetData =>
1502
        DatRegEnable_i  <= '1';
1503
        DataCnt_Clear_i <= '0';
1504
        if ssovalid = '1' then
1505
          DataCnt_Inc_i <= '1';
1506
        end if;
1507
      when st_Access_GetRN =>
1508
        RNRegEnable_i <= '1';
1509
        RNCnt_Clear_i <= '0';
1510
        if ssovalid = '1' then
1511
          RNCnt_Inc_i <= '1';
1512
        end if;
1513
      when st_Access_GetCRC16 =>
1514
        CRCRegEnable_i <= '1';
1515
        CRCCnt_Clear_i <= '0';
1516
        if ssovalid = '1' then
1517
          CRCCnt_Inc_i <= '1';
1518
        end if;
1519
      when st_Access_Done =>
1520
        CommandDoneFlag_i <= '1';
1521
        CommandDone_i     <= cmd_Access;
1522
 
1523
        -- BlockWrite (not fully implemented)
1524
      when st_BlockWrite_GetData =>
1525
        DatRegEnable_i  <= '1';
1526
        DataCnt_Clear_i <= '0';
1527
        if ssovalid = '1' then
1528
          DataCnt_Inc_i <= '1';
1529
        end if;
1530
      when st_BlockWrite_GetRN =>
1531
        RNRegEnable_i <= '1';
1532
        RNCnt_Clear_i <= '0';
1533
        if ssovalid = '1' then
1534
          RNCnt_Inc_i <= '1';
1535
        end if;
1536
      when st_BlockWrite_GetCRC16 =>
1537
        CRCRegEnable_i <= '1';
1538
        CRCCnt_Clear_i <= '0';
1539
        if ssovalid = '1' then
1540
          CRCCnt_Inc_i <= '1';
1541
        end if;
1542
      when st_BlockWrite_Done =>
1543
        CommandDoneFlag_i <= '1';
1544
        CommandDone_i     <= cmd_BlockWrite;
1545
 
1546
        -- BlockErase (not fully implemented)
1547
      when st_BlockErase_GetData1 =>
1548
        DatRegEnable_i  <= '1';
1549
        DataCnt_Clear_i <= '0';
1550
        if ssovalid = '1' then
1551
          DataCnt_Inc_i <= '1';
1552
        end if;
1553
      when st_BlockErase_GetData2 =>
1554
        DatRegEnable_i  <= '1';
1555
        DataCnt_Clear_i <= '0';
1556
        if ssovalid = '1' then
1557
          DataCnt_Inc_i <= '1';
1558
        end if;
1559
      when st_BlockErase_GetRN =>
1560
        RNRegEnable_i <= '1';
1561
        RNCnt_Clear_i <= '0';
1562
        if ssovalid = '1' then
1563
          RNCnt_Inc_i <= '1';
1564
        end if;
1565
      when st_BlockErase_GetCRC16 =>
1566
        CRCRegEnable_i <= '1';
1567
        CRCCnt_Clear_i <= '0';
1568
        if ssovalid = '1' then
1569
          CRCCnt_Inc_i <= '1';
1570
        end if;
1571
      when st_BlockErase_Done =>
1572
        CommandDoneFlag_i <= '1';
1573
        CommandDone_i     <= cmd_BlockErase;
1574
 
1575
 
1576
      when others => null;
1577
    end case;
1578
 
1579
  end process OUPUTDEC_DAT;
1580
 
1581
 
1582
-------------------------------------------------------------------------------
1583
-- Data Shift Registers
1584
-------------------------------------------------------------------------------  
1585
 
1586
  -- 16 bit register:
1587
  -- RN 16 
1588
  RN16_SHREG : shiftreg
1589
    generic map (
1590
      REGWD => 16)
1591
    port map (
1592
      clk   => clk,
1593
      rst_n => rst_n,
1594
      ce    => RN16_ce,
1595
      sin   => sso,
1596
      pout  => RN16_o);
1597
 
1598
  RN16_ce <= ssovalid and RNRegEnable;
1599
 
1600
 
1601
  -- 16 bit register:
1602
  -- CRC 16 
1603
  CRC16_SHREG : shiftreg
1604
    generic map (
1605
      REGWD => 16)
1606
    port map (
1607
      clk   => clk,
1608
      rst_n => rst_n,
1609
      ce    => CRC16_ce,
1610
      sin   => sso,
1611
      pout  => CRC16_o);
1612
 
1613
  CRC16_ce <= ssovalid and CRCRegEnable;
1614
 
1615
 
1616
  -- 32 Register
1617
  -- General Purpose Register
1618
  GPREG_SHREG : shiftreg
1619
    generic map (
1620
      REGWD => 32)
1621
    port map (
1622
      clk   => clk,
1623
      rst_n => rst_n,
1624
      ce    => GPReg_ce,
1625
      sin   => sso,
1626
      pout  => GPReg_o);
1627
 
1628
  GPReg_ce <= ssovalid and DatRegEnable;
1629
 
1630
 
1631
  -- 16 bit register:
1632
  -- Pointer register 
1633
  POINTER_SHREG : shiftreg
1634
    generic map (
1635
      REGWD => 16)
1636
    port map (
1637
      clk   => clk,
1638
      rst_n => Pointer_NOTrst,
1639
      ce    => Pointer_ce,
1640
      sin   => sso,
1641
      pout  => Pointer_o);
1642
 
1643
  Pointer_NOTrst <= not(Pointer_rst) and rst_n;
1644
  Pointer_ce     <= ssovalid and PointerRegEnable;
1645
 
1646
 
1647
  -- 8 bit register
1648
  -- Length/WordCount Register
1649
  LNT_SHREG : shiftreg
1650
    generic map (
1651
      REGWD => 8)
1652
    port map (
1653
      clk   => clk,
1654
      rst_n => rst_n,
1655
      ce    => LengthWCnt_ce,
1656
      sin   => sso,
1657
      pout  => LengthWCnt_o);
1658
 
1659
  LengthWCnt_ce <= ssovalid and LengthWCntRegEnable;
1660
 
1661
  -- MASKLENGTH bit register (def: 256 bit)
1662
  -- MASK Register
1663
  MASK_SHREG : shiftreg
1664
    generic map (
1665
      REGWD => MASKLENGTH)
1666
    port map (
1667
      clk   => clk,
1668
      rst_n => rst_n,
1669
      ce    => MaskReg_ce,
1670
      sin   => sso,
1671
      pout  => MaskReg_o);
1672
 
1673
  MaskReg_ce <= ssovalid and MaskRegEnable;
1674
 
1675
 
1676
-------------------------------------------------------------------------------
1677
-- Counters
1678
-------------------------------------------------------------------------------
1679
 
1680
  -- DataCnt
1681
  DataCnt_i : COUNTERCLR
1682
    generic map (
1683
      width => 8)
1684
    port map (
1685
      clk    => clk,
1686
      rst_n  => rst_n,
1687
      en     => DataCnt_Inc,
1688
      clear  => DataCnt_Clear,
1689
      outcnt => DataCnt);
1690
 
1691
  -- PointerCnt
1692
  PointerCnt_i : COUNTERCLR
1693
    generic map (
1694
      width => 8)
1695
    port map (
1696
      clk    => clk,
1697
      rst_n  => rst_n,
1698
      en     => PointerCnt_Inc,
1699
      clear  => PointerCnt_Clear,
1700
      outcnt => PointerCnt);
1701
 
1702
  -- RNCnt
1703
  RNCnt_i : COUNTERCLR
1704
    generic map (
1705
      width => 8)
1706
    port map (
1707
      clk    => clk,
1708
      rst_n  => rst_n,
1709
      en     => RNCnt_Inc,
1710
      clear  => RNCnt_Clear,
1711
      outcnt => RNCnt);
1712
 
1713
  -- CRCCnt
1714
  CRCCnt_i : COUNTERCLR
1715
    generic map (
1716
      width => 8)
1717
    port map (
1718
      clk    => clk,
1719
      rst_n  => rst_n,
1720
      en     => CRCCnt_Inc,
1721
      clear  => CRCCnt_Clear,
1722
      outcnt => CRCCnt);
1723
 
1724
-------------------------------------------------------------------------------
1725
-- CRC 5 & 16
1726
-------------------------------------------------------------------------------
1727
 
1728
  crc5encdec_i : crc5encdec
1729
    generic map (
1730
      PRESET_CRC5 => PRESET_CRC5)
1731
    port map (
1732
      clk   => clk,
1733
      rst_n => rst_n,
1734
      init  => CRC5Init,
1735
      ce    => CRC5ce,
1736
      sdi   => sso,
1737
      cout  => CRC5Dec);
1738
 
1739
  CRC5ce <= ssovalid;
1740
 
1741
 
1742
  crc16encdec_i : crc16encdec
1743
    generic map (
1744
      PRESET_CRC16 => PRESET_CRC16)
1745
    port map (
1746
      clk   => clk,
1747
      rst_n => rst_n,
1748
      init  => CRC16Init,
1749
      ce    => CRC16ce,
1750
      sdi   => sso,
1751
      cout  => CRC16Dec);
1752
 
1753
  CRC16ce <= ssovalid;
1754
 
1755
-------------------------------------------------------------------------------
1756
-- Output Signals
1757
-------------------------------------------------------------------------------
1758
 
1759
  CommDone  <= CommandDone;
1760
  Data_r    <= GPReg_o;
1761
  CRC_r     <= CRC16_o;
1762
  Pointer_r <= Pointer_o;
1763
  RN16_r    <= RN16_o;
1764
  Mask_r    <= MaskReg_o;
1765
  Length_r  <= LengthWCnt_o;
1766
 
1767
 
1768
-------------------------------------------------------------------------------
1769
-- Symbol Decoder
1770
-------------------------------------------------------------------------------
1771
  SymbolDecoder_i : SymbolDecoder
1772
    generic map (
1773
      LOG2_10_TARI_CK_CYC        => LOG2_10_TARI_CK_CYC,
1774
      DELIMITIER_TIME_CK_CYC_MIN => DELIMITIER_TIME_CK_CYC_MIN,
1775
      DELIMITIER_TIME_CK_CYC_MAX => DELIMITIER_TIME_CK_CYC_MAX)
1776
    port map (
1777
      clk      => clk,
1778
      rst_n    => rst_n,
1779
      tdi      => tdi,
1780
      en       => en,
1781
      start    => StartSDec,
1782
      sserror  => sserror,
1783
      ssovalid => ssovalid,
1784
      sso      => sso);
1785
 
1786
 
1787
end CommandDec1;

powered by: WebSVN 2.1.0

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