Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как ГРАМОТНО обработать входной тактовый сигнал?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Sobol'
Приветствую заглянувших.

Ситуация следующая. Автомат, который я хочу реализовать на ПЛИС должен работать на частоте порядка 1 MHz (плюс-минус 200 KHz роли не играют). Есть тактовый вход с частотой 50 MHz. На этапе моделирования пользовался наспех написанным делителем:

reg [5:0] clk_cnt = 0;
always @(posedge clk_50MHz) clk_cnt <= clk_cnt +1;
wire clk_1MHz = clk_cnt[5];

Выходная частота - порядка 1250 KHz - меня устраивает.
Теперь, когда нужно залить мою модель в ПЛИС задумался над тем, что наверно нужно использовать буферы.. Правильно ли я понимаю, что на сигнал clk_50MHz нужно повесить IBUFG а на сигнал clk_1MHz - BUFG? или что-то еще нужно менять? или вообще все прах и тлен и нужен другой подход?

ЗЫ среда ISE 14.7, плата Spartan 3E XC3S1600E
Alexey_Rostov
Цитата(Sobol' @ Feb 17 2015, 14:44) *
Приветствую заглянувших.

Ситуация следующая. Автомат, который я хочу реализовать на ПЛИС должен работать на частоте порядка 1 MHz (плюс-минус 200 KHz роли не играют). Есть тактовый вход с частотой 50 MHz. На этапе моделирования пользовался наспех написанным делителем:

reg [5:0] clk_cnt = 0;
always @(posedge clk_50MHz) clk_cnt <= clk_cnt +1;
wire clk_1MHz = clk_cnt[5];

Выходная частота - порядка 1250 KHz - меня устраивает.
Теперь, когда нужно залить мою модель в ПЛИС задумался над тем, что наверно нужно использовать буферы.. Правильно ли я понимаю, что на сигнал clk_50MHz нужно повесить IBUFG а на сигнал clk_1MHz - BUFG? или что-то еще нужно менять? или вообще все прах и тлен и нужен другой подход?

ЗЫ среда ISE 14.7, плата Spartan 3E XC3S1600E


Я использую вход CE триггера. Например получить частоту 1 MHz из 50 MHz след образом. Отрывок кода для автомата работающего на 1 МГц
Код
process(clk)
begin

    if (rising_edge(clk)) then     -- Rising clock edge
      if Rst = '1' then                
        state        <= WaitPushBut;    
          INC <= '0';
          leds_reg <= x"00";
          
      elsif(CEn = '1')then -----------------------------
        
            
        
        
          case state is
          
              when Idle =>
                    if (timer = 1) then
.................................................

clk здесь 50 МГц и есть сигнал CEn, по которому происходит работа автомата. Сигнал срабатывает с частотой 1 МГц. Получить его просто. Берете ядро для счетчика. Там есть опция порог и сигнал срабатывания порога. Этот сигнал и завожу на CEn. Например счетчик от 0 до 49. Порог 49. тогда частота срабатывания порога при частоте работы счетчика в 50 МГц / 50 = 1 МГц. То что вам необходимо.

Sobol'
farbius, а почему бы не поделить сам клок? В Вашем примере, для сигнала clk нужно использовать буфер или можно напрямую?
serjj
1 МГц клок можно конечно как угодно получать, но вообще лучше внутренние клоки через DCM получать. Почитайте на него доку, там расписано как клок с входного пина заходит, как получить выходной клок
Alexey_Rostov
Цитата(Sobol' @ Feb 17 2015, 16:40) *
а почему бы не поделить сам клок?


Может объясню неточно, знающие меня поправят. Тактируемым элементом CLB ячейки ПЛИС является D триггер. Именно он используется синтезатором при интерпретации любых тактируемых алгоритмов. Триггер имеет вход CE разрешающий клок. Когда описываете алгоритм способом, который я привел, то по идее синтезатор распознает именно D триггер.

Делить сам клок чревато приобретением джиттеров и как следствие ошибок в работе Вашей схемы. Вообще для клоков лучше использовать ядра типа DCM, PLL.

Цитата
В Вашем примере, для сигнала clk нужно использовать буфер или можно напрямую?


Напрямую подавать на клок счетчика.
andrew_b
Цитата(Sobol' @ Feb 17 2015, 14:44) *
Теперь, когда нужно залить мою модель в ПЛИС задумался над тем, что наверно нужно использовать буферы..
Специально ничего делать не надо. Синтезатор сам распознаёт клок и вставляет тактовый буфер. Обычно что-то надо делать, чтобы синтезатор буфер не вставлял.

Как уже сказали, нужно использовать не делённый клок, а сформировать сигнал CE, котоый будет идти с нужной частотой, и прописать в констрейнах мультицикл на него, чтобы PAR не считал, что нужно успевать за период клока.
Sobol'
Уважаемые, ткните пожалуйста меня носом - где почитать про DCM на русском?
andrew_b
Цитата(Sobol' @ Feb 18 2015, 11:05) *
где почитать про DCM на русском?
Про русский сразу забудьте. Читайте application note в оригинале.
http://www.xilinx.com/support/documentatio...tes/xapp462.pdf
Alexey_Rostov
Цитата(Sobol' @ Feb 18 2015, 11:05) *
Уважаемые, ткните пожалуйста меня носом - где почитать про DCM на русском?


Если хотите использовать DCM ядро, то coregenerator в помощь. Как настроить понятно интуитивно. Но для spartan 3e данного ядра нет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.