source: PlatformSupport/Deprecated/pcores/linkport_v1_00_a/hdl/vhdl/tx_ll_control.vhd

Last change on this file was 408, checked in by haijiang, 18 years ago
File size: 15.1 KB
Line 
1--
2--      Project:  Aurora Module Generator version 2.4
3--
4--         Date:  $Date: 2005/11/07 21:30:56 $
5--          Tag:  $Name: i+IP+98818 $
6--         File:  $RCSfile: tx_ll_control_vhd.ejava,v $
7--          Rev:  $Revision: 1.1.2.4 $
8--
9--      Company:  Xilinx
10-- Contributors:  R. K. Awalt, B. L. Woodard, N. Gulstone
11--
12--   Disclaimer:  XILINX IS PROVIDING THIS DESIGN, CODE, OR
13--                INFORMATION "AS IS" SOLELY FOR USE IN DEVELOPING
14--                PROGRAMS AND SOLUTIONS FOR XILINX DEVICES.  BY
15--                PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
16--                ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,
17--                APPLICATION OR STANDARD, XILINX IS MAKING NO
18--                REPRESENTATION THAT THIS IMPLEMENTATION IS FREE
19--                FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE
20--                RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY
21--                REQUIRE FOR YOUR IMPLEMENTATION.  XILINX
22--                EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH
23--                RESPECT TO THE ADEQUACY OF THE IMPLEMENTATION,
24--                INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR
25--                REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
26--                FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES
27--                OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28--                PURPOSE.
29--
30--                (c) Copyright 2004 Xilinx, Inc.
31--                All rights reserved.
32--
33
34--
35--  TX_LL_CONTROL
36--
37--  Author: Nigel Gulstone
38--          Xilinx - Embedded Networking System Engineering Group
39--
40--  VHDL Translation: Brian Woodard
41--                    Xilinx - Garden Valley Design Team
42--
43--  Description: This module provides the transmitter state machine
44--               control logic to connect the LocalLink interface to
45--               the Aurora Channel.
46--
47--               This module supports 1 2-byte lane designs
48--
49--               This module supports Immediate Mode Native Flow Control.
50--
51
52library IEEE;
53use IEEE.STD_LOGIC_1164.all;
54use WORK.AURORA.all;
55
56-- synthesis translate_off
57library UNISIM;
58use UNISIM.all;
59-- synthesis translate_on
60
61entity TX_LL_CONTROL is
62
63    port (
64
65    -- LocalLink PDU Interface
66
67            TX_SRC_RDY_N  : in std_logic;
68            TX_SOF_N      : in std_logic;
69            TX_EOF_N      : in std_logic;
70            TX_REM        : in std_logic;
71            TX_DST_RDY_N  : out std_logic;
72
73    -- NFC Interface
74
75            NFC_REQ_N     : in std_logic;
76            NFC_NB        : in std_logic_vector(0 to 3);
77            NFC_ACK_N     : out std_logic;
78
79    -- Clock Compensation Interface
80
81            WARN_CC       : in std_logic;
82            DO_CC         : in std_logic;
83
84    -- Global Logic Interface
85
86            CHANNEL_UP    : in std_logic;
87
88    -- TX_LL Control Module Interface
89
90            HALT_C        : out std_logic;
91
92    -- Aurora Lane Interface
93
94            GEN_SCP       : out std_logic;
95            GEN_ECP       : out std_logic;
96            GEN_SNF       : out std_logic;
97            FC_NB         : out std_logic_vector(0 to 3);
98            GEN_CC        : out std_logic;
99
100    -- RX_LL Interface
101
102            TX_WAIT       : in std_logic;
103            DECREMENT_NFC : out std_logic;
104
105    -- System Interface
106
107            USER_CLK      : in std_logic
108
109         );
110
111end TX_LL_CONTROL;
112
113architecture RTL of TX_LL_CONTROL is
114
115-- Parameter Declarations --
116
117    constant DLY : time := 1 ns;
118
119-- External Register Declarations --
120
121    signal TX_DST_RDY_N_Buffer  : std_logic;
122    signal NFC_ACK_N_Buffer     : std_logic;
123    signal HALT_C_Buffer        : std_logic;
124    signal GEN_SCP_Buffer       : std_logic;
125    signal GEN_ECP_Buffer       : std_logic;
126    signal GEN_SNF_Buffer       : std_logic;
127    signal FC_NB_Buffer         : std_logic_vector(0 to 3);
128    signal GEN_CC_Buffer        : std_logic;
129    signal DECREMENT_NFC_Buffer : std_logic;
130
131-- Internal Register Declarations --
132
133    signal do_cc_r                      : std_logic;
134    signal warn_cc_r                    : std_logic;
135    signal do_nfc_r                     : std_logic;
136
137    signal idle_r                       : std_logic;
138    signal sof_r                        : std_logic;
139    signal sof_data_eof_1_r             : std_logic;
140    signal sof_data_eof_2_r             : std_logic;
141    signal sof_data_eof_3_r             : std_logic;
142    signal data_r                       : std_logic;
143    signal data_eof_1_r                 : std_logic;
144    signal data_eof_2_r                 : std_logic;
145    signal data_eof_3_r                 : std_logic;
146
147-- Wire Declarations --
148
149    signal nfc_ok_c              : std_logic;
150
151    signal next_idle_c           : std_logic;
152    signal next_sof_c            : std_logic;
153    signal next_sof_data_eof_1_c : std_logic;
154    signal next_sof_data_eof_2_c : std_logic;
155    signal next_sof_data_eof_3_c : std_logic;
156    signal next_data_c           : std_logic;
157    signal next_data_eof_1_c     : std_logic;
158    signal next_data_eof_2_c     : std_logic;
159    signal next_data_eof_3_c     : std_logic;
160
161    signal fc_nb_c               : std_logic_vector(0 to 3);
162    signal tx_dst_rdy_n_c        : std_logic;
163    signal do_sof_c              : std_logic;
164    signal do_eof_c              : std_logic;
165    signal channel_full_c        : std_logic;
166    signal pdu_ok_c              : std_logic;
167
168-- Declarations to handle VHDL limitations
169    signal reset_i               : std_logic;
170
171-- Component Declarations --
172
173    component FDR
174
175        generic (INIT : bit := '0');
176
177        port (
178
179                Q : out std_ulogic;
180                C : in  std_ulogic;
181                D : in  std_ulogic;
182                R : in  std_ulogic
183
184             );
185
186    end component;
187
188begin
189
190    TX_DST_RDY_N  <= TX_DST_RDY_N_Buffer;
191    NFC_ACK_N     <= NFC_ACK_N_Buffer;
192    HALT_C        <= HALT_C_Buffer;
193    GEN_SCP       <= GEN_SCP_Buffer;
194    GEN_ECP       <= GEN_ECP_Buffer;
195    GEN_SNF       <= GEN_SNF_Buffer;
196    FC_NB         <= FC_NB_Buffer;
197    GEN_CC        <= GEN_CC_Buffer;
198    DECREMENT_NFC <= DECREMENT_NFC_Buffer;
199
200-- Main Body of Code --
201
202
203
204    reset_i <=  not CHANNEL_UP;
205
206
207    -- Clock Compensation --
208
209    -- Register the DO_CC and WARN_CC signals for internal use.  Note that the raw DO_CC
210    -- signal is used for some logic so the DO_CC signal should be driven directly
211    -- from a register whenever possible.
212
213    process (USER_CLK)
214
215    begin
216
217        if (USER_CLK 'event and USER_CLK = '1') then
218
219            if (CHANNEL_UP = '0') then
220
221                do_cc_r <= '0' after DLY;
222
223            else
224
225                do_cc_r <= DO_CC after DLY;
226
227            end if;
228
229        end if;
230
231    end process;
232
233
234    process (USER_CLK)
235
236    begin
237
238        if (USER_CLK 'event and USER_CLK = '1') then
239
240            if (CHANNEL_UP = '0') then
241
242                warn_cc_r <= '0' after DLY;
243
244            else
245
246                warn_cc_r <= WARN_CC after DLY;
247
248            end if;
249
250        end if;
251
252    end process;
253
254
255    -- NFC State Machine --
256
257    -- The NFC state machine has 2 states: waiting for an NFC request, and
258    -- sending an NFC message.  It can take over the channel at any time
259    -- except when there is a UFC message or a CC sequence in progress.
260
261    process (USER_CLK)
262
263    begin
264
265        if (USER_CLK 'event and USER_CLK = '1') then
266
267            if (CHANNEL_UP = '0') then
268
269                do_nfc_r <= '0' after DLY;
270
271            else
272
273                if (do_nfc_r = '0') then
274
275                    do_nfc_r <= not NFC_REQ_N and nfc_ok_c after DLY;
276
277                else
278
279                    do_nfc_r <= '0' after DLY;
280
281                end if;
282
283            end if;
284
285        end if;
286
287    end process;
288
289
290    -- You can only send an NFC message when there is no CC operation or UFC
291    -- message in progress.  We also prohibit NFC messages just before CC to
292    -- prevent collisions on the first cycle.
293
294    nfc_ok_c <= not do_cc_r and
295                not warn_cc_r;
296
297
298    NFC_ACK_N_Buffer <= not do_nfc_r;
299
300
301    -- PDU State Machine --
302
303    -- The PDU state machine handles the encapsulation and transmission of user
304    -- PDUs.  It can use the channel when there is no CC, NFC message, UFC header,
305    -- UFC message or remote NFC request.
306
307    -- State Registers
308
309    process (USER_CLK)
310
311    begin
312
313        if (USER_CLK 'event and USER_CLK = '1') then
314
315            if (CHANNEL_UP = '0') then
316
317                idle_r           <= '1' after DLY;
318                sof_r            <= '0' after DLY;
319                sof_data_eof_1_r <= '0' after DLY;
320                sof_data_eof_2_r <= '0' after DLY;
321                sof_data_eof_3_r <= '0' after DLY;
322                data_r           <= '0' after DLY;
323                data_eof_1_r     <= '0' after DLY;
324                data_eof_2_r     <= '0' after DLY;
325                data_eof_3_r     <= '0' after DLY;
326
327            else
328
329                if (pdu_ok_c = '1') then
330
331                    idle_r           <= next_idle_c           after DLY;
332                    sof_r            <= next_sof_c            after DLY;
333                    sof_data_eof_1_r <= next_sof_data_eof_1_c after DLY;
334                    sof_data_eof_2_r <= next_sof_data_eof_2_c after DLY;
335                    sof_data_eof_3_r <= next_sof_data_eof_3_c after DLY;
336                    data_r           <= next_data_c           after DLY;
337                    data_eof_1_r     <= next_data_eof_1_c     after DLY;
338                    data_eof_2_r     <= next_data_eof_2_c     after DLY;
339                    data_eof_3_r     <= next_data_eof_3_c     after DLY;
340
341                end if;
342
343            end if;
344
345        end if;
346
347    end process;
348
349
350    -- Next State Logic
351
352    next_idle_c           <= (idle_r and not do_sof_c)           or
353                             (sof_data_eof_3_r and not do_sof_c) or
354                             (data_eof_3_r and not do_sof_c);
355
356
357
358    next_sof_c            <= ((idle_r and do_sof_c) and not do_eof_c)           or
359                             ((sof_data_eof_3_r and do_sof_c) and not do_eof_c) or
360                             ((data_eof_3_r and do_sof_c) and not do_eof_c);
361
362
363
364    next_data_c           <= (sof_r and not do_eof_c ) or
365                             (data_r and not do_eof_c);
366
367
368    next_data_eof_1_c     <= (sof_r and do_eof_c) or
369                             (data_r and do_eof_c);
370
371
372    next_data_eof_2_c     <= data_eof_1_r;
373
374
375    next_data_eof_3_c     <= data_eof_2_r;
376
377
378    next_sof_data_eof_1_c <= ((idle_r and do_sof_c) and do_eof_c)           or
379                             ((sof_data_eof_3_r and do_sof_c) and do_eof_c) or
380                             ((data_eof_3_r and do_sof_c) and do_eof_c);
381
382
383    next_sof_data_eof_2_c <= sof_data_eof_1_r;
384
385
386    next_sof_data_eof_3_c <= sof_data_eof_2_r;
387
388
389    -- Generate an SCP character when the PDU state machine is active and in an SOF state.
390
391    process (USER_CLK)
392
393    begin
394
395        if (USER_CLK 'event and USER_CLK = '1') then
396
397            if (CHANNEL_UP = '0') then
398
399                GEN_SCP_Buffer <= '0' after DLY;
400
401            else
402
403                GEN_SCP_Buffer <= ((sof_r or sof_data_eof_1_r) and pdu_ok_c) after DLY;
404
405            end if;
406
407        end if;
408
409    end process;
410
411
412    -- Generate an ECP character when the PDU state machine is active and in and EOF state.
413
414    process (USER_CLK)
415
416    begin
417
418        if (USER_CLK 'event and USER_CLK = '1') then
419
420            if (CHANNEL_UP = '0') then
421
422                GEN_ECP_Buffer <= '0' after DLY;
423
424            else
425
426                GEN_ECP_Buffer <= (data_eof_3_r or sof_data_eof_3_r) and pdu_ok_c after DLY;
427
428            end if;
429
430        end if;
431
432    end process;
433
434
435    tx_dst_rdy_n_c <= (next_sof_data_eof_1_c and pdu_ok_c)           or
436                       sof_data_eof_1_r                              or
437                      (next_data_eof_1_c and pdu_ok_c)               or
438                     ((not do_nfc_r and not NFC_REQ_N) and nfc_ok_c) or
439                       DO_CC                                         or
440                       TX_WAIT                                       or
441                       data_eof_1_r                                  or
442                      (data_eof_2_r and not pdu_ok_c)                or
443                      (sof_data_eof_2_r and not pdu_ok_c);
444
445
446    -- The flops for the GEN_CC signal are replicated for timing and instantiated to allow us
447    -- to set their value reliably on powerup.
448
449    gen_cc_flop_0_i : FDR
450
451        port map (
452
453                    D => do_cc_r,
454                    C => USER_CLK,
455                    R => reset_i,
456                    Q => GEN_CC_Buffer
457
458                 );
459
460
461    -- GEN_SNF is asserted whenever the NFC state machine is not idle.
462
463    process (USER_CLK)
464
465    begin
466
467        if (USER_CLK 'event and USER_CLK = '1') then
468
469            if (CHANNEL_UP = '0') then
470
471                GEN_SNF_Buffer <= '0'      after DLY;
472
473            else
474
475                GEN_SNF_Buffer <= do_nfc_r after DLY;
476
477            end if;
478
479        end if;
480
481    end process;
482
483
484    -- FC_NB carries flow control codes to the Lane Logic.
485
486    process (USER_CLK)
487
488    begin
489
490        if (USER_CLK 'event and USER_CLK = '1') then
491
492            FC_NB_Buffer <= fc_nb_c after DLY;
493
494        end if;
495
496    end process;
497
498
499    -- Flow control codes come from the NFC_NB input.
500
501    fc_nb_c <= NFC_NB;
502
503
504    -- The TX_DST_RDY_N signal is registered.
505
506    process (USER_CLK)
507
508    begin
509
510        if (USER_CLK 'event and USER_CLK = '1') then
511
512            if (CHANNEL_UP = '0') then
513
514                TX_DST_RDY_N_Buffer <= '1' after DLY;
515
516            else
517
518                TX_DST_RDY_N_Buffer <= tx_dst_rdy_n_c after DLY;
519
520            end if;
521
522        end if;
523
524    end process;
525
526
527    -- Decrement the NFC pause required count whenever the state machine prevents new
528    -- PDU data from being sent except when the data is prevented by CC characters.
529
530    DECREMENT_NFC_Buffer <= TX_DST_RDY_N_Buffer and not do_cc_r;
531
532
533    -- Helper Logic
534
535    -- SOF requests are valid when TX_SRC_RDY_N. TX_DST_RDY_N and TX_SOF_N are asserted
536
537    do_sof_c <=     not TX_SRC_RDY_N            and
538                    not TX_DST_RDY_N_Buffer     and
539                    not TX_SOF_N;   
540
541
542    -- EOF requests are valid when TX_SRC_RDY_N, TX_DST_RDY_N and TX_EOF_N are asserted
543
544    do_eof_c <=     not TX_SRC_RDY_N            and
545                    not TX_DST_RDY_N_Buffer     and
546                    not TX_EOF_N;
547                 
548                 
549
550
551    -- Freeze the PDU state machine when CCs or NFCs must be handled.
552
553    pdu_ok_c <= not do_cc_r and
554                not do_nfc_r;
555
556
557    -- Halt the flow of data through the datastream when the PDU state machine is frozen.
558
559    HALT_C_Buffer <= not pdu_ok_c;
560
561
562    -- The aurora channel is 'full' if there is more than enough data to fit into
563    -- a channel that is already carrying an SCP and an ECP character.
564
565    channel_full_c <= '1';
566
567end RTL;
Note: See TracBrowser for help on using the repository browser.