|
|
  |
Clock mux |
|
|
|
Aug 8 2014, 09:23
|

я только учусь...
     
Группа: Модераторы
Сообщений: 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.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Aug 8 2014, 09:49
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Maverick @ Aug 8 2014, 13:40)  PS PS Вам бы стоило прислушаться к совету iosifk это более корректное решение для Вас. (мое мнение) Я всегда выбираю не самую короткую дорогу, а ту по которой легче идти. И как правило, именно по этой дороге можно прийти к цели быстрее... Переправить пару файлов в текстовом редакторе легче, чем изобретать многоклоковый проект... Вот пример такого подхода: У меня в записках инженера есть глава о "мультивибраторе длиной в две стойки".. Почитайте, будет полезно...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Aug 8 2014, 10:32
|

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

|
Цитата(djhall @ Aug 8 2014, 13:22)  Дело в том что логика обработки данных сделана так, что данные должны поступать по каждому такту. Всё конечно можно переделать, но боюсь это слишком сложно. Хотелось бы более простое решение. Обычно такая проблема решается за 15 мин., даже с чужим кодом, обрамлением кода внутри каждого процесса в if Enable ='1' then .. end if;
|
|
|
|
|
Aug 8 2014, 10:52
|
Частый гость
 
Группа: Свой
Сообщений: 168
Регистрация: 29-04-06
Пользователь №: 16 608

|
Цитата Обычно такая проблема решается за 15 мин., даже с чужим кодом, обрамлением кода внутри каждого процесса в К сожалению не всё так просто. Это огромный проект на несколько десятков тысяч строк. Переделывать всё огромный труд с неясным исходом. А то может выйти, что 15 минут делаем, неделю отлаживаем, месяц переделываем. Пока посматриваю в сторону реконфигурации PLL.
|
|
|
|
|
Aug 11 2014, 07:46
|
Знающий
   
Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650

|
Цитата(djhall @ Aug 8 2014, 18:09)  Спасибо. Как раз его и читаю. И ещё мои 5 коппек : В общем случае просто так выкидывать 19 из 20 отсчётов нельзя. Могут возникнуть проблемы. Рекомендую почитать чего-нить по ЦОС или хотя бы про теорему Котельникова.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|