Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Синхронная и асинхронная логика
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
AlphaMil
Насущный вопрос: как несинхронный сигнал, приходящий на вывод ПЛИС сделать синхронным с заданным клоком, но длиной в один период? Исходный сигнал существенно длиннее клокового.
des00
Цитата(AlphaMil @ Aug 2 2010, 18:56) *
Насущный вопрос: как несинхронный сигнал, приходящий на вывод ПЛИС сделать синхронным с заданным клоком, но длиной в один период? Исходный сигнал существенно длиннее клокового.

любая книга по цифровой схемотехнике начиная с 1980-х годов, например Тицце и Шенк %)
igorenja
Цитата(AlphaMil @ Aug 3 2010, 06:56) *
Насущный вопрос....


нуно поюзать D-триггер
iosifk
Цитата(AlphaMil @ Aug 3 2010, 03:56) *
Насущный вопрос: как несинхронный сигнал, приходящий на вывод ПЛИС сделать синхронным с заданным клоком, но длиной в один период? Исходный сигнал существенно длиннее клокового.

Эта тема называется CDC....
Есть примерно 4 способа обработки входного сигнала.
AlphaMil
Так может опишете эти способы. Я только начинаю работать и любая консультация (Ваш опыт) очень полезна.
iosifk
Цитата(AlphaMil @ Aug 4 2010, 08:52) *
Так может опишете эти способы.

Вообще то я это уже сделал. Называется "Краткий Курс HDL". Напечатан в журналах КиТ за 2008-2009. Частично выложен...
Maverick
Цитата(AlphaMil @ Aug 3 2010, 02:56) *
Насущный вопрос: как несинхронный сигнал, приходящий на вывод ПЛИС сделать синхронным с заданным клоком, но длиной в один период? Исходный сигнал существенно длиннее клокового.

Схемотехника - читаем литературу, которую Вам рекомендовали ранее.
ответ можно посмотреть здесь (VHDL)
Кстати ниже приводится описание реализации (хотя она очень простая)

Цитата(igorenja @ Aug 3 2010, 05:17) *
нуно поюзать D-триггер

D-триггер не решает полностью проблему
Boris_TS
К сожалению, вынужден отметить, что тут про грабельки саперные (особо подлые) никто вслух не упомянул: а зовутся они метастабильность.
Для подавления оной мерзости, на «больших» и «средних» частотах не достаточно просто воткнуть 2 триггера подряд. Т.к. метастабильный переходной процесс в триггере длится в разы дольше обычного переходного процесса, то необходимо убедиться, что даже с увеличенным временем переходного процесса будут выполняться временные ограничения. Для этого необходимо использовать дополнительные constraint'ы.
AlphaMil
Спасибо за ссылочку, буду пробовать.
iosifk
Цитата(Boris_TS @ Aug 4 2010, 21:08) *
К сожалению, вынужден отметить, что тут про грабельки саперные (особо подлые) никто вслух не упомянул: а зовутся они метастабильность.
....


Вообще то, все о чем Вы пишите и называется CDC. Там и метастабильность, и способы синхронизации.
tema-electric
Цитата(AlphaMil @ Aug 3 2010, 06:56) *
Насущный вопрос: как несинхронный сигнал, приходящий на вывод ПЛИС сделать синхронным с заданным клоком, но длиной в один период? Исходный сигнал существенно длиннее клокового.


Просто и сердито на VHDL пользую обработчик фронта. По крайней мере я его так называю. Эта же конструкция позволяет отслеживать и спад входящих асинхронных длинных сигналов. Идея заключается в том, что входной сигнал сначала проходит триггер, работающий на системной частоте. Дальше полученный "синхронный сигнал" поступает на вход второго триггера задержки. С обоих триггеров сигнал поступает на комбинаторную логику. Если вам нужно реагировать по изменению сигнала, применяем операцию xor, если на фронт или спад, один из сигналов инвертируется. На выходе такой цепочки вы получите импульс длиной в один период вашей системной тактовой частоты.

Код
--------------------------------------------------------------------------------------------------
-- синхронизация длинного по отношению к тактовой частоте системы асинхронного сигнала с системной частотой.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity Synchonizator is
port
(
  Clk                : in std_logic;
  Reset            : in std_logic;
  InSignal            : in std_logic;
  Signal_is_change    : out std_logic; -- изменение сигнала
  Signal_is_fall    : out std_logic; -- фронт сигнала
  Signal_is_rise    : out std_logic  -- спад сигнала
  );
end Synchonizator;

architecture rtl of Synchonizator is

  signal sInput_signal    : std_logic_vector(1 downto 0); -- триггеры задержки

begin

   sInput_signal <= sInput_signal(0)&InSignal when Reset = '1' else
                 sInput_signal(0)&InSignal when rising_edge(Clk);

   Signal_is_change    <= sInput_signal(0) xor sInput_signal(1);    -- изменение сигнала
   Signal_is_rise    <= sInput_signal(0) xor not sInput_signal(1);    -- фронт сигнала
   Signal_is_fall    <= not sInput_signal(0) xor sInput_signal(1);    -- спад сигнала
  
end rtl;

--------------------------------------------------------------------------------------------------


Схема ...
Нажмите для просмотра прикрепленного файла

Если будете применять данную конструкцию, не забывайте добавлять по 2 триггера для ресинхронизации на остальные линии, например шину данных. А эту конструкцию используйте для управляющих сигналов. Если жалко триггеры, смотрите по ситуации. Если у вас исключена возможность того, что за время обработки сигнала управления данные изменятся, то дерзайте.

ПС: Когда начинал на ПЛИС, мучился тем же вопросом ...
Maverick
Цитата(tema-electric @ Aug 9 2010, 15:50) *

я схему синхронизации ранее предлагал ...
Какая разница?
tema-electric
Цитата(Maverick @ Aug 9 2010, 20:19) *
я схему синхронизации ранее предлагал ...
Какая разница?


Да в принципе никакой. Исключение только в наличии детектора change и в правильном сбросе такой цепочки. Пардон что проглядел laughing.gif .
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.