Вот SystemVerilog проект. Ниже - констрейны для него. Работаю в Quartus 13.1, ПЛИС EP3C5E144I7.
Код
module ClockDivider (
(* chip_pin = "84" *) input ResetN,
(* chip_pin = "89", altera_attribute = "-name io_standard lvds" *) input ClkIn,
(* chip_pin = "28" *) output ClkOut,
(* chip_pin = "30" *) input ClkSel,
(* chip_pin = "32" *) input DataIn,
(* chip_pin = "33" *) output DataOut
);
bit ClkDiv;
always_ff @(posedge ClkIn, negedge ResetN)
if (!ResetN) ClkDiv <= 0;
else ClkDiv <= !ClkDiv;
always_comb
if (!ClkSel) ClkOut = ClkIn;
else ClkOut = ClkDiv;
always_ff @(posedge ClkOut, negedge ResetN)
if (!ResetN) DataOut <= 0;
else DataOut <= DataIn;
endmodule : ClockDivider
(* chip_pin = "84" *) input ResetN,
(* chip_pin = "89", altera_attribute = "-name io_standard lvds" *) input ClkIn,
(* chip_pin = "28" *) output ClkOut,
(* chip_pin = "30" *) input ClkSel,
(* chip_pin = "32" *) input DataIn,
(* chip_pin = "33" *) output DataOut
);
bit ClkDiv;
always_ff @(posedge ClkIn, negedge ResetN)
if (!ResetN) ClkDiv <= 0;
else ClkDiv <= !ClkDiv;
always_comb
if (!ClkSel) ClkOut = ClkIn;
else ClkOut = ClkDiv;
always_ff @(posedge ClkOut, negedge ResetN)
if (!ResetN) DataOut <= 0;
else DataOut <= DataIn;
endmodule : ClockDivider
Код
set_time_format -unit ns -decimal_places 3
create_clock -name clk_in -period "100 MHz" -waveform {0 5.0} ClkIn
create_clock -name clk_virt -period "100 MHz"
create_generated_clock -name clk_div ClkDiv -divide_by 2 -source ClkIn
# derive_clocks
derive_clock_uncertainty
set_input_delay -clock clk_virt -min 0.0 ClkSel
set_input_delay -clock clk_virt -max 1.0 ClkSel
set_input_delay -clock clk_virt -min 0.0 ResetN
set_input_delay -clock clk_virt -max 1.0 ResetN
set_input_delay -clock clk_virt -min 0.0 DataIn
set_input_delay -clock clk_virt -max 1.0 DataIn
set_output_delay -clock clk_virt -min -2.0 ClkOut
set_output_delay -clock clk_virt -max -1.0 ClkOut
set_output_delay -clock clk_virt -min -2.0 DataOut
set_output_delay -clock clk_virt -max -1.0 DataOut
create_clock -name clk_in -period "100 MHz" -waveform {0 5.0} ClkIn
create_clock -name clk_virt -period "100 MHz"
create_generated_clock -name clk_div ClkDiv -divide_by 2 -source ClkIn
# derive_clocks
derive_clock_uncertainty
set_input_delay -clock clk_virt -min 0.0 ClkSel
set_input_delay -clock clk_virt -max 1.0 ClkSel
set_input_delay -clock clk_virt -min 0.0 ResetN
set_input_delay -clock clk_virt -max 1.0 ResetN
set_input_delay -clock clk_virt -min 0.0 DataIn
set_input_delay -clock clk_virt -max 1.0 DataIn
set_output_delay -clock clk_virt -min -2.0 ClkOut
set_output_delay -clock clk_virt -max -1.0 ClkOut
set_output_delay -clock clk_virt -min -2.0 DataOut
set_output_delay -clock clk_virt -max -1.0 DataOut
Вопросы.
Почему работает описание триггера - делителя тактовой частоты, просто делить частоту на 2, без задержек в самом триггере? Как учитываются задержки в триггере?
Почему для выходных сигналов пришлось сделать отрицательную задержку, иначе ограничения не выполнялись?
Когда смотрел в TimeQuest временнЫе пути, Launch Clock запускался по срезу. Прикладываю картину ниже.
Правильные ли вообще эти констрейны?
Любые советы почитаю с интересом. (К сожалению, ответить смогу только завтра, ибо предстоит культурное мероприятие).
Вот картина-отчет. Как ее интерпретировать?
Нужно ли описывать сигнал после мультиплексора как тактовый? Пишут, вроде, нужно. А что же TimeQuest не ругается?