Перейти к содержанию
    

VHDL - сдвиговый регистр с параллельной загрузкой

Вроде бы элементарный вопрос...

Имеется обычный 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 в список чувствительности процесса и почему ? Работает вроде и так, и так, но интересует именно формально правильная форма (желательно с ссылкой на источник, почему нужно именно так, а не иначе).

Поиск в интернете однозначного ответа не дал - нашел разные варианты...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде бы элементарный вопрос...

 

Нужно ли включать SL в список чувствительности процесса и почему ? Работает вроде и так, и так, но интересует именно формально правильная форма (желательно с ссылкой на источник, почему нужно именно так, а не иначе).

Поиск в интернете однозначного ответа не дал - нашел разные варианты...

Как говорил Холмс - элементарно...

Если сигнал есть в списке чувствительности, то процесс запускается и по этому сигналу и по клоку. Если нет - то только по клоку...

Если Вы хотите сделать синхронный процесс, то он должен работать только по клоку. И обычно проектирование так и ведется... А если хотите сделать асинхронщину и потом долго трахаться, то вводите SL в список чувствительности...

Чтобы увидеть разницу, сделайте изменение сигнала SL относительно клока. Если он создается по клоку, то для симуляции вставьте задержку. И увидите, что выход регистра будет меняться по этому задержанному сигналу. Мало того, загрузка и сдвиг будут "не вовремя"... Например сделайте пульс сигнала SL внутри клока...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По логике вроде так и получается, что нечего SL делать в списке чувствительности. Просто меня смутило, что в ряде примеров его туда все-таки добавляли...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По логике вроде так и получается, что нечего SL делать в списке чувствительности. Просто меня смутило, что в ряде примеров его туда все-таки добавляли...

Есть D-триггер, он меняет свое состояние один раз по одному фронту.

А есть латч, триггер, который работает как водопроводный шланг. Сигнал разрешения либо разрешает меняться выходу в соответствии со входом неоднократно, либо зажимает состояние, которое было... И латчу не нужен клок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде бы элементарный вопрос...

Имеется обычный 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 дня промучился прежде чем нашел глюк в схеме. Оказалось всему виной асинхронный сброс... Плюнул и переделал на синхронный - все заработало...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дважды подумайте прежде чем делать асинхронный сброс. Штука очень коварная. Недавно я 2 дня промучился прежде чем нашел глюк в схеме. Оказалось всему виной асинхронный сброс... Плюнул и переделал на синхронный - все заработало...

При грамотно написанном асинхронном сбросе проблем не будет. Тут он по идее описан правильно. У Иосифа Каршенбойма есть статья на этот счет:

http://iosifk.narod.ru/hdl_coding/hdl_coding_11_kit_1_09.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При грамотно написанном асинхронном сбросе проблем не будет. Тут он по идее описан правильно. У Иосифа Каршенбойма есть статья на этот счет:

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 сброс подавался так-же через двухвходовой элемент "ИЛИ", где на один из входов всегда подавалась единица. Но схема перестала корректно сбрасываться ! Хотя по логике элемент "ИЛИ" не должен никак влиять на сигнал глобального сброса. Но каким-то образом он стал влиять.... Решил сделать синхронным сбросом - все стало работать как положено....

Изменено пользователем Flip-fl0p

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я эту статью читал. В своём проекте делал как положено. Но столкнулся с необъяснимым поведением схемы:

Пусть есть один модуль 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...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так вот когда на modul2 приходил глобальный сброс - то все было отлично. Сброс происходил - схема сбрасывалась. Но вот когда я на modul2 повесил 2 сброса: через условие "ИЛИ" (ASY_RESET_N OR RESET_MODUL2 поскольку modul2 должен сбрасываться глобально, и сигналом сброса от modul1), схема стала работать некорректно: счетчики в modul2 не сбрасывались. Визуально сброс происходил, поскольку "железка" работать переставала. Но вот работать она начинала не с обнуленных счетчиков. Сначала я подумал, что modul1 генерирует неправильно сброс, и временно отключил сигнал сброса от modul1. И у меня на modul2 сброс подавался так-же через двухвходовой элемент "ИЛИ", где на один из входов всегда подавалась единица. Но схема перестала корректно сбрасываться ! Хотя по логике элемент "ИЛИ" не должен никак влиять на сигнал глобального сброса. Но каким-то образом он стал влиять.... Решил сделать синхронным сбросом - все стало работать как положено....

Удлинение пути сброса могло привести к нарушению констрейнов на скорость распространения сигнала сброса, у вас они проверялись?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если сигнал есть в списке чувствительности, то процесс запускается и по этому сигналу и по клоку. Если нет - то только по клоку...
Тут возражений нет. Но вот дальше :facepalm:

Если Вы хотите сделать синхронный процесс, то он должен работать только по клоку. И обычно проектирование так и ведется... А если хотите сделать асинхронщину и потом долго трахаться, то вводите SL в список чувствительности...
Что вы несёте... Оттого, что в список чувствительности внести SL, никакой асинхронщины в данном конкретном случае не появится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В схеме был глобальный сигнал сброса ASY_RESET_N, срабатывающий по низкому уровню...

Так вот когда на modul2 приходил глобальный сброс - то все было отлично. Сброс происходил - схема сбрасывалась.

Но вот когда я на modul2 повесил 2 сброса: через условие "ИЛИ" (ASY_RESET_N OR RESET_MODUL2 поскольку modul2 должен сбрасываться глобально, и сигналом сброса от modul1), схема стала работать некорректно: счетчики в modul2 не сбрасывались.

Можно подробнее? Я так понял, что глобальный сброс идет нулем, а сброс модуля 2 чем?

Если тоже нулем, то почему Вы решили объединять оба сигнала сброса элементом ИЛИ? Ведь по логике, любая логическая 1 даст на выходе 1 и никакого сброса нулем не будет.

Если оба сброса идут нулями и в разное время (а иначе зачем дробить сбросы!), то правильнее объединять их по И.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Оттого, что в список чувствительности внести SL, никакой асинхронщины в данном конкретном случае не появится.

Как минимум, RTL view получившейся схемы не зависит от того, есть SL в списке чувствительности, или нет (схемы просто идентичны).

Я был удивлен, когда не смог быстро найти однозначный ответ на такой, казалось бы, простой вопрос, но вижу, что мнения действительно сильно различаются :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут возражений нет. Но вот дальше :facepalm:

Что вы несёте... Оттого, что в список чувствительности внести SL, никакой асинхронщины в данном конкретном случае не появится.

Увы... Мало того, что Вы пишите дикий бред, так еще я что-то "несу"...

Синхронный проект, это когда синтезатор просчитывает все сетапы и холды и задержки на логике только относительно клока. И все сигналы должны установиться к переднему фронту клока и иметь заданный сетап...

А теперь представьте, что триггер запускается не клоком, а сигналом SL, который сдвинут относительно клока... И как тут работать синтезатору? На SL есть констрейны как на клок? Как по Вашему отработает компилятор?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно подробнее? Я так понял, что глобальный сброс идет нулем, а сброс модуля 2 чем?

Если тоже нулем, то почему Вы решили объединять оба сигнала сброса элементом ИЛИ? Ведь по логике, любая логическая 1 даст на выходе 1 и никакого сброса нулем не будет.

Если оба сброса идут нулями и в разное время (а иначе зачем дробить сбросы!), то правильнее объединять их по И.

Да, глобальный сброс идет нулем. Сброс модуля идет лог.1. Но меня это мало волнует. Пусть у модуля modul2 входной порт сброса будет называться RESET. Тогда в VHDL подключение к этому порту других сигналов будет выглядеть так:

PORT MAP 
(
....
....
RESET => ASY_RESET_N [b]OR[/b] ([b]NOT[/b] RESET_MODUL2 ),
.....
)

А похоже, что я действительно ошибся в логике. Данный трюк сработал бы если сброс работал с активным уровнем 1.... Срамота.... Таблица ясно говорит, что надо было брать по И.

 

 

image.png

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А похоже, что я действительно ошибся в логике. Данный трюк сработал бы если сброс работал с активным уровнем 1.... Срамота.... Таблица ясно говорит, что надо было брать по И.

Какой из этого вывод?

Все сигналы в проекте должны иметь один и тот же активный уровень!

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...