This invention relates to the field of integrated circuit fabrication. More particularly, this invention relates to an arithmetic unit for implementing low-density parity-check (LDPC) codes.
Low density parity-check (LDPC) codes were first proposed by Gallager in 1962, and then “rediscovered” by MacKay in 1996. LDPC codes have been shown to achieve an outstanding performance that is very close to the Shannon transmission limit.
LDPC codes are based on a binary parity-check matrix H with n columns and m=n−k rows that has the following properties:
For every given binary source message u={u0, . . . , uk-1} of length k, the LDPC encoder builds a binary codeword v={v0, . . . , vn-1} of length n where (n>k), such that Hv=0. The codeword consists of two parts. The first k bits of the codeword are equal to the bits of the source message. The other n−k bits of the codeword are the so-called parity-check bits p={p0, . . . , pn-k-1}. The main task of the encoder is to calculate these parity-check bits p for the given input message u.
To simplify matrix operations, the parity check matrix can be composed of pγcells. The cells are arranged in p columns and γ rows, as given below.
Each cell is a t×t permutation matrix (n=pt, n−k=γt). It contains exactly one value of “one” in every row and every columns Therefore, properties (1), (2), and (4) as listed above are satisfied by the construction of the matrix.
Matrix H can be considered as a concatenation of two sub matrices: A and B. Matrix A contains k columns and (n−k) rows. It includes the first k columns of H. Matrix B is a square matrix that contains (n−k) columns and (n−k) rows. It includes the last (n−k) columns of matrix H. The source equation Hv=0 can then be rewritten as Au+Bp=0.
The most famous algorithm for decoding LDPC codes is called the iterative message-passing algorithm. Each iteration of this algorithm consists of two stages. In stage 1 (the row operations), the algorithm computes messages for all of the check nodes (the rows). In stage 2 (the column operations), the algorithm computes messages for all of the bit nodes (the columns), and sends them back to the check nodes associated with the given bit nodes. There are many different implementations of this message-passing algorithm, but all of them use two-stage operations. Further, in each of these implementations, the second step starts only after all of the messages for all of the rows have been calculated.
As with all information processing operations, it is desirable for the procedure to operate as quickly as possible, while consuming as few resources as possible. Unfortunately, LDPC codes such as those described above typically require a relatively significant overhead in terms of the time and the memory required for them to operate.
What is needed is an LDPC code that operates in a more efficient manner, such as by reducing the amount of time or the amount of memory that is required by the operation.
The above and other needs are met by an improvement to an arithmetic unit of a low-density parity-check decoder, where the arithmetic unit has a pipelined architecture of modules. A first module calculates a difference between absolute values of md_R and md_g_in, and passes the result to a first Gallager module. The first Gallager module converts this value from a p0/p1 representation to a 2*p0−1 representation, and passes the result to a second module. The second module selectively adjusts the result of the previous module based on the sign values of md_g_in and md_R, and passes one of its outputs to a third module (the other two outputs, loc_item_out and hard_out, are not a part of the pipeline). The third module calculates a new md_g value by adding the result of the second module and loc_item_in, and passes this result to a fourth module. The fourth module separates a sign and an absolute value of the new md_g, and passes the result to a second Gallager module. The second Gallager module converts the result from the 2*p0−1 representation to the p0/p1 representation and the final value leaves the unit as md_g_out. In these calculations, md_R=a check node value from the previous iteration, md_g=an edge value (md_g_in—from the previous iteration, md_out—for the next iteration), p0=probability that a value is zero, p1=probability that a value is one, loc_item_in/loc_item_out=intermediate values used for the md_g_out calculation, and hard_out=a bit value estimation for the current iteration of the pipelined arithmetic unit.
Further advantages of the invention are apparent by reference to the detailed description when considered in conjunction with the figures, which are not to scale so as to more clearly show the details, wherein like reference numbers indicate like elements throughout the several views, and wherein:
The a posteriori probability of a codeword's bit having a value of either zero or one is calculated in a message passing algorithm module of an iterative LDPC decoding scheme. The embodiment of the arithmetic unit described herein is a part of the message passing algorithm, and is used to calculate the probability coefficients (messages) for each edge of the so-called Tanner graph. The process is preferably repeated for every iteration, and the values that are calculated in a preceding iteration are then used in the following iteration. The estimations are based on the fixed point representations of signed and unsigned numbers.
Each check node from
Bit b as depicted in
For example, for an edge ek we would have
where i≠k means that edge ek for that check node is not included in the summation. For
After the process is repeated for every edge of a bit (edges e1, e2, e3 from
Inputs and Outputs
The inputs and outputs of the arithmetic unit according to the embodiment of the invention as described herein are shown in
As depicted in
The ports loc_item_in and loc_item_out are used during the md_g calculations. During the first loop, loc_item_out takes out the intermediate md_g value for an edge (as described above) and loc_item_in brings that value back into the arithmetic unit during the second loop, when the final md_g value is calculated. The port hard_out contains the estimation of a bit value after the current iteration.
Internal Structure
The arithmetic unit according to the present invention has a pipelined structure, as depicted in
and are used for transferring from a p0/p1 representation to a 2*p0−1 representation, and then back again (p0 and p1 are the probabilities that a given bit is equal to zero or one, respectively).
The computations are accomplished using a fixed-point representation for both signed and unsigned numbers, and the number of bits used for integer and fraction sizes is set according to desired arithmetic unit parameters. The ports md_g_in, md_g_out, md_m, md_r, loc_item_in, and loc_item_out can have various sizes depending on their parameter values. The two registers, lcr1_reg and lcr2_reg, one before and the other one after the first Gallager module as depicted in
Module 1 calculates the difference between the absolute values of md_R and md_g_in. This calculation is depicted in
Module 2, as depicted in
The three modules depicted in
The MUX 2 block controls the accumulation or the initialization of the ‘Current md_g sum reg’ with its two select bits: md_m_sign and flag01. The output of MUX 2 is determined using the expression: mux2_out=flag01 ? (md_m_sign ? mux2_in2: mux2_in1): mux2_in3. As this expression shows, at the start of each bit cycle, such as before the first edge of a bit is processed (indicated by toggling the bit port flag01), the sum is initialized with a value of md_m (negated or not through NEGATOR 2, depending on its sign bit md_m_sign). As it can be seen in
When all of the edges of a bit have been processed (toggled bit flag01), the sum then goes to the flag01 controlled register ‘Total md_g sum reg.’ It is then taken through the pipeline to Module 3. Port flag01 also determines the time at which an estimated bit value, hard_out, is output of the arithmetic unit, representing the sign of the accumulated sum. The value of port loc_item_out is updated for each edge of a given bit, and is actually a negated intermediate md_g value. The value leaves Module 2 and is subsequently returned to the arithmetic unit as the input to Module 3 in the second loop through edges.
Module 3 is an adder of signed numbers, such as depicted as ADDER in
The final recalculation is done in the second Gallager module depicted in
The foregoing description of preferred embodiments for this invention has been presented for purposes of illustration and description. It is not intended to be exhaustive or to limit the invention to the precise form disclosed. Obvious modifications or variations are possible in light of the above teachings. The embodiments are chosen and described in an effort to provide the best illustrations of the principles of the invention and its practical application, and to thereby enable one of ordinary skill in the art to utilize the invention in various embodiments and with various modifications as are suited to the particular use contemplated. All such modifications and variations are within the scope of the invention as determined by the appended claims when interpreted in accordance with the breadth to which they are fairly, legally, and equitably entitled.
Number | Name | Date | Kind |
---|---|---|---|
20070033482 | Seki | Feb 2007 | A1 |
20070089019 | Tang et al. | Apr 2007 | A1 |
Number | Date | Country | |
---|---|---|---|
20080178057 A1 | Jul 2008 | US |