реклама на сайте
подробности

 
 
> Clock mux
djhall
сообщение Aug 8 2014, 08:24
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 29-04-06
Пользователь №: 16 608



Необходимо получать данные от АЦП причём частота тактирования должна меняться от 100МГц до 1МГц, но на частоте меньше 20МГц АЦП работать отказывается.
Поэтому решил пусть АЦП работает на частоте 20МГц, а я сохраню каждое двадцатое значение. Проблема в том, что логика дальнейшей обработки работает на частоте АЦП и каждое 20 значение воспринимать не захочет, поэтому её нужно тактировать от частоты 1МГц. Ну это сделать не сложно обычным счётчиком. Но при таком решении нужно делать мультеплексирование тактовой частоты.
Подскажите как это сделать оптимальным образом?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
djhall
сообщение Aug 8 2014, 09:22
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 29-04-06
Пользователь №: 16 608



Дело в том что логика обработки данных сделана так, что данные должны поступать по каждому такту. Всё конечно можно переделать, но боюсь это слишком сложно. Хотелось бы более простое решение.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 8 2014, 09:23
Сообщение #3


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(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


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 13:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016