Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибка при инициализации регистра по reset
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
dsmv
Обнаружил на мой взгляд странную ошибку.

Есть такой процесс:

Код
pr_reg: process( clk ) begin
    if( rising_edge( clk ) ) then
        if( reset_p='1' ) then
            reg_a<=init_val after 1 ns;
        elsif( data_en='1' ) then                                              
            reg_a( 63 downto 1 ) <= reg_a( 62 downto 0 ) after 1 ns;
            reg_a(0) <= reg_a(63) xor reg_a(62) xor reg_a(60) xor reg_a(59) after 1 ns;
        end if;
    end if;      
end process;





clk - 166 MHz

reset_p - асинхронный, но крайне длительный >100 ms

init_val - это константа.

data_en возникает намного позже reset_p

Я обнаружил при помощи ChipScope, что иногда reg_a инициализируется неправильным значением. После того, как я сделал reset_p синхронным - всё стало нормально.

Собственно вопрос - откуда здесь может быть ошибка ? Скорее всего reset_p заводится на входы сброса/установки, длительность reset_p очень большая. Времени на установку более чем достаточно. Получается, что ошибка возникает при асинхронном снятии reset - вместо сброса в 0 возникает установка в 1. Не понимаю.




Александр77
Как-то привык в процессе не "анализировать" состояние внешнего сигнала напрямую.
Завожу переменную например
variable reset_s:std_logic
И в самом процессе синхронно присваиваю значение.
reset_s:=reset;
Далее уже обработка.
Длинных реакций на такой синтез не наблюдал..
Kompot
Цитата(dsmv @ May 24 2012, 15:17) *
Обнаружил на мой взгляд странную ошибку.

reset_p - асинхронный, но крайне длительный >100 ms


Я обнаружил при помощи ChipScope, что иногда reg_a инициализируется неправильным значением. После того, как я сделал reset_p синхронным - всё стало нормально.

Собственно вопрос - откуда здесь может быть ошибка ? Скорее всего reset_p заводится на входы сброса/установки, длительность reset_p очень большая. Времени на установку более чем достаточно. Получается, что ошибка возникает при асинхронном снятии reset - вместо сброса в 0 возникает установка в 1. Не понимаю.


У Вас описан регистр с синхронным сбросом. А сигнал сброса - асинхронен. Непорядок. Когда Вы его снимаете в произвольный момент времени, это может случиться аккурат в момент фронта клока. И тогда опаньки - метастабильность.

Косвенным подтверждением является исчезновение эффекта после того как сигнал стал синхронен.
bogaev_roman
Цитата(dsmv @ May 24 2012, 15:17) *
Получается, что ошибка возникает при асинхронном снятии reset - вместо сброса в 0 возникает установка в 1. Не понимаю.

Была подобного рода ошибка - многоразрядный счетчик после сброса устанавливался не в 0, а в 1. При подробном изучении оказалось, что сброс подмешивался к данным на вход триггера и в определенный момент была гонка - переключался клок и сброс примерно одновременно, т.е. триггер автоматом попадал в метастабильное состояние. Заморачиваться не стал и на входе сделал пересинхронизацию сброса.
warrior-2001
Цитата(dsmv @ May 24 2012, 15:17) *
reset_p - асинхронный, но крайне длительный >100 ms


Зачастую вопросы отпадают, если посмотреть на синтезированную по коду схему.
Как сказали выше - асинхронный сброс и на схеме скорее всего подается на синхронный.
dsmv
Цитата(bogaev_roman @ May 24 2012, 15:00) *
Была подобного рода ошибка - многоразрядный счетчик после сброса устанавливался не в 0, а в 1. При подробном изучении оказалось, что сброс подмешивался к данным на вход триггера и в определенный момент была гонка - переключался клок и сброс примерно одновременно, т.е. триггер автоматом попадал в метастабильное состояние. Заморачиваться не стал и на входе сделал пересинхронизацию сброса.


А вот это похоже. Если синтезатор вместо установки/сброса формирует бит данных и сигнал разрешения то действительно можно попасть в метастабильность.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.