Abstract:
An apparatus encodes data blocks into code blocks, each code block containing more symbols than its respective data block. The apparatus includes a data block latch for receiving individual data blocks and for dividing each data block into two sub-blocks. An encoder receives one of the data sub-blocks and encodes the first data sub-block as a code sub-block. An interleaver, coupled to the encoder and the data block latch, combines the code sub-block with the second data sub-block to produce a code block, such that when the code blocks are concatenated with each other to produce a string of code symbols no more than five consecutive occurrences of a particular code symbol are present in the string of code symbols.

Description:
This application claims priority from U.S. Provisional Application Ser. No. 60/023,225 filed on Aug. 5, 1996. 
     BACKGROUND OF THE INVENTION 
     The present invention relates to encoding data for transmission through a channel and for decoding such encoded data after its transmission through a channel. In particular, the present invention relates to encoders and decoders which implement run length limited codes. 
     Information that is transmitted from a source to a destination can be considered generically to pass through a channel. In some communication systems, the channel comprises electromagnetic radiation passing through the atmosphere. In other communication systems, the channel comprises a long conductor between the source and destination. Still other communication systems comprise a magnetic disk, where information from the source is stored on the disk and later retrieved from the disk for delivery to the destination. 
     In each communication system, the information transmitted through the channel can be corrupted by noise within the channel so that the information transmitted from the source is not the same as the information received by the destination. To identify when such errors have occurred, and in some cases to correct such errors, information is typically encoded at the source using a code that can be decoded at the destination. The code is designed to have a set of valid codewords that satisfy certain coding constraints, both as individual codewords and as a collection of concatenated codewords. When the destination receives values that violate the coding constraints, it knows that there has been an error. 
     Typically, such encoding involves translating a block of input information containing a number of information symbols into a block of coded information containing a number of coded symbols. The ratio of the number of symbols in the input information to the number of symbols in the encoded information is known as the rate of the code. Thus, if 16 symbols of information are encoded as 17 coded symbols the rate of the code is 16/17. The number of coded symbols is always greater than the number of input symbols, so the rate is always less than one. However, it is advantageous to use codes that have the highest possible rate since higher rate codes are more efficient than lower rate codes. High rate codes are efficient because each code symbol transmitted through the channel requires time and energy. If fewer code symbols are transmitted through the channel for a give number of input symbols, less time and energy is used by the channel to transmit the input data. Thus, a rate 16/17 code is more efficient than a rate 16/18 code since the 16/17 code can transmit 16 symbols of input data using one less symbol of code data than the 16/18 code. 
     In many communication systems, including magnetic disk drives, the decoder must be synchronized to the rate at which the coded symbols are produced by the channel. This is typically accomplished using a phase lock oscillator (PLO), also known as a phase locked loop. The phase locked loop creates a clock signal that is synchronized to the average time between transitions in the channel signal. Since the phase locked loop requires transitions in the signal in order to synchronize the clock signal, the encoder must limit the length of time separating transitions in the encoded information so that the phase locked loop&#39;s clock signal does not begin to deteriorate. This limitation is known as a run-length-limited (RLL) coding constraint. 
     In many systems, a binary value of &#34;1&#34; represents a transition in the channel signal and a binary value of &#34;0&#34; represents a lack of transitions in the channel signal. Thus, under a run-length-limited code, the encoder must limit the number of consecutive zeros used to create the channel signal. The limitation on the number of consecutive &#34;zeros&#34; is sometimes referred to as the &#34;k&#34; constraint. 
     In practice, it is difficult to find a high rate code that is simple to implement and that meets the run-length-limited constraint. For instance, to implement a rate 16/17 code that satisfies a run-length-limited constraint of &#34;k&#34;=5, requires selecting 65,536(2 16 ) codewords that meet the &#34;k&#34;=5 constraint out of a possible 131,072(2 17 ) possible codewords. Not only must the codewords themselves meet the run-length-limited constraint, but also their concatenation with all other possible codewords must meet the run-length-limited constraint. 
     Simply finding such codewords is extremely burdensome. However, finding such codewords is simple compared to constructing an encoder to encode the data into the selected codewords. Such encoders are complex since they usually attempt to find commonalities between codewords that allow for mapping between data and codewords based on fewer than all of the symbols in a section of data. 
     SUMMARY OF THE INVENTION 
     The present invention is an apparatus for encoding data blocks into code blocks. Individual data blocks are received by a data block latch which divides each data block into two data sub-blocks. An encoder receives the first data sub-block and encodes the first data sub-block into a first code sub-block. An interleaver receives the first code sub-block and the second data sub-block and combines the two sub-blocks to produce a code block. The code blocks created by the interleaver are such that when they are concatenated together, they produce a string of code symbols with no more than five consecutive occurrences of the same code symbol. 
     In preferred embodiments, some of the first data sub-blocks are encoded by simply inserting a code symbol into the first data sub-blocks. Preferably, each added code symbol is inserted at an end of each first data sub-block. Since it is easy to implement an encoder which merely adds a code symbol to produce a code sub-block, it is preferred that a majority of the first data sub-blocks be encoded through this method. 
     Typically, the present invention is used in coding systems that are based on a set of binary symbols where the two symbols in the binary set are the inverse of each other. For example, in most digital systems, the set of binary symbols is &#34;0&#34; and &#34;1&#34;, where &#34;0&#34; is the inverse of &#34;1&#34; and &#34;1&#34; is the inverse of &#34;0&#34;. 
     In a preferred embodiment of the present invention, at least some of the code sub-blocks are formed by inverting some, but not all, of the data symbols in some of the first data sub-blocks. The data symbols that are inverted are selected based on their position within the data sub-block so that the data symbols that are inverted occur in the same position in each data sub-block that is encoded in this manner. After the inversion of the selected data symbols, an additional code symbol is inserted into each mixed block of inverted and non-inverted data symbols. 
     It is preferred that a majority of the first data sub-blocks are encoded either by simply adding a code symbol to the data sub-block or by inverting a select group of the data symbols. This is preferred because these simple coding techniques can be implemented with few components, and if more data sub-blocks are encoded using theses techniques, fewer components are required to implement the encoder. 
     The method and apparatus of the present invention is particularly suited for creating a rate 16/17 code by dividing 16-bit digital words into 10-bit first data sub-blocks and 6-bit second data sub-blocks. The 10-bit data sub-blocks are encoded by the encoder into 11-bit code sub-blocks. The 11-bit code sub-blocks are then interleaved, or combined, with the 6-bit second data sub-blocks to create a 17-bit code block or codeword. Preferably, the concatenation of the codewords forms a code string that fulfills a &#34;k&#34;=5 constraint. 
    
    
     BRIEF DESCRIPTION OF THE DRAWINGS 
     FIG. 1 is a block diagram of a communication system of the present invention. 
     FIGS. 2A and 2B are mapping tables, which together show the mapping between 10 bit data sub-blocks and 11 bit code sub-blocks for the present invention. 
     FIG. 3 is a mapping table for data sub-blocks and code sub-blocks in group K. 
     FIG. 4 is a mapping table for data sub-blocks and code sub-blocks in group L. 
     FIG. 5 is a mapping table for data sub-blocks and code sub-blocks in group M. 
     FIG. 6 is a mapping table for data sub-blocks and code sub-blocks in group N. 
     FIG. 7 is a mapping table for data sub-blocks and code sub-blocks in group P. 
     FIG. 8 is a mapping table for data sub-blocks and code sub-blocks in group Q. 
    
    
     DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENTS 
     FIG. 1 is a block diagram of encoding/decoding apparatus 10, which utilizes a 16/17 rate RLL code. The original data is received by latch 30 of encoder 14 along a 16-bit line. Latch 30 divides each 16-bit data block into one 6-bit data sub-block and one 10-bit data sub-block. The 10-bit data sub-block is input to 10/11-rate encoder 32, which encodes each 10-bit data sub-block into an 11-bit code sub-block through a process described further below. The 11-bit code sub-block and the 6-bit data sub-block are received by latch 34, which is coupled to 10/11-rate encoder 32 and latch 30. Latch 34 combines the 11-bit code sub-block and the 6-bit data sub-block, in a manner described below, to produce a 17-bit code block. The 17-bit code block is input to parallel-to-serial converter 36, which sequentially outputs the individual bits of each code block. With each new code block, parallel-to-serial converter 36 concatenates the preceding code block to the current code block by simply performing the parallel-to-serial conversion. 
     Pre-coder 16, which is connected to parallel-to-serial converter 36 of encoder 14, receives the code symbols of the concatenated code blocks and performs additional operations on the code symbols to optimize the efficiency of their transmission through the channel. Typically, pre-coder 16 has a transfer function of 1/(1⊕D), where &#34;1&#34; represents the input signal, &#34;D&#34; represents the input signal delayed by one time unit, and ⊕ represents the EXCLUSIVE-OR logic operation. Pre-coders with this type of transfer function are known as NRZI pre-coders. Alternatively, pre-coder 16 can have a transfer function of 1/(1+D 2 ), where &#34;1&#34; represents the input signal and &#34;D 2  &#34; represents the input signal delayed by two time units. Pre-coders with this type of transfer function are known as interleaved NRZI pre-coders. The two pre-coders referenced above are simply examples of possible pre-coders and those skilled in the art will recognize that other pre-coders may be used in their place. 
     Pre-coder 16 is connected to channel 18, which in magnetic disk drives comprises a magnetic medium and magnetic heads used to &#34;write&#34; magnetic information to the magnetic medium and &#34;read&#34; magnetic information from the magnetic medium. The output from channel 18 is received by an equalizer 20 which optimizes the channel output signal for desired characteristics. These desired characteristics are usually dictated by the natural characteristics of channel 18 and the type of detection method used by a detector 22, which receives the equalized signals from equalizer 20. 
     Detector 22 may comprise any one of a number of detectors including a Viterbi detector, a Decision Feedback Equalizer (DFE), or a Fixed Delay Tree Search (FDTS) detector. Those skilled in the art will recognize that any of these detectors may be used as detector 22, as long as pre-coder 16 is selected to match the chosen detector. Detector 22 converts the equalized signal from equalizer 20 into a digital representation of the output digital signal produced by parallel-to-serial converter 36. 
     The digital signal from detector 22 is input to serial-to-parallel convertor 50 of decoder 24. Serial-to-parallel convertor 50 converts the serial digital values from detector 22 into parallel groups of 17-bit code blocks. The code blocks are input to latch 52 along a 17-bit line. Latch 52 divides each 17-bit code block into an 11-bit code sub-block and a 6-bit data sub-block. The division is accomplished using a reverse mapping of the mapping used by latch 34 to combine the 11-bit code sub-block from 10/11-rate encoder 32 and the 6-bit data sub-block from latch 30. The 11-bit code sub-block from latch 52 is input to 11/10-rate decoder 54 which decodes the 11-bit code sub-block into a 10-bit data sub-block through a process described further below. 
     The 10-bit data sub-block from 11/10-rate decoder 54 and the 6-bit data sub-block from latch 52 are combined by latch 56 into a 16-bit data block. Latch 56 combines the two data sub-blocks by using the inverse of the mapping used by latch 30 to divide the 16-bit input data block into 6-bit and 10-bit data sub-blocks. 
     Returning to the mappings performed by encoder 14, latch 30 of encoder 14 divides a data block denoted as D into two data sub-blocks denoted as A and B, wherein: 
     
         DΔ D.sub.15 D.sub.14 D.sub.13 D.sub.12 D.sub.11 D.sub.10 D.sub.9 D.sub.8 D.sub.7 D.sub.6 D.sub.5 D.sub.4 D.sub.3 D.sub.2 D.sub.1 D.sub.0 !,(1) 
    
     
         AΔ A.sub.9 A.sub.8 A.sub.7 A.sub.6 A.sub.5 A.sub.4 A.sub.3 A.sub.2 A.sub.1 A.sub.0 !,                                        2) 
    
     and 
     
         BΔ B.sub.5 B.sub.4 B.sub.3 B.sub.2 B.sub.1 B.sub.0 !.(3) 
    
     Data sub-block A is encoded by 10/11-rate encoder 32 into an 11-bit code sub-block C, wherein: 
     
         CΔ C.sub.10 C.sub.9 C.sub.8 C.sub.7 C.sub.6 C.sub.5 C.sub.4 C.sub.3 C.sub.2 C.sub.1 C.sub.0 !.                                (4) 
    
     The encoding performed to produce code sub-block C is discussed further below. Latch 34 combines code sub-block C and data sub-block B to form code block W, wherein: 
     
         WΔ C.sub.10 C.sub.9 B.sub.5 C.sub.8 B.sub.4 C.sub.7 C.sub.6 B.sub.3 B.sub.2 C.sub.5 C.sub.4 B.sub.1 C.sub.3 B.sub.0 C.sub.2 C.sub.1 C.sub.0 !,(5) 
    
     To ensure that the 17-bit code blocks W and the concatenation of the code blocks with each other meet the &#34;k&#34;=5 constraint, the bits of code sub-block C must satisfy all seven of the following equations: 
     
         C.sub.10 +C.sub.9 +C.sub.8 =1                              (6) 
    
     
         C.sub.8 +C.sub.7 +C.sub.6 =1                               (7) 
    
     
         C.sub.7 +C.sub.6 +C.sub.5 =1                               (8) 
    
     
         C.sub.6 +C.sub.5 +C.sub.4 =1                               (9) 
    
     
         C.sub.5 +C.sub.4 +C.sub.3 =1                               (10) 
    
     
         C.sub.4 +C.sub.3 +C.sub.2 +C.sub.1 =1                      (11) 
    
     
         C.sub.2 +C.sub.1 +C.sub.0 =1,                              (12) 
    
     wherein the bits of sub-block C have values of either &#34;0&#34; or &#34;1&#34; and &#34;+&#34; denotes a logical OR operation. When all of these equations are true, a code block W will not have more than 5 consecutive zeros even when concatenated with other code blocks. 
     Specifically, equations 6 and 12 ensure that the &#34;k&#34;=5 constraint is not violated when two code blocks are concatenated. For instance, if a code block W s  is concatenated with a code block W s-1 , where W s  and W s-l  are both constructed using equation 5, the concatenation will produce a string of bits consisting of  B 0 , C 2 , C 1 , C 0 , C 10 , C 9 , B 5 , C 8  !. Equations 6 and 12 together ensure that in a worst case situation this concatenated string will not violate the &#34;k&#34;=5 constraint. Specifically, with equations 6 and 12, the worst case situation is when C 2  =&#34;1&#34;, C 8  =&#34;1&#34;, and the remaining bits in the string are equal to &#34;0&#34;. However, even under this worst case, there are only 5 bits between C 2  and C 8 , so there are at most 5 consecutive zeros in the concatenation of code block W s  and code block W s-1 . 
     Those skilled in the art will recognize that the order of bits in Equation 5 may be reversed without affecting the requirements of Equations 6-12, as long as each code block is constructed in the same manner as all other code blocks. Thus latch 34 may form code block W as: 
     
         WΔ C.sub.0 C.sub.1 C.sub.2 B.sub.0 C.sub.3 B.sub.1 C.sub.4 C.sub.5 B.sub.2 B.sub.3 C.sub.6 C.sub.7 B.sub.4 C.sub.8 B.sub.5 C.sub.9 C.sub.10 !,(13) 
    
     without changing Equations 6-12, as long as all code blocks W have the order shown in Equation 13. 
     Those skilled in the art will also recognize that the particular code bits assigned to a particular position in Equations 5 and 13 may be changed as long as: the relative order of code-bits to data-bits shown in Equations 5 and 13 remains unchanged; the position of particular code bits in W is the same for all codewords; and Equations 6-12 are modified to reflect the change in position of specific code bits. Thus, if code bits C 10  and C 0  are swapped in Equation 5 so that C 0  is the most significant bit in W and C 10  is the least significant bit in W, Equations 6 and 12 become: 
     
         C.sub.0 +C.sub.9 +C.sub.8 1                                (14) 
    
     
         C.sub.2 +C.sub.1 +C.sub.10 =1,                             (15) 
    
     respectively. 
     In the discussion below, specific coding methods are described for a 10/11-rate encoder used with latch 34 to create code blocks based on Equation 5. Those skilled in the art will recognize that appropriate changes may be made to the encoder if the location of specific code bits within Equation 5 is changed while maintaining the relative position of code bits to data bits in Equation 5. Thus, if C 10  and C 0  are switched with each other in Equation 5, suitable changes will need to be made to the equations described below. 
     Of the 2,048 (2 11 ) possible 11-bit patterns for the code sub-block C, only 1,067 satisfy the conditions in the equations 6-12. This is more than the number necessary to map each 10-bit data sub-block into the 11-bit code sub-block since there are only 1,024 (2 10 ) possible 10-bit patterns. FIGS. 2A and 2B show the one-to-one mapping used by the present invention to map each 10-bit data sub-block A to an 11-bit code sub-block C using Equation 5 to create the code blocks. FIGS. 2A and 2B use a hexadecimal format to represent the sub-blocks with the least significant hexadecimal value of data sub-block A represented in the top lines of the tables and the two most significant hexadecimal digits of data sub-block A represented in the left most columns of the respective tables. 
     The 1,024 possible combinations of symbols that can be found in data sub-block A can be divided into three types, identified by the following equations: 
     
         T.sub.1 =(A.sub.8 +A.sub.7 +A.sub.6)*(A.sub.7 +A.sub.6 +A.sub.5)*(A.sub.6 +A.sub.5 +A.sub.4)*(A.sub.5 +A.sub.4 +A.sub.3)*(A.sub.4 +A.sub.3 A.sub.2 +A.sub.1)*(A.sub.2 +A.sub.1 +A.sub.0)                     (16) 
    
     
         T.sub.2 = (A.sub.9 +A.sub.8)*(A.sub.8 +A.sub.7 +A.sub.6)*(A.sub.7 +A.sub.6 +A.sub.5)*(A.sub.6 +A.sub.5 +A.sub.4)*(A.sub.5 +A.sub.4 +A.sub.3)*(A.sub.4 +A.sub.3 +A.sub.2 +A.sub.1)*(A.sub.2 +A.sub.1 +A.sub.0)!*T.sub.1(17) 
    
     
         T.sub.3 =(T.sub.1 *T.sub.2)                                (18) 
    
     where &#34;*&#34; denotes a logical AND operation, &#34;+&#34; denotes a logical OR operation, and &#34;x&#34; denotes an inversion or a logical NOT operation of the value &#34;x&#34;. In addition, T 1 , T 2 , and T 3  act as Boolean variables that indicate whether a particular data sub-block belongs to type I, II or III, respectively. When one of the Boolean variables is equal to &#34;0&#34;, the data sub-block is not of the type represented by the variable, and when the variable is equal to &#34;1&#34; the data sub-block is of the type represented by the variable. For instance, when equation 16 equals &#34;1&#34;, data sub-block A is a type I data sub-block. 
     For those data sub-blocks that fall within type I, 10/11-rate encoder 32 creates code word sub-block C from data sub-block A by assigning the bits of data sub-block A to the least significant bits of code sub-block C and assigning &#34;1&#34; to the most significant bit of code sub-block C. In other words, 10/11 rate encoder 32 performs the following assignments: 
     
         C.sub.10 =&#34;1&#34;, C.sub.9 =A.sub.9, C.sub.8 =A.sub.8, C.sub.7 =A.sub.7, C.sub.6 =A.sub.6, C.sub.5 =A.sub.5, C.sub.4 =A.sub.4, C.sub.3 =A.sub.3, C.sub.2 =A.sub.2, C.sub.1 =A.sub.1, C.sub.0 =A.sub.0.     (19) 
    
     Since this mapping is extremely easy to implement, requiring only that a one be concatenated to data sub-block A, it greatly reduces the complexity of 10/11-rate encoder 32. Moreover, since there are a total of 602 patterns in data sub-block A that belong to type I, a majority of the data sub-blocks can be encoded using this simple system. 
     For data sub-blocks that satisfies the conditions of type II, 10/11-rate encoder 32 inverts bits A 4  through A 9  to create code bits C 4  through C 9  ; data bits A 0  through A 3  are assigned directly to code bits C 0  through C 3  ; and the most significant bit of code sub-block C is assigned &#34;0&#34;. In other words, the 11-bits of code sub-block C are assigned the following values: 
     
         C.sub.10 =&#34;0&#34;, C.sub.9 =A.sub.9, C.sub.8 =A.sub.8, C.sub.7 =A.sub.7, C.sub.6 =A.sub.6, C.sub.5 =A.sub.5, C.sub.4 =A.sub.4, C.sub.3 =A.sub.3, C.sub.2 =A.sub.2, C.sub.1 =A.sub.1 and C.sub.0 =A.sub.0,  (20) 
    
     where &#34;x&#34; denotes the inversion of &#34;x&#34;. 
     Of the 1,024 possible patterns for data sub-block A, 207 belong to type II. Thus, there are 809 patterns for data sub-block A that are either type I or II. Since there are only 1,024 possible patterns for data sub-block A, nearly 80 percent of the possible patterns are type I or II. This means that 80 percent of the data sub-blocks can be encoded using very simple logic circuits. 
     The remaining 215 patterns for data sub-block A belong to type III. To make the encoder/decoder design simpler, sub-blocks are grouped together based on commonalities with other sub-blocks. In one embodiment of the present invention, the type III data sub-blocks are organized into six groups: K, L, M, N, P, Q. The one-to-one mapping between code sub-blocks and data sub-blocks in groups K, L, M, N, P, Q are shown in FIGS. 3, 4, 5, 6, 7 and 8, respectively. The six groups of type III data sub-blocks are identified by six different Boolean variables, which are determined by evaluating expressions that evaluate to &#34;1&#34; if the data sub-block is part of the group and to &#34;0&#34; if the data sub-block is not part of the group. The Boolean variables have the same letter as the group they represent and are determined as follows: 
     
         K=(H.sub.8 *H.sub.1 *H.sub.0)*(J.sub.8 +J.sub.0)           (21) 
    
     
         L=(H.sub.8 +H.sub.1 +H.sub.0)*(J.sub.8 +J.sub.0)           (22) 
    
     
         M=((A.sub.8 *H.sub.3)+(G.sub.1 *H.sub.12))*A.sub.3 *J.sub.0(23) 
    
     
         N=G.sub.3 *J.sub.1 *J.sub.0 *(((H.sub.8 +H.sub.1 +H.sub.0)*J.sub.8)+((H.sub.12 +H.sub.4)*A.sub.3))         (24) 
    
     
         P=(H.sub.14 +H.sub.1)*J.sub.1                              (25) 
    
     
         Q=G.sub.3 *H.sub.14 *J.sub.1 *A.sub.4,                     (26) 
    
     where &#34;*&#34; denotes a logical AND operation, &#34;+&#34; denotes a logical OR operation and &#34;x&#34; denotes a logical NOT operation. The values for G, H and J are defined as follows: 
     
         G.sub.1 =A.sub.9 *A.sub.8                                  (27) 
    
     
         G.sub.3 =A.sub.9 *A.sub.8                                  (28) 
    
     
         H.sub.0 =A.sub.7 *A.sub.6 *A.sub.5 *A.sub.4                (29) 
    
     
         H.sub.1 =A.sub.7 *A.sub.6 *A.sub.5 *A.sub.4                (30) 
    
     
         H.sub.3 =A.sub.7 *A.sub.6 *A.sub.5 *A.sub.4                (31) 
    
     
         H.sub.4 =A.sub.7 *A.sub.6 *A.sub.5 *A.sub.4                (32) 
    
     
         H.sub.8 =A.sub.7 *A.sub.6 *A.sub.5 *A.sub.4                (33) 
    
     
         H.sub.12 =A.sub.7 *A.sub.6 *A.sub.5 *A.sub.4               (34) 
    
     
         H.sub.14 =A.sub.7 *A.sub.6 *A.sub.5 *A.sub.4               (35) 
    
     
         J.sub.0 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                (36) 
    
     
         J.sub.1 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                (37) 
    
     
         J.sub.8 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                (38) 
    
     The production of the individual bits of code sub-block C can be expressed as individual equations by combining the above equations as follows: 
     
         C.sub.10 =T.sub.1                                          (39) 
    
     
         C.sub.9 =(A.sub.9 *T.sub.1)+(A.sub.9 *T.sub.2)+((K+(A.sub.9 *L)+((A.sub.9 +A.sub.8)*M)+P+Q)*T.sub.3)                                (40) 
    
     
         C.sub.8 =(A.sub.8 *T.sub.1)+(A.sub.8 *T.sub.2)+(((A.sub.9 *K)+L+(A.sub.8 *M)+N)*T.sub.3)                                           (41) 
    
     
         C.sub.7 =(A.sub.7 *T.sub.1)+(A.sub.7 *T.sub.2)+(((A.sub.8 *K)+M+((H.sub.8 +H.sub.1)*N)+P)*T.sub.3)                                  (42) 
    
     
         C.sub.6 =(A.sub.6 *T.sub.1)+(A.sub.6 *T.sub.2)+(((A.sub.8 *K)+(A.sub.8 *L)+(A.sub.6 *N)+P+Q)*T.sub.3)                            (43) 
    
     
         C.sub.5 =(A.sub.5 *T.sub.1)+(A.sub.5 *T.sub.2)+(((J.sub.8 *K)+(A.sub.8 *L) +M+((A.sub.7 +H.sub.0)*N))*T.sub.3)                       (44) 
    
     
         C.sub.4 =(A.sub.4 *T.sub.1)+(A.sub.4 *T.sub.2)+(((J.sub.0 *K)+(A.sub.8 *L) +M+P+((H.sub.4 +H.sub.1)*N))*T.sub.3)                     (45) 
    
     
         C.sub.3 =(A.sub.3 *T.sub.1)+(A.sub.3 *T.sub.2)+(((A.sub.7 *K)+L+M+(A.sub.3 *N)+(A.sub.9 *P)+Q)*T.sub.3)                              (46) 
    
     
         C.sub.2 =(A.sub.2 *T.sub.1)+(A.sub.2 *T.sub.2)+(((A.sub.6 *K)+(A.sub.3 *L)+(A.sub.2 *M)+(A.sub.2 *N)+P+(A.sub.7 *Q))*T.sub.3)    (47) 
    
     
         C.sub.1 =(A.sub.1 *T.sub.1)+(A.sub.1 *T.sub.2)+(((A.sub.5 *K)+((A.sub.7 +A.sub.4)*L)+(A.sub.1 *M)+(A.sub.1 *N)+(A.sub.8 *P)+(A.sub.6 *Q))*T.sub.3)(48) 
    
     
         C.sub.0 =(A.sub.0 *T.sub.1)+(A.sub.0 *T.sub.2)+(((A.sub.4 *K)+(A.sub.4 *L)+(A.sub.0 *M)+(A.sub.0 *N)+(A.sub.4 *P)+(A.sub.5 *Q))*T.sub.3)(49) 
    
     Those skilled in the art will recognize that other partitions are possible, that Boolean expressions further reduced, or other equivalent expressions perhaps more constructive to implementing the particular logic gate circuits chosen for use, may be obtained from the present logic expression described in equations 21 through 49. Thus there other possible forms for the logic equations used in constructing 10/11-rate encoder 32. The equations shown are preferred but are not required for the present invention. 
     Latch 52 of decoder 24 of FIG. 1 uses the inverse of the map used by latch 34 to de-interleave data sub-block B from code sub-block C. Code sub-block C is provided to 11/10-rate decoder 54 which decodes the 11-bit code sub-block C into a 10-bit data sub-block A. 
     11/10-rate decoder 54 determines if code sub-block C is a valid code pattern by using the following equation: 
     
         V= (C.sub.10 +C.sub.9 +C.sub.8)*(C.sub.8 +C.sub.7 +C.sub.6)*(C.sub.7 +C.sub.6 +C.sub.5)*(C.sub.6 +C.sub.5 +C.sub.4)*(C.sub.5 +C.sub.4 +C.sub.3)*(C.sub.4 +C.sub.3 +C.sub.2 +C.sub.1)*(C.sub.2 +C.sub.1 +C.sub.0)!,                                               (50) 
    
     where V equals &#34;1&#34; if the code sub-block is valid, and V equals &#34;0&#34; if the code sub-block is invalid. 
     11/10-rate decoder 54 can also determine the type of data sub-block which created the code sub-block, i.e. type I, II, or III. Specifically, since the most significant bit, C 10 , in a code sub-block is &#34;1&#34; if the code sub-block is derived from a type I data sub-block, a code sub-block is from a type I data sub-block if it is valid and its most significant bit is &#34;1&#34;. In terms of a Boolean variable, T 1  : 
     
         T.sub.1 =(C.sub.10 *V)                                     (51) 
    
     where T 1  equals &#34;1&#34; when the code sub-block is derived from a type I data sub-block and T 1  equals &#34;0&#34; when the code sub-block is not derived from a type I data sub-block. 
     Code sub-blocks that were formed from type II data sub-blocks can also be identified through a Boolean expression. To construct such an expression, it is helpful to first recognize that the bits of type II data sub-blocks do not satisfy Equations 6-12 if a &#34;1&#34; is added as the most significant bit to form the code sub-block. If they did, they would be considered type I data sub-blocks. It should also be remembered that to construct a code sub-block from a type II data sub-block, bits A 4  -A 9  of the type II data sub-block A are inverted and a &#34;0&#34; is added as the most significant bit of the code sub-block. Thus, inverting C 4  -C 10  should create a sub-block that does not satisfy Equations 6-12 if the code sub-block was derived from a type II data sub-block. In other words, code sub-block C is derived from a type II data sub-block only if code sub-block C satisfies the following equation: 
     
          (C.sub.10 +C.sub.9 +C.sub.8)*(C.sub.8 +C.sub.7 +C.sub.6)*(C.sub.7 +C.sub.6 +C.sub.5)*(C.sub.6 +C.sub.5 +C.sub.4)*(C.sub.5 +C.sub.4 +C.sub.3)*(C.sub.4 +C.sub.3 +C.sub.2 +C.sub.1)*(C.sub.2 +C.sub.1 +C.sub.0)!=0(52) 
    
     Inverting this equation so that the expression on the left will equal &#34;1&#34; when code sub-block C is derived from a type II data sub-block and using DeMorgon&#39;s Law, equation 52 may be expressed as: 
     
          (C.sub.10 *C.sub.9 *C.sub.8)+(C.sub.8 *C.sub.7 *C.sub.6)+(C.sub.7 *C.sub.6 *C.sub.5)+(C.sub.6 *C.sub.5 *C.sub.4)+(C.sub.5 *C.sub.4 *C.sub.3)+(C.sub.4 *C.sub.3 *C.sub.2 *C.sub.1)+(C.sub.2 *C.sub.1 *C.sub.0)!=1(53) 
    
     A code sub-block must satisfy two additional requirements in order to be properly identified as being derived from a type II data sub-block. First, the most significant bit of the code sub-block must be equal to &#34;0&#34;. Second, the code sub-block must satisfy equation 50, in other words, it must be a valid code sub-block. Combining equation 53 with these limitations creates an equation that is equal to &#34;1&#34; when the code sub-block is derived from a type II data sub-block and is equal to &#34;0&#34; when the code sub-block is not derived from a type II data sub-block. In terms of the Boolean variable T 2 , that equation is: 
     
         T.sub.2 = (C.sub.8 *C.sub.7 *C.sub.6)+(C.sub.7 *C.sub.6 *C.sub.5)+(C.sub.6 *C.sub.5 *C.sub.4)+(C.sub.5 *C.sub.4 *C.sub.3)+(C.sub.4 *C.sub.3 *C.sub.2 *C.sub.1)+(C.sub.2 *C.sub.1 *C.sub.0)!*C.sub.10 *V        (54) 
    
     where &#34;*&#34; denotes a logical AND operation, &#34;+&#34; denotes a logical OR operation, and &#34;x&#34; denotes a logical NOT operation on the variable &#34;x&#34;. Note that the (C 10  *C 9  *C 8 ) term from equation 53 is not present in equation 54 since C 10  must equal zero and if C 10  is zero this entire term must equal zero. 
     Code sub-blocks that are valid but are not derived from type I or type II data sub-blocks, fall within a third group of sub-blocks identified by the Boolean variable T 3  and the expression: 
     
         T.sub.3 =(T.sub.2 *C.sub.10 *V)                            (55) 
    
     Note that the equation for T 3  does not guarantee that the code sub-block was actually generated by a type III data sub-block. There are additional valid code words that return of value of &#34;1&#34; for the equation 55 beyond those that are derived from a type III data sub-block. These additional code sub-blocks exist because there are 1,067 possible valid code sub-blocks but only 1,024 are needed to accommodate all of the possible patterns of the data sub-blocks. Thus, the additional 43 code sub-blocks that are not associated with a data sub-block will set flag T 3  to &#34;1&#34;. 
     11/10-rate decoder 54 can identify the group--K,L,M,N,P, or Q--from which a code sub-block was derived by using the following equations: 
     
         K=C.sub.9 *(H.sub.5 +H.sub.6 +H.sub.9 +H.sub.10)*(J.sub.0 *J.sub.1 *J.sub.8)(56) 
    
     
         L=C.sub.8 *(H.sub.4 +H.sub.3)*(C.sub.1 +C.sub.0)           (57) 
    
     
         M=(C.sub.9 +C.sub.8)*H.sub.11 *C.sub.3 *J.sub.8            (58) 
    
     
         N=G.sub.1 *(((H.sub.6 +H.sub.5)*C.sub.3 *(C.sub.1 +C.sub.2))+((H.sub.10 +H.sub.9 +H.sub.2)*(J.sub.0 +J.sub.1 +J.sub.8)))          (59) 
    
     
         P=G.sub.2 *H.sub.13 *C.sub.2                               (60) 
    
     
         Q=G.sub.2 *H.sub.4 *C.sub.3 *J.sub.8,                      (61) 
    
     where a value of &#34;1&#34; for an expression to the right of the equal sign indicates that the code sub-block was derived from a type III data sub-block from the particular group identified by the letter on the left. The G, H, and J terms are defined as: 
     
         G.sub.1 =C.sub.10 *C.sub.9 *C.sub.8                        (62) 
    
     
         G.sub.2 =C.sub.10 *C.sub.9 *C.sub.8                        (63) 
    
     
         H.sub.2 =C.sub.7 *C.sub.6 *C.sub.5 *C.sub.4                (64) 
    
     
         H.sub.3 =C.sub.7 *C.sub.6 *C.sub.5 *C.sub.4                (65) 
    
     
         H.sub.4 =C.sub.7 *C.sub.6 *C.sub.5 *C.sub.4                (66) 
    
     
         H.sub.5 =C.sub.7 *C.sub.6 *C.sub.5 *C.sub.4                (67) 
    
     
         H.sub.6 =C.sub.7 *C.sub.6 *C.sub.5 *C.sub.4                (68) 
    
     
         H.sub.9 =C.sub.7 *C.sub.6 *C.sub.5 *C.sub.4                (69) 
    
     
         H.sub.10 =C.sub.7 *C.sub.6 *C.sub.5 *C.sub.4               (70) 
    
     
         H.sub.11 =C.sub.7 *C.sub.6 *C.sub.5 *C.sub.4               (71) 
    
     
         H.sub.13 =C.sub.7 *C.sub.6 *C.sub.5 *C.sub.4               (72) 
    
     
         J.sub.0 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0                (73) 
    
     
         J.sub.1 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0                (74) 
    
     
         J.sub.8 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0                (75) 
    
     If a received code sub-block C does not match any of the 1,024 valid code sub-blocks that can be derived from the data sub-blocks, it is desirable to set a flag to indicate that the code sub-block is an invalid code sub-block. A flag, F g  can be set to &#34;1&#34; to indicate an invalid code block based on the following expression: 
     
         F.sub.g =(T.sub.1 *T.sub.2 *K*L*M*N*P*Q)                   (76) 
    
     Based on equations 50-75, expressions for determining the individual bits of data sub-block A are as follows: 
     
         A.sub.9 =(C.sub.9 *T.sub.1)+(C.sub.9 *T.sub.2)+ ((C.sub.8 *K)+(C.sub.9 *L)+(C.sub.9 *C.sub.8 *M)+N+(C.sub.3 *P)+Q)*T.sub.3 !     (77) 
    
     
         A.sub.8 =(C.sub.8 *T.sub.1)+(C.sub.8 *T.sub.2)+ ((C.sub.7 *K)+(C.sub.6 *L)+(C.sub.8 *M)+N+(C.sub.1 *P)+Q)*T.sub.3 !              (78) 
    
     
         A.sub.7 =(C.sub.7 *T.sub.1)+(C.sub.7 *T.sub.2)+ ((C.sub.3 *K)+(C.sub.1 *C.sub.0 *L) +(C.sub.9 *C.sub.8 *M)+((H.sub.10 +H.sub.6)*N)+(C.sub.0 *P)+(C.sub.2 *Q))*T.sub.3 !                               (79) 
    
     
         A.sub.6 =(C.sub.6 *T.sub.1)+(C.sub.6 *T.sub.2)+ ((C.sub.2 *K)+(C.sub.9 *C.sub.8 *M)+(C.sub.6 *N)+(C.sub.0 *P)+(C.sub.1 *Q))*T.sub.3 !(80) 
    
     
         A.sub.5 =(C.sub.5 *T.sub.1)+(C.sub.5 *T.sub.2)+ (((C.sub.1 *K)+(C.sub.8 *M)+(C.sub.0 *P)+(C.sub.0 *Q))*T.sub.3 !(81) 
    
     
         A.sub.4 =(C.sub.4 *T.sub.1)+(C.sub.4 *T.sub.2)+ ((C.sub.0 *K)+(C.sub.0 *L)+(C.sub.8 *M)+(C.sub.7 *C.sub.4 *N)+(C.sub.0 *P))*T.sub.3 !(82) 
    
     
         A.sub.3 (C.sub.3 *T.sub.1)+(C.sub.3 *T.sub.2)+ ((C.sub.5 *K)+(C.sub.2 *L)++(C.sub.3 *N))*T.sub.3 !                              (83) 
    
     
         A.sub.2 =(C.sub.2 *T.sub.1)+(C.sub.2 *T.sub.2)+ ((C.sub.2 *M)+(C.sub.2 *N))*T.sub.3 !(84) 
    
     
         A.sub.1 =(C.sub.1 *T.sub.1)+(C.sub.1 *T.sub.2)+ ((C.sub.1 *M)+(C.sub.1 *N))*T.sub.3 !                                            (85) 
    
     
         A.sub.0 =(C.sub.0 *T.sub.1)+(C.sub.0 *T.sub.2)+ ((C.sub.0 *M)+(C.sub.0 *N)+P+Q)*T.sub.3 !                                        (86) 
    
     The present invention simplifies the implementation of an encoder and decoder for a rate 16/17 RLL code by using a rate 10/11RLL code and by using simple encoding logic to encode a majority of the data sub-blocks input to the 10/11encoder. 
     Although the present invention has been described with reference to preferred embodiments, workers skilled in the art will recognize that changes may be made in form and detail without departing from the spirit and scope of the invention.