Перейти к содержанию
    

Блок синхронизации CDC

Здравствуйте. Я понимаю что тема избитая но мне хочется до конца понять.

будет ли эффективно работать вот такой код?

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity clock_domain_crossing is
    Port (
        clk_50MHz  : in  std_logic;
        clk_160MHz : in  std_logic;
        signal_in  : in  std_logic;
        signal_out : out std_logic
    );
end clock_domain_crossing;

architecture Behavioral of clock_domain_crossing is
    signal signal_in_50MHz : std_logic;
    signal sync_160MHz_1   : std_logic;
    signal sync_160MHz_2   : std_logic;
begin
    -- Capture signal in 50MHz domain
    process(clk_50MHz)
    begin
        if rising_edge(clk_50MHz) then
            signal_in_50MHz <= signal_in;
        end if;
    end process;

    -- Synchronize signal to 160MHz domain
    process(clk_160MHz)
    begin
        if rising_edge(clk_160MHz) then
            sync_160MHz_1 <= signal_in_50MHz;
            sync_160MHz_2 <= sync_160MHz_1;
        end if;
    end process;

    signal_out <= sync_160MHz_2;

end Behavioral;

можно ли на основе него писать свои доработки??

или вот такой код:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity clock_domain_crossing_pulse is
    Port (
        clk_50MHz  : in  std_logic;
        clk_160MHz : in  std_logic;
        signal_in  : in  std_logic;
        signal_out : out std_logic
    );
end clock_domain_crossing_pulse;

architecture Behavioral of clock_domain_crossing_pulse is
    signal signal_in_50MHz    : std_logic;
    signal sync_160MHz_1      : std_logic := '0';
    signal sync_160MHz_2      : std_logic := '0';
    signal pulse_detected_50MHz : std_logic := '0';
    signal pulse_sync_160MHz_1 : std_logic := '0';
    signal pulse_sync_160MHz_2 : std_logic := '0';
begin
    -- Capture signal in 50MHz domain
    process(clk_50MHz)
    begin
        if rising_edge(clk_50MHz) then
            signal_in_50MHz <= signal_in;
            if signal_in = '1' then
                pulse_detected_50MHz <= '1';
            else
                pulse_detected_50MHz <= '0';
            end if;
        end if;
    end process;

    -- Synchronize pulse detection to 160MHz domain
    process(clk_160MHz)
    begin
        if rising_edge(clk_160MHz) then
            pulse_sync_160MHz_1 <= pulse_detected_50MHz;
            pulse_sync_160MHz_2 <= pulse_sync_160MHz_1;
        end if;
    end process;

    -- Generate synchronized pulse in 160MHz domain
    signal_out <= pulse_sync_160MHz_2 and not pulse_sync_160MHz_1;

end Behavioral;

или этот код избыточен?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если я правильно понял что Вам нужно, то делал бы так:

Клоком 50МГц защелкнул бы signal_in в триггере А.

Клоком 160МГц выделил бы нарастающий фронт из сигнала 50МГц.

Клоком 160МГц и при разрешающем сигнале схемы выделения фронта переписал бы состояние триггера А в триггер Б. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я на верилоге и довольно редко пишу

С чем могут возникнуть проблемы?

Про выделение фронта можно тут почитать Выделение момента изменения сигналов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...