Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Задание временных ограничений для АЦП MAX1186
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
DENth
Приветствую всех!

Есть интересная задача - задать временные ограничения для проекта, работающего с АЦП MAX1186. Особенность АЦП в том, что шина данных у него мультиплексированная. Сам АЦП двухканальный, но шина одна.
Диаграмма его работы следующая:



Пользуясь статьями по Synopsys Design Constraint, сделал следующее:

Код
##ADC
#clock source to destination clock pin delay
set clkA_delay_max [expr 22.0*0.010]
set clkA_delay_min [expr 22.0*0.005]
#source to destination data pins delay
set bdA_delay_max [expr 22.0*0.010]
set bdA_delay_min [expr 22.0*0.005]
#ADC parameters
set Tco_max 8
set Tco_min 3

set usedTsu [expr $clkA_delay_max + $Tco_max + $bdA_delay_max]
set usedTh [expr $clkA_delay_min + $Tco_min + $bdA_delay_min]

set_input_delay -clock adcclk -max $usedTsu [get_ports {adc[*]}]
set_input_delay -clock adcclk -min $usedTh [get_ports {adc[*]}]


Данные с порта adc[*] поступают на регистры и в последующем обрабатываюся:
Код
adcclk=vcc;
adcclk.clk=80mhz;

adc_a[9..0]=adc[9..0];
adc_a[9..0].clk=adcclk;
adc_b[9..0]=adc[9..0];
adc_b[9..0].clk=!adcclk;


Ограничения, заданные таким образом выполняются, но работает проект не так, как нужно. В регистре adc_a данные канала "B" и наоборот.
Я так понимаю, что заданные ограничения распространяются только на восходящий фронт частоты adcclk. А как задать нисходящий?

Уже подумал, что нужно регистры тактировать частотой 80 Мгц с соответствующим сигналом разрешения записи то в один, то в другой. Но физически частота тактирования АЦП 40 МГц - сигнал adcclk. И окончательно запутался.

Подскажите как быть!

И, кстати, из pdf-ки на АЦП не ясно как правильно задать Tco_min, так как в таблице присутствует только max.
DENth
Хм... Ни одного ответа.
Очень надеялся, что мне смогут помочь.

Может быть я спросил какую-то глупость?
Ответьте мне хотя бы односложно - "Глупость. На такое никто не ответит" или "Учи мат. часть" чтобы я понял, что перемудрил и всё очевидно.
alexadmin
Интерфейс с АЦП уже много раз обсуждался, достаточно поискать. Если кратко, то для красоты констрэйнов нужно воспользоваться еще -clock_fall -add_delay.
А для того, чтобы работало - поменять данные по входу
DENth
Спасибо за ответ.
Искал, но не нашел. Попробую поискать еще.

А что Вы имеете в виду под "поменять данные по входу"? Так?:

Код
adc_a[9..0]=adc[9..0];
adc_a[9..0].clk=!adcclk;
adc_b[9..0]=adc[9..0];
adc_b[9..0].clk=adcclk;


Рабоать-то оно действительно работает. Просто загадка, что идет в разрез с pdf-кой на АЦП. И понятно, что вызвано задержкой на линиях данных. Но в таком случае как получить уверенность, что проект будет работать во всем диапазоне температур и изменениях в других частях проекта? Если временной анализатор не выдает ошибок - это ведь не значит, что все верно задано.

Вот в правильном задании и был вопрос.
DENth
Всё. Разобрался. Спасибо alexadmin за наводку.
Для всех, кому интересно, нужно было действительно сделать следующее:

Код
##ADC
#clock source to destination clock pin delay
set clkA_delay_max [expr 22.0*0.010]
set clkA_delay_min [expr 22.0*0.005]
#source to destination data pins delay
set bdA_delay_max [expr 22.0*0.010]
set bdA_delay_min [expr 22.0*0.005]
#ADC parameters
set Tco_max 8
set Tco_min 3

set usedTsu [expr $clkA_delay_max + $Tco_max + $bdA_delay_max]
set usedTh [expr $clkA_delay_min + $Tco_min + $bdA_delay_min]

set_input_delay -clock adcclk -max $usedTsu [get_ports {adc[*]}]
set_input_delay -clock adcclk -min $usedTh [get_ports {adc[*]}]

set_input_delay -clock adcclk -clock_fall -add_delay -max $usedTsu [get_ports {adc[*]}]
set_input_delay -clock adcclk -clock_fall -add_delay -min $usedTh [get_ports {adc[*]}]


И в коде:

Код
adc_a[9..0]=adc[9..0];
adc_a[9..0].clk=!adcclk;
adc_b[9..0]=adc[9..0];
adc_b[9..0].clk=adcclk;


Необходимость этого явно видна, если посмостреть отчет по пути от adc к adc_a во временном анализаторе.
Timmy
Цитата(DENth @ Sep 18 2013, 13:48) *
set usedTsu [expr $clkA_delay_max + $Tco_max + $bdA_delay_max]
set usedTh [expr $clkA_delay_min + $Tco_min + $bdA_delay_min]

Мне почему-то кажется, что здесь надо было:
Код
set usedTsu [expr -$clkA_delay_min + $Tco_max + $bdA_delay_max]
set usedTh [expr -$clkA_delay_max + $Tco_min + $bdA_delay_min]

DENth
Цитата(Timmy @ Sep 18 2013, 19:12) *
Мне почему-то кажется, что здесь надо было:
Код
set usedTsu [expr -$clkA_delay_min + $Tco_max + $bdA_delay_max]
set usedTh [expr -$clkA_delay_max + $Tco_min + $bdA_delay_min]


Вы имеете ввиду что данную задержку нужно задавать отрицательной? Или синтаксис команды? Не могли бы Вы пояснить свою точку зрения?
Timmy
Цитата(DENth @ Sep 18 2013, 21:08) *
Вы имеете ввиду что данную задержку нужно задавать отрицательной? Или синтаксис команды? Не могли бы Вы пояснить свою точку зрения?

Задержка данных относительно клока не обязательно будет отрицательной, но задержку клока нужно вычитать, причём для максимальной задержки данных вычитать минимальную задержку клока. Синтаксис в порядке. И ещё, кстати, рекомендуется использовать виртуальный клок, хотя это не критично.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.