Перейти к содержанию
    

Прошу помощи с констрейнами DDR/QDR

Бьюсь с выравниванием времянок в QDR интерфейсе, пока безуспешно. Прошу помощи.

Сделал проект в котором реализован приёмник двух каналов АЦП по QDR интерфейсу.  И выходы с приемников АЦП поключены к SignalTap, который тактируется ADC1_FRM.

АЦП формирует удвоенную ADC_CLK, её фронты приходятся на середину данных. (Т.е ADC_CLK сдвинута относительно данных на 90 град)
Тактовая частота ADC_FRM приходится на фронт данных.

Констрейны прописал по описанию из AN433. 

После компиляции вижу в TimeQuest следующую картину:

Клоки

image.thumb.png.e180a6e5dff45cc3ca8096b59e6e3c62.png

Почему то только анализирует ADCx_FRM. Почему нет ADCx_CLK ?

image.png.74fd956667cce61a47f11e3256d3137f.png

Setup ADC2_FRM

image.thumb.png.b5079b4ded6789b74c5ec588ab8f7f48.png

И самое, то из-за чего не работает и пытаюсь разобраться с констрейнами - это то что для данных и клоков получаются разные времянки прохождения сигнала до триггера. 
report_path -from ADC*_CLK -npaths 128 -panel_name {Report Path}

ADC1_CLK - 4.4 нс, а ADC2_CLK - 8.6 нс и соответственно тоже самое и для данных
ADC1_D* - 1.5 нс,    ADC2_D* - 1.5 нс

Ниже привожу код приемника QDR и SDC файл. 

В принципе я могу эти задержки выровнять при помощи настройки DelayChain но при изменениях в проекте базовые времена ADC*_CLK изменяются, и приходится настраивать заново.

Помогите правильно прописать констрейны, чтобы при перекомпиляции не слетали времянки.


image.thumb.png.f2bc6d800a54e58de16e6345b7f0175c.png

image.thumb.png.9c4ea10ec818b0dfea5ffb3f52c702c9.png

image.thumb.png.cfa108546b9ac1ad65a1f2a1726ae19d.png

 

// ПРИЕМНИК ДАННЫХ С АЦП 

module ADS42LB69
(
	reset,										// (in) reset
	clk,											// (out) data clk
	d_out,										// (out) data output
// --------------chip interface ---------------------//
	D_CLK,										// (in) QDR data clk
	FRAME,										// (in) QDR data frame
	D													// (in) QDR data
);
input reset;

input	D_CLK;		// ADCx_CLK
input	FRAME;		// ADCx_FRM							
input [3: 0] D;	// ADCx_D[]

output clk;
output reg [15: 0] d_out;

wire [15: 0] gpio_d;
gpiox4_in gpio_inst
(
	.aclr		(sys_rst),
	.ck_fr	(D_CLK),
	.ck_hr	(FRAME),
	.pad_in	(D),
	.dout		({gpio_d[3: 0], gpio_d[7: 4], gpio_d[11: 8], gpio_d[15: 12]})
);

assign clk = FRAME;
always @(negedge FRAME)   d_out[15:0] = gpio_d[15:0];

endmodule
set_time_format -unit ns -decimal_places 3
derive_clock_uncertainty 

set adc_data_period 2.500
set adc_frame_preiod [expr $adc_data_period * 2]

# max_delay = unit_interval - tsu
# min_delay = th
#set_input_delay -max [expr <unit interval> - <setup time>] -clock  [get_clocks input_clock] -add_delay [get_ports data_in]
#set_input_delay -min <hold time> -clock [get_clocks input_clock]  -add_delay [get_ports data_in]
#set adc_tsu 0.31
#set adc_th 0.29

 // Так же пробовал ставить max 0.2   min -0.2  Эффекта не заметил
set max_data_delay  1.05  
set min_data_delay  0.2


create_clock -name virtual_clock_adc -period $adc_data_period 

create_clock -name {ADC1_CLK} -period $adc_data_period   [get_ports  {ADC1_CLK}]  -waveform { 0.625 1.875 }
create_clock -name {ADC2_CLK} -period $adc_data_period   [get_ports  {ADC2_CLK}]  -waveform { 0.625 1.875 }
create_clock -name {ADC1_FRM} -period $adc_frame_preiod  [get_ports {ADC1_FRM}] 
create_clock -name {ADC2_FRM} -period $adc_frame_preiod  [get_ports {ADC2_FRM}] 

set_input_delay -clock [ get_clocks virtual_clock_adc]  -min $min_data_delay  [get_ports {ADC1_D[*]}] 
set_input_delay -clock [ get_clocks virtual_clock_adc]  -max $max_data_delay  [get_ports {ADC1_D[*]}] 
set_input_delay -clock [ get_clocks virtual_clock_adc]  -min $min_data_delay  [get_ports {ADC1_D[*]}]  -add_delay -clock_fall
set_input_delay -clock [ get_clocks virtual_clock_adc]  -max $max_data_delay  [get_ports {ADC1_D[*]}]  -add_delay -clock_fall

set_input_delay -clock [ get_clocks virtual_clock_adc]  -min $min_data_delay  [get_ports {ADC2_D[*]}] 
set_input_delay -clock [ get_clocks virtual_clock_adc]  -max $max_data_delay  [get_ports {ADC2_D[*]}] 
set_input_delay -clock [ get_clocks virtual_clock_adc]  -min $min_data_delay  [get_ports {ADC2_D[*]}]  -add_delay -clock_fall
set_input_delay -clock [ get_clocks virtual_clock_adc]  -max $max_data_delay  [get_ports {ADC2_D[*]}]  -add_delay -clock_fall

set_false_path -setup -fall_from [get_clocks virtual_clock_adc] -rise_to [get_clocks ADC1_CLK]
set_false_path -setup -rise_from [get_clocks virtual_clock_adc] -fall_to [get_clocks ADC1_CLK]
set_false_path -hold -rise_from [get_clocks virtual_clock_adc] -rise_to [get_clocks ADC1_CLK]
set_false_path -hold -fall_from [get_clocks virtual_clock_adc] -fall_to [get_clocks ADC1_CLK]

set_false_path -setup -fall_from [get_clocks virtual_clock_adc] -rise_to [get_clocks ADC2_CLK]
set_false_path -setup -rise_from [get_clocks virtual_clock_adc] -fall_to [get_clocks ADC2_CLK]
set_false_path -hold -rise_from [get_clocks virtual_clock_adc] -rise_to [get_clocks ADC2_CLK]
set_false_path -hold -fall_from [get_clocks virtual_clock_adc] -fall_to [get_clocks ADC2_CLK]

set_clock_groups -exclusive -group [get_clocks  {ADC1_CLK } ] 
set_clock_groups -exclusive -group [get_clocks  {ADC2_CLK } ] 
set_clock_groups -exclusive -group [get_clocks  {ADC1_FRM } ] 
set_clock_groups -exclusive -group [get_clocks  {ADC2_FRM } ] 

 

 

image.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, Digi said:

...

Помогите правильно прописать констрейны, чтобы при перекомпиляции не слетали времянки.

...

Встречался с подобной проблемой - сигналы были заведены на низкоскоростные ноги ПЛИС, и все танцы с бубном вокруг констрейнов ни к чему не приводили. Поэтому сначала надо посмотреть, на какие ноги заведены сигналы.

Кстати, а тестовый паттерн верно принимается? Нет ошибок?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, клоки действительно заведены не туда куда необходимо. Но тем не менее, вручную удается выставить необходимые задержки, чтобы это всё работало. При правильных задержках и тестовый паттерн принимается нормально и сигнал нормальный. 

А вот по поводу констрейнов, я считал, что Quartus будет стараться разводить так, чтобы выполнялись необходимые условия, и сам же установить необходимые задержки на буферах IO (в другом проекте, он их ставит, правда констрейны тоже неправильно прописаны и проект не работает) .

 Я даже согласен выставить вручную задержки один раз, но чтобы при изменениях проекта их не приходилось больше менять.

А так я даже не вижу, что не попадаю в нужные мне времянки, ADC_CLK не анализируется никак.... Оценить работоспособность проекта могу только лишь посмотрев на Path report. 

В том что я выложил, принципиальные ошибки какие либо есть ? Почему он их игнорирует ? 

Как правильно описать set_input_delay, для случая когда данные сдвинуты от клока на 90 град ?

Вот так ?
max_delay = unit_interval - tsu
min_delay = th

или 

max_delay =  tco
min_delay = - tco

(tco считать примерно равной tsu)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, Digi said:

... вручную удается выставить необходимые задержки, чтобы это всё работало...

 

Тоже руками крутил delay в IO портах. И тоже *иногда* собиралось так, что паттерн передавался без ошибок. После кучи убитого времени пришел к тому, что всё это самообман, и "рабочие" сборки - просто удачно разложенные регистры, чисто случайно. Но, может быть, у вас получится чего-то добиться. Будет интересно прочесть про рабочий вариант.

ЗЫ. А тестовый паттерн сколько времени проверяли? Сколько бит тестового паттерна принимается подряд без ошибок? 10^5? 10^9?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может это конечно и самообман, но основная задача - запустить опытный образец на том что есть и параллельно разобраться, как должны работать констрейны. Меня вполне устраивает работа того что есть, но не устраивает то что при изменении проекта может не зарабоать.

Пока что, то что я пытаюсь задавать никак не влияет на анализ и разводку. Или я не правильно задаю или не то ожидаю увидеть.

Например из моего примера. Я задал virtual_clock и относительно него задал input_delay. После анализа я Ожидаю увидеть ADC1_CLK, который будет защёлкивать данные синхронные с Virtual Clock. Но этого не происходит. При анализе почему то вообще нет ADC1_CLK. Если я задаю input_delay относительно ADC1_CLK, то он его анализирует, при этом ожидает данные относительно нулевой шкалы + тот delay, который я ему задал.... вроде как.

Дальше мне совсем непонятно его поведение. Он показывает, что данные приходят слишком поздно, но ко всему этому он у IO порта выкручивает задержку до максимума. Если задержку прописать руками, то всё у него складывается и слаков нет. Зачем он увеличивает задержку, когда её наоборот нужно уменьшать ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 hours ago, Digi said:

анализирует ADCx_FRM

Quote

выходы с приемников АЦП поключены к SignalTap, который тактируется ADC1_FRM

предположу - это идет анализ разводки сигналтапа. 

41 minutes ago, Digi said:

задал virtual_clock и относительно него задал input_delay

а с каким реально сигналом связан этот виртуальный клок? Я что-то не нашел (может - плохо смотрел...).

43 minutes ago, Digi said:

При анализе почему то вообще нет ADC1_CLK

а где его подключение? - тоже не нашел... Не могли напутать с обозначениями клоков - в тексте программы и в тексте констрейнов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 минуты назад, Yuri124 сказал:

а с каким реально сигналом связан этот виртуальный клок? Я что-то не нашел (может - плохо смотрел...).

Я считал, что я задаю сигнал, который соответствует моментам установки данных на АЦП, т.е. те, которые приходят на входы ADC*_D[*]

24 минуты назад, Yuri124 сказал:

а где его подключение? - тоже не нашел... Не могли напутать с обозначениями клоков - в тексте программы и в тексте констрейнов?

В файле верхнего уровня он заходит на вход D_CLK модуля ADS42LB69 (в комментарии я написал сигналы, которые в него приходят из верхнего уровня). Таких модулей там 8 штук, соответственно сигналы от каждого канала АЦП содержат х, где х - цифра от 1 до 8. ADCx_CLK -> ADC1_CLK ,ADC2_CLK ... ADC8_CLK

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 minutes ago, Digi said:

Я считал, что я задаю сигнал, который соответствует моментам установки данных на АЦП

но ведь этот виртуальный клок чисто условно привязан к нулю временной шкалы, надо его как-то привязать к реальным клокам, которые имеют задержки при распространении по кристаллу, иначе, как я понимаю, время прихода данных ни к чему не привязано...

И тем более Вы отменяете анализ между реальными клоками и этим виртуальным
 

set_false_path -setup -fall_from [get_clocks virtual_clock_adc] -rise_to [get_clocks ADC1_CLK]
set_false_path -setup -rise_from [get_clocks virtual_clock_adc] -fall_to [get_clocks ADC1_CLK]
set_false_path -hold -rise_from [get_clocks virtual_clock_adc] -rise_to [get_clocks ADC1_CLK]
set_false_path -hold -fall_from [get_clocks virtual_clock_adc] -fall_to [get_clocks ADC1_CLK]

 

23 minutes ago, Digi said:

В файле верхнего уровня он заходит на вход D_CLK модуля ADS42LB69 (в комментарии я написал сигналы, которые в него приходят из верхнего уровня)

Понял, спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

45 минут назад, Yuri124 сказал:

но ведь этот виртуальный клок чисто условно привязан к нулю временной шкалы,

В примерах от Altera так и есть, его привязывают к условному нулю. У меня фактически тоже так и есть. Я ADC*_CLK указываю что он со сдвигом на 90 град, а ADC*_FRM и данные ADC*_D (которые описываю virual_clock)   и начинаются от 0. 

 

create_clock -name virtual_clock_adc -period 2.500
create_clock -name {ADC2_CLK} -period 2.500   [get_ports  {ADC1_CLK}]  -waveform { 0.625 1.875 }
create_clock -name {ADC1_FRM} -period 5.000  [get_ports {ADC1_FRM}] 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Digi said:

Я задал virtual_clock и относительно него задал input_delay. После анализа я Ожидаю увидеть ADC1_CLK, который будет защёлкивать данные синхронные с Virtual Clock. Но этого не происходит.

может быть дело в этом:

set_clock_groups -exclusive -group [get_clocks  {ADC1_CLK } ] 

 

Я правильно понимаю - когда Вы

2 hours ago, Digi said:

задаю input_delay относительно ADC1_CLK, то он его анализирует, при этом ожидает данные относительно нулевой шкалы + тот delay, который я ему задал.... вроде как.

то в отчете  идет привязка к правильному клоку, но только проблема в

2 hours ago, Digi said:

совсем непонятно его поведение. Он показывает, что данные приходят слишком поздно, но ко всему этому он у IO порта выкручивает задержку до максимума. Если задержку прописать руками, то всё у него складывается и слаков нет. Зачем он увеличивает задержку, когда её наоборот нужно уменьшать ?

Т.е. где-то неточность в описании констрейнов на входах ПЛИС?

Изменено пользователем Yuri124

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, Yuri124 сказал:

может быть дело в этом:


set_clock_groups -exclusive -group [get_clocks  {ADC1_CLK } ] 

Если я правильно понял, то эта запись указывает, что всё что тактируется ADC1_CLK , не должно анализироваться с другими клоками. Или она совсем не то означает ?
У меня большой проект и в нем много разных тактов и если не писать такой констрейн, то время компиляции возрастает до полутора часов на мощном компе. Если такты я выделяю в группы и в проекте выполняю межклоковую синхронизацию необходимых данных, то время компиляции сокращается до 20 минут и исчезают различные глюки, связанные с запаздываниями сигналов. 

21 минуту назад, Yuri124 сказал:

Я правильно понимаю - когда Вы

3 часа назад, Digi сказал:

задаю input_delay относительно ADC1_CLK, то он его анализирует, при этом ожидает данные относительно нулевой шкалы + тот delay, который я ему задал.... вроде как.

то в отчете  идет привязка к правильному клоку, но только проблема в

3 часа назад, Digi сказал:

совсем непонятно его поведение. Он показывает, что данные приходят слишком поздно, но ко всему этому он у IO порта выкручивает задержку до максимума. Если задержку прописать руками, то всё у него складывается и слаков нет. Зачем он увеличивает задержку, когда её наоборот нужно уменьшать ?

Т.е. где-то неточность в описании констрейнов на входах ПЛИС?

Да, правильно. 

# Center-Aligned Double Data Rate Source Synchronous Inputs 
#
# For a center-aligned Source Synchronous interface, the clock
# transition is aligned with the center of the data valid window.
# The same clock edge is used for launching and capturing the
# data. The constraints below rely on the default timing
# analysis (setup = 1/2 cycle, hold = 0 cycle).
#
# input                  ____________________
# clock    _____________|                    |_____________
#                       |                    |                 
#                dv_bre | dv_are      dv_bfe | dv_afe
#               <------>|<------>    <------>|<------>
#          _    ________|________    ________|________    _
# data     _XXXX____Rise_Data____XXXX____Fall_Data____XXXX_
#

#set input_clock         <clock_name>;      # Name of input clock
#set input_clock_period  2.500;                    # Period of input clock (full-period)
#set dv_bre              0.300;             # Data valid before the rising clock edge
#set dv_are              0.300;             # Data valid after the rising clock edge
#set dv_bfe              0.300;             # Data valid before the falling clock edge
#set dv_afe              0.300;             # Data valid after the falling clock edge
#set input_ports         {ADC1_D[*] ADC2_D[*] ADC3_D[*] ADC4_D[*]};     # List of input ports
#
## Input Delay Constraint
#set_input_delay -clock ADC1_CLK -max [expr $input_clock_period/2 - $dv_bfe]  [get_ports {ADC1_D[*]}];
#set_input_delay -clock ADC1_CLK -min $dv_are                                [get_ports {ADC1_D[*]}];
#set_input_delay -clock ADC1_CLK -max [expr $input_clock_period/2 - $dv_bre] [get_ports {ADC1_D[*]}] -clock_fall -add_delay;
#set_input_delay -clock ADC1_CLK -min $dv_afe                                [get_ports {ADC1_D[*]}] -clock_fall -add_delay;

Вот такое описание начинает влиять на IO DELAY но с ними задержки, которые устанавливает компилятор становятся неадекватными. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

33 minutes ago, Digi said:

эта запись указывает, что всё что тактируется ADC1_CLK , не должно анализироваться с другими клоками.

Да, поэтому я предполагаю - когда Вы привязываете входные сигналы к виртуальному клоку, то нет анализа их взаимодействия с реальным - но это только мое предположение, почему в этом случае отсутствует в отчетах нужная информация с ADC1_CLK...

 

У меня подозрение, что нужно указывать знак минус (т.к. по отношению к данным  клок находится в центре) - поэтому квартус пытается "дотянуть" данные с помощью неадекватной задержки до следующего фронта клока...

https://www.intel.com/content/www/us/en/programmable/quartushelp/13.0/mergedProjects/tafs/tafs/tcl_pkg_sdc_ver_1.5_cmd_set_input_delay.htm

 

Изменено пользователем Yuri124

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или, если привязывать сигналы на входах к виртуальному клоку - то потом добавлять этот клок в каждую группу set_clock_groups вместе с ADCх_CLK

Изменено пользователем Yuri124

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С обратным знаком вроде выглядит как надо. Но IO DELAY всёравно надо ставить руками, иначе он угоняет его в максимум. На работоспособность не проверял. 

SDC такой 

create_clock -name {ADC1_CLK} -period $adc_data_period   [get_ports  {ADC1_CLK}]  -waveform { 0.625 1.875 }
create_clock -name {ADC1_FRM} -period $adc_frame_preiod  [get_ports {ADC1_FRM}] 

set input_clock         <clock_name>;      # Name of input clock
set input_clock_period  2.500;                    # Period of input clock (full-period)
set dv_bre              0.300;             # Data valid before the rising clock edge
set dv_are              0.300;             # Data valid after the rising clock edge
set dv_bfe              0.300;             # Data valid before the falling clock edge
set dv_afe              0.300;             # Data valid after the falling clock edge
# Input Delay Constraint
set_input_delay -clock ADC1_CLK -max -[expr $input_clock_period/2 - $dv_bfe]  [get_ports {ADC1_D[*]}];
set_input_delay -clock ADC1_CLK -min -$dv_are                                [get_ports {ADC1_D[*]}];
set_input_delay -clock ADC1_CLK -max -[expr $input_clock_period/2 - $dv_bre] [get_ports {ADC1_D[*]}] -clock_fall -add_delay;
set_input_delay -clock ADC1_CLK -min -$dv_afe                                [get_ports {ADC1_D[*]}] -clock_fall -add_delay;

 

image.thumb.png.30ed3690a3ff443d2072fa0f8eab3253.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Продолжаю разбираться с констрейнами. Создал новый проект, в котором кроме GPIO ничего нет. Описываю констрейны как указано в AN433 и снова получаю полную хрень. 

Вопросы:

1) как в этому случае должен описываться сигнал ADC1_FRM (half rate clock) ? 
2) Почему квартус увеличивает задержку на линиях данных ADC1_D[*], когда её необходимо уменьшать ?
3) Какие методы ещё применить для анализа, на что посмотреть ?

PS: проект так и не работает. Только вручную удаётся его заставить работать, отключив анализ клоков и данных. Во всех остальных случаях он разводить его так, что это все становится неработоспособным. Видимо что то не так описано.

Кстати заметил, что в описании на GPIO half_rate_clk и full_rate_clk нарисованы с совпадающими фронтами а не смещенными на 90 град. У меня с АЦП они выходят смещенные.

 

 

Сам код:

module top 
(
			// ADC1
	input		[3: 0]	ADC1_D,	
	input 					ADC1_CLK,
	input 					ADC1_FRM,
	input 					ADC1_OVR,
	
	output	[7: 4]	B_BUSo,				
	output	[3: 0]	VPX_TX

);


wire [15: 0] gpio_d;
gpiox4_in gpio_inst
(
	.aclr		(0),
	.ck_fr	(ADC1_CLK),
	.ck_hr	(ADC1_FRM),
	.pad_in	(ADC1_D[3:0]),
	.dout		({gpio_d[3: 0], gpio_d[7: 4], gpio_d[11: 8], gpio_d[15: 12]})
);

 assign {VPX_TX[3:0], B_BUSo[7:4]} = gpio_d[7:0] | gpio_d[15:8];		// Dummy output

//-------------------------------------------------------------------------//

//-------------------------------------------------------------------------//
endmodule

SDC файл:

set_time_format -unit ns -decimal_places 3
derive_clock_uncertainty 

set adc_data_period 2.500
set adc_frame_preiod [expr $adc_data_period * 2]

set skew 0.3

create_clock -name virtual_clock -period $adc_data_period 
create_clock -name {ADC1_CLK} -period $adc_data_period   [get_ports  {ADC1_CLK}]  -waveform { 0.625 1.875 }
create_clock -name {ADC1_FRM} -period $adc_frame_preiod  [get_ports {ADC1_FRM}] 

create_clock -name {ADC2_CLK} -period $adc_data_period   [get_ports  {ADC2_CLK}]  -waveform { 0.625 1.875 }
create_clock -name {ADC3_CLK} -period $adc_data_period   [get_ports  {ADC3_CLK}]  -waveform { 0.625 1.875 }
create_clock -name {ADC2_FRM} -period $adc_frame_preiod  [get_ports {ADC2_FRM}] 

set_input_delay -max $skew -clock [get_clocks virtual_clock] [get_ports {ADC1_D[*]}]
set_input_delay -max $skew -clock [get_clocks virtual_clock] -clock_fall [get_ports {ADC1_D[*]}] -add_delay
set_input_delay -min -$skew -clock [get_clocks virtual_clock] [get_ports {ADC1_D[*]}] -add_delay
set_input_delay -min -$skew -clock [get_clocks virtual_clock] -clock_fall [get_ports {ADC1_D[*]}] -add_delay

set_false_path -setup -fall_from [get_clocks virtual_clk] -rise_to [get_clocks ADC1_CLK]
set_false_path -setup -rise_from [get_clocks virtual_clk] -fall_to [get_clocks ADC1_CLK]
set_false_path -hold -rise_from [get_clocks virtual_clk] -rise_to [get_clocks ADC1_CLK]
set_false_path -hold -fall_from [get_clocks virtual_clk] -fall_to [get_clocks ADC1_CLK]



#Example 49. from AN433
#set_input_delay -max <skew> -clock [get_clocks virtual_clock] [get_ports data_in]
#set_input_delay -max <skew> -clock [get_clocks virtual_clock] -clock_fall [get_ports data_in] -add_delay
#set_input_delay -min <negative skew> -clock [get_clocks virtual_clock] [get_ports data_in] -add_delay
#set_input_delay -min <negative skew> -clock [get_clocks virtual_clock] -clock_fall [get_ports data_in] -add_delay

#Example 52.
#set_false_path -setup -fall_from [get_clocks virtual_clk] -rise_to [get_clocks data_clk]
#set_false_path -setup -rise_from [get_clocks virtual_clk] -fall_to [get_clocks data_clk]
#set_false_path -hold -rise_from [get_clocks virtual_clk] -rise_to [get_clocks data_clk]
#set_false_path -hold -fall_from [get_clocks virtual_clk] -fall_to [get_clocks data_clk]

Setup ADC1_CLK

image.thumb.png.1e5a1de132fa2ed8ee4715abec804f28.png

Hold ADC1_CLK

image.thumb.png.ace660fb217dd395152ce763e36500c1.png

image.thumb.png.3a200e669e96e906df5e4b90c20215d2.png

И путь сигнала. Причём Quartus при компиляции сам выкрутил задержку в буфере до значения 42, хотя сам же сообщает, что данные должны быть раньше.

image.thumb.png.aedb3b448fd8e2d4fbf15f69fc7d1a51.png

Структура GPIO

image.png.0ed0881210c353adbadcce61026f3295.png

image.thumb.png.3eca70305d60d80aebbe8d12f1552f8f.png

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...