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

Работа ПЛИС на точной частоте

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

 

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

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


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

..а в чём проблема делить на 7 ? PLL будет пропускать только 7-й импульс для сравнения.

Ваша частота с кучей цифр после запятой - лишь ваша фантазия, все цифры условны.

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


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

Обычным счётчиком можно. PLL лучше приберечь для умножения частоты.

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

 

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


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

Т.е. к DCM и PLL лучше не прибегать в данном случае и делать все на логике.

 

Ваша частота с кучей цифр после запятой - лишь ваша фантазия, все цифры условны.

 

Вот требуется, чтобы ПЛИС формировала управляющие сигналы на этой точной частоте со всеми циферками после запятой...

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


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

1. В режиме DCM - входная частота (у Spartan6) от 5 МГц. Так что заведется. А вот как PLL - фиг.

2. Можно использовать счетчик + DDR триггер на выходе. Тогда Duty Cycle выходного клока будет в абсолютном значении такой же как и у входного. Соответственно в процентах - в семь раз меньше.

 

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


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

2. Можно использовать счетчик + DDR триггер на выходе. Тогда Duty Cycle выходного клока будет в абсолютном значении такой же как и у входного. Соответственно в процентах - в семь раз меньше.

можно чуть подробнее? что на какие входы ДДР идет?

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


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

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

 

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

 

Я делал на основе обычного двоичного счетчика.......а вот после счетчика обязательно ставил глобальный буфер, тем самым цепь становилась глобальной, т.е. тактовой. Далее в проекте эту деленную частоту использовал только в тактовых цепях. Все было ок. ПЛИС SPARTAN6. Опробовано в разных проетах.

P.S. Можно и на DCM.... указываем в настройках к-т деления и тоже пользуемся деленной глобальной частотой. Тут вообще проблем никаких нет.

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


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

можно чуть подробнее? что на какие входы ДДР идет?

 

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

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.

Результат:

clk_div7.jpg

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


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

сдвиговый регистр не совсем счетчик, но концепт понятен, спасибо ;)

 

я делал на счетчике, входы ДДР фиксировал в 0 и 1, а счетчиком формировал клоки, но ваш вариант по ресурсам поизящнее выглядит.

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


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

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

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


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

а ничего что вы на 8 поделили? Давайте теперь пруф деления на 7 с 50% скважностью:)

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

 

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

clk_div7_v3.jpg

40 ns - период исходного клока,

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

140 ns - Clock_low для полученного.

 

Итого - DutyCycle 50|50.

Отношение периодов - 280/40 = 7.

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


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

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

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

 

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

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

 

ну строго говоря конечно там будет не совсем 50%, потому что мультиплексор ДДР внесет некоторую задержку на перекидывание сигнала, но это уже совсем крохи...

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


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

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

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


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

На отличненько!!

 

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

 

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

 

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

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


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

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

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

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

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

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

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

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

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

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