Реализация защелки и разделения данных простейшая:
Код
always @(negedge adc_clock)
begin
reg_adc1_data[0] <= adc1_data[0];
reg_adc1_data[2] <= adc1_data[1];
reg_adc1_data[4] <= adc1_data[2];
reg_adc1_data[6] <= adc1_data[3];
reg_adc1_data[8] <= adc1_data[4];
reg_adc1_data[10] <= adc1_data[5];
reg_adc1_data[12] <= adc1_data[6];
reg_adc1_data[14] <= adc1_data[7];
//
reg_adc2_data[0] <= adc2_data[0];
reg_adc2_data[2] <= adc2_data[1];
reg_adc2_data[4] <= adc2_data[2];
reg_adc2_data[6] <= adc2_data[3];
reg_adc2_data[8] <= adc2_data[4];
reg_adc2_data[10] <= adc2_data[5];
reg_adc2_data[12] <= adc2_data[6];
reg_adc2_data[14] <= adc2_data[7];
adc1_of <= adc_OF;
end
always @(posedge adc_clock)
begin
reg_adc1_data[1] <= adc1_data[0];
reg_adc1_data[3] <= adc1_data[1];
reg_adc1_data[5] <= adc1_data[2];
reg_adc1_data[7] <= adc1_data[3];
reg_adc1_data[9] <= adc1_data[4];
reg_adc1_data[11] <= adc1_data[5];
reg_adc1_data[13] <= adc1_data[6];
reg_adc1_data[15] <= adc1_data[7];
//
reg_adc2_data[1] <= adc2_data[0];
reg_adc2_data[3] <= adc2_data[1];
reg_adc2_data[5] <= adc2_data[2];
reg_adc2_data[7] <= adc2_data[3];
reg_adc2_data[9] <= adc2_data[4];
reg_adc2_data[11] <= adc2_data[5];
reg_adc2_data[13] <= adc2_data[6];
reg_adc2_data[15] <= adc2_data[7];
adc2_of <= adc_OF;
end
begin
reg_adc1_data[0] <= adc1_data[0];
reg_adc1_data[2] <= adc1_data[1];
reg_adc1_data[4] <= adc1_data[2];
reg_adc1_data[6] <= adc1_data[3];
reg_adc1_data[8] <= adc1_data[4];
reg_adc1_data[10] <= adc1_data[5];
reg_adc1_data[12] <= adc1_data[6];
reg_adc1_data[14] <= adc1_data[7];
//
reg_adc2_data[0] <= adc2_data[0];
reg_adc2_data[2] <= adc2_data[1];
reg_adc2_data[4] <= adc2_data[2];
reg_adc2_data[6] <= adc2_data[3];
reg_adc2_data[8] <= adc2_data[4];
reg_adc2_data[10] <= adc2_data[5];
reg_adc2_data[12] <= adc2_data[6];
reg_adc2_data[14] <= adc2_data[7];
adc1_of <= adc_OF;
end
always @(posedge adc_clock)
begin
reg_adc1_data[1] <= adc1_data[0];
reg_adc1_data[3] <= adc1_data[1];
reg_adc1_data[5] <= adc1_data[2];
reg_adc1_data[7] <= adc1_data[3];
reg_adc1_data[9] <= adc1_data[4];
reg_adc1_data[11] <= adc1_data[5];
reg_adc1_data[13] <= adc1_data[6];
reg_adc1_data[15] <= adc1_data[7];
//
reg_adc2_data[1] <= adc2_data[0];
reg_adc2_data[3] <= adc2_data[1];
reg_adc2_data[5] <= adc2_data[2];
reg_adc2_data[7] <= adc2_data[3];
reg_adc2_data[9] <= adc2_data[4];
reg_adc2_data[11] <= adc2_data[5];
reg_adc2_data[13] <= adc2_data[6];
reg_adc2_data[15] <= adc2_data[7];
adc2_of <= adc_OF;
end
Кое-как отфазировал клок из АЦП, работает но с ошибками. TimeQuest показывает сильную разницу между заржками к двум буферам. Проблема в том, что вход один, а регистров два. Один квартус сделал как Fast Input а второй где придется.

Один из входных пинов не может использовать FastInput и регистры используются одинаковые, в результате разница в задержках мизерная.
Я думаю, что если как-то запретить квартусу использовать FastInput, то можно получить неравномерность в пределах 1 нс, чего будет достаточно.
Я в TimeQuest только первые шаги делаю и не совсем понятно,
как задержать входной клок на 5 нс, чтобы все эти данные вовремя под фронты попадали
а еще вероятно нужно будет менять задержки для каждой линии из-за неоптимальной разводки на плате. Не знаю, как это и возможно ли вообще.
Прошу помощи.
И еще, нет ли какой готовой реализации подобного интерфейса в IP, может это решит все проблемы ?