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

 
 
> Ошибка при инициализации регистра по 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
 
Start new topic
Ответов
Kompot
сообщение May 24 2012, 11:57
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 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



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

 


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


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