DETAILED DESCRIPTION
[0040] In the following description, for the purposes of explanation, numerous specific details are set forth in order to provide a thorough understanding of the present invention. It will be apparent, however, to one skilled in the art that the invention may be practiced without some of these specific details. In other instances, well-known structures and devices are shown in block diagram form to avoid obscuring the underlying principles of the invention.
EMBODIMENTS OF A SYSTEM AND METHOD FOR DEMODULATING AND DECODING MULTIPLE DATA STREAMS
[0041] As illustrated in FIG. 2 , one embodiment of the invention is comprised of a plurality of quadrature tuners 201 - 204 , each of which lock on to signals transmitted by a plurality of transponders, downconvert the signals to baseband, and separate the in-phase (“I”) and quadrature phase (“Q”) components of the signals. In one embodiment, the entire group of transponders employed on the satellite system are allocated across the tuners 201 - 204 . Accordingly, for a 32 transponder system, each of the quadrature tuners 201 - 204 process data streams from 8 transponders. Two of the tuners (e.g., 201 - 202 ) process signals from the first satellite LNB and the other two tuners (e.g., 203 - 204 ) process signals from the second satellite LNB, at first and second polarizations, respectively. More specifically, in one embodiment, each of the tuners 201 - 204 processes a 250 MHz chunk of transponder spectrum, resulting in 8 baseband signals having data from −125 MHz to +125 MHz. It should be noted, however, that the underlying principles of the invention are not limited to any particular number of tuners or any particular transponder/bandwidth allocation among the tuners.
[0042] The transponder signals are then passed through a plurality of anti-alias filters 205 which suppress undesirable non-baseband signal residuals. Because of the digital signal processing performed in one embodiment of the invention (described in detail below) relatively inexpensive anti-alias filters may be used to filter the signals, thereby reducing system costs. For example, in one embodiment, the anti-alias filters are 3 rd order elliptic filters.
[0043] The filtered signals are then passed through a plurality of analog-to-digital (“A/D”) converters 210 , which digitally sample the signal at a predetermined sampling rate. In one embodiment, each of the A/D converters 210 is a 300 Msample/sec, 6-bit A/D. However, various other types of A/D converters may be employed while still complying with the underlying principles of the invention.
[0044] Once processed by the A/D converters 210 , the digitized samples are temporarily stored in a plurality of buffers 215 . Although illustrated in FIG. 2 a as four independent buffer units, it will be appreciated that a single buffer may also be employed to store data from each of the streams (i.e., and broken up into a plurality of addressable memory blocks).
[0045] Conventional satellite systems perform filtering via convolution. More specifically, in the time domain, the input signal is “convolved” with a time domain representation of the filter's transfer function. As mentioned above, conventional receiver systems use finite impulse response (“FIR”) or infinite impulse response (“IIR”) bandpass filters to filter data from each transponder based on the transponder's carrier frequency and bandwidth. These filtering techniques are effective for processing data from one or possibly two transponders. However, standard filtering techniques are not practical for filtering data from numerous transponders. For example, a bank of at least 32 conventional filters would be required for 32 transponders, dramatically increasing system costs.
[0046] By contrast, in one embodiment of the invention, a Fast Fourier Transform (“FFT”) unit 220 , a multiplier 230 and an inverse FFT unit 240 are used in place of conventional filters to convolve the in-phase (“I”) and quadrature (“Q”) samples from all 32 transponders (or as many transponders as are provided on the system). While the logic required to implemented the FFT may be more substantial than that required to implement a typical conventional FIR filter, only a single FFT is required for the entire group of transponders. Mathematically, the FFT is more efficient for processing a significantly greater number of data samples because, in order to process N data samples, the FFT must perform N*Log(N) operations, whereas an FIR filter must perform N 2 operations.
[0047] As indicated in FIG. 2 a , in one embodiment, a 384-point FFT is employed which converts 384 samples of complex data (i.e., complex data if QPSK is used as the modulation scheme) from a buffer 215 (or multiple buffers) into 384 complex frequency coefficients with each FFT operation. Because FFTs are inherently capable of processing complex numbers, no supplemental logic is required for the FFT to concurrently process both the I and Q signal components.
[0048] In one embodiment, during each FFT operation, the FFT unit 220 processes 192 new samples and 192 replay samples from each tuner. This technique of overlapping input data in an FFT operation is graphically demonstrated in FIG. 6 using input sample data from a single tuner (e.g., tuner 201 , which includes data for transponders 1 - 8 ). As illustrated, for the first FFT operation (identified as FFT 1 ) input samples 1-192 and 193-384 are concurrently processed. The FFT then proceeds down through each of the buffers in turn, performing similar 384-point FFT operations using input samples from each of the tuners. Once it processes data from the final tuner (e.g., tuner 204 , which includes data for transponders 25 - 32 ), it starts again from the first in a round robin fashion. As illustrated in FIG. 6 , it then performs an 384-point FFT (identified as FFT 2 ) using both 192 new samples 385-576 and 192 replay samples 192-384. The FFT continues reading data samples from each transponder in this manner as long as data is available.
[0049] Each tuner may not necessarily supply data to the FFT 220 at the same rate, depending on the system configuration. Accordingly, in one embodiment, arbitration logic (not shown) may instruct the FFT 220 to process relatively more or fewer samples for a particular tuner in a given cycle, depending on the relative speed with which the tuner provides samples to the FFT 220 (or, rather, to the buffer 215 from which the FFT 220 reads the samples). For example, in one embodiment, the arbitration logic monitors each of the buffers 215 and, when the data in a particular buffer reaches a threshold value, the arbitration logic instructs the FFT 220 to process an additional 384 samples from the buffer before moving to the next buffer. Various static and dynamic arbitration techniques may be employed while still complying with the underlying principles of the invention.
[0050] The level of overlapping illustrated in FIG. 6 is referred to as a 50% overlap (i.e., because for each FFT {fraction (1/2)} of the data is old and {fraction (1/2)} is new). It should be noted, however, that various other levels of overlapping may be employed while still complying with the underlying principles of the invention (e.g., depending on the particular FFT used).
[0051] In one embodiment, “overlap-save” and/or “overlap-discard” techniques are employed to avoid the effects of circular convolution. More specifically, due to the periodic nature of the discrete Fourier transforms such as the FFT, a portion of the output from the FFT may be errant (i.e., and may wrap back upon itself). Accordingly, in one embodiment of the invention, this errant portion is discarded/filtered following the FFT.
[0052] In one embodiment, for each FFT operation, 384 complex frequency values from a given tuner (or multiple tuners) are stored in the buffer 225 but only 128 are selected from the buffer by the complex multiplier 230 . The particular 128 values may be selected based on the center frequency of the transponder of interest (e.g., 64 samples greater than the center frequency and 64 samples less than the center frequency may be selected). Alternatively, or in addition, the 128 frequency values may be selected from each transponder (or cable system carrier) before being stored in the buffer 225 rather than after.
[0053] Because only 128 frequency coefficients are selected in the process of performing the FFT, the underlying signal is effectively decimated by a factor of 3×(i.e., because the 384 input samples are converted into 128 frequency coefficients which are subsequently transformed back into the time domain by an IFFT, described below). Moreover, the decimation is accomplished without the need for a separate decimation unit—a potentially costly component, particularly when implementing large decimation factors.
[0054] Although a 3×decimation was described above, it should be noted that various alternative decimation factors may be realized by selecting greater or fewer frequency coefficients following the FFT operation. For example, 96 coefficients may be selected to achieve a decimation factor of 4×.
[0055] As mentioned above, in one embodiment, as part of the convolution process, a complex multiplier 230 multiplies the I and Q frequency components by a set of complex designated frequency coefficients (i.e., in an embodiment in which complex signal data is being convolved). The frequency coefficients may be selected based on the desired transfer function. One particular complex multiplier 230 for performing the multiplication using frequency coefficients ‘a’ and ‘b’ is illustrated in FIG. 3 a.
[0056] Gain and phase imbalances may be introduced in the signal during transmission and/or by the various system components (e.g., by the tuners 201 - 204 or the LNBs). As such, following the FFT operation, the I component and/or the Q component of the signal may not have the correct amplitude and may not be exactly 90 degrees out of phase. In one embodiment of the invention, the complex multiplier 230 compensates for these gain and phase imbalances using an additional set of frequency coefficients. As illustrated in FIG. 3 b , four coefficients may be used (i.e., identified as ‘a,’ ‘b,’ ‘c,’ and ‘d’). Although this requires storing an additional two coefficients, it allows for more precise gain/phase corrections. For example, with four coefficients, the gain of the I component may be precisely adjusted without affecting the phase/gain of Q. Similarly, the phase of the Q component may be modified without affecting I. This level of control is not possible using only two coefficients (i.e., where a change to ‘a’ or ‘b’ would affect both I and Q).
[0057] In one embodiment, the additional coefficients may be used to independently control gain and phase for two different streams or for a single high bandwidth stream. For example, the standard data rate of the system may not be sufficient to handle certain high bandwidth streams (e.g., a 60 MHz wide FSS transponder). In such a case, two sets of coefficients may be time shifted (e.g., by {fraction (1/2)} of the data rate) and applied to the stream twice in succession to produce two filtered streams. These time-shifted streams may then be combined to produce a higher bandwidth stream. Accordingly, if the typical data rate output from the IFFT unit 240 is 100 MHz (which may not be sufficient under certain conditions), time shifting coefficients and combining streams in this manner may produce an effective data rate of 200 MHz.
[0058] Following the gain/phase corrections, the signal components are converted back into the time domain via an inverse FFT (“IFFT”) unit 240 . In one embodiment, the IFFT is a 128-point IFFT which operates on the 128 frequency components for each transponder output from the complex multiplier. Accordingly, in one embodiment, the output of the IFFT contains 64 valid transponder data samples (i.e., because the rest are discarded due to the effects of circular convolution). In an embodiment in which the two sets of coefficients used in the complex multiplier 230 are time shifted by a specified period of time (e.g., 5 nsec) and applied twice in succession for a given transponder, two sets of 64 data samples may be output from the IFFT 240 . The two sets may then be interleaved even/odd to produce a more accurate representation of the signal in the time domain.
[0059] In one embodiment, the output of the IFFT 240 is then fed into a linear interpolator 245 which interpolates between data samples at points identified by a baud loop unit 246 . More specifically, the baud loop unit 246 identifies the baud rate at which the transponder signal was transmitted (e.g., from the satellite uplink facility) and applies this rate to the interpolator 245 . In response, the interpolator adjusts the effective sampling rate by selecting a new set of data points, spaced according to the rate identified by the baud loop unit 246 (often at a lower rate than transmitted from the IFFT unit 240 ).
[0060] In one embodiment, following the linear interpolator, the signal is passed through a carrier removal module 250 which removes the carrier offset from the signal using a periodic signal (e.g., a sinusoid) supplied by a Numerically Controlled Oscillator (“NCO”) 252 . When the output of the NCO is equivalent to the desired carrier frequency, the carrier is effectively removed from the signal. However, the NCO oscillator frequency and the actual frequency of the signal read out of the linear interpolator may not be equal due to signal drift produced by the LNB and/or various other system components which process the signal prior to the carrier removal unit 250 (e.g., the tuners 201 - 204 ).
[0061] To compensate for signal drift, following the linear interpolator 245 , one embodiment of the invention employs the system illustrated in FIG. 4 . According to this embodiment, a carrier detection module 410 detects the frequency of the carrier signal from each transponder and stores the results in a register 430 . An averager unit 450 calculates the average difference between the actual frequency signals from each transponder (read from register 440 ) and the desired frequency values for each transponder (i.e., assuming no drift). In one embodiment, these values are loaded into a register 440 when the system is initialized.
[0062] The average difference between the optimal frequency values and the actual frequency values represents the overall drift of the system (i.e., the drift associated with all transponders). Accordingly, in one embodiment, this value is used to control a voltage controlled oscillator (“VCO”) within a phase locked loop (“PLL”) (described in greater detail below) which generates the center frequency of each of the tuners 201 - 204 at the front end of the receiver. In one embodiment, the averager unit 450 transmits the average drift as a 32-bit word. However, it should be noted that various other data lengths may be employed (e.g., 24 bits) to transmit the average drift value while still complying with the underlying principles of the invention.
[0063] In the embodiment shown in FIG. 4 , the average drift is calculated in the described manner for all transponders received over the same LNB. Accordingly, if 16 transponders are received by one LNB and another 16 transponders are received by a second LNB, then two separate averaging calculations may be performed (i.e., one for each LNB). This will allow for more accurate signal drift calculations, particularly when each of the LNBs cause a different level of drift.
[0064] In one embodiment, a subtraction unit 425 calculates the difference between the average transponder drift (output from the averager 450 ) and the drift measured for each individual transponder (output from the carrier detection module 410 ). The resulting “per-transponder drift” values are stored in the NCO control register 420 . These values indicate the extent to which the frequency needs to be adjusted by the NCO 252 for each individual transponder.
[0065] Providing two levels of drift compensation as described above (i.e., a per-transponder compensation and a system-level compensation) allows the system to control signal drift more precisely. In one embodiment, the loop filters used to control the VCO (associated with the tuners) and the NCO may be fine-tuned to perform their respective functions. For example, the per-transponder drift will typically be much lower than the overall system drift (e.g., introduced by the LNBs). Accordingly, the loop filters used for the NCO may be configured with a narrower adjustment range than that used for the NCO.
[0066] As mentioned above, a PLL controls the center frequency for each of the quadrature tuners 201 - 204 . A conventional PLL, illustrated in FIG. 5 a , is comprised of a VCO 510 , which provides an output frequency signal 502 and a phase detector 550 which measures the difference between the output frequency 502 and the frequency of a reference clock signal 501 . If the reference frequency and the output frequency are not equal, a loop filter 520 adjusts the VCO 510 (e.g., by increasing/decreasing the signal delay) until the two signals 501 , 502 are “locked” at the same frequency. Accordingly, if a conventional PLL is employed in the system, the average drift value transmitted by the averager unit 450 may be used by the loop filter 520 to lock the VCO 510 to the appropriate frequency.
[0067] In one embodiment, illustrated in FIG. 5 b , the PLL also includes a divide-by-N unit 530 and a sigma-delta A/D unit 540 . The divide-by-N unit 530 provides for precise system drift correction by dividing the output of the VCO 510 by a specified value of N. In one embodiment, the value of N is supplied by the most significant 16 bits of the 32 bit drift value transmitted from the averager unit 450 (i.e., if a 32-bit code is used). Dividing the VCO 510 output by N may cause a significant amount of jitter, particularly for values of N which are not multiples of the reference clock frequency. The sigma-delta A/D unit 540 is used to compensate for the jitter by removing high frequency noise components from the output signal.
Depuncture Region
[0068] As illustrated in FIG. 2 b , one embodiment of the system also includes a Viterbi decoder unit 260 and a byte-synchronization unit 265 . Viterbi codes are forward error correcting codes used to improve the capacity of a channel by adding some redundant information to the data being transmitted through the channel. As illustrated in FIG. 7 , in one embodiment of the invention, the Viterbi decoder unit 260 is comprised of eight Viterbi decoder modules 700 shared across all thirty-two transponders (e.g., with each Viterbi decoder module servicing data streams from four transponders).
[0069] The Viterbi decoder unit 260 is also comprised of a plurality of depuncture “regions” 715 which reinsert symbol values into the received stream to match the expected original symbol stream at the transmitter. The transmitter may remove symbol values based on a specific pattern before the actual bit pattern is modulated and sent on the channel. Therefore, some of the original data symbol values are not sent by the transmitter. The depuncture region 715 must insert these erased symbol values into the received symbol stream at the correct locations so that the Viterbi decoders 700 will decode the symbols correctly. In one embodiment there are eight depuncture regions (i.e., one for each Viterbi decoder 700 ) with each depuncture region 715 comprised of one Viterbi buffer 720 ; four depuncture/rotator units 710 (e.g., one for each transponder); one depuncture control block 712 ; and four Viterbi feedback paths 1000 (illustrated in FIG. 10 ).
[0070] The rotator logic of the depuncture/rotator units 710 (illustrated in FIG. 9 as rotator logic 900 ) rotates the received symbols to the correct phase before depuncturing is performed. For example, in an embodiment which uses QPSK modulation, depuncturing is performed after the rotator portion rotates the symbols to the correct QPSK phase. This is accomplished with the help of the byte synchronization (“BSYNC”) unit 265 . The BSYNC unit 265 accumulates the bits received from the Viterbi decoder unit 260 and attempts to detect a meaningful byte pattern in them. If it does not find a pattern it recognizes after a programmable amount of time, it informs the rotator portion of the depuncture/rotator units 710 that the phase of the signal from the demodulator is incorrect and must be rotated (e.g., by some multiple of 90 degrees).
[0071] Symbols are sometimes removed from the transmitted signal to increase channel bandwidth. This tends to decrease the overall performance of the system for a particular signal to noise ratio (“SNR”). Thus, the tradeoff is between channel bandwidth, system performance, and SNR. The act of removing symbols is called “puncturing” the signal. There are several patterns that can be applied to puncture the signal. These patterns are referred more
1 | TABLE 1 |
| |
| |
| | Pattern: X:Y | | # of |
| Rate | Encoding | Symbol Pattern | States |
| |
|
| 1/2 | X | 1 | X 1 | 1 |
| | Y | 1 | Y 1 |
| 2/3 | X | 10 | X 1 Y 2 Y 3 | 2 |
| | Y | 11 | Y 1 X 3 Y 4 |
| 3/4 | X | 101 | X 1 Y 2 | 3 |
| | Y | 110 | Y 1 X 3 |
| 5/6 | X | 10101 | X 1 Y 2 Y 4 | 5 |
| | Y | 11010 | Y 1 X 3 X 5 |
| 6/7 | X | 100101 | X 1 Y 2 X 4 X 6 Y 7 Y 9 Y 11 | 6 |
| | Y | 111010 | Y 1 Y 3 Y 5 X 7 Y 8 X 10 X 12 |
| 7/8 | X | 1000101 | X 1 Y 2 Y 4 Y 6 | 7 |
| | Y | 1111010 | Y 1 Y 3 X 5 X 7 |
| |
[0072] Table 1 above shows the puncture patterns for different code rates. Although a total of six code rates are illustrated, it should be noted that various other code rates may be employed while still complying with the underlying principles of the invention. The code or puncture rate is a fraction that represents the Viterbi output bit rate in relation the number of received symbol values. For instance, if the rate were {fraction (1/2)}, it would take two symbol values to create a single bit. This is because the Viterbi decoders 700 take a whole symbol as an input an output a single bit for each input symbol. It should be noted that, in one embodiment, a symbol is composed of two symbol values, I and Q. Puncturing removes a single symbol component, I or Q, not the value pair.
[0073] To further illustrate the puncturing concept, a rate of {fraction (2/3)} will be used as an example. Suppose the following symbol pattern is transmitted:
[0074] I=X1,X2,X3,X4, . . .
[0075] Q=Y1, Y2, Y3, Y4, . . .
[0076] Each pair X/Y has been encoded by a Viterbi encoder. The integer values represent the order in time that the symbols were encoded. If the {fraction (2/3)} rate puncture pattern shown in Table 1 above is applied to this sequence, the following modified sequence is generated:
[0077] I=X1, Y2, Y3, X5, . . .
[0078] Q=Y1, X3, Y4, Y5, . . .
[0079] This is the actual symbol pattern sent by the transmitter. Note that symbol values X2 and X4 have been skipped. These values were skipped since they matched the same position as the zeros in the puncture pattern. Symbol values matching the ones in the puncture pattern are always sent.
[0080] In one embodiment, the depuncture/rotator units 710 apply the same puncture pattern as the transmitter applied in order to restore the input symbol pattern to the correct state. Accordingly, the symbol stream should closely resemble the original encoded stream to be recognized and decoded correctly by the Viterbi decoders 700 . The depuncture/rotator units 710 insert a null or zero symbol value wherever the incoming symbol value matches a zero in the puncture table. This is similar to the puncture example explained earlier. Symbols that match ones in the puncture table are not affected. Thus, the depuncture/rotator units 710 do not remove any symbol values from the received stream. They only add null symbol values which increases the number of symbol values at the Viterbi input. The rate {fraction (1/2)} is an exception. For rate {fraction (1/2)}, the transmitter does not puncture any symbol values and, as such, the depuncture/rotator units 710 do not insert any null symbol values (signified by its puncture pattern in the table above by the absence of zeros).
[0081] Null symbol values are set to zero for the symbol value and have an additional bit set for the symbol indicating it is a null symbol value. Inserting null symbol values effectively increases the number of symbols (i.e., relative to the number of symbols originally received by the depuncture/rotator units 710 ). That is to say, the input rate into the depuncture/rotator units 710 do not equal the output rate.
[0082] As indicated in the rate table, a different number of puncture phases exist for each rate. In one embodiment, this number specifies the possible states of the depuncture logic for a particular code rate. The puncturing logic on the transmitter, and in the feed back path has the same number of states. Code rates may be different for each transponder. Accordingly, one embodiment of the system includes a set of registers which store the code rate for each individual transponder.
[0083] Symbols from the slicer blocks 740 are fed into the eight Viterbi buffers 720 within the eight depuncture regions 715 . Each region 715 also receives a transponder (TP) number that indicates the transponder number for the symbols. This number is decoded in each region and enables one of the eight buffers to be written. In one embodiment, only a single buffer is written in a given cycle.
[0084] In one embodiment, a single Viterbi buffer 720 is employed in each depuncture region 715 . Each buffer 720 holds symbols for four transponders. Accordingly, buffering is employed, in part, because each Viterbi block symbols for the transponders not being serviced need to be temporarily stored. Moreover, during depuncturing, extra symbol values are added to the symbols, thus making the bandwidth pattern irregular. Buffering is used to make this pattern more regular so that the Viterbi decoders 700 can be utilized efficiently.
[0085] The Viterbi buffer 720 may be implemented as a queue structure using a register file as the main storage element. In one embodiment, there are four separate read and four separate write pointers for the four logical queues to address the register file. The register file uses one read port and one write port since data can be read from the one logical queue and written to another logical queue in the same cycle. A TP number is sent with the slicer symbols to each Viterbi buffer 720 . A decoder enables the Viterbi buffer 720 to be written at any given point in time and also specifies which of the four transponder sections to write to the buffer 720 .
[0086] Each entry or address in the register file holds four symbols worth of data. This includes 8 bits of soft decision×4 symbols and 1 bit feedback bit×4 symbols. Accordingly, in this embodiment, the total width of the register files needs to be minimum 32+4=36 bits. The feedback bit needs to be stored per symbol since symbols may not be aligned (see the description of write control below).
[0087] For a Viterbi decoder with a depth of 64, Viterbi buffer simulation experiments show that a storage of 156 symbols per transponder should be sufficient as a buffer length. In one embodiment, this length is rounded up to 192 symbols to add some extra safety margin. Since each buffer has 4 symbols, there needs to be 192/4=48 entries per transponder of logical queue. Since we have 4 logical queues, the physical register has the following dimensions: 192×36, (1 read, 1write).
[0088] In one embodiment, symbols (soft decisions) are written to only one logical buffer space at a time (e.g., since data is supplied for one transponder at a time. There can be up to four symbols received in the same cycle. However, there can be cycles where fewer than four valid symbols received. This data pattern is not always aligned since fewer than four symbols may be received.
[0089] To alleviate this problem, in one embodiment illustrated in FIG. 8, a set of holding registers 800 is provided at the input of the Viterbi buffer 720 to hold symbols to be written to the Viterbi buffer 720 . A buffer entry is written when there are four symbols available. Data provided to the Viterbi buffer 720 can come directly from the slicers 740 or from the holding registers or from a combination of both. In one embodiment, there are actually four different sets of holding registers 800 within each depuncture region 715 , one for each transponder.
[0090] In one embodiment, the multiplexer 810 illustrated in FIG. 8 is selecting data for a single transponder. This multiplexer 810 may be more complicated than what is shown. As enumerated in Table 2 below, there may be several combinations to consider in order to write the data to correct place. More specifically, Table 2 below shows combinations for a single transponder when multiplexing data between symbols from the slicer blocks 740 and the symbols held in the holding registers 800 . It also enumerates writes and reads from the holding registers. Consider the first row of the table as the simplest example. There are no valid symbols from the interpolator 245 and nothing is in the holding registers 800 . In this case, no writes are performed. In fact, in one embodiment, no writes are performed when there is no valid data, regardless of the content stored in the holding registers 800 .
2 | TABLE 2 |
|
|
| Holding | | | | |
| Register Valid | | Holding |
| Valid Symbols | Bits | Holding Register | Registers | VBUF | VBUF Write Data |
| S3 S2 S1 S0 | H2 H1 H0 | WE | Write Data | WE | Entries |
|
| 0000 | 000 | 000 | — — — | 0 | — — — — |
| 0000 | 001 | 000 | — — — | 0 | — — — — |
| 0000 | 011 | 000 | — — — | 0 | — — — — |
| 0000 | 111 | 000 | — — — | 0 | — — — — |
| 0001 | 000 | 001 | — — S0 | 0 | — — — — |
| 0001 | 001 | 010 | — S0 — | 0 | — — — — |
| 0001 | 011 | 100 | S0 — — | 0 | — — — — |
| 0001 | 111 | 000 | — — — | 1 | S0 H2 H1 H0 |
| 0011 | 000 | 011 | — S1 S0 | 0 | — — — — |
| 0011 | 001 | 110 | S1 S0 — | 0 | — — — — |
| 0011 | 011 | 000 | — — — | 1 | S1 S0 H1 H0 |
| 0011 | 111 | 001 | — — S1 | 1 | S0 H2 H1 H0 |
| 0111 | 000 | 111 | S2 S1 S0 | 0 | — — — — |
| 0111 | 001 | 000 | — — — | 1 | S2 S1 S0 H0 |
| 0111 | 011 | 001 | — — S2 | 1 | S1 S0 H1 H0 |
| 0111 | 111 | 011 | — S2 S1 | 1 | S0 H2 H1 H0 |
| 1111 | 000 | 000 | — — — | 1 | S3 S2 S1 S0 |
| 1111 | 001 | 001 | — — S3 | 1 | S2 S1 S0 H0 |
| 1111 | 011 | 011 | — S3 S2 | 1 | S1 S0 H1 H0 |
| 1111 | 111 | 111 | S3 S2 S1 | 1 | S0 H2 H1 H0 |
|
[0091] Taking a more complicated example, the last row of the table demonstrates writes to both the holding registers and the Viterbi buffer 720 . In this case, there are three valid entries in the holding registers and four valid symbols from the slicers 740 . The oldest symbols should be written to the Viterbi buffer 720 and the earliest symbols should be written to the holding registers 800 . Thus, in this particular example, S3, S2, and S1 would be written to the holding registers 800 since these are the earliest in time. The three symbols from the holding registers would be combined with one of the symbols from the slicers 740 as the four symbols to write to the Viterbi buffer 720 .
[0092] In one embodiment, the depuncture/rotator units 710 receive symbols for a particular transponder from the Viterbi buffer 720 until the number of symbols processed exceeds a maximum limit. This limit is controlled by a depuncture control block 712 . When this limit is reached, the depuncture control block signals a context switch and reads from the next transponder queue. In one embodiment, the depuncture control block 712 asserts a 4 bit 1-hot vector which acts as a read enable to the Viterbi buffer 720 . The vector selects one of four read pointers to form the read address for the register file. After the read is completed the read pointer is incremented. If none of the read enables are set, then no data is returned to the depuncture/rotator unit 710 and the read pointers are not affected. In one embodiment, on every read, the register file returns four symbols to the depuncture/rotator units 710 .
[0093] In one embodiment, the Viterbi buffer 720 sends four independent signals (one for each logical transponder queue) to the depuncture control block 712 , which indicates whether the number of entries in the buffer will result in 64 symbols that can be sent to the Viterbi decoder 700 for that transponder. In one embodiment, the signals are set if the following is true for a particular queue: ((Write Pointer−Read Pointer)*2* code rate)>64.
[0094] The depuncture/rotator unit 710 requests symbols from the Viterbi buffer 720 , and in response, the Viterbi buffer 720 provides four symbols at a time (i.e., because each entry in the buffer holds four symbols). As mentioned above, in an embodiment which uses QPSK modulation, the depuncture/rotator unit 710 first performs a QPSK rotation on the symbols before it depunctures them.
[0095] The byte synchronization unit 265 (BSYNC) accumulates bits received from the Viterbi decoder unit 260 and attempts to detect a meaningful byte pattern in them. If it does not find a recognizable pattern within a programmable amount of time, then it will either indicate to the depuncture/rotator units 710 to change the rotator phase or the puncture phase. There are two possible rotator phases: 0 degrees and 90 degrees. Byte sync alternates between these two phase when it is trying to find synchronization. If the current rotation phase from byte sync is 0 degrees, then the symbol values read from the Viterbi buffer (I and Q) are passed unchanged to the depuncture unit. If the current rotation phase from byte sync is 90 degrees, then the Q symbol value read from the Viterbi buffer is passed as I symbol value to the depuncture unit, and the I symbol value read from the Viterbi buffer is inverted, and sent as Q symbol value to the depuncture unit. This is illustrated in Table 3 below where Irot and Qrot are the output of the rotator unit going to the depuncture unit, and I and Q are the symbol values read from the Viterbi buffer:
[0096] Rotator
3 | TABLE 3 |
|
|
| Phase | Irot | Qrot |
|
| 0 | I | Q |
| 90 | Q | ˜I |
|
[0097] By rotating 90 degrees, the rotator can reach all 4 phases 90, 180, 270 and 0 degrees.
[0098] A data path for a depuncture/rotator unit 710 employed in one embodiment of the invention is illustrated in FIG. 9 . Four symbols are simultaneously loaded into a symbol queue 920 . In one embodiment, the rotator logic processes one symbol at a time. Rotated symbol values are then fed to a symbol value queue 915 that will be read by the depuncture logic 910 . The depuncture logic 910 reads 0,1, or 2 symbol values from symbol value queue 915 depending on the puncture pattern. Note that in one embodiment the depuncture logic reads symbol values, not necessarily an entire symbol (as mentioned above, depuncturing is performed on symbol values).
[0099] The rotator logic 900 transmits data to the symbol value queue 915 until it is full. In one embodiment, the symbol value queue 915 holds four rotated symbols (eight symbol values). Alternatively, the symbol value queue 915 may hold more than four symbols (e.g., eight symbols) because of the turnaround time reading from the Viterbi buffer 720 . For example, it may need to queue up more than four symbols to avoid starving the depuncture logic 910 .
[0100] This buffering scheme is employed in one embodiment because the depuncture logic 910 does not have to consume a symbol every cycle from the symbol value queue 915 . Depending on the puncture pattern, the depuncture logic 910 may create a null symbol to be sent to the Viterbi decoder 700 in a given cycle. Accordingly, the depuncture logic 910 effectively increases the symbol bandwidth into the Viterbi region. This is one of the factors that affects the Viterbi buffer 720 size requirements.
4 | TABLE 4 |
|
|
| Code | | | | | | | |
| Rate | Current | Change | Next |
| Name | State | Phase | State | RD1 | RD2 | SYMICTL | SYMQCTL |
|
| 1/2 | 000 | — | 000 | 0 | 1 | DIN0 | DIN1 |
| 2/3 | 000 | — | 001 | 0 | 1 | DIN0 | DIN1 |
| 001 | 0 | 000 | 1 | 0 | NULL | DIN0 |
| 001 | 1 | 111 | 1 | 0 | NULL | DIN0 |
| 111 | — | 000 | 1 | 0 | DIN0 | NULL |
| 3/4 | 000 | — | 001 | 0 | 1 | DIN0 | DIN1 |
| 001 | — | 010 | 1 | 0 | NULL | DIN0 |
| 010 | 0 | 000 | 1 | 0 | DIN0 | NULL |
| 010 | 1 | 111 | 1 | 0 | DIN0 | NULL |
| 111 | — | 000 | 1 | 0 | DIN0 | NULL |
| 5/6 | 000 | — | 001 | 0 | 1 | DIN0 | DIN1 |
| 001 | — | 010 | 1 | 0 | NULL | DIN0 |
| 010 | — | 011 | 1 | 0 | DIN0 | NULL |
| 011 | — | 100 | 1 | 0 | NULL | DIN0 |
| 100 | 0 | 000 | 1 | 0 | DIN0 | NULL |
| 100 | 1 | 111 | 1 | 0 | DIN0 | NULL |
| 111 | — | 000 | 1 | 0 | DIN0 | NULL |
| 6/7 | 000 | — | 001 | 0 | 1 | DIN0 | DIN1 |
| 001 | — | 010 | 1 | 0 | NULL | DIN0 |
| 010 | — | 011 | 1 | 0 | NULL | DIN0 |
| 011 | — | 100 | 1 | 0 | DIN0 | NULL |
| 100 | — | 101 | 1 | 0 | NULL | DIN0 |
| 101 | 0 | 000 | 1 | 0 | DIN0 | NULL |
| 101 | 1 | 111 | 1 | 0 | DIN0 | NULL |
| 111 | — | 000 | 1 | 0 | DIN0 | NULL |
| 7/8 | 000 | — | 001 | 0 | 1 | DIN0 | DIN1 |
| 001 | — | 010 | 1 | 0 | NULL | DIN0 |
| 010 | — | 011 | 1 | 0 | NULL | DIN0 |
| 011 | — | 100 | 1 | 0 | NULL | DIN0 |
| 100 | — | 101 | 1 | 0 | DIN0 | NULL |
| 101 | — | 000 | 1 | 0 | NULL | DIN0 |
| 110 | 0 | 000 | 1 | 0 | DIN0 | NULL |
| 110 | 1 | 111 | 1 | 0 | DIN0 | NULL |
| 111 | — | 000 | 1 | 0 | DIN0 | NULL |
|
[0101] One embodiment of depuncture logic 910 is based on Table 4 shown above. This table is derived from Table 1. In one embodiment, the state of the depuncture logic 910 is held in a register. The current state and the code rate determines the next state and the outputs. In one embodiment, 4 output signals control the functioning of the depuncture logic. In one embodiment, these signals are referred to as RD1, RD2, SYMICTL and SYMQCTL. The depuncture logic continuously cycles through all the states as indicated in Table 4.
[0102] RD1 and RD2 are mutually exclusive, i.e., both cannot be asserted at the same time. if RD1 is asserted then 1 symbol value is read from the symbol value queue 915 . If RD2 is asserted the 2 symbol values are read from the symbol value queue 915 . SYMICTL controls the value being sent out as symbol value I to the Viterbi decoder 700 . SYMICTL can take two values: DIN0 and NULL. NIN0 indicates that the first symbol value read from the symbol value queue is sent out as symbol value I. NULL indicates that a NULL symbol is inserted at symbol value I position.
[0103] SYMQCTL controls the value being sent out as symbol value Q to the Viterbi decoder 700 . SYMQCTL can take three values: DIN0, DIN1, and NULL. DIN0 indicates that the first symbol value read from the symbol value queue is sent out as symbol value Q. DIN1 indicates that the second symbol value read out of the symbol value queue is sent out as symbol value Q. NULL indicates that a NULL symbol is inserted at symbol value Q position. An additional control signal may be sent along with the null symbol value to be used by the Viterbi decoder 700 to handle NULL symbols in a special manner.
[0104] Two control signals from the byte synchronization unit 265 that affect the depuncture region 715 are referred to herein as “change puncture phase” and “current rotational phase” signals. In one embodiment, these signal operate on a per-transponder/carrier basis, so there are 4 independent signals for each of them giving a total of 8 signals. The BSYNC unit accumulates bits received from the Viterbi decoder unit 260 and attempts to detect a meaningful byte pattern. If it does not find a recognizable pattern within a programmable amount of time, then it will either indicate to the depuncture/rotator units 710 to change the rotator phase or the puncture phase.
[0105] The “change puncture phase” signal indicates a change is required in the puncture phase for a given transponder. The BSYNC unit sends this signal as a single clock pulse to the depuncture logic. When the depuncture logic receives the “change puncture phase” signal, it tries a new puncturing phase, and the design of depuncture logic is such that it cycles through all possible puncturing phases. When the right combination of the rotator phase and depuncture phase is found, the BSYNC unit will be able to find a recognizable pattern, i.e., it will achieve synchronization and it will stop sending the “change puncture phase” signal.
[0106] In one embodiment, the “change puncture phase” signal is a pulse and it is latched and held by the depuncture unit, and is called the “change phase” signal. If the “change phase” signal is set, then the depuncture state for each code rate transitions to a special state indicated by state number 7 in Table 4. This transition occurs only after the last state for a particular code rate is reached. For example, for code rate {fraction (5/6)}, state number 4 is normally the last state and then it transitions to state 0. If “change phase” signal is set, then state number 4 is followed by the special state 7. In state 7, a single symbol value is read from the symbol value queue, the read symbol value is passed as the I symbol value to the Viterbi decoder, and a NULL value is passed as the Q symbol value. This mechanism ensures that a change of puncture phase occurs at the depuncture unit. State number 7 then transitions back to state 0, and the “change phase” signal is cleared. This unique design guarantees that a new puncture phase will be tried on each occurrence of the “change puncture phase” signal from the BSYNC unit. The “change phase” signal has no affect on the operation of the depuncture unit during any state other than the last state for the particular code rate. On every puncture phase change, the depuncture region sends out a control signal which is piped along with the symbol values coming out of the depuncture region. This signal is used by the puncture block 1020 in the feedback path.
[0107] The current rotational phase signals specify the current rotational phase for the rotator logic 900 . This signal is fed to the rotator logic 900 in the depuncture/rotator unit 720 and the de-rotator in the Viterbi Feedback path 1000 . This signal is used as a multiplexer select for the rotator logic 900 and the de-rotator logic 1030 .
[0108] As mentioned above, each depuncture control block 712 handles context switching between the transponder contexts in a depuncture region 715 . In one embodiment, the depuncture control block 712 also controls the replay behavior of the Viterbi decoders 700 (described in detail below) region and the buffering required for the depuncture logic 910 . The depuncture control block 712 receives a vector which indicates the active transponder. In one embodiment, it is ultimately is responsible for the following functions:
[0109] (1) Sending 4 read-enable signals (1 per transponder) to the Viterbi buffer 720 . Only one of these 4 read-enables is active at any given time. The Viterbi buffer 720 selects the correct read pointer based on the active read-enable signal, read the buffer entry, and provide the 4 symbols to the depuncture/rotator unit 710 . The read pointer is incremented following the read. On every context switch, the depuncture control block 712 selects a new transponder buffer (e.g., in a round-robin fashion). During Viterbi replay state, the read-enables are masked off so that no reads occur.
[0110] (2) Generating a save-ACS signal which is piped along with the symbols to the Viterbi region. Every context switch is preceded by a save-ACS signal. The Viterbi region needs to be fed exactly 64 symbols between a context switch and a previous save-ACS assertion. The save-ACS signal will be described in greater detail below.
[0111] (3) Generate a context switch signal which is piped along with the symbols. This signal is used to select a new depuncture/rotator unit 710 and to select new transponder data from the Viterbi buffer 720 . The depuncture control block signals a context switch when the number of symbols processed for a transponder exceeds a predetermined maximum limit, or the number of symbols in the Viterbi buffer 720 falls below some minimum number.
[0112] FIG. 11 illustrates a state diagram describing one embodiment of the depuncture control block 712 . As illustrated, according to this embodiment the depuncture control block 712 has three states in its state machine (IDLE 1100 , PROCESS 1110 , and REPLAY 1120 ) and it maintains three counters (maxcounter, mincounter, replaycounter). Each of these counters can be loaded with a predetermined (e.g., software programmable) value. In one embodiment, MINCOUNTER is loaded with a value of 64, MAXCOUNTER is loaded with a value of 256, and REPLAYCOUNTER is loaded with a value of 64. The following is the description of each state:
[0113] (1) IDLE 1100 : The depuncture control block 712 stays in the Idle state as long as there are less than 64 symbols to be processed in the Viterbi buffer 720 . When the number of symbols in the Viterbi buffer 720 exceed 64, the Viterbi buffer 720 sends a signal to the depuncture control block 712 block. This signal triggers the transition to the process state, generates the save-ACS signal and loads the maxcounter and mincounter.
[0114] (1) PROCESS 1110 : While in the process state, the maxcounter and mincounter are decremented when valid symbols are sent to Viterbi decoders. In addition, while in the process state, the depuncture control block 712 generates read-enable signals when it needs to read new symbols from the Viterbi buffer 720 . The mincounter gets reloaded every time the Viterbi buffer 720 asserts its signal indicating that the number of buffered symbols exceed 64. When either one of maxcounter or mincounter goes to zero, a context switch is signaled by the depuncture control block 712 , the state transitions to replay state (described below), and the replay counter is loaded. On every context switch, the depuncture control block 712 identifies a new transponder by updating the read-enable signals.
[0115] REPLAY 1120 : In this state, the replay counter is decremented every cycle. Once the replay counter goes to zero, and if the Viterbi buffer signal is asserted (i.e., indicating more than 64 buffered symbols) for the current transponder, then the state will transition to PROCESS state. If the Viterbi buffer signal is not asserted, then the depuncture control block 712 will transition to the IDLE state.
[0116] In one embodiment, a Viterbi Feedback Path (“VFP”) 1000 , illustrated in FIG. 10 , is provided in the depuncture region 715 . It is composed of a Viterbi encoder 1010 , a puncture block 1020 , a de-rotator 1030 , and a fine SNR block 1040 . The feedback path provides feedback from the Viterbi encoders 1010 to a fine SNR block 1040 associated with the slicers 255 . In particular, the fine SNR block 1040 uses this information to update the slicer decision levels and/or to monitor noise variance and signal power.
[0117] In one embodiment, the feedback response bit from the Viterbi encoders is transmitted all the way through the feedback path along with its associated data bit. This will eventually reach the fine SNR block 1040 and will indicate a valid response to the fine SNR's feedback request. In one embodiment, there are four instances of this entire path in the depuncture region 715 (i.e., each transponder is provided with its own path).
[0118] FIG. 12 illustrates a Viterbi encoder 1010 employed in one embodiment of the invention. It is comprised of a shift register structure with taps to generate two outputs every cycle. The encoder 1010 takes a single bit from the Viterbi decoder 700 and re-encodes it to two hard decision values, I and Q (i.e., using the rate {fraction (1/2)} encoder). The I and Q values are then passed to the puncture block 1020 .
[0119] The puncture block 1020 operates in a converse manner to the depuncture block 910 . Instead of adding null symbol values, it throws away the symbol values according to the puncture patterns described in Table 1. In one embodiment, no buffering is required in the depuncture block 910 because the output rate is always less than or equal to the input rate (i.e., because the puncture block throws away symbol values). The state machine for the puncture block is described in Table 5 below. The control signal indicating a change of puncture phase is piped along with the data coming from the Viterbi encoder. IN one embodiment, this change of phase signal is guaranteed to arrive only when the puncture block is in state 0 (for any of the code rates), and it is asserted only for a single symbol. The puncture state machine described in the table below generates two outputs: NOPNI and NOPNQ. NOPNI indicates that the I symbol value is not punctured, while NOPNQ indicates that the Q symbol value is not punctured.
5 | TABLE 5 |
|
|
| Code Rate | Current | Change | Next | | |
| Name | State | Phase | State | NOPNI | NOPNQ |
|
| 1/2 | 000 | — | 000 | 1 | 1 |
| 2/3 | 000 | 1 | 000 | 1 | 0 |
| 000 | 0 | 001 | 1 | 1 |
| 001 | — | 000 | 0 | 1 |
| 3/4 | 000 | 1 | 000 | 1 | 0 |
| 000 | 0 | 001 | 1 | 1 |
| 001 | — | 010 | 0 | 1 |
| 010 | — | 000 | 1 | 0 |
| 5/6 | 000 | 1 | 000 | 1 | 0 |
| 000 | 0 | 001 | 1 | 1 |
| 001 | — | 010 | 0 | 1 |
| 010 | — | 011 | 1 | 0 |
| 011 | — | 100 | 0 | 1 |
| 100 | — | 000 | 1 | 0 |
| 6/7 | 000 | 1 | 000 | 1 | 0 |
| 000 | 0 | 001 | 1 | 1 |
| 001 | — | 010 | 0 | 1 |
| 010 | — | 011 | 0 | 1 |
| 011 | — | 100 | 1 | 0 |
| 100 | — | 101 | 0 | 1 |
| 101 | — | 000 | 1 | 0 |
| 7/8 | 000 | 1 | 000 | 1 | 0 |
| 000 | 0 | 001 | 1 | 1 |
| 001 | — | 010 | 0 | 1 |
| 010 | — | 011 | 0 | 1 |
| 011 | — | 100 | 0 | 1 |
| 100 | — | 101 | 1 | 0 |
| 101 | — | 110 | 0 | 1 |
| 110 | — | 000 | 1 | 0 |
|
[0120] The de-rotator block 1030 is fed by the puncture block 1020 . It rotates symbols using the exact inversion of the rotator block 900 based on the “current rotational phase” signals described above. The phase rotation table for one embodiment of the de-rotator 1030 is shown in Table 6 below.
6 | TABLE 6 |
|
|
| De-rotator | | |
| Phase | I rot | Q rot |
|
| 0° | I | Q |
| −90° | ˜Q | I |
|
[0121] By rotating −90 degrees, all de-rotators can reach all phases (i.e., −90, −180, −270 and 0 degrees). The output of the de-Rotator will be two rotated symbol values, Irot and Qrot. However, in one embodiment, only the Irot symbol value must be passed on because the fine SNR block 1040 only looks at the I values of the symbol.
Viterbi Region
[0122] For those unfamiliar with the principles associated with Viterbi encoding/decoding, a general discussion of these principles can be found in BRUCE A. CARLSON, COMMUNICATION SYSTEMS, AN INTRODUCTION TO SIGNALS AND NOISE IN ELECTRICAL COMMUNICATION (3 rd ed. 1986) at 491-508, and SIMON HAYKIN, DIGITAL COMMUNICATIONS (1988) at 393-141.
[0123] In one embodiment of the invention, each of the Viterbi decoders is comprised of (1) a Replay Unit and Replay Buffers; (2) a Branch Metric Unit; (3) an Add-Compare-Select Unit and ACS Buffers; (4) a forward-tracing array; and (5) a Minimization Unit.
Replay Unit and Replay Buffers
[0124] As mentioned above, in one embodiment, eight Viterbi decoders 700 are shared across thirty-two transponders with each Viterbi decoder servicing four transponders. Of course, various alternate numbers of Viterbi decoders may be employed while still complying with the underlying principles of the invention (e.g., based on variables such as the processing throughput of the Viterbi decoders, the required bitrate of the transponder data streams, and the number of transponders, to name a few).
[0125] Moreover, although described below with respect to the Viterbi algorithm, the principles of the invention may be implemented in systems which use alternate types of encoding/decoding. This may include, for example, various other types of maximum-likelihood codes, forward error correction (“FEC”) codes, convolutional codes (e.g., Turbo Code), and cyclic codes (e.g., Reed-Solomon Codes), to name a few.
[0126] In one embodiment, when a particular decoder changes the transponder or cable carrier it is processing, the decoder is restored to the same state it was in when it was processing the same transponder/carrier the last time around. As used herein, a “context switch” occurs when the decoder switches from processing one transponder/carrier to another. Restoring the state of the decoder on a context switch may be accomplished in a variety of ways. For example, in one embodiment, the decoder state is saved on every context switch. The correct state is then selected when processing a particular transponder. Alternatively, or in addition, the state itself may not be saved. Rather, when switching from one transponder (or cable carrier) to another, N symbols output by the transponder the last time around are replayed, thereby restoring the state of the decoder. In one embodiment, N is greater than or equal to the depth of the Viterbi trellis. In one specific embodiment, N=64. However, it will be appreciated that the particular value of N is not pertinent to the underlying principles of the invention.
[0127] There are various cost/performance tradeoffs between the non-replay and the replay scheme. For example, under the non-replay scheme the same output bandwidth (e.g., 1 GB/sec) may be achieved as that of the replay scheme using fewer Viterbi decoders. On the other hand, the replay scheme may require fewer forward-tracing arrays (e.g., 8 as opposed to 32). Either scheme may be more or less appropriate depending on the system configuration (e.g., based on parameters such as the required output bandwidth, number of transponders processed, . . . etc).
[0128] One advantage which the replay scheme has over the non-replay scheme is that in the replay scheme, a multi-cycle bubble due to a context switch can be tolerated whereas in the non-replay scheme, the context switch may need to be accomplished in fewer (e.g., 0) cycles. Another issue to be considered is that the non-replay scheme may require a wider fanout of signals from the add-compare-select unit 1320 (described below). For example, as illustrated in FIG. 14, 64 ACS outputs may need to feed 4 forward-tracing arrays 1410 - 1416 and the 64 outputs of the 4 forward-tracing arrays 1410 - 1416 may need to be multiplexed (e.g., via mux 1420 ) to feed the minimization logic 1350 .
[0129] One embodiment of a Viterbi decoder 1300 which employs a replay scheme is illustrated in FIG. 13 a . As used herein, a “context switch” refers to a switch from processing data from one transponder (or other signal carrier—e.g., such as a cable carrier) to another. Using the replay scheme, on a context switch, the forward-tracing array 1340 may be restored to the state it was in when it left off processing the same transponder the last time around. In one embodiment, this is accomplished by replaying the last N symbols of the transponder through the decoder and discarding the output. After the last N symbols are replayed, the decoder is ready to accept new symbols for the transponder/carrier. During the replay period, the output from the forward-tracing array 1340 may be ignored.
[0130] In order to be able to replay the last N symbols from each transponder, the symbols transmitted from the depuncture/rotator block(s) 715 need to be saved off in one or more replay buffers 1310 . In an embodiment in which the depuncture/rotator block 715 provides data for only 1 of the 4 transponders at any given time, the replay buffers for the 4 transponders may be implemented as a single register file. In one embodiment, N=64, each row of the register file 1310 holds 1 symbol (10 bits), and there are 64*4=256 rows. Accordingly, in this embodiment, the size of each register file is 256×10 bits. Moreover, in one embodiment, the register file 1310 is provided with 1 read, and 1 write port. It should be noted, however, that the numbers set forth above represent one specific embodiment of the invention. Various alternate buffering configurations may be employed while still complying with the underlying principles of the invention.
[0131] As described above, the depuncture/rotator block 715 signals a context switch when it is done providing data for the current transponder. In one embodiment, the context switch signal is transmitted along with the last symbol to be processed for the current transponder. The replay unit 1311 uses the context switch signal along with a 4-bit one-hot transponder/carrier vector which indicates the current active transponder/carrier to generate the read and write addresses to the replay buffers 1310 . Accordingly, in this embodiment, the one-hot transponder/carrier signal is updated on every context switch.
[0132] The depuncture/rotator block 715 also generates a “save ACS” signal some predetermined number of clocks before a context switch. The number of clocks may be equal to the depth of the Viterbi trellis, and is the same as the number of replay symbols (64 in one embodiment of the invention). The “save ACS” signal tells the replay unit 1311 to begin saving incoming symbols in the replay buffer 1310 .
[0133] The timing associated with one embodiment of a replay scheme is illustrated in FIG. 13 b . In this example, a context switch occurs at point 1391 . As such, at point 1390 , which is N symbols prior to point 1391 , the replay unit 1311 begins saving symbols to the replay buffer 1310 (as mentioned, in one embodiment N=64, or the depth of the Viterbi trellis). In addition, the accumulator values from the ACS units 1320 are saved off to the ACS buffers 1330 .
[0134] When the context switch occurs at point 1391 , the system begins processing symbols from a different transponder/carrier. In order to resume processing the symbols illustrated in FIG. 13 b , the decoder must be restored to the same state it was in at point 1391 the last time around. Accordingly, in one embodiment, the accumulator values are restored from the ACS buffer 1330 and the same set of N symbols are replayed from the replay buffer 1310 (i.e., starting from point 1390 ). Once all of the symbols have been replayed, the decoder is in the same state that it was in at point 1391 the last time around. The next N symbols may then be decoded.
[0135] In one embodiment, the replay buffer 1310 is divided into 4 blocks, each of which holds N replay symbols for each of the four transponders being processed. On every save ACS signal from the depuncture/rotator block 715 , the write pointer is reset to point to the start address of the corresponding block based on the one-hot transponder enable signal. Every symbol read out of the replay multiplexer 1315 following the save ACS signal is written into the replay buffer 1310 . The write pointer is incremented after every write. Writing continues in this manner until the depuncture/rotator block 715 signals a context switch.
[0136] In one embodiment, a “read enable” signal is generated on each context switch which enables reading from the replay buffers by the replay unit 1311 . The read enable signal. The read enable signal remains active for the duration of the replay state. On a context switch, the read pointer is reset to the start address of the corresponding block based on the one-hot current transponder signal. During the replay clocks, the replay buffer is read every cycle and the data is fed to the Viterbi decoder 1300 through the replay multiplexer 1315 . The read pointer is incremented after every read and, at end of the replay clocks, the “read enable” signal is disabled until the next context switch.
[0137] Upon receiving the context switch, the replay unit 1311 uses it to switch the replay multiplexer 1315 to select data from the replay buffer 1310 on the next cycle. The select on the replay multiplexer 1315 stays in this state for the duration of the replay clocks. At the end of the replay clocks, the replay multiplexer 1315 then selects symbols from the depuncture/rotator block 715 until the next context switch.
[0138] In one embodiment, the replay unit 1311 sends a “valid bit” signal which enables the Viterbi decoder when valid symbols are read from depuncture/rotator block 715 or the replay buffer 1310 . In addition, in one embodiment, du