реклама на сайте
подробности

 
 
> Double Rate CMOS fast input, компенсация задержек.
rolin
сообщение Mar 1 2016, 14:28
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-01-09
Пользователь №: 44 224



Приветствую. Впервые столкнулся с необходимостью приема данных от АЦП на частоте 122.8 (период 8.138 нс) да еще и Double Rate, то есть требования к задержкам возросли вдвое. Естественно - не работает как надо, данные идут с ошибками.
Реализация защелки и разделения данных простейшая:
Код
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


Кое-как отфазировал клок из АЦП, работает но с ошибками. TimeQuest показывает сильную разницу между заржками к двум буферам. Проблема в том, что вход один, а регистров два. Один квартус сделал как Fast Input а второй где придется.


Один из входных пинов не может использовать FastInput и регистры используются одинаковые, в результате разница в задержках мизерная.
Я думаю, что если как-то запретить квартусу использовать FastInput, то можно получить неравномерность в пределах 1 нс, чего будет достаточно.
Я в TimeQuest только первые шаги делаю и не совсем понятно,
как задержать входной клок на 5 нс, чтобы все эти данные вовремя под фронты попадали
а еще вероятно нужно будет менять задержки для каждой линии из-за неоптимальной разводки на плате. Не знаю, как это и возможно ли вообще.
Прошу помощи.
И еще, нет ли какой готовой реализации подобного интерфейса в IP, может это решит все проблемы ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
bogaev_roman
сообщение Mar 1 2016, 15:12
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата(rolin @ Mar 1 2016, 17:28) *
Прошу помощи.
И еще, нет ли какой готовой реализации подобного интерфейса в IP, может это решит все проблемы ?

Дело не в готовой реализации. Вам нужно грамотно прописать временные ограничения, чтобы квартус сам все вытянул, Вы их прописали? Если нет, то советую посмотреть, каким образом это делается, например здесь - http://embedders.org/content/timequest-dly...rfeisov-raznykh.
ЗЫ. Частота 122,88 сейчас невысокая. Что мешает поставить DDR регистр на вход, который тактируется adc_clock (которую пропускаете через pll и сдвигаете на 90 градусов)?
Ну для xilinx примерно так:
Код
IDDR #(
    .DDR_CLK_EDGE ("SAME_EDGE_PIPELINED"),
    .INIT_Q1 (1'b0),
    .INIT_Q2 (1'b0),
    .SRTYPE ("ASYNC"))
  i_rx_data_iddr (
    .CE (1'b1),
    .R (1'b0),
    .S (1'b0),
    .C (ADC_clk),
    .D (rx_data_ibuf_s[l_inst]),
    .Q1 (rx_data_p_s[l_inst]),
    .Q2 (rx_data_n_s[l_inst]));

Go to the top of the page
 
+Quote Post
rolin
сообщение Mar 1 2016, 17:48
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-01-09
Пользователь №: 44 224



Цитата(bogaev_roman @ Mar 1 2016, 19:12) *
Что мешает поставить DDR регистр на вход, который тактируется adc_clock (которую пропускаете через pll и сдвигаете на 90 градусов)?

разобрался, для альтеры это IP ALTDDIO
получилось так
Код
         wire [7:0] adc1_data_buffer_h, adc1_data_buffer_l;
         wire [7:0] adc2_data_buffer_h, adc2_data_buffer_l;
     adc_ddr_reg ddr_reg1  (adc1_data, clock, adc1_data_buffer_h, adc1_data_buffer_l);
     adc2_ddr_reg ddr_reg2 (adc2_data, clock, adc2_data_buffer_h, adc2_data_buffer_l);
     adc_of_ddr_reg ddr_of (adc_OF, clock, adc2_of, adc1_of);


Теперь задержки выровнялись



осталось скомпенсировать общую задержку > 5 нс
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Mar 2 2016, 05:33
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(rolin @ Mar 1 2016, 20:48) *
разобрался, для альтеры это IP ALTDDIO
Да. Мне, например, не удалось заставить Квартус расположить оба триггера в IOB без использования этого ядра, что для DDR критично.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01388 секунд с 7
ELECTRONIX ©2004-2016