Worldmaster 0 15 мая Опубликовано 15 мая · Жалоба Здравствуйте. Я понимаю что тема избитая но мне хочется до конца понять. будет ли эффективно работать вот такой код? 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; или этот код избыточен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Freibier 3 15 мая Опубликовано 15 мая · Жалоба Если я правильно понял что Вам нужно, то делал бы так: Клоком 50МГц защелкнул бы signal_in в триггере А. Клоком 160МГц выделил бы нарастающий фронт из сигнала 50МГц. Клоком 160МГц и при разрешающем сигнале схемы выделения фронта переписал бы состояние триггера А в триггер Б. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 15 мая Опубликовано 15 мая · Жалоба А можете код набросать ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Freibier 3 15 мая Опубликовано 15 мая · Жалоба я на верилоге и довольно редко пишу С чем могут возникнуть проблемы? Про выделение фронта можно тут почитать Выделение момента изменения сигналов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться