реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Ошибка при инициализации регистра по reset, Может опять метастабильность ?
dsmv
сообщение May 24 2012, 11:17
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284



Обнаружил на мой взгляд странную ошибку.

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

Код
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. Не понимаю.




Go to the top of the page
 
+Quote Post
Александр77
сообщение May 24 2012, 11:22
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 608
Регистрация: 10-07-09
Из: Дубна, Московская область
Пользователь №: 51 111



Как-то привык в процессе не "анализировать" состояние внешнего сигнала напрямую.
Завожу переменную например
variable reset_s:std_logic
И в самом процессе синхронно присваиваю значение.
reset_s:=reset;
Далее уже обработка.
Длинных реакций на такой синтез не наблюдал..
Go to the top of the page
 
+Quote Post
Kompot
сообщение May 24 2012, 11:57
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 10-06-08
Из: Хочу в пампасы...
Пользователь №: 38 192



Цитата(dsmv @ May 24 2012, 15:17) *
Обнаружил на мой взгляд странную ошибку.

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


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

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


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

Косвенным подтверждением является исчезновение эффекта после того как сигнал стал синхронен.
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение May 24 2012, 12:00
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



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

Была подобного рода ошибка - многоразрядный счетчик после сброса устанавливался не в 0, а в 1. При подробном изучении оказалось, что сброс подмешивался к данным на вход триггера и в определенный момент была гонка - переключался клок и сброс примерно одновременно, т.е. триггер автоматом попадал в метастабильное состояние. Заморачиваться не стал и на входе сделал пересинхронизацию сброса.
Go to the top of the page
 
+Quote Post
warrior-2001
сообщение May 24 2012, 12:20
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 375
Регистрация: 9-10-08
Из: Таганрог, Ростовская обл.
Пользователь №: 40 792



Цитата(dsmv @ May 24 2012, 15:17) *
reset_p - асинхронный, но крайне длительный >100 ms


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


--------------------
Глупцы игнорируют сложность. Прагматики терпят ее. Некоторые могут избегать ее. Гении ее устраняют.
Go to the top of the page
 
+Quote Post
dsmv
сообщение May 25 2012, 06:26
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284



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


А вот это похоже. Если синтезатор вместо установки/сброса формирует бит данных и сигнал разрешения то действительно можно попасть в метастабильность.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 11:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016