Как всем известно, DCM в Xilinx Virtex-4 состоит из 2-х отдельных петель ФАПЧ с общим входом и разными выходами: DLL и DFS. Первая из них (DLL) умеет делить входную частоту на разные коэффициенты, умножать на 2 и поворачивать фазу на фиксированные значения, обеспечивая при этом низкий джиттер. Вторая из них (DFS) умеет только умножать на дробный коэффициент (не будем принимать в расчет поворот фазы на 180), обеспечивая при этом хуже джиттер и немного ниже максимальную выходную частоту.
Также всем известно, что DCM можно динамически переконфигурировать. Не буду останавливаться на подробностях, а сошлюсь на следующие документы:
Dynamic Reconfiguration of Functional Blocks
Virtex-4 Configuration Guide
Reconfiguration Techniques/Dynamic Reconfiguration of Functional Blocks (DRP)/DRP DCM Implementation
Из этих документов, а также из других источников, можно найти информацию о некоторых программируемых регистрах:
DFS_MULTIPLY
DADDR = 0x50
DI[4:0] = FX_MULTIPLY
DFS_DIVIDE
DADDR = 0x52
DI[4:0] = FX_DIVIDE
DFS_RESET
DADDR = 0x3F
DI[15:0] = 0x0000
DFS_LOCKED (read)
DADDR = 0x30
DI[0] = DFS_LOCKED
PHASE_SHIFT
DADDR = 0x55
DI[9:0] = PHASE_SHIFT
CLKOUT_PHASE_SHIFT
DADDR = 0x56
DI[15:0]
0x000D: DIRECT
PHASE_SHIFT_KICK_OFF
DADDR = 0x11
DI[15:0] = 0x0000
DFS_FREQUENCY_MODE
DADDR = 0x41
DI[5]
0: LF (low frequency mode)
1: HF (high frequency mode)
DLL_FREQUENCY_MODE
DADDR = 0x58
DI[7:6]
00: LF (low frequency mode)
11: HF (high frequency mode)
Знание этих регистров поможет вам в большинстве случаев переконфигурировать DCM после прошивки (проверено на практике). Но, к сожалению, для меня этого не достаточно, поэтому обращаюсь к гуру (возможно когда-то общавшихся со службой поддержки) с вопросом о пополнении вышеуказанного списка. В первую очередь интересуют следующие регистры:
CLKDV_DIVIDE
CLKIN_DIVIDE_BY_2
DCM_PERFORMANCE_MODE
CLKOUT_PHASE_SHIFT (за исключением DIRECT)
DUTY_CYCLE_CORRECTION
FACTORY_JF
Возможно есть еще интересные регистры, буду рад любой информации. Предложения по перебору не рассматриваются.