justontime 0 12 ноября, 2016 Опубликовано 12 ноября, 2016 · Жалоба Вроде бы элементарный вопрос... Имеется обычный 8-битный сдвиговый регистр со сбросом и параллельной загрузкой: process (ClrN, CLK) begin if ClrN = '0' then reg <= x"00"; elsif rising_edge(CLK) then if SL = '0' then reg <= dataIn; else reg(0) <= '0'; reg(7 downto 1) <= reg(6 downto 0); end if; end if; end process; Нужно ли включать SL в список чувствительности процесса и почему ? Работает вроде и так, и так, но интересует именно формально правильная форма (желательно с ссылкой на источник, почему нужно именно так, а не иначе). Поиск в интернете однозначного ответа не дал - нашел разные варианты... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 12 ноября, 2016 Опубликовано 12 ноября, 2016 · Жалоба Вроде бы элементарный вопрос... Нужно ли включать SL в список чувствительности процесса и почему ? Работает вроде и так, и так, но интересует именно формально правильная форма (желательно с ссылкой на источник, почему нужно именно так, а не иначе). Поиск в интернете однозначного ответа не дал - нашел разные варианты... Как говорил Холмс - элементарно... Если сигнал есть в списке чувствительности, то процесс запускается и по этому сигналу и по клоку. Если нет - то только по клоку... Если Вы хотите сделать синхронный процесс, то он должен работать только по клоку. И обычно проектирование так и ведется... А если хотите сделать асинхронщину и потом долго трахаться, то вводите SL в список чувствительности... Чтобы увидеть разницу, сделайте изменение сигнала SL относительно клока. Если он создается по клоку, то для симуляции вставьте задержку. И увидите, что выход регистра будет меняться по этому задержанному сигналу. Мало того, загрузка и сдвиг будут "не вовремя"... Например сделайте пульс сигнала SL внутри клока... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
justontime 0 12 ноября, 2016 Опубликовано 12 ноября, 2016 · Жалоба По логике вроде так и получается, что нечего SL делать в списке чувствительности. Просто меня смутило, что в ряде примеров его туда все-таки добавляли... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 12 ноября, 2016 Опубликовано 12 ноября, 2016 · Жалоба По логике вроде так и получается, что нечего SL делать в списке чувствительности. Просто меня смутило, что в ряде примеров его туда все-таки добавляли... Есть D-триггер, он меняет свое состояние один раз по одному фронту. А есть латч, триггер, который работает как водопроводный шланг. Сигнал разрешения либо разрешает меняться выходу в соответствии со входом неоднократно, либо зажимает состояние, которое было... И латчу не нужен клок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 12 ноября, 2016 Опубликовано 12 ноября, 2016 · Жалоба Вроде бы элементарный вопрос... Имеется обычный 8-битный сдвиговый регистр со сбросом и параллельной загрузкой: process (ClrN, CLK) begin if ClrN = '0' then reg <= x"00"; elsif rising_edge(CLK) then if SL = '0' then reg <= dataIn; else reg(0) <= '0'; reg(7 downto 1) <= reg(6 downto 0); end if; end if; end process; Нужно ли включать SL в список чувствительности процесса и почему ? Работает вроде и так, и так, но интересует именно формально правильная форма (желательно с ссылкой на источник, почему нужно именно так, а не иначе). Поиск в интернете однозначного ответа не дал - нашел разные варианты... Дважды подумайте прежде чем делать асинхронный сброс. Штука очень коварная. Недавно я 2 дня промучился прежде чем нашел глюк в схеме. Оказалось всему виной асинхронный сброс... Плюнул и переделал на синхронный - все заработало... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sqrt(2) 0 12 ноября, 2016 Опубликовано 12 ноября, 2016 · Жалоба Дважды подумайте прежде чем делать асинхронный сброс. Штука очень коварная. Недавно я 2 дня промучился прежде чем нашел глюк в схеме. Оказалось всему виной асинхронный сброс... Плюнул и переделал на синхронный - все заработало... При грамотно написанном асинхронном сбросе проблем не будет. Тут он по идее описан правильно. У Иосифа Каршенбойма есть статья на этот счет: http://iosifk.narod.ru/hdl_coding/hdl_coding_11_kit_1_09.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 12 ноября, 2016 Опубликовано 12 ноября, 2016 (изменено) · Жалоба При грамотно написанном асинхронном сбросе проблем не будет. Тут он по идее описан правильно. У Иосифа Каршенбойма есть статья на этот счет: http://iosifk.narod.ru/hdl_coding/hdl_coding_11_kit_1_09.pdf Я эту статью читал. В своём проекте делал как положено. Но столкнулся с необъяснимым поведением схемы: Пусть есть один модуль modul1, который работает на частоте CLK1. В определенные моменты времени, он формирует сигнал RESET_MODUL2 равный лог 0, который должен сбрасывать другой модуль modul2 работающий на частоте CLK2. В схеме был глобальный сигнал сброса ASY_RESET_N, срабатывающий по низкому уровню. Во все модули глобальный сброс передавался через синхронизаторы(2 D-триггера). Длительность сигнала сброса была несколько миллисекунд ( гораздо больше чем период синхрочастоты). Так вот когда на modul2 приходил глобальный сброс - то все было отлично. Сброс происходил - схема сбрасывалась. Но вот когда я на modul2 повесил 2 сброса: через условие "ИЛИ" (ASY_RESET_N OR RESET_MODUL2 поскольку modul2 должен сбрасываться глобально, и сигналом сброса от modul1), схема стала работать некорректно: счетчики в modul2 не сбрасывались. Визуально сброс происходил, поскольку "железка" работать переставала. Но вот работать она начинала не с обнуленных счетчиков. Сначала я подумал, что modul1 генерирует неправильно сброс, и временно отключил сигнал сброса от modul1. И у меня на modul2 сброс подавался так-же через двухвходовой элемент "ИЛИ", где на один из входов всегда подавалась единица. Но схема перестала корректно сбрасываться ! Хотя по логике элемент "ИЛИ" не должен никак влиять на сигнал глобального сброса. Но каким-то образом он стал влиять.... Решил сделать синхронным сбросом - все стало работать как положено.... Изменено 12 ноября, 2016 пользователем Flip-fl0p Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 12 ноября, 2016 Опубликовано 12 ноября, 2016 · Жалоба Я эту статью читал. В своём проекте делал как положено. Но столкнулся с необъяснимым поведением схемы: Пусть есть один модуль modul1, который работает на частоте CLK1. В определенные моменты времени, он формирует сигнал RESET_MODUL2 равный лог 0, который должен сбрасывать другой модуль modul2 работающий на частоте CLK2. В схеме был глобальный сигнал сброса ASY_RESET_N, срабатывающий по низкому уровню. Во все модули глобальный сброс передавался через синхронизаторы(2 D-триггера). Длительность сигнала сброса была несколько миллисекунд ( гораздо больше чем период синхрочастоты). Так вот когда на modul2 приходил глобальный сброс - то все было отлично. Сброс происходил - схема сбрасывалась. Но вот когда я на modul2 повесил 2 сброса: через условие "ИЛИ" (ASY_RESET_N OR RESET_MODUL2 поскольку modul2 должен сбрасываться глобально, и сигналом сброса от modul1), схема стала работать некорректно: счетчики в modul2 не сбрасывались. Визуально сброс происходил, поскольку "железка" работать переставала. Но вот работать она начинала не с обнуленных счетчиков. Сначала я подумал, что modul1 генерирует неправильно сброс, и временно отключил сигнал сброса от modul1. И у меня на modul2 сброс подавался так-же через двухвходовой элемент "ИЛИ", где на один из входов всегда подавалась единица. Но схема перестала корректно сбрасываться ! Хотя по логике элемент "ИЛИ" не должен никак влиять на сигнал глобального сброса. Но каким-то образом он стал влиять.... Решил сделать синхронным сбросом - все стало работать как положено.... посмотрите, как сделан сброс в проекте у Ксайлинкса: c:\Xilinx\14.7\ISE_DS\ISE\ISEexamples\wave_gen_ver_v6.zip И там есть такой же на VHDL... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 12 ноября, 2016 Опубликовано 12 ноября, 2016 · Жалоба Так вот когда на modul2 приходил глобальный сброс - то все было отлично. Сброс происходил - схема сбрасывалась. Но вот когда я на modul2 повесил 2 сброса: через условие "ИЛИ" (ASY_RESET_N OR RESET_MODUL2 поскольку modul2 должен сбрасываться глобально, и сигналом сброса от modul1), схема стала работать некорректно: счетчики в modul2 не сбрасывались. Визуально сброс происходил, поскольку "железка" работать переставала. Но вот работать она начинала не с обнуленных счетчиков. Сначала я подумал, что modul1 генерирует неправильно сброс, и временно отключил сигнал сброса от modul1. И у меня на modul2 сброс подавался так-же через двухвходовой элемент "ИЛИ", где на один из входов всегда подавалась единица. Но схема перестала корректно сбрасываться ! Хотя по логике элемент "ИЛИ" не должен никак влиять на сигнал глобального сброса. Но каким-то образом он стал влиять.... Решил сделать синхронным сбросом - все стало работать как положено.... Удлинение пути сброса могло привести к нарушению констрейнов на скорость распространения сигнала сброса, у вас они проверялись? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 12 ноября, 2016 Опубликовано 12 ноября, 2016 · Жалоба Если сигнал есть в списке чувствительности, то процесс запускается и по этому сигналу и по клоку. Если нет - то только по клоку...Тут возражений нет. Но вот дальше :facepalm: Если Вы хотите сделать синхронный процесс, то он должен работать только по клоку. И обычно проектирование так и ведется... А если хотите сделать асинхронщину и потом долго трахаться, то вводите SL в список чувствительности...Что вы несёте... Оттого, что в список чувствительности внести SL, никакой асинхронщины в данном конкретном случае не появится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Александр77 1 12 ноября, 2016 Опубликовано 12 ноября, 2016 · Жалоба В схеме был глобальный сигнал сброса ASY_RESET_N, срабатывающий по низкому уровню... Так вот когда на modul2 приходил глобальный сброс - то все было отлично. Сброс происходил - схема сбрасывалась. Но вот когда я на modul2 повесил 2 сброса: через условие "ИЛИ" (ASY_RESET_N OR RESET_MODUL2 поскольку modul2 должен сбрасываться глобально, и сигналом сброса от modul1), схема стала работать некорректно: счетчики в modul2 не сбрасывались. Можно подробнее? Я так понял, что глобальный сброс идет нулем, а сброс модуля 2 чем? Если тоже нулем, то почему Вы решили объединять оба сигнала сброса элементом ИЛИ? Ведь по логике, любая логическая 1 даст на выходе 1 и никакого сброса нулем не будет. Если оба сброса идут нулями и в разное время (а иначе зачем дробить сбросы!), то правильнее объединять их по И. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
justontime 0 12 ноября, 2016 Опубликовано 12 ноября, 2016 · Жалоба Оттого, что в список чувствительности внести SL, никакой асинхронщины в данном конкретном случае не появится. Как минимум, RTL view получившейся схемы не зависит от того, есть SL в списке чувствительности, или нет (схемы просто идентичны). Я был удивлен, когда не смог быстро найти однозначный ответ на такой, казалось бы, простой вопрос, но вижу, что мнения действительно сильно различаются :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 12 ноября, 2016 Опубликовано 12 ноября, 2016 · Жалоба Тут возражений нет. Но вот дальше :facepalm: Что вы несёте... Оттого, что в список чувствительности внести SL, никакой асинхронщины в данном конкретном случае не появится. Увы... Мало того, что Вы пишите дикий бред, так еще я что-то "несу"... Синхронный проект, это когда синтезатор просчитывает все сетапы и холды и задержки на логике только относительно клока. И все сигналы должны установиться к переднему фронту клока и иметь заданный сетап... А теперь представьте, что триггер запускается не клоком, а сигналом SL, который сдвинут относительно клока... И как тут работать синтезатору? На SL есть констрейны как на клок? Как по Вашему отработает компилятор? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 12 ноября, 2016 Опубликовано 12 ноября, 2016 · Жалоба Можно подробнее? Я так понял, что глобальный сброс идет нулем, а сброс модуля 2 чем? Если тоже нулем, то почему Вы решили объединять оба сигнала сброса элементом ИЛИ? Ведь по логике, любая логическая 1 даст на выходе 1 и никакого сброса нулем не будет. Если оба сброса идут нулями и в разное время (а иначе зачем дробить сбросы!), то правильнее объединять их по И. Да, глобальный сброс идет нулем. Сброс модуля идет лог.1. Но меня это мало волнует. Пусть у модуля modul2 входной порт сброса будет называться RESET. Тогда в VHDL подключение к этому порту других сигналов будет выглядеть так: PORT MAP ( .... .... RESET => ASY_RESET_N [b]OR[/b] ([b]NOT[/b] RESET_MODUL2 ), ..... ) А похоже, что я действительно ошибся в логике. Данный трюк сработал бы если сброс работал с активным уровнем 1.... Срамота.... Таблица ясно говорит, что надо было брать по И. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 12 ноября, 2016 Опубликовано 12 ноября, 2016 · Жалоба А похоже, что я действительно ошибся в логике. Данный трюк сработал бы если сброс работал с активным уровнем 1.... Срамота.... Таблица ясно говорит, что надо было брать по И. Какой из этого вывод? Все сигналы в проекте должны иметь один и тот же активный уровень! А если нужен иной уровень, то такой сигнал нужно сразу же проинвертировать в проекте верхнего уровня. Иметь разные уровни для активных сигналов - значит влететь в ошибки... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться