Полная версия этой страницы:
Два синхросигнала и гонки
nickbor
Apr 30 2006, 06:00
Профи, помогите хоббиисту пожалуйста. Спаял и кое как запрограммировал свою первую плату на Spartan 2. Вроде как работает, но мучают меня сомнения. Вот, например есть у меня описанный на VHDL счетчик, запитанный от 1-го синхросигнала. По N-му счету он переписывается в регистр. А чтение из регистра производится по 2-му синхросигналу. 1й и 2й синхросигналы от разных кварцев. Может ли такое случится один раз из миллиона, что в момент чтения только полрегистра записалось? Вы уж простите меня за глупый вопрос
jorikdima
Apr 30 2006, 06:16
Мне кажется врядли. Скорее всего чето не так в коде. понимаю чот он простой, но выложи на всякий случай осмотрим. Ты уверен что по синхросигналу переписываешь в регистр

а не при каждом изменении значения счетчика?
Именно так и будет. Надо обязательно ставить дополнительный регистр и синхронизатор, который переписывает из регистра, синхронного со счетчиком, по второму синхросигналу, но только в тот момент, когда нет записи из счетчика.
nickbor
Apr 30 2006, 16:19
Счетчик переписывается в регистр по первому синхросигналу.
Спасибо всем, придется придумывать как синхронизовать...
Чтобы все было по науке - смотрите здесь
http://www.sunburst-design.com/papersплюс приаттаченный файл.
nickbor
May 2 2006, 04:01
Спасибо, изучаю... Кстати, мой случай христоматийный. Наверняка все сталкивались со случаем, когда идет оцифровка и ввод данных по одному синхросигналу, а шина обмена с процессором - по другому. Есть, конечно, возможность задержать обмен по шине, но встает вопрос, когда выдавать сигнал о задержке, сколько времени он идет, не медленнее ли, чем смена данных и т.п.
Случай настолько хрестоматийный, что в него влипали даже крупные фирмы. Если я помню правильно, кажется USART 16550 стал 16550A именно по этой причине. Тот, который без А имел проблемы синхронизации.
Если не хотите задерживать обмен, надо ставить доп регистр после счетчика, в который переписывается по 1 синхросигналу, и одновременно взводите этим ипульсом 1й триггер синхронизатора. По фронту второго синхросигнала взводится 2й триггер синхронизатора, который разрешает запись в регистр, тактируемый 2 синхросигналом и сбрасывает асинхронно 1й триггер.
Триггера D-типа, выход первого соединен с D входом второго. С первого - импульс, подаваемый в момент, когда уже завершена запись в буферный регистр. C второго - 2й синхросигнал.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.