Имеется Cyclone4, а в нём имеется PLL.
Как известно PLL на рабочий режим выходит не сразу, сразу после запуска она выдаёт нестабильную частоту.
Тактировать схемы такой нестабильной частотой, понятное дело, нельзя - могут сбойнуть. Для этого в PLL предусмотрен специальный выход "locked". Доподлинно неизвестно синхронизирован ли этот выход с тактовой частотой выдаваемой PLL, или нет. Потому встаёт вопрос: как правильно использовать этот выход.
Я предлагаю такую схему:
Нажмите для просмотра прикрепленного файла
На Verilog-е выглядит так:
Код
module M1(
....................................
(*chip_pin = "Y2"*) input inMHz50);
wire Locked33_6, MHz33_6_;
PLL1 PLL1(.c0(MHz33_6_), .locked(Locked33_6), .inclk0(inMHz50));
wire Enable33_6Q;
DFF Enable33_6(.q(Enable33_6Q), .d(Locked33_6), .clk(MHz33_6_), .clrn(1'd1), .prn(1'd1));
wire MHz33_6;
LCELL Cell(.out(MHz33_6), .in(Enable33_6Q & MHz33_6_));
.......ля-ля-ля тополя.......
endmodule
....................................
(*chip_pin = "Y2"*) input inMHz50);
wire Locked33_6, MHz33_6_;
PLL1 PLL1(.c0(MHz33_6_), .locked(Locked33_6), .inclk0(inMHz50));
wire Enable33_6Q;
DFF Enable33_6(.q(Enable33_6Q), .d(Locked33_6), .clk(MHz33_6_), .clrn(1'd1), .prn(1'd1));
wire MHz33_6;
LCELL Cell(.out(MHz33_6), .in(Enable33_6Q & MHz33_6_));
.......ля-ля-ля тополя.......
endmodule
LCELL нужен только для того чтобы на него сослаться в констрейнах, по другому я не сумел.
Сами констрейны выглядят так:
Код
derive_clock_uncertainty
#тактовая частота с генератора 50МГц
create_clock -period 50MHz -name {inMHz50} [get_ports {inMHz50}]
#тактовая частота с PLL
create_generated_clock -name MHz33_6_ -source [get_ports {inMHz50}] [get_pins {PLL1|altpll_component|auto_generated|pll1|clk[0]}] -divide_by 5 -multiply_by 7 -duty_cycle 70.00
create_generated_clock -name MHz33_6 -source [get_pins {PLL1|altpll_component|auto_generated|pll1|clk[0]}] [get_nets {Cell}] -invert
#тактовая частота с генератора 50МГц
create_clock -period 50MHz -name {inMHz50} [get_ports {inMHz50}]
#тактовая частота с PLL
create_generated_clock -name MHz33_6_ -source [get_ports {inMHz50}] [get_pins {PLL1|altpll_component|auto_generated|pll1|clk[0]}] -divide_by 5 -multiply_by 7 -duty_cycle 70.00
create_generated_clock -name MHz33_6 -source [get_pins {PLL1|altpll_component|auto_generated|pll1|clk[0]}] [get_nets {Cell}] -invert
То что в названии частоты присутствует 33,6 МГц - это пережиток прошлого, сейчас там 70.
В последней строчке я и ссылаюсь на LCELL, "-invert" присутствует из-за того что компилятор по каким-то своим причинам инвертирует сигнал после LCELL.
Вопроса, собственно, два: Правильно ли использовать выход "locked" подобным образом? И если правильно, правильно ли заданы констрейны?