Цитата(TRILLER @ Mar 8 2016, 15:28)

Я бы вам посоветовал не пытаться детектировать ошибку входного синхроимпульса, а запустить работу логики от DCM. Непосредственно входным же тактом осуществлять только захват данных в ножках. Таким образом неполадки опорной тактовой будут приводить всего лишь к потере нескольких тактов данных, а не к умиранию всей схемы.
Спасибо за совет.
Я так и сделал сейчас, правда еще есть схема мониторинга состояния DCM и сброса при отсутствии захвата. Но в первом приближении косяк остался, завтра буду продолжать разбираться, может что-то не корректно сделал.
Еще вопрос до кучи)))
Чем отличается STATUS[1] от INPUT_CLK_STOPPED Clocking Wizarda. Не могу нигде найти. По тестбенчам они совпадают вроде.
P.S. А ничем и не отлчаются они
assign INPUT_CLK_STOPPED = status_int[1];
Цитата(TRILLER @ Mar 8 2016, 15:28)

Я бы вам посоветовал не пытаться детектировать ошибку входного синхроимпульса, а запустить работу логики от DCM. Непосредственно входным же тактом осуществлять только захват данных в ножках. Таким образом неполадки опорной тактовой будут приводить всего лишь к потере нескольких тактов данных, а не к умиранию всей схемы.
Подскажите, пожалуйста, а можно ли и захват данных сделать от DCM, так как у меня BUFG дефицит. Если делать так как Вы говорите, по моему, нужно 2 BUFG на ввод дифф. тактовой пары, от них на IDDR2 синхронизацию подать и их же завести на вход DCM, плюс один BUFG - выход DCM.
Или я что-то не так делаю))) Буду очень рад советам.
Вот старый вариант кода сбора данных (без DCM, который отказывает на морозе). От out_dclk тактируется остальная логика.
Покритикуйте, пожалуйста. Может где подводные камни есть.
Код
module ad9613_rx #
(
parameter DIFF_TERM = "FALSE" // Parameter to enable internal differential termination
)
(
// Данные
input [ADC_WIDTH - 1 : 0] in_data_p,
input [ADC_WIDTH - 1 : 0] in_data_n,
// Синхронизация
input in_dco_p,
input in_dco_n,
input in_adc_or_p,
input in_adc_or_n,
// Выходы
output out_dclk,
output reg [ADC_WIDTH - 1 : 0] out_data_0,
output reg [ADC_WIDTH - 1 : 0] out_data_1
);
localparam ADC_WIDTH = 12;
wire w_dco_p;
wire w_dco_n;
wire w_dco_bufg_p;
wire w_dco_bufg_n;
wire [ADC_WIDTH - 1 : 0] w_rx_data_in;
wire [ADC_WIDTH - 1 : 0] w_rx_data_in_fix;
wire [ADC_WIDTH - 1 : 0] w_rx_data_0;
wire [ADC_WIDTH - 1 : 0] w_rx_data_1;
// Выходной клок
assign out_dclk = w_dco_bufg_p;
parameter [ADC_WIDTH - 1 : 0] RX_SWAP_MASK = 12'h0000; // pinswap mask for input bits (0 = no swap (default), 1 = swap). Allows inputs to be connected the wrong way round to ease PCB routing.
genvar i;
// Входной буфер для клока (формирует дифференциальные сигналы
IBUFGDS_DIFF_OUT IBUFGDS_DIFF_OUT_ADC_DCO (
.O(w_dco_p), // Buffer diff_p output
.OB(w_dco_n), // Buffer diff_n output
.I(in_dco_p), // Diff_p buffer input (connect directly to top-level port)
.IB(in_dco_n) // Diff_n buffer input (connect directly to top-level port)
);
// Заводим в глобальную шину синхронизации
BUFG BUFG_ADC_DCO_P (
.O(w_dco_bufg_p), // 1-bit output: Clock buffer output
.I(w_dco_p) // 1-bit input: Clock buffer input
);
BUFG BUFG_ADC_DCO_N (
.O(w_dco_bufg_n), // 1-bit output: Clock buffer output
.I(w_dco_n) // 1-bit input: Clock buffer input
);
// Генерация входных буферов
generate
for (i = 0; i < ADC_WIDTH; i = i + 1)
begin : loop0
// Входной дифф. буфер
IBUFDS #(
.DIFF_TERM (DIFF_TERM))
data_in (
.I (in_data_p[i]),
.IB (in_data_n[i]),
.O (w_rx_data_in[i])
);
// При необходимости проводим инверсию данных
assign w_rx_data_in_fix[i] = w_rx_data_in[i] ^ RX_SWAP_MASK[i]; // Invert data signals as required
// DDR
IDDR2 #(
.DDR_ALIGNMENT("C0") // Sets output alignment to "NONE", "C0" or "C1"
) IDDR2_D0D1 (
.Q0 ( w_rx_data_0[i] ), // 1-bit output captured with C0 clock
.Q1 ( w_rx_data_1[i] ), // 1-bit output captured with C1 clock
.C0 ( w_dco_p), // 1-bit clock input
.C1 ( w_dco_n), // 1-bit clock input
.CE (1'b1), // 1-bit clock enable input
.D (w_rx_data_in_fix[i]), // 1-bit DDR data input
.R (1'b0), // 1-bit reset input
.S (1'b0) // 1-bit set input
);
end
endgenerate
// Защелкиваем выходные данные
always @(posedge out_dclk)
begin
out_data_0 <= w_rx_data_0;
out_data_1 <= w_rx_data_1;
end
endmodule
Сообщение отредактировал Fourier - Mar 8 2016, 12:58