Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Clock mux
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
djhall
Необходимо получать данные от АЦП причём частота тактирования должна меняться от 100МГц до 1МГц, но на частоте меньше 20МГц АЦП работать отказывается.
Поэтому решил пусть АЦП работает на частоте 20МГц, а я сохраню каждое двадцатое значение. Проблема в том, что логика дальнейшей обработки работает на частоте АЦП и каждое 20 значение воспринимать не захочет, поэтому её нужно тактировать от частоты 1МГц. Ну это сделать не сложно обычным счётчиком. Но при таком решении нужно делать мультеплексирование тактовой частоты.
Подскажите как это сделать оптимальным образом?
iosifk
Цитата(djhall @ Aug 8 2014, 12:24) *
Необходимо получать данные от АЦП причём частота тактирования должна меняться от 100МГц до 1МГц, но на частоте меньше 20МГц АЦП работать отказывается.
Поэтому решил пусть АЦП работает на частоте 20МГц, а я сохраню каждое двадцатое значение. Проблема в том, что логика дальнейшей обработки работает на частоте АЦП и каждое 20 значение воспринимать не захочет, поэтому её нужно тактировать от частоты 1МГц. Ну это сделать не сложно обычным счётчиком. Но при таком решении нужно делать мультеплексирование тактовой частоты.
Подскажите как это сделать оптимальным образом?

Частоту в ядре логики оставить только одну, а все остальное делать, выдавая сигнал "разрешения" для триггеров. И никаких мультиплексоров не делать!!!
А на входе поставить FIFO двухклоковое...
djhall
Дело в том что логика обработки данных сделана так, что данные должны поступать по каждому такту. Всё конечно можно переделать, но боюсь это слишком сложно. Хотелось бы более простое решение.
Maverick
Цитата(djhall @ Aug 8 2014, 12:22) *
Дело в том что логика обработки данных сделана так, что данные должны поступать по каждому такту. Всё конечно можно переделать, но боюсь это слишком сложно. Хотелось бы более простое решение.

Это решение, если Вы хотите менять именно клоковую частоту, но лучше воспользуйтесь советом iosifk
если Вы все таки хотите динамически менять тактовую частоту, то можно через перенастройку DCM, пример ниже

входная частота 32MHz на выходе после DCM 25MHz, 40Mhz, 64MHz или 74MHz (после перенастройки)

Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

library UNISIM;
use UNISIM.VComponents.all;

entity dcm_clockgen_test is
    Port ( clk_in  : in  STD_LOGIC;
           clk_out : out STD_LOGIC;
           sw      : in  STD_LOGIC_VECTOR (3 downto 0));
end dcm_clockgen_test;

architecture Behavioral of dcm_clockgen_test is
   signal prog_data_sr : std_logic_vector(27 downto 0) := (others => '0');
   signal prog_en_sr   : std_logic_vector(27 downto 0) := (others => '0');
  
   signal prog_data    : std_logic;
   signal prog_en      : std_logic;
  
   signal desired_mode: std_logic_vector(3 downto 0)   := "0001";
   signal current_mode: std_logic_vector(3 downto 0)   := "0000";
begin
   prog_data <= prog_data_sr(0);
   prog_en   <= prog_en_sr(0);
  
process(clk_in)
   begin
      if rising_edge(clk_in) then
         -- Update the clock reprogramming signals
         prog_en_sr   <= '0' & prog_en_sr((prog_en_sr'length)-1 downto 1);
         prog_data_sr <= '0' & prog_data_sr((prog_data_sr'length)-1 downto 1);
        
         -- Do we need to switch modes?
         if desired_mode /= current_mode and unsigned(prog_en_sr) = 0 then
            case desired_mode is
            when "0001"  =>
               -- switch to 25MHz
               prog_en_sr   <= "1000" & "11111111" & "11" & "0000" & "11111111" & "11"; -- Two 10-bit xfers + 1-bit 'go'
               prog_data_sr <= "0000" & "00001010" & "11" & "0000" & "00001101" & "01"; -- Code for D 14 M 11
               current_mode <= desired_mode;

            when "0010"  =>
               -- switch to 40MHz
               prog_en_sr   <= "1000" & "11111111" & "11" & "0000" & "11111111" & "11"; -- Two x 10-bit xfers + 1-bit 'go'
               prog_data_sr <= "0000" & "00000100" & "11" & "0000" & "00000011" & "01"; -- Code for D 5 M 4
               current_mode <= desired_mode;

            when "0100"  =>
               -- switch to 64.0MHz
               prog_en_sr   <= "1000" & "11111111" & "11" & "0000" & "11111111" & "11"; -- Two x 10-bit xfers + 1-bit 'go'
               prog_data_sr <= "0000" & "00000001" & "11" & "0000" & "00000000" & "01"; -- Code for D 1 M 2
               current_mode <= desired_mode;

            when "1000"  =>
               -- switch to 74.6MHz
               prog_en_sr   <= "1000" & "11111111" & "11" & "0000" & "11111111" & "11"; -- Two x 10-bit xfers + 1-bit 'go'
               prog_data_sr <= "0000" & "00000110" & "11" & "0000" & "00000010" & "01"; -- Code for D 3 M 7
               current_mode <= desired_mode;

            when others =>
            
            end case;
         end if;
         if sw /= "0000" then
            desired_mode <= sw;
         end if;
      end if;
   end process;

DCM_CLKGEN_inst : DCM_CLKGEN
   generic map (
      CLKFXDV_DIVIDE => 2,    
      CLKFX_DIVIDE   => 14,  
      CLKFX_MD_MAX   => 2.0,  
      CLKFX_MULTIPLY => 11,  
      CLKIN_PERIOD   => 31.25,
      SPREAD_SPECTRUM => "NONE",
      STARTUP_WAIT => FALSE
   )
  
   port map (
      CLKIN     => clk_in,  
      CLKFX     => clk_out,  
      CLKFX180  => open,    
      CLKFXDV   => open,    
      LOCKED    => open,    
      PROGDONE  => open,    
      STATUS    => open,    
      FREEZEDCM => '0',      
      PROGCLK   => clk_in,  
      PROGDATA  => PROG_DATA,
      PROGEN    => PROG_EN,  
      RST       => '0'      
   );

end Behavioral;


PS ПЛИС использовалась Spartan 6
djhall
Благодарю.
Я использую Cyclone 3 от Алтеры.
Я так понял DCM_CLKGEN это специальный компонент для Xilinx. Как быть с альтерой?
Maverick
Цитата(djhall @ Aug 8 2014, 12:39) *
Благодарю.
Я использую Cyclone 3 от Алтеры.
Я так понял DCM_CLKGEN это специальный компонент для Xilinx. Как быть с альтерой?

аналогичным способом... sm.gif
PS посмотрите описание на PLL у альтеры и его перепрограммирование, возможно есть даже готовый пример...
Успехов...
PS PS Вам стоит прислушаться к совету iosifk это более корректное решение для Вас. (мое мнение)
iosifk
Цитата(Maverick @ Aug 8 2014, 13:40) *
PS PS Вам бы стоило прислушаться к совету iosifk это более корректное решение для Вас. (мое мнение)

Я всегда выбираю не самую короткую дорогу, а ту по которой легче идти. И как правило, именно по этой дороге можно прийти к цели быстрее...
Переправить пару файлов в текстовом редакторе легче, чем изобретать многоклоковый проект...
Вот пример такого подхода: У меня в записках инженера есть глава о "мультивибраторе длиной в две стойки".. Почитайте, будет полезно...
DuHast
Цитата(djhall @ Aug 8 2014, 13:22) *
Дело в том что логика обработки данных сделана так, что данные должны поступать по каждому такту. Всё конечно можно переделать, но боюсь это слишком сложно. Хотелось бы более простое решение.


Обычно такая проблема решается за 15 мин., даже с чужим кодом, обрамлением кода внутри каждого процесса в

if Enable ='1' then
..
end if;
djhall
Цитата
Обычно такая проблема решается за 15 мин., даже с чужим кодом, обрамлением кода внутри каждого процесса в


К сожалению не всё так просто. Это огромный проект на несколько десятков тысяч строк. Переделывать всё огромный труд с неясным исходом.
А то может выйти, что 15 минут делаем, неделю отлаживаем, месяц переделываем.

Пока посматриваю в сторону реконфигурации PLL.
Maverick
Цитата(djhall @ Aug 8 2014, 13:52) *
Пока посматриваю в сторону реконфигурации PLL.

нашел кое-что
в конце есть ссылка на примеры использования...
PS не правильный путь Вы выбрали, возможно нужно поменять только "приемник данных" с АЦП - подумайте....
djhall
Спасибо.
Как раз его и читаю.
Bad0512
Цитата(djhall @ Aug 8 2014, 18:09) *
Спасибо.
Как раз его и читаю.

И ещё мои 5 коппек :
В общем случае просто так выкидывать 19 из 20 отсчётов нельзя. Могут возникнуть проблемы.
Рекомендую почитать чего-нить по ЦОС или хотя бы про теорему Котельникова.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.