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

Cyclone V -> внешний DAC -> set_output_delay -> проблемы с качеством выходного сигнала.

Всем доброго дня! 

Прошу помочь, не могу разобраться, что делаю не так.

Имеется:

1. SoCKit 

2. AD/DA Data Conversion Card

Генерирую ЛЧМ сигнал с помощью NCO. С помощью TimeQuest в GUI задал констрейны:

1. На входную тактовую частоту 50 МГц поступающую на PLL. 

2. create_generated_clock на порождаемый с помощью PLL клок 100 МГц от входного клока 50 МГц

3. На выходную тактовую частоту из ПЛИС для DAC которая является дифференциальной. Для каждого порта dac_clk_p и dac_clk_n отдельный create_generated_clock исходя из соображений, что эти клоки порождаемые от выходной из PLL частоты 100 МГц. 

     а) Правильно ли я тут сделал, исходя из того что
   

             assign dac_clk_p = clk_100MHz;

             assign dac_clk_n = ~clk_100MHz;

     б) Нужно ли мне объединять в эксклюзивную группу dac_clk_p и dac_clk_n? Как я понял в группу объединяются синхронные клоки здесь как раз такой случай.

4. set_output_delay -min и set_output_delay -max на порты поступающие от ПЛИС на ЦАП относительно dac_clk_p. В соответствии с datasheet на ЦАП для -min задал значение th = 3.8 nS, для -max tsu = 2.9 nS.

Проблема в том, что если не задавать констрейны set_output_delay сигнал на выходе ЦАП чистый, но если задать сигнал зашумлен (иголки). Предполагаю, что я не верно задаю set_output_delay  и ухудшаю параметры по tsu/th сигналов поступающих на ЦАП.

dds.out.sdc dds.out_Set_Output_Delay.sdc

Изменено пользователем en-valb

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


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

Quote

Правильно ли

Нет. Дифференциальный сигнал это не пара инверсных сигналов. Дифференциальный сигнал формируется либо инстанцированием специального буфера, либо прописыванием специального констрейна. А выходной клок формируется буфером DDR. А формировать клок для ЦАП в ФПЖА очень плохая идея.

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


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

On 12/16/2022 at 5:15 PM, andrew_b said:

Нет. Дифференциальный сигнал это не пара инверсных сигналов. Дифференциальный сигнал формируется либо инстанцированием специального буфера, либо прописыванием специального констрейна. А выходной клок формируется буфером DDR. А формировать клок для ЦАП в ФПЖА очень плохая идея.

andrew_b, благодарю за помощь, планировал от внешнего 10 МГц все затактировать, но видимо придется 100 МГц генератор покупать.

В pin planer для входной частоты сделал I/O Standart дифференциальный вход. Теперь этот вход 100 МГц (раньше был 50 МГц). Подключил его на PLL. У PLL теперь на входе и выходе 100 МГц. Оставил его(PLL) так как далее скорее всего понадобятся другие частоты. sdc файл полностью переделал, во вложении. Остальное пока не трогал. На AD/DA Data Conversion Card допаял перемычку на R111 чтобы вход CLK сделать униполярным и подал на него с генератора 100 МГц. Все картинки на осциллографе хорошие, но пока не заданы констрейны set_output_delay. Буду разбираться как их описать под новую конфигурацию схемы тактирования ЦАП.

dds.out.sdc

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


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

Переключил внутреннюю логику на входную частоту от которой непосредственно ЦАП тактируется, выход PLL сейчас висит не подключенный. Задал констрейны:

set_output_delay -add_delay -max -clock [get_clocks {refclk}]  2.900 [get_ports {lfm_out[0]}]
set_output_delay -add_delay -min -clock [get_clocks {refclk}]  3.800 [get_ports {lfm_out[0]}]
set_output_delay -add_delay -max -clock [get_clocks {refclk}]  2.900 [get_ports {lfm_out[1]}]
set_output_delay -add_delay -min -clock [get_clocks {refclk}]  3.800 [get_ports {lfm_out[1]}]
set_output_delay -add_delay -max -clock [get_clocks {refclk}]  2.900 [get_ports {lfm_out[2]}]
set_output_delay -add_delay -min -clock [get_clocks {refclk}]  3.800 [get_ports {lfm_out[2]}]
set_output_delay -add_delay -max -clock [get_clocks {refclk}]  2.900 [get_ports {lfm_out[3]}]
set_output_delay -add_delay -min -clock [get_clocks {refclk}]  3.800 [get_ports {lfm_out[3]}]
set_output_delay -add_delay -max -clock [get_clocks {refclk}]  2.900 [get_ports {lfm_out[4]}]
set_output_delay -add_delay -min -clock [get_clocks {refclk}]  3.800 [get_ports {lfm_out[4]}]
set_output_delay -add_delay -max -clock [get_clocks {refclk}]  2.900 [get_ports {lfm_out[5]}]
set_output_delay -add_delay -min -clock [get_clocks {refclk}]  3.800 [get_ports {lfm_out[5]}]
set_output_delay -add_delay -max -clock [get_clocks {refclk}]  2.900 [get_ports {lfm_out[6]}]
set_output_delay -add_delay -min -clock [get_clocks {refclk}]  3.800 [get_ports {lfm_out[6]}]
set_output_delay -add_delay -max -clock [get_clocks {refclk}]  2.900 [get_ports {lfm_out[7]}]
set_output_delay -add_delay -min -clock [get_clocks {refclk}]  3.800 [get_ports {lfm_out[7]}]
set_output_delay -add_delay -max -clock [get_clocks {refclk}]  2.900 [get_ports {lfm_out[8]}]
set_output_delay -add_delay -min -clock [get_clocks {refclk}]  3.800 [get_ports {lfm_out[8]}]
set_output_delay -add_delay -max -clock [get_clocks {refclk}]  2.900 [get_ports {lfm_out[9]}]
set_output_delay -add_delay -min -clock [get_clocks {refclk}]  3.800 [get_ports {lfm_out[9]}]
set_output_delay -add_delay -max -clock [get_clocks {refclk}]  2.900 [get_ports {lfm_out[10]}]
set_output_delay -add_delay -min -clock [get_clocks {refclk}]  3.800 [get_ports {lfm_out[10]}]
set_output_delay -add_delay -max -clock [get_clocks {refclk}]  2.900 [get_ports {lfm_out[11]}]
set_output_delay -add_delay -min -clock [get_clocks {refclk}]  3.800 [get_ports {lfm_out[11]}]
set_output_delay -add_delay -max -clock [get_clocks {refclk}]  2.900 [get_ports {lfm_out[12]}]
set_output_delay -add_delay -min -clock [get_clocks {refclk}]  3.800 [get_ports {lfm_out[12]}]
set_output_delay -add_delay -max -clock [get_clocks {refclk}]  2.900 [get_ports {lfm_out[13]}]
set_output_delay -add_delay -min -clock [get_clocks {refclk}]  3.800 [get_ports {lfm_out[13]}]

image.thumb.png.98d8ac0e7dc7a09b1cbd4aecac07a383.png

image.thumb.png.2434885af66393e19596ffa439f8dc39.png

image.thumb.png.4a4ab6e9865e050e1d33898f973ac32d.png

Сигнал на осциллографе хороший. 

На диаграмме выше видно, что запускающий clock задержан на 7.308 ns. Или это можно рассматривать как сдвиг фазы на 7.308 ns? Тогда нужно фазу пододвинуть, с помощью PLL наверное?

Изменено пользователем en-valb

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


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

Ваш случай описан в Timequest для чайников.

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


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

1 hour ago, Flip-fl0p said:

Ваш случай описан в Timequest для чайников.

Source-Synchronus Output

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


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

Вот что получилось:

Создал виртуальный клок dac_clk

#**************************************************************
# Create Clock
#**************************************************************

create_clock -name {refclk} -period 10.000 -waveform { 0.000 5.000 } [get_ports {refclk}]
create_clock -name {dac_clk} -period 10.000 -waveform { 0.000 5.000 } 

Объединил входной клок refclk и виртуальный клок dac_clk в эксклюзивную группу

#**************************************************************
# Set Clock Groups
#**************************************************************

set_clock_groups -exclusive -group [get_clocks {dac_clk refclk}] 

И переписал set_output_delay

#**************************************************************
# Set Output Delay
#**************************************************************
# максимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC)
set CLK_bs_delay_max 0.2 
# максимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП)
set DATA_delay_max 0.5
# минимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 0.9 ns)
set CLK_bd_delay_min 1.6
#(tSU ЦАП по справочнику)
set tSU 2.9 


# минимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC)
set CLK_bs_delay_min 0.2
# минимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП)
set DATA_delay_min 0.5
# максимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 2.5 ns)
set CLK_bd_delay_max 3.2
#(tH ЦАП по справочнику)
set tH 3.8



set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[0]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[0]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[1]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[1]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[2]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[2]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[3]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[3]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[4]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[4]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[5]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[5]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[6]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[6]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[7]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[7]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[8]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[8]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[9]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[9]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[10]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[10]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[11]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[11]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[12]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[12]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[13]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[13]}]

Теперь на диаграмме вижу, что запускающий клок это refclk, а защелкивающий клок это dac_clk

image.thumb.png.e88a01963cff6310c8da3423ae41bea2.png

Картина поменялась в лучшую сторону, но все еще не достаточно.

Теперь как я понимаю необходимо подключить тактирование внутренней логики к выходу PLL и немного пододвинуть запускающий клок?

36 minutes ago, krux said:

примитив DDIO чайники выдумали?

 

Вы это имеете ввиду?

module ddio(
	input wire d0,
	input wire d1,
	input wire clk,
	output wire out
	);

reg r_d0;
reg r_d1;
always @(posedge clk)
begin
	r_d0 <= d0;
	r_d1 <= d1;
end
assign out = clk ? r_d0 : r_d1;
endmodule

Сейчас у меня вот так

image.thumb.png.97037294b2dd0e8655406bec093edc43.png

Такой вариант хуже?

DDIO мне наверное не нужен, мне дифференциальную пару тактового сигнала на ПЛИС завести надо, а на ЦАП идет 14-ти разрядная параллельная шина униполярных сигналов.

Изменено пользователем en-valb

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


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

 

1 hour ago, en-valb said:

Вот что получилось:

Создал виртуальный клок dac_clk

#**************************************************************
# Create Clock
#**************************************************************

create_clock -name {refclk} -period 10.000 -waveform { 0.000 5.000 } [get_ports {refclk}]
create_clock -name {dac_clk} -period 10.000 -waveform { 0.000 5.000 } 

Объединил входной клок refclk и виртуальный клок dac_clk в эксклюзивную группу

#**************************************************************
# Set Clock Groups
#**************************************************************

set_clock_groups -exclusive -group [get_clocks {dac_clk refclk}] 

И переписал set_output_delay

#**************************************************************
# Set Output Delay
#**************************************************************
# максимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC)
set CLK_bs_delay_max 0.2 
# максимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП)
set DATA_delay_max 0.5
# минимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 0.9 ns)
set CLK_bd_delay_min 1.6
#(tSU ЦАП по справочнику)
set tSU 2.9 


# минимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC)
set CLK_bs_delay_min 0.2
# минимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП)
set DATA_delay_min 0.5
# максимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 2.5 ns)
set CLK_bd_delay_max 3.2
#(tH ЦАП по справочнику)
set tH 3.8



set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[0]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[0]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[1]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[1]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[2]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[2]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[3]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[3]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[4]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[4]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[5]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[5]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[6]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[6]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[7]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[7]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[8]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[8]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[9]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[9]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[10]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[10]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[11]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[11]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[12]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[12]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[13]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[13]}]

Теперь на диаграмме вижу, что запускающий клок это refclk, а защелкивающий клок это dac_clk

image.thumb.png.e88a01963cff6310c8da3423ae41bea2.png

Картина поменялась в лучшую сторону, но все еще не достаточно.

Теперь как я понимаю необходимо подключить тактирование внутренней логики к выходу PLL и немного пододвинуть запускающий клок?

Вы это имеете ввиду?

module ddio(
	input wire d0,
	input wire d1,
	input wire clk,
	output wire out
	);

reg r_d0;
reg r_d1;
always @(posedge clk)
begin
	r_d0 <= d0;
	r_d1 <= d1;
end
assign out = clk ? r_d0 : r_d1;
endmodule

Сейчас у меня вот так

image.thumb.png.97037294b2dd0e8655406bec093edc43.png

Такой вариант хуже?

DDIO мне наверное не нужен, мне дифференциальную пару тактового сигнала на ПЛИС завести надо, а на ЦАП идет 14-ти разрядная параллельная шина униполярных сигналов.

 

Не выходит каменный цветок! Двинул фазу на +90, Time Ques перестал выдавать ошибки, но сигнал на выходе ЦАП испортился.

Изменено пользователем en-valb

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


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

а можно глупый вопрос 

On 12/16/2022 at 6:57 PM, en-valb said:

По этой ссылке плата от терасиков, в даташите которой указано 

Quote

The D/A converter (U3 for channel A and B) on the Data Conversion HSMC provides 14-bit resolution and produces samples at rates up to 275 MSPS. It is a high-speed TI DAC5672 D/A converter and is set up to drive a differential-to-single output through a transformer.

а в даташите на DAC5672-EP указано 

Quote

Timing – Dual-Bus Mode

tsu Input setup time 1 ns

th Input hold time 1 ns

Timing – Single-Bus Interleaved Mode

tsu Input setup time 0.5 ns

th Input hold time 0.5 ns 

а вы ставите 

On 12/16/2022 at 6:57 PM, en-valb said:

4. set_output_delay -min и set_output_delay -max на порты поступающие от ПЛИС на ЦАП относительно dac_clk_p. В соответствии с datasheet на ЦАП для -min задал значение th = 3.8 nS, для -max tsu = 2.9 nS

откуда вы взяли эти цифры? задержка по плате 0.1нс максимум.

 

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


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

20 minutes ago, des00 said:

а можно глупый вопрос 

По этой ссылке плата от терасиков, в даташите которой указано 

а в даташите на DAC5672-EP указано 

а вы ставите 

откуда вы взяли эти цифры? задержка по плате 0.1нс максимум.

 

А ведь действительно, видимо глянул в даташит ADC по ошибке, на бумажку выписал tsu и th, и больше не сверялся. Внимательности у меня конечно не занимать. Премного благодарен!!! Сейчас все исправлю.

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


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

На счет задержки по плате, у AD/DA Data Conversion Card между CLK_IN_P куда я генератор подключил и ЦАП стоит две микросхемы, мультиплексор и буфер. На мультиплексор по даташит propagation delay 0.7 ns, а на буфер от 0.9 ns до 2.5 ns дополнительно какая то задержка по плате, пусть 0.1 ns. В сторону ПЛИС тактовая идет напрямую через разъем на выводы AA26, AB27. Соответственно в формулу я должен включить суммарную задержку CLK_bd_delay_min = 0.7+0.9+0.1 и CLK_bd_delay_max = 0.7+2.5+0.1. Я правильно понимаю?

image.thumb.png.52dd24528b32df073fa20ecd59dafb7d.png

Стало значительно лучше!

#**************************************************************
# Set Output Delay
#**************************************************************
# максимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC)
set CLK_bs_delay_max 0.1 
# максимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП)
set DATA_delay_max 0.1
# минимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 0.9 ns)
#set CLK_bd_delay_min 3.45
set CLK_bd_delay_min 3.3
#(tSU ЦАП по справочнику)
set tSU 1.0 
#set tmax [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min]
set tmax [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max]


# минимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC)
set CLK_bs_delay_min 0.1
# минимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП)
set DATA_delay_min 0.1
# максимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 2.5 ns)
#set CLK_bd_delay_max 5.55
set CLK_bd_delay_max 1.7
#(tH ЦАП по справочнику)
set tH 1.0
#set tmin [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] 
set tmin [expr $CLK_bs_delay_min - $tH + $DATA_delay_min] 

set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  $tmax [get_ports {lfm_out[0]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  $tmin [get_ports {lfm_out[0]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  $tmax [get_ports {lfm_out[1]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  $tmin [get_ports {lfm_out[1]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  $tmax [get_ports {lfm_out[2]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  $tmin [get_ports {lfm_out[2]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  $tmax [get_ports {lfm_out[3]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  $tmin [get_ports {lfm_out[3]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  $tmax [get_ports {lfm_out[4]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  $tmin [get_ports {lfm_out[4]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  $tmax [get_ports {lfm_out[5]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  $tmin [get_ports {lfm_out[5]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  $tmax [get_ports {lfm_out[6]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  $tmin [get_ports {lfm_out[6]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  $tmax [get_ports {lfm_out[7]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  $tmin [get_ports {lfm_out[7]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  $tmax [get_ports {lfm_out[8]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  $tmin [get_ports {lfm_out[8]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  $tmax [get_ports {lfm_out[9]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  $tmin [get_ports {lfm_out[9]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  $tmax [get_ports {lfm_out[10]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  $tmin [get_ports {lfm_out[10]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  $tmax [get_ports {lfm_out[11]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  $tmin [get_ports {lfm_out[11]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  $tmax [get_ports {lfm_out[12]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  $tmin [get_ports {lfm_out[12]}]
set_output_delay -add_delay -max -clock [get_clocks {dac_clk}]  $tmax [get_ports {lfm_out[13]}]
set_output_delay -add_delay -min -clock [get_clocks {dac_clk}]  $tmin [get_ports {lfm_out[13]}]

 

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


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

Добавил задержку CLK по плате на ЦАП, Time Quest ругаться перестал.

#**************************************************************
# Set Output Delay
#**************************************************************
# максимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC)
set CLK_bs_delay_max 0.1 
# максимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП)
set DATA_delay_max 0.1
# минимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 0.9 ns)
#set CLK_bd_delay_min 3.45
set CLK_bd_delay_min 3.3
#(tSU ЦАП по справочнику)
set tSU 1.0 
set tmax [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min]
#set tmax [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max]


# минимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC)
set CLK_bs_delay_min 0.1
# минимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП)
set DATA_delay_min 0.1
# максимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 2.5 ns)
#set CLK_bd_delay_max 5.55
set CLK_bd_delay_max 1.7
#(tH ЦАП по справочнику)
set tH 1.0
set tmin [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] 
#set tmin [expr $CLK_bs_delay_min - $tH + $DATA_delay_min] 

image.thumb.png.b9f856b7617ac35cf87d04d839e8abc6.png

image.thumb.png.fe26b444e0e6354cb6b8885ca499372d.png

Но теперь по холду подозрительно огромный запас получился. Я видимо с CLK_bd_delay_min и CLK_bd_delay_max перестарался, хотя вроде как по даташиту.

Изменено пользователем en-valb

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


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

34 minutes ago, en-valb said:

Я правильно понимаю?

Да, TQ же ничего не знает о том, что вы тактируете. Поэтому и тактовая виртуальная, потому что физически ее в ПЛИС нет. Если они идут разными путями, то можно: 

1. Задать фазировку приходящей в ПЛИС тактовой и виртуальной, в долях периода или в нс 

2. Учесть эту разницу в задержках распространения сигналов. 

9 minutes ago, en-valb said:

Но теперь по холду подозрительно огромный запас получился. 

У вас чип способен работать на 250МГц = 4нс, вы его ставите, как я понял, на 100МГц = 10нс. tsu всего 1нс, если вы попадает в первую четверть периода 10нс, естественно у вас запас на холд будет лошадиный. 

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


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

Вот теперь правильный и hold и setup!!!

Значения перепутал, в min и max. В min вбил значение максимальной задержки, а в max значение минимальной задержки.

#**************************************************************
# Set Output Delay
#**************************************************************
# максимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC)
set CLK_bs_delay_max 0.1 
# максимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП)
set DATA_delay_max 0.1
# минимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 0.9 ns)
#set CLK_bd_delay_min 3.45
set CLK_bd_delay_min 1.7
#(tSU ЦАП по справочнику)
set tSU 1.0 
set tmax [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min]
#set tmax [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max]


# минимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC)
set CLK_bs_delay_min 0.1
# минимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП)
set DATA_delay_min 0.1
# максимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 2.5 ns)
#set CLK_bd_delay_max 5.55
set CLK_bd_delay_max 3.3
#(tH ЦАП по справочнику)
set tH 1.0
set tmin [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] 
#set tmin [expr $CLK_bs_delay_min - $tH + $DATA_delay_min] 

 

image.thumb.png.e237db275bd52de19f821eb3d8330406.png 

image.thumb.png.b35e217b8f2340531393269e5c56be99.png

Теперь похоже на правду).

des00, благодарю за помощь от всей души!!!

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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