AN-953: Direct Digital Synthesis (DDS) with a Programmable Modulus

Overview

The programmable modulus is a modification of the typical accumulator-based DDS architecture. It extends the use of DDS to applications that require exact rational frequency synthesis (any-rate applications, for example). The AD9913 is the first accumulator-based DDS product by Analog Devices, Inc., to offer the programmable modulus architecture.

Typical Accumulator-Based DDS

A typical accumulator-based DDS relies on an accumulator to recursively sum the digital input tuning word at the rate of the sample clock (see Figure 1). This produces a time series of digital words at the output of the accumulator that increases linearly until the accumulator rolls over at its maximum value of 2C. Hence, the accumulator output has a fixed modulus of 2C.

Figure 1. Typical Accumulator-Based DDS Architecture

Usually the accumulator output is truncated to P bits (using only the MSBs) to reduce the size and complexity of the angleto-amplitude conversion block that immediately follows the accumulator. This causes the time series of digital words produced by the accumulator to appear at the input to the angle-to-amplitude converter as P-bit word(s) ranging in value from zero to 2P − 1.

The angle-to-amplitude converter maps the P-bit word(s) to one revolution on the unit circle; that is, it linearly maps binary values from 0 to 2P to radian angles from 0 to 2π. This mapping arrangement allows the angle-to-amplitude converter to translate the P-bit word(s) to D-bit amplitude value(s) (A) in a very efficient manner.

The translation process relies on the trigonometric relationship

x = sin(2πk/2P)

where:
P is the number of bits taken from the accumulator.
k is the binary value of those bits at any given instant.

The value of A for each k is the value of x scaled, offset, and rounded such that A takes on integer values between zero and 2D − 1.

It is possible to readily extend the angle-to-amplitude conversion function to perform both sine and cosine conversions concurrently. Therefore, DDSs that offer both conversion schemes are commonly found.

Following the angle-to-amplitude converter is a D-bit DAC. It converts the D-bit digital amplitude values produced by the angle-to-amplitude converter to analog levels. The result is a sinusoidal waveform at the output of the DAC with a frequency determined by the average rollover rate of the accumulator.

The following equation expresses the frequency of the sinusoid that appears at the DAC output for a typical accumulator-based DDS:

equation1

where:
fO is the synthesized frequency.
fS is the sampling frequency.
M/2C is the fractional scale factor (M and C are positive integers).

Normally, M is constrained to be less than 2C – 1. Otherwise, the DDS synthesizes a Nyquist image frequency. The quantity, 2C, is the modulus of the accumulator, where C is the accumulator width in bits. The integer, M, is often referred to as the frequency tuning word. Because M, by definition, is an integer, fO is constrained to the following set of frequencies:

equation2

Thus, the set of frequencies from dc to almost ½fS comprises equally spaced intervals of fS/2C. This spacing, fS/2C, is referred to as the frequency resolution of the DDS. Inspection of the fO frequency set indicates that the modulus of the DDS accumulator, namely 2C, determines both the frequency resolution of the DDS and the number of possible output frequencies. For example, the output frequency set of a DDS with a 32-bit accumulator has 2,147,483,648 (that is, 231) possible output frequencies for a given sample rate (fS).

Even with such a large set of available frequencies, the typical accumulator-based DDS is not capable of generating some useful frequencies (like precisely fS/10) because the accumulator modulus is fixed and the tuning word (M) must be an integer. Rearranging Equation 1 reveals that the ratio of the output frequency to the sampling frequency must satisfy

equation3

Now for output frequencies that are an integer submultiple of the sample rate (for example, fS/10), fO can be expressed as fO = fS/Q (Q is an integer). Substituting fS/Q for fO in Equation 3 leads to

equation4

Solving for M yields M = 2C/Q. Because M and Q must both be integers, the only values of Q that satisfy Equation 4 are those that take the form 2K, where K is an integer. That is, M = 2C/2K = 2C − K (both C and K are integers). To demonstrate, let fO = fS/8 and assume that C is 32. Then Q = 8 = 23 and M = 232 − 3 = 229 = 536,870,912 (an integer). On the other hand, if fO = fS/10, Q is 10 and M = 232/10 = 429,496,729.6 (not an integer), which means that the typical DDS is not capable of generating the exact frequency fS/10. The typical DDS can synthesize an output frequency extremely close to fS/10 (based on the frequency resolution) but not exactly fS/10. In most cases, extremely close is acceptable, but in certain applications (network clocks, for example), the exact frequency ratio is a necessity.

Inspection of Equation 4 indicates that the ratio on the righthand side is established by the modulus of the accumulator (2C), which is a fixed quantity governed by the accumulator size. The fixed modulus of the accumulator limits the set of available output frequencies. However, it seems reasonable to assume that an adjustable accumulator modulus would make it possible to accommodate values of Q other than just those that take the form 2K. Such is the foundation of the programmable modulus DDS architecture.

Programmable Modulus DDS

A programmable modulus is a modification of the typical accumulator-based DDS architecture (see Figure 2). Although the underlying function of the programmable modulus technique is to alter the accumulator modulus, the actual implementation is more complicated. The complication is twofold.

Figure 2. Programmable Modulus DDS Architecture

The first complication is that the angle-to-amplitude converter maps the entire P-bit input range (0 to 2P ) to 0 to 2π radians. It is this power-of-two mapping arrangement that allows the angle-to-amplitude converter to operate efficiently. Arbitrarily changing the accumulator modulus to something other than a power-of-two necessarily violates the mapping arrangement required by the angle-to-amplitude converter. To overcome this difficulty, the programmable modulus architecture uses a secondary accumulator to make the primary accumulator appear to have an altered modulus while still maintaining the power-of-two mapping required for the angle-to-amplitude converter.

The second complication involves spurious performance. If not done properly, modification of the accumulator modulus can introduce spectral artifacts. The programmable modulus implementation requires great care to minimize any negative impact on spurious performance. The architecture of the AD9913 embodies such care as demonstrated by its excellent spurious performance.

The programmable modulus DDS architecture results in a variation of Equation 3 as follows:

equation5

where M and N are integers and M < N. In practice, M should be constrained to less than N/2 in order to comply with the Nyquist sampling requirement.

Notice that the frequency ratio for the programmable modulus DDS (Equation 5) is very similar to that of the typical accumulator-based DDS (Equation 3). The only difference is that N is not required to be a power-of-two for the programmable modulus, but can be an arbitrary integer. In practice, hardware constraints place limits on the range of values for N.

Implementation of the programmable modulus function within the AD9913 is such that the fraction, M/N, is expressible per Equation 6. Note that the form of Equation 6 implies a compound frequency tuning word with X representing the integer part and A/B representing the fractional part. X, A, and B are inputs to the modulus control logic in Figure 2.

equation6

where X, A and B are 32-bit integers programmable with any integer from 0 to 232 − 1, inclusive.

Although programmable over this range, the architecture imposes the following constraints on A and B:

B > 0

A < B

The fact that X, A, and B are 32-bit integers places the constraints on N. Specifically, for N ≤ 232, N can be any integer from 0 to 232, but for N > 232 the choices for N are constrained per Table 1.

Table 1. Constraints on the Value of N
N Constraints Remarks
N ≤ 232 3 ≤ N ≤ 232 Note that N = 0 is meaningless and N = 1 or N = 2 is trivial.
N > 232 N = K × 232 K is an integer: 2 ≤ K ≤ 232 – 1. This constrains N to an integer multiple of 232 with an upper bound of (232 − 1) × 232.

Calculating The Modulus Parameters: A, B, And X

Given the known values of fO and fS, use fO/fS to produce the fraction, M/N, but with both M and N expressed as integers. Next, reduce the fraction to its lowest terms and ensure that N satisfies the two constraints in Table 1. If N fails to satisfy the constraints of Table 1, then synthesis of the exact output frequency (fO) from the given sample rate (fS) is not possible.

With M and N expressed as integers, use long division to find X as summarized in Equation 7. That is, given M and N, choose X as the largest integer that yields a positive (or zero) value for Y.

equation7

where:
X is the integer quotient of the division process.
Y is the integer remainder.

Equation 7 constitutes a long division operation with N as the divisor and M as part of the dividend. Note that M and N are integers with the fraction M/N reduced to lowest terms and equivalent to the fraction fO/fS. The first step in the long division process is to choose X as the largest integer that satisfies XN ≤ M232. Next, place the product of X and N below the dividend and subtract it from the dividend, which leaves the remainder, Y. Thus, Y is the value obtained by subtracting XN from M232.

Equation 7 yields Y as an integer such that the fraction Y/N has the same numeric value as A/B in Equation 6. Reducing the fraction Y/N to its lowest terms yields the integers A and B.

Interestingly, M establishes the periodicity of the accumulator output sequence. That is, the accumulator is required to cycle through M overflows to complete one unique output sequence and return to its original starting point. This unique output sequence repeats indefinitely.

It is worth noting that if Y is 0, then A is 0 and the programmable modulus feature is unnecessary. That is, fO can be synthesized directly from fS using a typical accumulator-based DDS. In fact, when Y = 0 it is best to disable the programmable modulus feature of the AD9913, thereby reducing power consumption.

Programmable Modulus Example

Consider the case in which fS = 250 MHz and the desired value of fO is 25 MHz. This scenario synthesizes an output frequency that is not a power-of-two submultiple of the sample rate, namely fO = (1/10)fS, which is not possible with a typical accumulator-based DDS. The frequency ratio, fO/fS, leads directly to M and N, which are determined by reducing the fraction (25,000,000/250,000,000) to its lowest terms. That is:

M/N = 25,000,000/250,000,000 = 1/10

Therefore, M = 1 and N = 10 and using Equation 7 allows X and Y to be calculated as X = 429,496,729 and Y = 6. The fraction, Y/N, is 6/10, which reduces to 3/5. Thus, A = 3 and B = 5.

Programming these values into the AD9913 causes it to produce an output frequency of exactly 25 MHz given a 250 MHz sampling clock.

A typical accumulator-based DDS, regardless of the capacity of its accumulator, is not capable of synthesizing exactly 25 MHz given that fS = 250 MHz. For example, the closest that a 32-bit accumulator-based DDS can get to 25 MHz with fS = 250 MHz is 25.000000023283064365386962890625 MHz. This constitutes an error of 0.931 parts per billion. In a network clocking application, for example, this close value may not be acceptable because such applications are very sensitive to any fractional frequency error.

Considerations

Most computational programs (for example, Excel®, Mathcad®, and MATLAB®) can introduce numerical errors when calculating X, Y, A, and B. These errors are due to internal rounding or truncation, which shows up when multiplying or dividing with large integers. However, the calculator included as part of the Windows® XP operating system provides sufficient numeric precision to perform these computations without the aforementioned errors (at least in the context of the 32-bit numbers associated with programming the AD9913). In fact, having prior knowledge of the numeric precision issue led developers of the AD9913 evaluation board software to mitigate any rounding or truncation errors.

To demonstrate the effects of rounding and truncation, consider again the case in which the desired value of fO is 25 MHz, but fS is 249,999,999.5 MHz (instead of 250 MHz). The frequency ratio, fO/fS, leads directly to M and N by reducing the fraction (25,000,000/249,999,999.5) to its lowest terms. This first requires multiplying M and N by 2 to eliminate the decimal point in N, as follows:

M/N = 25,000,000/249,999,999.5 = 50,000,000/499,999,999

The fraction, 50,000,000/499,999,999 is irreducible, therefore, use these values for M and N. This leads to X = 429,496,730 and Y = 229,496,730. Thus, Y/N = 229,496,730/499,999,999, which is irreducible leading to A = 229,496,730 and B = 499,999,999. These values yield fO = 25 MHz, exactly.

Using Excel yields the same value for X, but Y calculates as 229,496,736. Notice that the last digit of Y is 6 instead of 0 (the correct value). Thus, Y/N = 229,496,736/499,999,999, which is irreducible leading to A = 229,496,736 and B = 499,999,999. These values yield fO = 25.000000000000000698491930961609 MHz. Applications requiring a precise fO/fS ratio might not be able to tolerate this small error.

More dramatically, consider the case where N is the maximum allowable value of (232 − 1) × 232. To express this integer requires 64 bits. Most computational programs are unable to represent integers in excess of 48 bits.

Be sure that the computing engine used to calculate X, Y, A, and B has sufficient numerical precision to fully represent very large integers. Otherwise, there is the potential to introduce rounding or truncation errors into the calculations, which yields incorrect results.

Author

Ken Gentile

Ken Gentile

Ken Gentile joined Analog Devices in 1998 as a system design engineer with the Clock and Signal Synthesis product line in Greensboro, NC, where he specializes in direct digital synthesis, analog filter design, and writing GUI-based engineering tools in MATLAB. Ken holds 10 patents. He has published 14 articles in various industry trade journals and over a dozen ADI application notes, as well as having presented at ADI’s annual General Technical Conference (GTC) in 2001, 2005, and 2006. He graduated with honors in 1996 with a B.S.E.E. from North Carolina State University. In his spare time, Ken enjoys reading, mathematical puzzles, and most anything related to science, engineering, and “backyard” astronomy.