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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.61/] [rtl/] [bplib/] [fx2lib/] [fx2_2fifoctl_as.vhd] - Blame information for rev 27

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

Line No. Rev Author Line
1 17 wfjm
-- $Id: fx2_2fifoctl_as.vhd 453 2012-01-15 17:51:18Z mueller $
2
--
3
-- Copyright 2011-2012 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4
--
5
-- This program is free software; you may redistribute and/or modify it under
6
-- the terms of the GNU General Public License as published by the Free
7
-- Software Foundation, either version 2, or at your option any later version.
8
--
9
-- This program is distributed in the hope that it will be useful, but
10
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
11
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12
-- for complete details.
13
-- 
14
------------------------------------------------------------------------------
15
-- Module Name:    fx2_2fifoctl_as - syn
16
-- Description:    Cypress EZ-USB FX2 driver (2 fifo; async)
17
--
18
-- Dependencies:   vlib/xlib/iob_reg_o
19
--                 vlib/xlib/iob_reg_i_gen
20
--                 vlib/xlib/iob_reg_o_gen
21
--                 vlib/xlib/iob_reg_io_gen
22
--                 memlib/fifo_1c_dram
23
--
24
-- Test bench:     -
25
-- Target Devices: generic
26
-- Tool versions:  xst 12.1, 13.1, 13.3; ghdl 0.26-0.29
27
--
28
-- Synthesized (xst):
29
-- Date         Rev  ise         Target      flop lutl lutm slic t peri
30
-- 2012-01-14   453  13.3   O76x xc3s1200e-4   65  153   64  133 s  7.2
31
-- 2012-01-03   449  13.3   O76x xc3s1200e-4   67  149   64  133 s  7.2
32
-- 2011-12-25   445  13.3   O76x xc3s1200e-4   61  147   64  127 s  7.2
33
-- 2011-12-25   444  13.3   O76x xc3s1200e-4   54  140   64  123 s  7.2
34
-- 2011-07-07   389  12.1   M53d xc3s1200e-4   45  132   64  109 s  7.9
35
--
36
-- Revision History: 
37
-- Date         Rev Version  Comment
38
-- 2012-01-14   453   1.3    common DELAY for PE and WR; use aempty/afull logic
39
-- 2012-01-04   450   1.2.2  use new FLAG layout (EF,FF now fixed)
40
-- 2012-01-03   449   1.2.1  use new fx2ctl_moni layout; hardcode ep's
41
-- 2011-12-25   445   1.2    change pktend handling, now timer based
42
-- 2011-11-25   433   1.1.1  now numeric_std clean
43
-- 2011-07-30   400   1.1    capture rx data in 2nd last s_rdpwh cycle
44
-- 2011-07-24   389   1.0.2  use FX2_FLAG_N to signal that flags are act.low
45
-- 2011-07-17   394   1.0.1  (RX|TX)FIFOEP now generics; add MONI port
46
-- 2011-07-08   390   1.0    Initial version 
47
--
48
------------------------------------------------------------------------------
49
 
50
library ieee;
51
use ieee.std_logic_1164.all;
52
use ieee.numeric_std.all;
53
 
54
use work.slvtypes.all;
55
use work.xlib.all;
56
use work.memlib.all;
57
use work.fx2lib.all;
58
 
59
entity fx2_2fifoctl_as is               -- EZ-USB FX2 driver (2 fifo; async)
60
  generic (
61
    RXFAWIDTH : positive :=  5;         -- receive  fifo address width
62
    TXFAWIDTH : positive :=  5;         -- transmit fifo address width
63
    PETOWIDTH : positive :=  7;         -- packet end time-out counter width
64
    CCWIDTH :   positive :=  5;         -- chunk counter width
65
    RXAEMPTY_THRES : natural := 1;      -- threshold for rx aempty flag
66
    TXAFULL_THRES  : natural := 1;      -- threshold for tx afull flag
67
    RDPWLDELAY : positive := 5;         -- slrd low  delay in clock cycles
68
    RDPWHDELAY : positive := 5;         -- slrd high delay in clock cycles
69
    WRPWLDELAY : positive := 5;         -- slwr low  delay in clock cycles
70
    WRPWHDELAY : positive := 7;         -- slwr high delay in clock cycles
71
    FLAGDELAY  : positive := 2);        -- flag delay in clock cycles
72
  port (
73
    CLK : in slbit;                     -- clock
74
    CE_USEC : in slbit;                 -- 1 usec clock enable
75
    RESET : in slbit := '0';            -- reset
76
    RXDATA : out slv8;                  -- receive data out
77
    RXVAL : out slbit;                  -- receive data valid
78
    RXHOLD : in slbit;                  -- receive data hold
79
    RXAEMPTY : out slbit;               -- receive almost empty flag
80
    TXDATA : in slv8;                   -- transmit data in
81
    TXENA : in slbit;                   -- transmit data enable
82
    TXBUSY : out slbit;                 -- transmit data busy
83
    TXAFULL : out slbit;                -- transmit almost full flag
84
    MONI : out fx2ctl_moni_type;        -- monitor port data
85
    I_FX2_IFCLK : in slbit;             -- fx2: interface clock
86
    O_FX2_FIFO : out slv2;              -- fx2: fifo address
87
    I_FX2_FLAG : in slv4;               -- fx2: fifo flags
88
    O_FX2_SLRD_N : out slbit;           -- fx2: read enable    (act.low)
89
    O_FX2_SLWR_N : out slbit;           -- fx2: write enable   (act.low)
90
    O_FX2_SLOE_N : out slbit;           -- fx2: output enable  (act.low)
91
    O_FX2_PKTEND_N : out slbit;         -- fx2: packet end     (act.low)
92
    IO_FX2_DATA : inout slv8            -- fx2: data lines
93
  );
94
end fx2_2fifoctl_as;
95
 
96
 
97
architecture syn of fx2_2fifoctl_as is
98
 
99
  constant c_rxfifo : slv2 := c_fifo_ep4;
100
  constant c_txfifo : slv2 := c_fifo_ep6;
101
 
102
  constant c_flag_prog   : integer := 0;
103
  constant c_flag_tx_ff  : integer := 1;
104
  constant c_flag_rx_ef  : integer := 2;
105
  constant c_flag_tx2_ff : integer := 3;
106
 
107
  type state_type is (
108
    s_init,                             -- s_init: init state
109
    s_rdprep,                           -- s_rdprep: prepare read
110
    s_rdwait,                           -- s_rdwait: wait for data
111
    s_rdpwl,                            -- s_rdpwl: read, strobe low
112
    s_rdpwh,                            -- s_rdpwh: read, strobe high
113
    s_wrprep,                           -- s_wrprep: prepare write
114
    s_wrpwl,                            -- s_wrpwl: write, strobe low
115
    s_wrpwh,                            -- s_wrpwh: write, strobe high
116
    s_peprep,                           -- s_peprep: prepare pktend
117
    s_pepwl,                            -- s_pepwl: pktend, strobe low
118
    s_pepwh                             -- s_pepwh: pktend, strobe high
119
  );
120
 
121
  type regs_type is record
122
    state : state_type;                 -- state
123
    petocnt : slv(PETOWIDTH-1 downto 0);  -- pktend time out counter
124
    pepend : slbit;                     -- pktend pending
125
    dlycnt : slv4;                      -- wait delay counter
126
    moni_ep4_sel : slbit;               -- ep4 (rx) select
127
    moni_ep6_sel : slbit;               -- ep6 (tx) select
128
    moni_ep4_pf : slbit;                -- ep4 (rx) prog flag
129
    moni_ep6_pf : slbit;                -- ep6 (rx) prog flag
130
  end record regs_type;
131
 
132
  constant petocnt_init : slv(PETOWIDTH-1 downto 0) := (others=>'0');
133
 
134
  constant regs_init : regs_type := (
135
    s_init,                             -- state
136
    petocnt_init,                       -- petocnt
137
    '0',                                -- pepend
138
    (others=>'0'),                      -- cntdly
139
    '0','0',                            -- moni_ep(4|6)_sel
140
    '0','0'                             -- moni_ep(4|6)_pf
141
  );
142
 
143
  signal R_REGS : regs_type := regs_init;  -- state registers
144
  signal N_REGS : regs_type := regs_init;  -- next value state regs
145
 
146
  signal FX2_FIFO     : slv2 := (others=>'0');
147
  signal FX2_FIFO_CE  : slbit := '0';
148
  signal FX2_FLAG_N   : slv4 := (others=>'0');
149
  signal FX2_SLRD_N   : slbit := '1';
150
  signal FX2_SLWR_N   : slbit := '1';
151
  signal FX2_SLOE_N   : slbit := '1';
152
  signal FX2_PKTEND_N : slbit := '1';
153
  signal FX2_DATA_CEI : slbit := '0';
154
  signal FX2_DATA_CEO : slbit := '0';
155
  signal FX2_DATA_OE  : slbit := '0';
156
 
157
  signal RXFIFO_DI  : slv8 := (others=>'0');
158
  signal RXFIFO_ENA  : slbit := '0';
159
  signal RXFIFO_BUSY : slbit := '0';
160
  signal RXSIZE  : slv(RXFAWIDTH downto 0) := (others=>'0');
161
  signal TXFIFO_DO   : slv8 := (others=>'0');
162
  signal TXFIFO_VAL  : slbit := '0';
163
  signal TXFIFO_HOLD : slbit := '0';
164
  signal TXSIZE  : slv(TXFAWIDTH downto 0) := (others=>'0');
165
 
166
  signal TXBUSY_L : slbit := '0';
167
 
168
begin
169
 
170
  assert RDPWLDELAY<=2**R_REGS.dlycnt'length and
171
         RDPWHDELAY<=2**R_REGS.dlycnt'length and RDPWHDELAY>=2 and
172
         WRPWLDELAY<=2**R_REGS.dlycnt'length and
173
         WRPWHDELAY<=2**R_REGS.dlycnt'length and
174
         FLAGDELAY<=2**R_REGS.dlycnt'length
175
    report "assert(*DELAY <= 2**dlycnt'length and RDPWHDELAY >=2)"
176
    severity failure;
177
 
178
  assert RXAEMPTY_THRES<=2**RXFAWIDTH and
179
         TXAFULL_THRES<=2**TXFAWIDTH
180
    report "assert((RXAEMPTY|TXAFULL)_THRES <= 2**(RX|TX)FAWIDTH)"
181
    severity failure;
182
 
183
  IOB_FX2_FIFO : iob_reg_o_gen
184
    generic map (
185
      DWIDTH => 2,
186
      INIT   => '0')
187
    port map (
188
      CLK => CLK,
189
      CE  => FX2_FIFO_CE,
190
      DO  => FX2_FIFO,
191
      PAD => O_FX2_FIFO
192
    );
193
 
194
  IOB_FX2_FLAG : iob_reg_i_gen
195
    generic map (
196
      DWIDTH => 4,
197
      INIT   => '0')
198
    port map (
199
      CLK => CLK,
200
      CE  => '1',
201
      DI  => FX2_FLAG_N,
202
      PAD => I_FX2_FLAG
203
    );
204
 
205
  IOB_FX2_SLRD : iob_reg_o
206
    generic map (
207
      INIT   => '1')
208
    port map (
209
      CLK => CLK,
210
      CE  => '1',
211
      DO  => FX2_SLRD_N,
212
      PAD => O_FX2_SLRD_N
213
    );
214
 
215
  IOB_FX2_SLWR : iob_reg_o
216
    generic map (
217
      INIT   => '1')
218
    port map (
219
      CLK => CLK,
220
      CE  => '1',
221
      DO  => FX2_SLWR_N,
222
      PAD => O_FX2_SLWR_N
223
    );
224
 
225
  IOB_FX2_SLOE : iob_reg_o
226
    generic map (
227
      INIT   => '1')
228
    port map (
229
      CLK => CLK,
230
      CE  => '1',
231
      DO  => FX2_SLOE_N,
232
      PAD => O_FX2_SLOE_N
233
    );
234
 
235
  IOB_FX2_PKTEND : iob_reg_o
236
    generic map (
237
      INIT   => '1')
238
    port map (
239
      CLK => CLK,
240
      CE  => '1',
241
      DO  => FX2_PKTEND_N,
242
      PAD => O_FX2_PKTEND_N
243
    );
244
 
245
  IOB_FX2_DATA : iob_reg_io_gen
246
    generic map (
247
      DWIDTH => 8,
248
      PULL   => "KEEP")
249
    port map (
250
      CLK => CLK,
251
      CEI => FX2_DATA_CEI,
252
      CEO => FX2_DATA_CEO,
253
      OE  => FX2_DATA_OE,
254
      DI  => RXFIFO_DI,                 -- input data   (read from pad)
255
      DO  => TXFIFO_DO,                 -- output data  (write  to pad)
256
      PAD => IO_FX2_DATA
257
    );
258
 
259
  RXFIFO : fifo_1c_dram                -- input fifo, 1 clock, dram based
260
    generic map (
261
      AWIDTH => RXFAWIDTH,
262
      DWIDTH => 8)
263
    port map (
264
      CLK   => CLK,
265
      RESET => RESET,
266
      DI    => RXFIFO_DI,
267
      ENA   => RXFIFO_ENA,
268
      BUSY  => RXFIFO_BUSY,
269
      DO    => RXDATA,
270
      VAL   => RXVAL,
271
      HOLD  => RXHOLD,
272
      SIZE  => RXSIZE
273
    );
274
 
275
  TXFIFO : fifo_1c_dram                -- output fifo, 1 clock, dram based
276
    generic map (
277
      AWIDTH => TXFAWIDTH,
278
      DWIDTH => 8)
279
    port map (
280
      CLK   => CLK,
281
      RESET => RESET,
282
      DI    => TXDATA,
283
      ENA   => TXENA,
284
      BUSY  => TXBUSY_L,
285
      DO    => TXFIFO_DO,
286
      VAL   => TXFIFO_VAL,
287
      HOLD  => TXFIFO_HOLD,
288
      SIZE  => TXSIZE
289
    );
290
 
291
  proc_regs: process (CLK)
292
  begin
293
 
294
    if rising_edge(CLK) then
295
      if RESET = '1' then
296
        R_REGS <= regs_init;
297
      else
298
        R_REGS <= N_REGS;
299
      end if;
300
    end if;
301
 
302
  end process proc_regs;
303
 
304
  proc_next: process (R_REGS, CE_USEC,
305
                      FX2_FLAG_N, TXFIFO_VAL, RXFIFO_BUSY, TXBUSY_L)
306
 
307
    variable r : regs_type := regs_init;
308
    variable n : regs_type := regs_init;
309
 
310
    variable idly_ld   : slbit := '0';
311
    variable idly_val  : slv(r.dlycnt'range) := (others=>'0');
312
    variable idly_end  : slbit := '0';
313
    variable idly_end1 : slbit := '0';
314
 
315
    variable iflag_rdok : slbit := '0';
316
    variable iflag_wrok : slbit := '0';
317
 
318
    variable ififo_ce : slbit := '0';
319
    variable ififo    : slv2 := "00";
320
 
321
    variable irxfifo_ena  : slbit := '0';
322
    variable itxfifo_hold : slbit := '0';
323
 
324
    variable islrd   : slbit := '0';
325
    variable islwr   : slbit := '0';
326
    variable isloe   : slbit := '0';
327
    variable ipktend : slbit := '0';
328
 
329
    variable idata_cei : slbit := '0';
330
    variable idata_ceo : slbit := '0';
331
    variable idata_oe  : slbit := '0';
332
 
333
    variable imoni  : fx2ctl_moni_type := fx2ctl_moni_init;
334
 
335
    procedure go_rdprep(nstate   : out state_type;
336
                        idly_ld  : out slbit;
337
                        idly_val : out slv4;
338
                        ififo_ce : out slbit;
339
                        ififo    : out slv2) is
340
    begin
341
      idly_ld  := '1';
342
      idly_val := slv(to_unsigned(FLAGDELAY-1, idly_val'length));
343
      ififo_ce := '1';
344
      ififo    := c_rxfifo;
345
      nstate   := s_rdprep;
346
    end procedure go_rdprep;
347
 
348
    procedure go_wrprep(nstate   : out state_type;
349
                        idly_ld  : out slbit;
350
                        idly_val : out slv4;
351
                        ififo_ce : out slbit;
352
                        ififo    : out slv2) is
353
    begin
354
      idly_ld  := '1';
355
      idly_val := slv(to_unsigned(FLAGDELAY-1, idly_val'length));
356
      ififo_ce := '1';
357
      ififo    := c_txfifo;
358
      nstate   := s_wrprep;
359
    end procedure go_wrprep;
360
 
361
    procedure go_peprep(nstate   : out state_type;
362
                        idly_ld  : out slbit;
363
                        idly_val : out slv4;
364
                        ififo_ce : out slbit;
365
                        ififo    : out slv2) is
366
    begin
367
      idly_ld  := '1';
368
      idly_val := slv(to_unsigned(FLAGDELAY-1, idly_val'length));
369
      ififo_ce := '1';
370
      ififo    := c_txfifo;
371
      nstate   := s_peprep;
372
    end procedure go_peprep;
373
 
374
    procedure go_rdpwl(nstate   : out state_type;
375
                       idly_ld  : out slbit;
376
                       idly_val : out slv4;
377
                       islrd    : out slbit) is
378
    begin
379
      idly_ld  := '1';
380
      idly_val := slv(to_unsigned(RDPWLDELAY-1, n.dlycnt'length));
381
      islrd    := '1';
382
      nstate   := s_rdpwl;
383
    end procedure go_rdpwl;
384
 
385
    procedure go_wrpwl(nstate   : out state_type;
386
                       idly_ld  : out slbit;
387
                       idly_val : out slv4;
388
                       islwr    : out slbit) is
389
    begin
390
      idly_ld  := '1';
391
      idly_val := slv(to_unsigned(WRPWLDELAY-1, n.dlycnt'length));
392
      islwr    := '1';
393
      nstate   := s_wrpwl;
394
    end procedure go_wrpwl;
395
 
396
    procedure go_pepwl(nstate   : out state_type;
397
                       idly_ld  : out slbit;
398
                       idly_val : out slv4;
399
                       ipktend  : out slbit) is
400
    begin
401
      idly_ld  := '1';
402
      idly_val := slv(to_unsigned(WRPWLDELAY-1, n.dlycnt'length));
403
      ipktend  := '1';
404
      nstate   := s_pepwl;
405
    end procedure go_pepwl;
406
 
407
  begin
408
 
409
    r := R_REGS;
410
    n := R_REGS;
411
 
412
    ififo_ce := '0';
413
    ififo    := "00";
414
 
415
    irxfifo_ena  := '0';
416
    itxfifo_hold := '1';
417
 
418
    islrd   := '0';
419
    islwr   := '0';
420
    isloe   := '0';
421
    ipktend := '0';
422
 
423
    idata_cei := '0';
424
    idata_ceo := '0';
425
    idata_oe  := '0';
426
 
427
    imoni := fx2ctl_moni_init;
428
 
429
    iflag_rdok := FX2_FLAG_N(c_flag_rx_ef);      -- empty flag is act.low!
430
    iflag_wrok := FX2_FLAG_N(c_flag_tx_ff);      --  full flag is act.low!
431
 
432
    idly_ld   := '0';
433
    idly_val  := (others=>'0');
434
    idly_end  := '1';
435
    idly_end1 := '0';
436
    if unsigned(r.dlycnt) /= 0 then
437
      idly_end := '0';
438
    end if;
439
    if unsigned(r.dlycnt) = 1 then
440
      idly_end1 := '1';
441
    end if;
442
 
443
    case r.state is
444
      when s_init =>                    -- s_init:
445
        go_rdprep(n.state, idly_ld, idly_val, ififo_ce, ififo);
446
 
447
      when s_rdprep =>                  -- s_rdprep: prepare read
448
        if idly_end = '1' then
449
          n.state := s_rdwait;
450
        end if;
451
 
452
      when s_rdwait =>                  -- s_rdwait: wait for data
453
        if r.pepend='1' and TXFIFO_VAL='0' then
454
          go_peprep(n.state, idly_ld, idly_val, ififo_ce, ififo);
455
 
456
        elsif iflag_rdok='1' and
457
             (RXFIFO_BUSY='0' and TXBUSY_L='0') then
458
          go_rdpwl(n.state, idly_ld, idly_val, islrd);
459
 
460
        elsif TXFIFO_VAL = '1' then
461
          go_wrprep(n.state, idly_ld, idly_val, ififo_ce, ififo);
462
        end if;
463
 
464
      when s_rdpwl =>                   -- s_rdpwl: read, strobe low
465
        idata_cei := '1';
466
        isloe     := '1';
467
        if idly_end = '1' then
468
          idly_ld  := '1';
469
          idly_val := slv(to_unsigned(RDPWHDELAY-1, n.dlycnt'length));
470
          n.state  := s_rdpwh;
471
        else
472
          islrd    := '1';
473
          n.state  := s_rdpwl;
474
        end if;
475
 
476
      -- Note: data is sampled and written into rxfifo in 2nd last cycle in the
477
      --       last cycle the rxfifo busy reflects therefore last written byte
478
      --       and safely indicates whether another byte will fit.
479
      when s_rdpwh =>                   -- s_rdpwh: read, strobe high
480
        idata_cei := '1';
481
        isloe     := '1';
482
        if idly_end1 = '1' then           -- 2nd last cycle
483
          irxfifo_ena := '1';             -- capture rxdata
484
        end if;
485
        if idly_end = '1' then            -- last cycle 
486
          if iflag_rdok='1' and
487
            (RXFIFO_BUSY='0' and TXBUSY_L='0') then
488
            go_rdpwl(n.state, idly_ld, idly_val, islrd);
489
 
490
          elsif TXFIFO_VAL = '1' then
491
            go_wrprep(n.state, idly_ld, idly_val, ififo_ce, ififo);
492
 
493
          else
494
            n.state := s_rdwait;
495
          end if;
496
        end if;
497
 
498
      when s_wrprep =>                  -- s_wrprep: prepare write
499
        if idly_end = '1' then
500
          if iflag_wrok = '1' then
501
            go_wrpwl(n.state, idly_ld, idly_val, islwr);
502
          else
503
            go_rdprep(n.state, idly_ld, idly_val, ififo_ce, ififo);
504
          end if;
505
        end if;
506
 
507
      when s_wrpwl =>                   -- s_wrpwl: write, strobe low
508
        idata_ceo := '1';
509
        idata_oe  := '1';
510
        if idly_end = '1' then
511
          idata_ceo    := '0';
512
          itxfifo_hold := '0';
513
          idly_ld  := '1';
514
          idly_val := slv(to_unsigned(WRPWHDELAY-1, n.dlycnt'length));
515
          n.state := s_wrpwh;
516
        else
517
          islwr    := '1';
518
          n.state := s_wrpwl;
519
        end if;
520
 
521
      when s_wrpwh =>                   -- s_wrpwh: write, strobe high
522
        idata_oe  := '1';
523
        if idly_end = '1' then
524
          if iflag_wrok='1' and TXFIFO_VAL='1' then
525
            go_wrpwl(n.state, idly_ld, idly_val, islwr);
526
          elsif iflag_wrok='1' and r.pepend='1' and TXFIFO_VAL='0' then
527
            go_pepwl(n.state, idly_ld, idly_val, ipktend);
528
          else
529
            go_rdprep(n.state, idly_ld, idly_val, ififo_ce, ififo);
530
          end if;
531
        end if;
532
 
533
      when s_peprep =>                  -- s_peprep: prepare pktend
534
        if idly_end = '1' then
535
          if iflag_wrok = '1' then
536
            go_pepwl(n.state, idly_ld, idly_val, ipktend);
537
          else
538
            go_rdprep(n.state, idly_ld, idly_val, ififo_ce, ififo);
539
          end if;
540
        end if;
541
 
542
      when s_pepwl =>                   -- s_pepwl: pktend, strobe low
543
        if idly_end = '1' then
544
          idly_ld  := '1';
545
          idly_val := slv(to_unsigned(WRPWHDELAY-1, n.dlycnt'length));
546
          n.state := s_pepwh;
547
        else
548
          ipktend := '1';
549
          n.state := s_pepwl;
550
        end if;
551
 
552
      when s_pepwh =>                   -- s_pepwh: pktend, strobe high
553
        if idly_end = '1' then
554
          n.pepend := '0';
555
          go_rdprep(n.state, idly_ld, idly_val, ififo_ce, ififo);
556
        end if;
557
 
558
      when others => null;
559
    end case;
560
 
561
    if idly_ld = '1' then
562
      n.dlycnt := idly_val;
563
    elsif idly_end = '0' then
564
      n.dlycnt := slv(unsigned(r.dlycnt) - 1);
565
    end if;
566
 
567
    -- pktend time-out handling:
568
    --   if tx fifo is non-empty, set counter to max
569
    --   if tx fifo is empty, count down every usec
570
    --   on 1->0 transition queue pktend request
571
    if TXFIFO_VAL = '1' then
572
      n.petocnt := (others=>'1');
573
    else
574
      if CE_USEC = '1' and unsigned(r.petocnt) /= 0 then
575
        n.petocnt := slv(unsigned(r.petocnt) - 1);
576
        if unsigned(r.petocnt) = 1 then
577
          n.pepend := '1';
578
        end if;
579
      end if;
580
    end if;
581
 
582
    n.moni_ep4_sel := '0';
583
    n.moni_ep6_sel := '0';
584
    if r.state = s_wrprep or r.state = s_wrpwl or r.state = s_wrpwh or
585
       r.state = s_peprep or r.state = s_pepwl or r.state = s_pepwh then
586
      n.moni_ep6_sel := '1';
587
      n.moni_ep6_pf  := not FX2_FLAG_N(c_flag_prog);
588
    else
589
      n.moni_ep4_sel := '1';
590
      n.moni_ep4_pf  := not FX2_FLAG_N(c_flag_prog);
591
    end if;
592
 
593
    imoni.fifo_ep4        := r.moni_ep4_sel;
594
    imoni.fifo_ep6        := r.moni_ep6_sel;
595
    imoni.flag_ep4_empty  := not FX2_FLAG_N(c_flag_rx_ef);
596
    imoni.flag_ep4_almost := r.moni_ep4_pf;
597
    imoni.flag_ep6_full   := not FX2_FLAG_N(c_flag_tx_ff);
598
    imoni.flag_ep6_almost := r.moni_ep6_pf;
599
    imoni.slrd            := islrd;
600
    imoni.slwr            := islwr;
601
    imoni.pktend          := ipktend;
602
 
603
    N_REGS <= n;
604
 
605
    FX2_FIFO_CE  <= ififo_ce;
606
    FX2_FIFO     <= ififo;
607
 
608
    FX2_SLRD_N   <= not islrd;
609
    FX2_SLWR_N   <= not islwr;
610
    FX2_SLOE_N   <= not isloe;
611
    FX2_PKTEND_N <= not ipktend;
612
 
613
    FX2_DATA_CEI <= idata_cei;
614
    FX2_DATA_CEO <= idata_ceo;
615
    FX2_DATA_OE  <= idata_oe;
616
 
617
    RXFIFO_ENA   <= irxfifo_ena;
618
    TXFIFO_HOLD  <= itxfifo_hold;
619
 
620
    MONI         <= imoni;
621
 
622
  end process proc_next;
623
 
624
  proc_almost: process (RXSIZE, TXSIZE)
625
  begin
626
 
627
    -- (rx|tx)size is the number of bytes in fifo
628
    --   --> rxsize is number of bytes which can be read
629
    --   --> 2**txfawidth-txsize is is number of bytes which can be written
630
 
631
    if unsigned(RXSIZE) <= RXAEMPTY_THRES then
632
      RXAEMPTY <= '1';
633
    else
634
      RXAEMPTY <= '0';
635
    end if;
636
 
637
    if unsigned(TXSIZE) >= 2**TXFAWIDTH-TXAFULL_THRES then
638
      TXAFULL <= '1';
639
    else
640
      TXAFULL <= '0';
641
    end if;
642
 
643
  end process proc_almost;
644
 
645
  TXBUSY <= TXBUSY_L;
646
 
647
end syn;

powered by: WebSVN 2.1.0

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