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 3

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

powered by: WebSVN 2.1.0

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