Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа ПЛИС на точной частоте
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
ZZZRF413
Всем доброго дня!

Подскажите пожалуйста по следующему вопросу: Есть тактовая частота например 5,137958413076 МГц поступающая на ПЛИС для конкретики пускай будет ПЛИС фирмы Xilinx серии Spartan6. Сможет ли DCM либо PLL поделить её точно на 7 т.е. до 0,73399405901085714285714285714286 МГц. Дрожание фазы в данном случае не важно, главное чтобы частота была точной. Кто-нибудь сталкивался с похожим вопросом? Каково Ваше мнение?
Lmx2315
..а в чём проблема делить на 7 ? PLL будет пропускать только 7-й импульс для сравнения.
Ваша частота с кучей цифр после запятой - лишь ваша фантазия, все цифры условны.
bugdesigner
Обычным счётчиком можно. PLL лучше приберечь для умножения частоты.
Bad0512
Цитата(bugdesigner @ Jul 3 2015, 09:16) *
Обычным счётчиком можно. PLL лучше приберечь для умножения частоты.

Если надо duty cycle 50/50 то в данном случае счётчик не прокатит. Для PLL/DCM частота маловата - может и не завестись от 5МГц - надо смотреть даташиты.
ZZZRF413
Т.е. к DCM и PLL лучше не прибегать в данном случае и делать все на логике.

Цитата(Lmx2315 @ Jul 3 2015, 00:06) *
Ваша частота с кучей цифр после запятой - лишь ваша фантазия, все цифры условны.


Вот требуется, чтобы ПЛИС формировала управляющие сигналы на этой точной частоте со всеми циферками после запятой...
AJIEKCEu
1. В режиме DCM - входная частота (у Spartan6) от 5 МГц. Так что заведется. А вот как PLL - фиг.
2. Можно использовать счетчик + DDR триггер на выходе. Тогда Duty Cycle выходного клока будет в абсолютном значении такой же как и у входного. Соответственно в процентах - в семь раз меньше.
Golikov A.
Цитата
2. Можно использовать счетчик + DDR триггер на выходе. Тогда Duty Cycle выходного клока будет в абсолютном значении такой же как и у входного. Соответственно в процентах - в семь раз меньше.

можно чуть подробнее? что на какие входы ДДР идет?
Dmitriyspb
Цитата(ZZZRF413 @ Jul 2 2015, 22:47) *
Всем доброго дня!

Подскажите пожалуйста по следующему вопросу: Есть тактовая частота например 5,137958413076 МГц поступающая на ПЛИС для конкретики пускай будет ПЛИС фирмы Xilinx серии Spartan6. Сможет ли DCM либо PLL поделить её точно на 7 т.е. до 0,73399405901085714285714285714286 МГц. Дрожание фазы в данном случае не важно, главное чтобы частота была точной. Кто-нибудь сталкивался с похожим вопросом? Каково Ваше мнение?


Я делал на основе обычного двоичного счетчика.......а вот после счетчика обязательно ставил глобальный буфер, тем самым цепь становилась глобальной, т.е. тактовой. Далее в проекте эту деленную частоту использовал только в тактовых цепях. Все было ок. ПЛИС SPARTAN6. Опробовано в разных проетах.
P.S. Можно и на DCM.... указываем в настройках к-т деления и тоже пользуемся деленной глобальной частотой. Тут вообще проблем никаких нет.
AJIEKCEu
Цитата(Golikov A. @ Jul 3 2015, 08:26) *
можно чуть подробнее? что на какие входы ДДР идет?


Например вот:
CODE

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

library UNISIM;
use UNISIM.VComponents.all;

entity clk_div7 is
Port ( clkin : in STD_LOGIC;
clkout : out STD_LOGIC);
end clk_div7;

architecture Behavioral of clk_div7 is
signal shift_reg : std_logic_vector(13 downto 0) := "00000001111111";
signal nclkin : std_logic := '1';
begin

nclkin <= not clkin;

process(clkin)
begin
if rising_edge(clkin) then
shift_reg <= shift_reg(11 downto 0) & shift_reg(13 downto 12);
end if;
end process;

ODDR2_inst : ODDR2
generic map(
DDR_ALIGNMENT => "C0", -- Sets output alignment to "NONE", "C0", "C1"
INIT => '0', -- Sets initial state of the Q output to '0' or '1'
SRTYPE => "ASYNC") -- Specifies "SYNC" or "ASYNC" set/reset
port map (
Q => clkout, -- 1-bit output data
C0 => clkin, -- 1-bit clock input
C1 => nclkin, -- 1-bit clock input
CE => '1', -- 1-bit clock enable input
D0 => shift_reg(13), -- 1-bit data input (associated with C0)
D1 => shift_reg(12), -- 1-bit data input (associated with C1)
R => '0', -- 1-bit reset input
S => '0' -- 1-bit set input
);


end Behavioral;


Можно наверное сделать нагляднее, это в качестве proof-of-concept.
Результат:
Golikov A.
сдвиговый регистр не совсем счетчик, но концепт понятен, спасибо wink.gif

я делал на счетчике, входы ДДР фиксировал в 0 и 1, а счетчиком формировал клоки, но ваш вариант по ресурсам поизящнее выглядит.
bugdesigner
Поделить на 7 со скважностью 50:50 никак не выйдет. Можно будет только 3:4, либо сперва умножить частоту на четное значение.
AJIEKCEu
Цитата(Golikov A. @ Jul 3 2015, 11:24) *
а ничего что вы на 8 поделили? Давайте теперь пруф деления на 7 с 50% скважностьюsm.gif

Чё-й то на 8? Я вот считаю с картинки клоки - у меня 7 получается. На 7 периодов исходного клока - один период полученного.

Вот вам картинка с временами, если лень считать:

40 ns - период исходного клока,
40+100.1 ns - Clock_High для полученного (0,1 нс - из-за DDR Триггера и это задержка, а не изменение периода).
140 ns - Clock_low для полученного.

Итого - DutyCycle 50|50.
Отношение периодов - 280/40 = 7.
Golikov A.
Цитата
Чё-й то на 8? Я вот считаю с картинки клоки - у меня 7 получается. На 7 периодов исходного клока - один период полученного.

не это я с перепугу чушь написалsm.gif, просто долго исправлял сообщениеsm.gif

Цитата
Поделить на 7 со скважностью 50:50 никак не выйдет. Можно будет только 3:4, либо сперва умножить частоту на четное значение.

ну оно как бы уже получилосьsm.gif ДДР дает возможность использовать оба фронта, 3:4 это при использовании только одного фронта клока...

ну строго говоря конечно там будет не совсем 50%, потому что мультиплексор ДДР внесет некоторую задержку на перекидывание сигнала, но это уже совсем крохи...
EvgenyNik
Код
module div7
(
input    clkin,
output     reg clkout
);
reg                reg1;
reg        [2:0]    reg2;

wire clk_w;
assign clk_w = reg1 ^ clkin;

always @ (posedge clk_w)
    begin
    reg1 <= clkin;
    if (reg2 == 6)
        begin
        reg2 <= 0;
        clkout <= ~clkout;
        end
    else    reg2 <= reg2 + 1;
    end
endmodule
Fat Robot
На отличненько!!

http://electronix.ru/forum/index.php?s=&am...t&p=1340599

Там вся ветка наполнена пушкинской тоской. Почитайте.

Цитата(EvgenyNik @ Jul 3 2015, 10:51) *
Код
module div7
(
input    clkin,
output     reg clkout
);
reg                reg1;
reg        [2:0]    reg2;

wire clk_w;
assign clk_w = reg1 ^ clkin;

always @ (posedge clk_w)
    begin
    reg1 <= clkin;
    if (reg2 == 6)
        begin
        reg2 <= 0;
        clkout <= ~clkout;
        end
    else    reg2 <= reg2 + 1;
    end
endmodule
Golikov A.
Цитата


ну клок то поделил на нечетное число с 50% скважностью и без ДДР sm.gif ДДР наружу только, а такой даже внутри применить "можно" (не могу подобрать слово, которое как бы обозначает возможность, но с не очень хорошим результатом)....

Интересно при таком решении в реальном железе, может быть так что некоторые биты регистра счетчика не будут получать клока, ну или его длительности будет не хватать?
EvgenyNik
"Негодование" понятно, но я отталкивался от
Цитата(ZZZRF413 @ Jul 2 2015, 22:47) *
Дрожание фазы в данном случае не важно, главное чтобы частота была точной.

За жирные плисины не ручаюсь, а в маленьких CPLDшках нормально работает.
Хотелось бы ещё у ТС уточнить вот какой момент: если дрожание фазы не важно, то на каком интервале времени предъявляется требование к точности частоты? Т.е. можно ли просто играть скважностью так, чтобы в итоге за 2, 4, 8 и т.д. интервалов, всё-таки, набиралось нужное количество тактов?
Алга
Можно делить на 3, 5, 7 и тд с duty cycle 50%-50%.
Есть статьи по этому вопросу

http://www.mikrocontroller.net/attachment/...s_Made_Easy.pdf
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.