На вход ПЛИС поступает некая тактовая по ЛВДС:
Код
PORT MAP (
i => comp_in_p,
ibar => comp_in_n,
o => cry_lane_clk
);
i => comp_in_p,
ibar => comp_in_n,
o => cry_lane_clk
);
Эта тактовая поступает в модуль переопределения рабочих частот:
Код
PORT MAP (
-- clock area
lane_clk_in => cry_lane_clk,
lane_clk_out => cry_lane_clk_selected,
gen_clk => quartz_clk,
lane_div_out => lane_div,
...
);
-- clock area
lane_clk_in => cry_lane_clk,
lane_clk_out => cry_lane_clk_selected,
gen_clk => quartz_clk,
lane_div_out => lane_div,
...
);
Далее, что происходит в этом модуле:
1.
Код
lane_clk_out <= lane_clk_inner;
lane_div_out <= lane_div_clk_p;
lane_div_out <= lane_div_clk_p;
2.
Код
lane_clk_inner <= pll_160_lane_clk WHEN command_osc_oe = '1' ELSE
lane_clk_in WHEN pll2_status_locked = '1' ELSE
pll_160_lane_clk WHEN pll_160_status_locked = '1' ELSE
'0';
lane_clk_in WHEN pll2_status_locked = '1' ELSE
pll_160_lane_clk WHEN pll_160_status_locked = '1' ELSE
'0';
т.е. исходя из условий, тактовая lane_clk_inner может быть pll_160_lane_clk или lane_clk_in или 0.
3. этот модуль содержит 2 ФАПЧа:
Код
gen_pll_lane : gen_pll2
PORT MAP (
inclk0 => lane_clk_in, -- 160
c0 => pll2_sdi_clk, -- 300
c1 => pll2_serial_clkh, -- 20
c2 => pll2_core_clk, -- 100
c3 => pll2_serial_clkl, -- 3
locked => pll2_status_locked
);
gen_pll_160_quartz : gen_pll_160
PORT map
(
inclk0 => gen_clk, -- 80
c0 => pll_160_lane_clk, -- 160
locked => pll_160_status_locked
);
PORT MAP (
inclk0 => lane_clk_in, -- 160
c0 => pll2_sdi_clk, -- 300
c1 => pll2_serial_clkh, -- 20
c2 => pll2_core_clk, -- 100
c3 => pll2_serial_clkl, -- 3
locked => pll2_status_locked
);
gen_pll_160_quartz : gen_pll_160
PORT map
(
inclk0 => gen_clk, -- 80
c0 => pll_160_lane_clk, -- 160
locked => pll_160_status_locked
);
исходя из состояний этих ФАПЧей и происходит выбор тактовой, которая коммутируется на сигнал lane_clk_inner.
4. Также в этом модуле есть деление этой тактовой lane_clk_inner на 10, этот сигнал называется lane_div_clk_p.
В SDC-файле описал следующее:
1. create_clock -period 6.25 -name comp_in_p [ get_ports comp_in_p ]
т.е. описал входную тактовую comp_in_p (160 МГц)
2. create_clock -period 12.50 -name quartz_clk [ get_ports quartz_clk ]
т.е. описал входную тактовую quartz_clk (80 МГц)
3. create_clock -name {altera_reserved_tck} -period 33.333 -waveform { 0.000 16.666 } [get_ports {altera_reserved_tck}]
derive_pll_clocks
derive_clock_uncertainty
set_clock_groups -asynchronous \
-group {altera_reserved_tck} \
-group {comp_in_p} \
-group {quartz_clk}
т.е. указал асинхронные группы без их взаимного анализа.
altera_reserved_tck - из-за использования СигналТапа.
Проект компилится без замечаний ТаймКвеста, т.е. типа все норм.
И вот здесь начинается...
Вроде проект заработал, можно тестировать...
НО!... немного изменишь проект, добавишь отладочные сигналы или изменишь наполнение СигналТапа (уберешь пару сигналов из захвата)...
и все, проект перестает полноценно работать.
При подробном анализе ТаймКвеста увидел не описанную тактовую lane_div_clk_p, т.е.
которая lane_clk_inner/10.
В-общем по разному пытался её описать, но ничего не получается, постоянно появляется варнинг:
"Node: gen_logic:gen_logic_unit|lane_div_clk_p was determined to be a clock but was found without an associated clock assignment."
Думаю, что сначала надо описать тактовую lane_clk_inner, но не знаю как, т.к. она является мультиплексированной,
после этого уже описывать lane_div_clk_p.
Большая просьба, подскажите нормальную литературу по времнному анализу ТаймКвест для ОЧЕНЬ начинающих,
где можно постичь тонкости описания таких сложных ситуаций.
Можно даже попытаться объяснить прямо здесь.
Заранее признателен за помощь.