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

 
 
> 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
Ответов
rolin
сообщение Mar 1 2016, 22:35
Сообщение #2


Участник
*

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



После выравнивания задержек благодаря применения ALTDDIO_IN устройство работает хорошо.
Больше ничего не делал, подобрал фазу клока из АЦП и все.
Плату на глаз дорожки волнами рисовал, похоже угадал.
Спасибо.
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Mar 2 2016, 06:10
Сообщение #3


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

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



Цитата(rolin @ Mar 2 2016, 01:35) *
После выравнивания задержек благодаря применения ALTDDIO_IN устройство работает хорошо.
Больше ничего не делал, подобрал фазу клока из АЦП и все.

У Вас слаки отрицательные и Вы считаете, что все работает в штатном режиме? А если температура поменяется и это алгоритм для полета баллистической ракеты biggrin.gif . Все-таки советую доразобраться с ограничениями, в приведенной ссылке на странице 5 именно Ваш случай - System-Synchronus Input.
Не забыли прописать, что-то типа

Код
derive_pll_clocks
derive_clock_uncertainty
create_clock -period 122.88MHz -name {clk} [get_ports {clk}]
create_generated_clock -name {adc_clk} -source [get_ports {clk}] [get_ports {adc_clk}]

Судя по ограничениям
Код
set_input_delay -add_delay -max -clock [get_clocks {adc_clock}]  7.138 [get_ports {adc_d1[0]}]
set_input_delay -add_delay -min -clock [get_clocks {adc_clock}]  1.000 [get_ports {adc_d1[0]}]

у Вас фронт/срез тактовой примерно совпадает с переходами данных, но в большинстве случаев тактовая должна быть посредине окна данных, т.е. сдвинута на 90 градусов, эти ограничения Вы взяли из спецификации?
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 03:28
Рейтинг@Mail.ru


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