Jump to content

    
Sign in to follow this  
AlexZabr

Не работает кусок логики

Recommended Posts

Простой кусочек кода проэкта не работает, сижу пол дня над ним, туплю, не понимаю почему молчит.

 

out_swithing: process(nRST, CLK, OUT_SW, PATTERN)    
    begin
        if rising_edge(CLK) then
        
            if nRST = RST_pol then
                
                OUT_SW_sig <= OUT_SW;
                
                PATTERN_sig <= PATTERN;
                
            else
                OUT_SW_sig <= OUT_SW_sig;
                
                PATTERN_sig <= PATTERN_sig;
            end if;
            
        end if;
end process;

 

смысл кода в том что-бы синхронно читать вход OUT_SW в внутренний сигнал OUT_SW_sig только во время активизации глобального сброса (nRST). Когда-же сброс не активизирован - сигнал удерживает последнее значение. Это нужно для конфигурации системы.

 

OUT_SW - определен в entity как input, std_logic;

OUT_SW_sig - определен как сигнал в architecture

OUT_SW_sig - выводится на выход для debugа

 

Второй вход/сигнал не проверял еще.

 

В функциональной симуляции работает нормально, в тайминговой и в железе - не работает, т.е. OUT_SW_sig заткнут постоянно в '0';

Когда в процессе debugа ставлю постоянное значение на выход OUT_SW_sig (например '1') - нормально выводится на выход в железе.

Когда вешаю на OUT_SW_sig сам вход OUT_SW и им играюсь (он на dip-switchе) - тоже нормально работает в железе.

 

А вот в коде - никак.

 

Чего делаю левого ?

 

Спасибо..

 

P.S. FPGA - Lattice ECP2 (LFE2-50E)

Share this post


Link to post
Share on other sites
P.S. FPGA - Lattice

Скорее всего на каком-то этапе кто-то (как синплифи, так и исплевер, оба умеют) сунули сигнал резета на GSR. Уберите его оттуда, пустите по обычным сигнальным путям, и жизнь станет хороша. Код тут не причем. GSR железно резетит все ваши регистры, пока он активен, и этот код просто физически не работает. Тайминг-симуляция GSR тоже поддерживает, поэтому в ней тоже не работает.

Share this post


Link to post
Share on other sites
Скорее всего на каком-то этапе кто-то (как синплифи, так и исплевер, оба умеют) сунули сигнал резета на GSR. Уберите его оттуда, пустите по обычным сигнальным путям, и жизнь станет хороша. Код тут не причем. GSR железно резетит все ваши регистры, пока он активен, и этот код просто физически не работает. Тайминг-симуляция GSR тоже поддерживает, поэтому в ней тоже не работает.

 

Вуаля...

Очень похоже на сей случай. Я GSR специально использую и на него завожу вход nRST.

По моему есть атрибуты "убирания" GSRа с конкретных регистров, забыл их....

Нужно будет заатрибутить OUT_SW_sig (и второй сигнал), тогда надеюсь проблема решиться....

 

Не подскажете-ли сии атрибуты (синтакс) ? Буду премного благодарен....

Share this post


Link to post
Share on other sites
Не подскажете-ли сии атрибуты (синтакс) ? Буду премного благодарен....

Не, не подскажу. Я от Вас об этой возможности впервые слышу, тоже было бы интересно. Я просто везде где могу GSR отключаю в таких проектах, где не надо все ресетить. И, докучи, завожу его на жесткую 1, чтобы всякие там синтезаторы самодеятельностью не занимались.

 

Почитал я тут, полистал... http://www.latticesemi.com/dynamic/view_do...cument_id=31408 Как я понял, надо вынести этот блок в отдельный модуль, и при его подключении указать:

module_name mod_inst( signal list) /* synthesis GSR=DISABLED */;

 

Только расскажите, получилось ли :)

Share this post


Link to post
Share on other sites
Это нужно для конфигурации системы.

 

А зачем при конфигурации системы что то считывать извне. Где гарантия, что это извне уже сконфигурировалось.

По идее, При конфигурации системы заботятся о выходах, игнорируя входы?

Share this post


Link to post
Share on other sites
А зачем при конфигурации системы что то считывать извне. Где гарантия, что это извне уже сконфигурировалось.

Ну, как пример, я в одном из своих процов делал так, что по состоянию одного бита шины данных в момент резета (а в этот момент на шину адреса выдается адрес старта после резета) определяется, какая ПЗУ подключена к процессору, 8-битная, или 16-битная, и соответсвенно конфигурируется контроллер шины для корректной работы с ПЗУ. То есть если ПЗУ 16-битная, то там должна быть прошита единица. Если 8-битная, то эту шину надо подтянуть резюком к земле. Второй вариант - определение режима загрузки кода из внешней памяти во внутренюю для последующего его исполнения, почти во всех DSP-процессорах это делается по состоянию каких-то ног во время резета. Ну и дальше, мало ли что надо сигналом резет сконфигурировать, что не прошито железно, а может меняться от системы к системе... А гарантию того, что это "извне" сконфигурировалось - обычно делают тем, что это "извне" является резистором, и конфигурированию не подлежит. Или, если резет подает кто-то ведущий, то он же обеспечивает и все конфигурационные биты.

Share this post


Link to post
Share on other sites
А зачем при конфигурации системы что то считывать извне. Где гарантия, что это извне уже сконфигурировалось.

По идее, При конфигурации системы заботятся о выходах, игнорируя входы?

 

Именно как поясним выше SM.

Такой режим конфигурации системы (не IOs а именно системная конфигурация) не редко употребляется. Например на моей прошлой работе был evaluation system нашего процессора цифорвых камер, там процессор имел целый ряд конфигурационных входов которые во время активного Resetа функционировали именно как конфигурационные входа, а затем после Resetа - автоматически конфигурирвались как IO. Конфигурация системы например определяла с каким типом карточки памяти система должан работать, тип подключенного дисплея и т.д. и т.п.

 

 

Не, не подскажу. Я от Вас об этой возможности впервые слышу, тоже было бы интересно. Я просто везде где могу GSR отключаю в таких проектах, где не надо все ресетить. И, докучи, завожу его на жесткую 1, чтобы всякие там синтезаторы самодеятельностью не занимались.

 

Почитал я тут, полистал... http://www.latticesemi.com/dynamic/view_do...cument_id=31408 Как я понял, надо вынести этот блок в отдельный модуль, и при его подключении указать:

module_name mod_inst( signal list) /* synthesis GSR=DISABLED */;

 

Только расскажите, получилось ли :)

 

Пытаюсь разбираться с GSRом...

Свою проблему вроде решил, хотя пока не проверял в железе (я уже дома, не на работе), но в timing симуляции уже работает.

В чем суть: у меня в дизайне я использовал GSR как Global, т.е. explicitly делал его instantiation в топ модуле.

Существует атрибут GSR который можно исползовать по идее как ENABLE или DISABLE для конкретного сигнала (регистра ессно). Что-бы использовать атрибут нужно его вначале обьвить, но это проблема если уже есть GSR instantiation (ибо атрибут тоже называется GSR).

 

В общем, на данный момент я отменил GSR instantiation (значит согласно тому PDFу он работате как inferred), и теперь не нужно и атрибута ибо GSR уже не действует на сей сигнал.

 

Но тогда мне опять непонятно применение этого атрибута.... ;)

Кроме того вот надыбал такую errata на форуме Латтиса:

http://www.latticesemi.com/forums/forum/me...p;enterthread=y

 

Завтра еще раз перечитаю тот PDF по GSRу и сосстыкуюсь с саппортом Lattice - пусть разьяснят что и как с GSRом...

Share this post


Link to post
Share on other sites

Попробуйте так:

out_swithing: process(CLK)

begin

if rising_edge(CLK) then

 

if nRST = RST_pol then

 

OUT_SW_sig <= OUT_SW;

 

PATTERN_sig <= PATTERN;

 

end if;

 

end if;

end process;

В списке чувсвительности явно лишние сигналы. Xilinx ISE это очень не любит. И писать "OUT_SW_sig <= OUT_SW_sig" смысла нет!

Edited by kuchynski

Share this post


Link to post
Share on other sites
Что-бы использовать атрибут нужно его вначале обьвить, но это проблема если уже есть GSR instantiation (ибо атрибут тоже называется GSR).

Ну это на раз обходится методом написания того модуля, где это нужно, на верилоге.

 

ЗЫ. Потом расскажите пожалуста, что саппорт про GSR наговорит... Уж очень интересно, все таки реально управлять неподключением GSR-а к отдельным регистрам, или нет...

Share this post


Link to post
Share on other sites
Попробуйте так:

out_swithing: process(CLK)

begin

if rising_edge(CLK) then

 

if nRST = RST_pol then

 

OUT_SW_sig <= OUT_SW;

 

PATTERN_sig <= PATTERN;

 

end if;

 

end if;

end process;

В списке чувсвительности явно лишние сигналы. Xilinx ISE это очень не любит. И писать "OUT_SW_sig <= OUT_SW_sig" смысла нет!

 

Спасибо, да, в списке действительно лишние сигналы и OUT_SW_sig <= OUT_SW_sig действительно лишнее в синхронном процессе, но это не причина проблемы.

Причина была как правильно заметил SM в специфике GSR - это специфика работы с Латтисом (я не на Xilinxе).

Share this post


Link to post
Share on other sites
Ну это на раз обходится методом написания того модуля, где это нужно, на верилоге.

 

ЗЫ. Потом расскажите пожалуста, что саппорт про GSR наговорит... Уж очень интересно, все таки реально управлять неподключением GSR-а к отдельным регистрам, или нет...

 

Получил частичный ответ от саппорта. Если определен GSR как Global - он обнуляет все абсолютно флип-флопы чипа там где Reset не определен explicitly логикой. Что-бы сделать так чтоб определенный сигнал/флип-флоп не обнулялся автоматом Global GSRом - можно дать ему gated Reset, т.е. через логику (входной сигнал Resetа подогнать к флип-флопу через какой-нить gate).

 

Сам пока не проверял, у себя просто отменил Global GSR и оставил inferred.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this