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

 
 
 
Reply to this topicStart new topic
> 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
iosifk
сообщение Aug 8 2014, 08:30
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(djhall @ Aug 8 2014, 12:24) *
Необходимо получать данные от АЦП причём частота тактирования должна меняться от 100МГц до 1МГц, но на частоте меньше 20МГц АЦП работать отказывается.
Поэтому решил пусть АЦП работает на частоте 20МГц, а я сохраню каждое двадцатое значение. Проблема в том, что логика дальнейшей обработки работает на частоте АЦП и каждое 20 значение воспринимать не захочет, поэтому её нужно тактировать от частоты 1МГц. Ну это сделать не сложно обычным счётчиком. Но при таком решении нужно делать мультеплексирование тактовой частоты.
Подскажите как это сделать оптимальным образом?

Частоту в ядре логики оставить только одну, а все остальное делать, выдавая сигнал "разрешения" для триггеров. И никаких мультиплексоров не делать!!!
А на входе поставить FIFO двухклоковое...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
djhall
сообщение Aug 8 2014, 09:22
Сообщение #3


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

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



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


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

Группа: Модераторы
Сообщений: 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
djhall
сообщение Aug 8 2014, 09:39
Сообщение #5


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

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



Благодарю.
Я использую Cyclone 3 от Алтеры.
Я так понял DCM_CLKGEN это специальный компонент для Xilinx. Как быть с альтерой?
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 8 2014, 09:40
Сообщение #6


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

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



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

аналогичным способом... sm.gif
PS посмотрите описание на PLL у альтеры и его перепрограммирование, возможно есть даже готовый пример...
Успехов...
PS PS Вам стоит прислушаться к совету iosifk это более корректное решение для Вас. (мое мнение)


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

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


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Maverick @ Aug 8 2014, 13:40) *
PS PS Вам бы стоило прислушаться к совету iosifk это более корректное решение для Вас. (мое мнение)

Я всегда выбираю не самую короткую дорогу, а ту по которой легче идти. И как правило, именно по этой дороге можно прийти к цели быстрее...
Переправить пару файлов в текстовом редакторе легче, чем изобретать многоклоковый проект...
Вот пример такого подхода: У меня в записках инженера есть глава о "мультивибраторе длиной в две стойки".. Почитайте, будет полезно...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
DuHast
сообщение Aug 8 2014, 10:32
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 314
Регистрация: 13-07-06
Из: Москва
Пользователь №: 18 797



Цитата(djhall @ Aug 8 2014, 13:22) *
Дело в том что логика обработки данных сделана так, что данные должны поступать по каждому такту. Всё конечно можно переделать, но боюсь это слишком сложно. Хотелось бы более простое решение.


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

if Enable ='1' then
..
end if;
Go to the top of the page
 
+Quote Post
djhall
сообщение Aug 8 2014, 10:52
Сообщение #9


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

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



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


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

Пока посматриваю в сторону реконфигурации PLL.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 8 2014, 10:56
Сообщение #10


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

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



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

нашел кое-что
в конце есть ссылка на примеры использования...
PS не правильный путь Вы выбрали, возможно нужно поменять только "приемник данных" с АЦП - подумайте....


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

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


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

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



Спасибо.
Как раз его и читаю.
Go to the top of the page
 
+Quote Post
Bad0512
сообщение Aug 11 2014, 07:46
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Цитата(djhall @ Aug 8 2014, 18:09) *
Спасибо.
Как раз его и читаю.

И ещё мои 5 коппек :
В общем случае просто так выкидывать 19 из 20 отсчётов нельзя. Могут возникнуть проблемы.
Рекомендую почитать чего-нить по ЦОС или хотя бы про теорему Котельникова.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 18:51
Рейтинг@Mail.ru


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